diff options
Diffstat (limited to 'gnu/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp')
| -rw-r--r-- | gnu/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/gnu/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp b/gnu/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp index 622c8bfb500..548bd6b3fd7 100644 --- a/gnu/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/gnu/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp @@ -277,6 +277,8 @@ protected: Fields.addInt(Int8Ty, 0); } + virtual llvm::Constant *GenerateCategoryProtocolList(const + ObjCCategoryDecl *OCD); virtual ConstantArrayBuilder PushPropertyListHeader(ConstantStructBuilder &Fields, int count) { // int count; @@ -1164,6 +1166,15 @@ class CGObjCGNUstep2 : public CGObjCGNUstep { return MethodList.finishAndCreateGlobal(".objc_protocol_method_list", CGM.getPointerAlign()); } + llvm::Constant *GenerateCategoryProtocolList(const ObjCCategoryDecl *OCD) + override { + SmallVector<llvm::Constant*, 16> Protocols; + for (const auto *PI : OCD->getReferencedProtocols()) + Protocols.push_back( + llvm::ConstantExpr::getBitCast(GenerateProtocolRef(PI), + ProtocolPtrTy)); + return GenerateProtocolList(Protocols); + } llvm::Value *LookupIMPSuper(CodeGenFunction &CGF, Address ObjCSuper, llvm::Value *cmd, MessageSendInfo &MSI) override { @@ -1547,7 +1558,7 @@ class CGObjCGNUstep2 : public CGObjCGNUstep { sectionName<CategorySection>()); if (!EmittedClass) { createNullGlobal(".objc_null_cls_init_ref", NULLPtr, - sectionName<ClassReferenceSection>()); + sectionName<ClassSection>()); createNullGlobal(".objc_null_class_ref", { NULLPtr, NULLPtr }, sectionName<ClassReferenceSection>()); } @@ -3099,18 +3110,21 @@ llvm::Constant *CGObjCGNU::MakeBitField(ArrayRef<bool> bits) { return ptr; } +llvm::Constant *CGObjCGNU::GenerateCategoryProtocolList(const + ObjCCategoryDecl *OCD) { + SmallVector<std::string, 16> Protocols; + for (const auto *PD : OCD->getReferencedProtocols()) + Protocols.push_back(PD->getNameAsString()); + return GenerateProtocolList(Protocols); +} + void CGObjCGNU::GenerateCategory(const ObjCCategoryImplDecl *OCD) { const ObjCInterfaceDecl *Class = OCD->getClassInterface(); std::string ClassName = Class->getNameAsString(); std::string CategoryName = OCD->getNameAsString(); // Collect the names of referenced protocols - SmallVector<std::string, 16> Protocols; const ObjCCategoryDecl *CatDecl = OCD->getCategoryDecl(); - const ObjCList<ObjCProtocolDecl> &Protos = CatDecl->getReferencedProtocols(); - for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(), - E = Protos.end(); I != E; ++I) - Protocols.push_back((*I)->getNameAsString()); ConstantInitBuilder Builder(CGM); auto Elements = Builder.beginStruct(); @@ -3132,7 +3146,7 @@ void CGObjCGNU::GenerateCategory(const ObjCCategoryImplDecl *OCD) { GenerateMethodList(ClassName, CategoryName, ClassMethods, true), PtrTy); // Protocol list - Elements.addBitCast(GenerateProtocolList(Protocols), PtrTy); + Elements.addBitCast(GenerateCategoryProtocolList(CatDecl), PtrTy); if (isRuntime(ObjCRuntime::GNUstep, 2)) { const ObjCCategoryDecl *Category = Class->FindCategoryDeclaration(OCD->getIdentifier()); @@ -3541,12 +3555,16 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { ConstantInitBuilder builder(CGM); auto selectors = builder.beginArray(selStructTy); auto &table = SelectorTable; // MSVC workaround - for (auto &entry : table) { + std::vector<Selector> allSelectors; + for (auto &entry : table) + allSelectors.push_back(entry.first); + llvm::sort(allSelectors); - std::string selNameStr = entry.first.getAsString(); + for (auto &untypedSel : allSelectors) { + std::string selNameStr = untypedSel.getAsString(); llvm::Constant *selName = ExportUniqueString(selNameStr, ".objc_sel_name"); - for (TypedSelector &sel : entry.second) { + for (TypedSelector &sel : table[untypedSel]) { llvm::Constant *selectorTypeEncoding = NULLPtr; if (!sel.first.empty()) selectorTypeEncoding = |
