diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-01-30 20:55:31 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-01-30 20:55:31 +0000 |
| commit | 279abd31a9046b79f3f3bb37f5900c4bb9a3803e (patch) | |
| tree | df0d637107369f5304dd060343769a6c08835049 | |
| parent | ff8acd684fbbc5c37fb0dd856275a4c344b81f29 (diff) | |
| download | bcm5719-llvm-279abd31a9046b79f3f3bb37f5900c4bb9a3803e.tar.gz bcm5719-llvm-279abd31a9046b79f3f3bb37f5900c4bb9a3803e.zip | |
Generate list of implemented classes and categories in their
own sections (related to objc2 nonfragile abi).
llvm-svn: 63418
| -rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index cf7010ae2dc..67ef1ae0e83 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -3144,6 +3144,59 @@ llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() { void CGObjCNonFragileABIMac::FinishNonFragileABIModule() { // nonfragile abi has no module definition. + + // Build list of all implemented classe addresses in array + // L_OBJC_LABEL_CLASS_$. + // FIXME. Also generate in L_OBJC_LABEL_NONLAZY_CLASS_$ + // list of 'nonlazy' implementations (defined as those with a +load{} + // method!!). + unsigned NumClasses = DefinedClasses.size(); + if (NumClasses) { + std::vector<llvm::Constant*> Symbols(NumClasses); + for (unsigned i=0; i<NumClasses; i++) + Symbols[i] = llvm::ConstantExpr::getBitCast(DefinedClasses[i], + ObjCTypes.Int8PtrTy); + llvm::Constant* Init = + llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy, + NumClasses), + Symbols); + + llvm::GlobalVariable *GV = + new llvm::GlobalVariable(Init->getType(), false, + llvm::GlobalValue::InternalLinkage, + Init, + "\01L_OBJC_LABEL_CLASS_$", + &CGM.getModule()); + GV->setSection("__DATA, __objc_classlist, regular, no_dead_strip"); + UsedGlobals.push_back(GV); + } + + // Build list of all implemented category addresses in array + // L_OBJC_LABEL_CATEGORY_$. + // FIXME. Also generate in L_OBJC_LABEL_NONLAZY_CATEGORY_$ + // list of 'nonlazy' category implementations (defined as those with a +load{} + // method!!). + unsigned NumCategory = DefinedCategories.size(); + if (NumCategory) { + std::vector<llvm::Constant*> Symbols(NumCategory); + for (unsigned i=0; i<NumCategory; i++) + Symbols[i] = llvm::ConstantExpr::getBitCast(DefinedCategories[i], + ObjCTypes.Int8PtrTy); + llvm::Constant* Init = + llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy, + NumCategory), + Symbols); + + llvm::GlobalVariable *GV = + new llvm::GlobalVariable(Init->getType(), false, + llvm::GlobalValue::InternalLinkage, + Init, + "\01L_OBJC_LABEL_CATEGORY_$", + &CGM.getModule()); + GV->setSection("__DATA, __objc_catlist, regular, no_dead_strip"); + UsedGlobals.push_back(GV); + } + std::vector<llvm::Constant*> Used; for (std::vector<llvm::GlobalVariable*>::iterator i = UsedGlobals.begin(), e = UsedGlobals.end(); i != e; ++i) { @@ -3456,7 +3509,9 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) { ID); TClassName = ObjCClassName + ClassName; - BuildClassMetaData(TClassName, MetaTClass, SuperClassGV, CLASS_RO_GV); + llvm::GlobalVariable *ClassMD = + BuildClassMetaData(TClassName, MetaTClass, SuperClassGV, CLASS_RO_GV); + DefinedClasses.push_back(ClassMD); } /// GenerateProtocolRef - This routine is called to generate code for |

