bool ClangASTImporter::LayoutRecordType( const clang::RecordDecl *record_decl, uint64_t &bit_size, uint64_t &alignment, llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) { RecordDeclToLayoutMap::iterator pos = m_record_decl_to_layout_map.find(record_decl); bool success = false; base_offsets.clear(); vbase_offsets.clear(); if (pos != m_record_decl_to_layout_map.end()) { bit_size = pos->second.bit_size; alignment = pos->second.alignment; field_offsets.swap(pos->second.field_offsets); base_offsets.swap(pos->second.base_offsets); vbase_offsets.swap(pos->second.vbase_offsets); m_record_decl_to_layout_map.erase(pos); success = true; } else { bit_size = 0; alignment = 0; field_offsets.clear(); } return success; }
void CGObjCJit::AddMethodsToClass(void *theClass) { // Methods need to be added at runtime. Method function pointers (IMP) // are not available until then. CGBuilderTy Builder(JitInitBlock); CodeGen::CodeGenFunction CGF(CGM); void *theMetaclass = _object_getClass(theClass); llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*>::iterator I = MethodDefinitions.begin(); while (I != MethodDefinitions.end()) { const ObjCMethodDecl *D = I->first; std::string TypeStr; CGM.getContext().getObjCEncodingForMethodDecl(const_cast<ObjCMethodDecl*>(D), TypeStr); const char* TypeCStr = // keep in a set MethodTypeStrings.insert(MethodTypeStrings.begin(), TypeStr)->c_str(); void *ClassObject = D->isClassMethod() ? theMetaclass : theClass; llvm::Value *ClassArg = llvm::Constant::getIntegerValue(ObjCTypes.ClassPtrTy, llvm::APInt(sizeof(void*) * 8, (uint64_t)ClassObject)); llvm::Value *SelectorArg = GetSelector(CGF, D->getSelector()); llvm::Value *TypeArg = llvm::Constant::getIntegerValue(ObjCTypes.Int8PtrTy, llvm::APInt(sizeof(void*) * 8, (uint64_t)TypeCStr)); llvm::Value *MethodArg = Builder.CreateBitCast(I->second, ImpPtrTy); Builder.CreateCall4(fn_class_addMethod, ClassArg, SelectorArg, MethodArg, TypeArg); I++; } // Done with list for this implementation, so clear it MethodDefinitions.clear(); }
void reset() { indexedScopes.clear(); scopeToIndexMap.clear(); closureToScopesMap.clear(); }