Hi Saleem I just realize there can be an issue with this commit. This breaks the bitcode compatibility when LTO linking bitcode file produced by llvm-5.0 vs the older versions. Because the objc related module flag has the behavior Module::Error, simple whitespace changes will cause libLTO to error upon seeing different values.
I wish I caught this earlier so we can fix the issue before 5.0 released. Maybe we need another bitcode upgrade path to strip away all the whitespaces in "Objective-C Image Info Section" module flag? Steven > On Jun 3, 2017, at 9:18 AM, Saleem Abdulrasool via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > > Author: compnerd > Date: Sat Jun 3 11:18:09 2017 > New Revision: 304661 > > URL: http://llvm.org/viewvc/llvm-project?rev=304661&view=rev > Log: > CodeGen: fix section names for different file formats > > This changes the codegen to match the section names according to the > ObjC rewriter as well as the runtime. The changes to the test are > simply whitespace changes to the section attributes and names and are > functionally equivalent (the whitespace is ignored by the linker). > > Added: > cfe/trunk/test/CodeGenObjC/sections.m > Modified: > cfe/trunk/lib/CodeGen/CGObjCMac.cpp > cfe/trunk/test/CodeGenObjC/exceptions-asm-attribute.m > cfe/trunk/test/CodeGenObjC/image-info.m > cfe/trunk/test/CodeGenObjC/metadata-symbols-64.m > cfe/trunk/test/CodeGenObjC/metadata_symbols.m > cfe/trunk/test/CodeGenObjC/non-lazy-classes.m > > Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=304661&r1=304660&r2=304661&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Sat Jun 3 11:18:09 2017 > @@ -1004,6 +1004,8 @@ protected: > const ObjCInterfaceDecl *ID, > ObjCCommonTypesHelper &ObjCTypes); > > + std::string GetSectionName(StringRef Section, StringRef MachOAttributes); > + > public: > /// CreateMetadataVar - Create a global variable with internal > /// linkage for use by the Objective-C runtime. > @@ -4786,6 +4788,27 @@ llvm::Value *CGObjCMac::EmitIvarOffset(C > > /* *** Private Interface *** */ > > +std::string CGObjCCommonMac::GetSectionName(StringRef Section, > + StringRef MachOAttributes) { > + switch (CGM.getTriple().getObjectFormat()) { > + default: > + llvm_unreachable("unexpected object file format"); > + case llvm::Triple::MachO: { > + if (MachOAttributes.empty()) > + return ("__DATA," + Section).str(); > + return ("__DATA," + Section + "," + MachOAttributes).str(); > + } > + case llvm::Triple::ELF: > + assert(Section.substr(0, 2) == "__" && > + "expected the name to begin with __"); > + return Section.substr(2).str(); > + case llvm::Triple::COFF: > + assert(Section.substr(0, 2) == "__" && > + "expected the name to begin with __"); > + return ("." + Section.substr(2) + "$B").str(); > + } > +} > + > /// EmitImageInfo - Emit the image info marker used to encode some module > /// level information. > /// > @@ -4809,9 +4832,10 @@ enum ImageInfoFlags { > > void CGObjCCommonMac::EmitImageInfo() { > unsigned version = 0; // Version is unused? > - const char *Section = (ObjCABI == 1) ? > - "__OBJC, __image_info,regular" : > - "__DATA, __objc_imageinfo, regular, no_dead_strip"; > + std::string Section = > + (ObjCABI == 1) > + ? "__OBJC,__image_info,regular" > + : GetSectionName("__objc_imageinfo", "regular,no_dead_strip"); > > // Generate module-level named metadata to convey this information to the > // linker and code-gen. > @@ -4822,7 +4846,7 @@ void CGObjCCommonMac::EmitImageInfo() { > Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Version", > version); > Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Section", > - llvm::MDString::get(VMContext,Section)); > + llvm::MDString::get(VMContext, Section)); > > if (CGM.getLangOpts().getGC() == LangOptions::NonGC) { > // Non-GC overrides those files which specify GC. > @@ -5930,17 +5954,21 @@ void CGObjCNonFragileABIMac::FinishNonFr > } > > AddModuleClassList(DefinedClasses, "OBJC_LABEL_CLASS_$", > - "__DATA, __objc_classlist, regular, no_dead_strip"); > + GetSectionName("__objc_classlist", > + "regular,no_dead_strip")); > > AddModuleClassList(DefinedNonLazyClasses, "OBJC_LABEL_NONLAZY_CLASS_$", > - "__DATA, __objc_nlclslist, regular, no_dead_strip"); > + GetSectionName("__objc_nlclslist", > + "regular,no_dead_strip")); > > // Build list of all implemented category addresses in array > // L_OBJC_LABEL_CATEGORY_$. > AddModuleClassList(DefinedCategories, "OBJC_LABEL_CATEGORY_$", > - "__DATA, __objc_catlist, regular, no_dead_strip"); > + GetSectionName("__objc_catlist", > + "regular,no_dead_strip")); > AddModuleClassList(DefinedNonLazyCategories, > "OBJC_LABEL_NONLAZY_CATEGORY_$", > - "__DATA, __objc_nlcatlist, regular, no_dead_strip"); > + GetSectionName("__objc_nlcatlist", > + "regular,no_dead_strip")); > > EmitImageInfo(); > } > @@ -6359,7 +6387,8 @@ llvm::Value *CGObjCNonFragileABIMac::Gen > llvm::GlobalValue::WeakAnyLinkage, > Init, > ProtocolName); > - PTGV->setSection("__DATA, __objc_protorefs, coalesced, no_dead_strip"); > + PTGV->setSection(GetSectionName("__objc_protorefs", > + "coalesced,no_dead_strip")); > PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility); > PTGV->setAlignment(Align.getQuantity()); > CGM.addCompilerUsedGlobal(PTGV); > @@ -6818,8 +6847,8 @@ llvm::Constant *CGObjCNonFragileABIMac:: > PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolRef)); > PTGV->setAlignment( > CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy)); > - if (CGM.getTriple().isOSBinFormatMachO()) > - PTGV->setSection("__DATA, __objc_protolist, coalesced, no_dead_strip"); > + PTGV->setSection(GetSectionName("__objc_protolist", > + "coalesced,no_dead_strip")); > PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility); > CGM.addCompilerUsedGlobal(PTGV); > return Entry; > @@ -7015,7 +7044,7 @@ CGObjCNonFragileABIMac::EmitVTableMessag > /*constant*/ false, > llvm::GlobalValue::WeakAnyLinkage); > messageRef->setVisibility(llvm::GlobalValue::HiddenVisibility); > - messageRef->setSection("__DATA, __objc_msgrefs, coalesced"); > + messageRef->setSection(GetSectionName("__objc_msgrefs", "coalesced")); > } > > bool requiresnullCheck = false; > @@ -7126,7 +7155,8 @@ CGObjCNonFragileABIMac::EmitClassRefFrom > false, llvm::GlobalValue::PrivateLinkage, > ClassGV, "OBJC_CLASSLIST_REFERENCES_$_"); > Entry->setAlignment(Align.getQuantity()); > - Entry->setSection("__DATA, __objc_classrefs, regular, no_dead_strip"); > + Entry->setSection(GetSectionName("__objc_classrefs", > + "regular,no_dead_strip")); > CGM.addCompilerUsedGlobal(Entry); > } > return CGF.Builder.CreateAlignedLoad(Entry, Align); > @@ -7160,7 +7190,8 @@ CGObjCNonFragileABIMac::EmitSuperClassRe > false, llvm::GlobalValue::PrivateLinkage, > ClassGV, "OBJC_CLASSLIST_SUP_REFS_$_"); > Entry->setAlignment(Align.getQuantity()); > - Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip"); > + Entry->setSection(GetSectionName("__objc_superrefs", > + "regular,no_dead_strip")); > CGM.addCompilerUsedGlobal(Entry); > } > return CGF.Builder.CreateAlignedLoad(Entry, Align); > @@ -7182,7 +7213,8 @@ llvm::Value *CGObjCNonFragileABIMac::Emi > MetaClassGV, > "OBJC_CLASSLIST_SUP_REFS_$_"); > Entry->setAlignment(Align.getQuantity()); > > - Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip"); > + Entry->setSection(GetSectionName("__objc_superrefs", > + "regular,no_dead_strip")); > CGM.addCompilerUsedGlobal(Entry); > } > > @@ -7278,7 +7310,8 @@ Address CGObjCNonFragileABIMac::EmitSele > false, llvm::GlobalValue::PrivateLinkage, > Casted, "OBJC_SELECTOR_REFERENCES_"); > Entry->setExternallyInitialized(true); > - Entry->setSection("__DATA, __objc_selrefs, literal_pointers, > no_dead_strip"); > + Entry->setSection(GetSectionName("__objc_selrefs", > + "literal_pointers,no_dead_strip")); > Entry->setAlignment(Align.getQuantity()); > CGM.addCompilerUsedGlobal(Entry); > } > > Modified: cfe/trunk/test/CodeGenObjC/exceptions-asm-attribute.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/exceptions-asm-attribute.m?rev=304661&r1=304660&r2=304661&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/exceptions-asm-attribute.m (original) > +++ cfe/trunk/test/CodeGenObjC/exceptions-asm-attribute.m Sat Jun 3 11:18:09 > 2017 > @@ -15,7 +15,7 @@ > // CHECK-X86_64: @"OBJC_EHTYPE_$_MySecretNamespace.EH1" = weak global {{.*}}, > align 8 > // CHECK-X86_64: @"OBJC_EHTYPE_$_MySecretNamespace.EH2" = external global > // CHECK-X86_64: @"OBJC_EHTYPE_$_MySecretNamespace.EH3" = global {{.*}}, > section "__DATA,__objc_const", align 8 > -// CHECK-X86_64: @"OBJC_LABEL_CLASS_$" = private global {{.*}}, section > "__DATA, __objc_classlist, regular, no_dead_strip", align 8 > +// CHECK-X86_64: @"OBJC_LABEL_CLASS_$" = private global {{.*}}, section > "__DATA,__objc_classlist,regular,no_dead_strip", align 8 > // CHECK-X86_64: define internal void @"\01-[A im0]" > // CHECK-X86_64: define internal void @"\01-[A(Cat) im1]" > > @@ -39,7 +39,7 @@ > // CHECK-ARMV6: @"OBJC_EHTYPE_$_MySecretNamespace.EH1" = weak global {{.*}}, > align 4 > // CHECK-ARMV6: @"OBJC_EHTYPE_$_MySecretNamespace.EH2" = external global > // CHECK-ARMV6: @"OBJC_EHTYPE_$_MySecretNamespace.EH3" = global {{.*}}, > section "__DATA,__objc_const", align 4 > -// CHECK-ARMV6: @"OBJC_LABEL_CLASS_$" = private global {{.*}}, section > "__DATA, __objc_classlist, regular, no_dead_strip", align 4 > +// CHECK-ARMV6: @"OBJC_LABEL_CLASS_$" = private global {{.*}}, section > "__DATA,__objc_classlist,regular,no_dead_strip", align 4 > // CHECK-ARMV6: define internal void @"\01-[A im0]" > // CHECK-ARMV6: define internal void @"\01-[A(Cat) im1]" > > > Modified: cfe/trunk/test/CodeGenObjC/image-info.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/image-info.m?rev=304661&r1=304660&r2=304661&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/image-info.m (original) > +++ cfe/trunk/test/CodeGenObjC/image-info.m Sat Jun 3 11:18:09 2017 > @@ -7,11 +7,11 @@ > // CHECK-FRAGILE: !llvm.module.flags = !{{{.*}}} > // CHECK-FRAGILE: !{{[0-9]+}} = !{i32 1, !"Objective-C Version", i32 1} > // CHECK-FRAGILE-NEXT: !{{[0-9]+}} = !{i32 1, !"Objective-C Image Info > Version", i32 0} > -// CHECK-FRAGILE-NEXT: !{{[0-9]+}} = !{i32 1, !"Objective-C Image Info > Section", !"__OBJC, __image_info,regular"} > +// CHECK-FRAGILE-NEXT: !{{[0-9]+}} = !{i32 1, !"Objective-C Image Info > Section", !"__OBJC,__image_info,regular"} > // CHECK-FRAGILE-NEXT: !{{[0-9]+}} = !{i32 4, !"Objective-C Garbage > Collection", i32 0} > > // CHECK-NONFRAGILE: !llvm.module.flags = !{{{.*}}} > // CHECK-NONFRAGILE: !{{[0-9]+}} = !{i32 1, !"Objective-C Version", i32 > 2} > // CHECK-NONFRAGILE-NEXT: !{{[0-9]+}} = !{i32 1, !"Objective-C Image Info > Version", i32 0} > -// CHECK-NONFRAGILE-NEXT: !{{[0-9]+}} = !{i32 1, !"Objective-C Image Info > Section", !"__DATA, __objc_imageinfo, regular, no_dead_strip"} > +// CHECK-NONFRAGILE-NEXT: !{{[0-9]+}} = !{i32 1, !"Objective-C Image Info > Section", !"__DATA,__objc_imageinfo,regular,no_dead_strip"} > // CHECK-NONFRAGILE-NEXT: !{{[0-9]+}} = !{i32 4, !"Objective-C Garbage > Collection", i32 0} > > Modified: cfe/trunk/test/CodeGenObjC/metadata-symbols-64.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/metadata-symbols-64.m?rev=304661&r1=304660&r2=304661&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/metadata-symbols-64.m (original) > +++ cfe/trunk/test/CodeGenObjC/metadata-symbols-64.m Sat Jun 3 11:18:09 2017 > @@ -12,7 +12,7 @@ > // CHECK: @"\01l_OBJC_$_PROTOCOL_INSTANCE_METHODS_P" = private global {{.*}} > section "__DATA, __objc_const", align 8 > // CHECK: @"\01l_OBJC_$_PROTOCOL_CLASS_METHODS_P" = private global {{.*}} > section "__DATA, __objc_const", align 8 > // CHECK: @"\01l_OBJC_PROTOCOL_$_P" = weak hidden global {{.*}}, align 8 > -// CHECK: @"\01l_OBJC_LABEL_PROTOCOL_$_P" = weak hidden global {{.*}} > section "__DATA, __objc_protolist, coalesced, no_dead_strip", align 8 > +// CHECK: @"\01l_OBJC_LABEL_PROTOCOL_$_P" = weak hidden global {{.*}} > section "__DATA,__objc_protolist,coalesced,no_dead_strip", align 8 > // CHECK: @"\01l_OBJC_CLASS_PROTOCOLS_$_A" = private global {{.*}} section > "__DATA, __objc_const", align 8 > // CHECK: @"\01l_OBJC_METACLASS_RO_$_A" = private global {{.*}} section > "__DATA, __objc_const", align 8 > // CHECK: @"\01l_OBJC_$_INSTANCE_METHODS_A" = private global {{.*}} section > "__DATA, __objc_const", align 8 > @@ -23,14 +23,14 @@ > // CHECK: @"\01l_OBJC_$_CATEGORY_INSTANCE_METHODS_A_$_Cat" = private global > {{.*}} section "__DATA, __objc_const", align 8 > // CHECK: @"\01l_OBJC_$_CATEGORY_CLASS_METHODS_A_$_Cat" = private global > {{.*}} section "__DATA, __objc_const", align 8 > // CHECK: @"\01l_OBJC_$_CATEGORY_A_$_Cat" = private global {{.*}} section > "__DATA, __objc_const", align 8 > -// CHECK: @"OBJC_CLASSLIST_SUP_REFS_$_{{[0-9]*}}" = private global {{.*}} > section "__DATA, __objc_superrefs, regular, no_dead_strip", align 8 > -// CHECK: @OBJC_SELECTOR_REFERENCES_ = private externally_initialized global > {{.*}} section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip" > -// CHECK: @"OBJC_CLASSLIST_SUP_REFS_$_{{[\.0-9]*}}" = private global {{.*}} > section "__DATA, __objc_superrefs, regular, no_dead_strip", align 8 > +// CHECK: @"OBJC_CLASSLIST_SUP_REFS_$_{{[0-9]*}}" = private global {{.*}} > section "__DATA,__objc_superrefs,regular,no_dead_strip", align 8 > +// CHECK: @OBJC_SELECTOR_REFERENCES_ = private externally_initialized global > {{.*}} section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip" > +// CHECK: @"OBJC_CLASSLIST_SUP_REFS_$_{{[\.0-9]*}}" = private global {{.*}} > section "__DATA,__objc_superrefs,regular,no_dead_strip", align 8 > // CHECK: @"OBJC_CLASS_$_B" = external global > -// CHECK: @"OBJC_CLASSLIST_REFERENCES_$_{{[0-9]*}}" = private global {{.*}} > section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8 > -// CHECK: @"\01l_objc_msgSend_fixup_alloc" = weak hidden global {{.*}} > section "__DATA, __objc_msgrefs, coalesced", align 16 > -// CHECK: @"OBJC_LABEL_CLASS_$" = private global {{.*}} section "__DATA, > __objc_classlist, regular, no_dead_strip", align 8 > -// CHECK: @"OBJC_LABEL_CATEGORY_$" = private global {{.*}} section "__DATA, > __objc_catlist, regular, no_dead_strip", align 8 > +// CHECK: @"OBJC_CLASSLIST_REFERENCES_$_{{[0-9]*}}" = private global {{.*}} > section "__DATA,__objc_classrefs,regular,no_dead_strip", align 8 > +// CHECK: @"\01l_objc_msgSend_fixup_alloc" = weak hidden global {{.*}} > section "__DATA,__objc_msgrefs,coalesced", align 16 > +// CHECK: @"OBJC_LABEL_CLASS_$" = private global {{.*}} section > "__DATA,__objc_classlist,regular,no_dead_strip", align 8 > +// CHECK: @"OBJC_LABEL_CATEGORY_$" = private global {{.*}} section > "__DATA,__objc_catlist,regular,no_dead_strip", align 8 > // CHECK: @objc_msgSend_fpret( > // CHECK: @objc_msgSend_fixup( > > > Modified: cfe/trunk/test/CodeGenObjC/metadata_symbols.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/metadata_symbols.m?rev=304661&r1=304660&r2=304661&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/metadata_symbols.m (original) > +++ cfe/trunk/test/CodeGenObjC/metadata_symbols.m Sat Jun 3 11:18:09 2017 > @@ -14,7 +14,7 @@ > // CHECK-X86_64: @"OBJC_EHTYPE_$_EH1" = weak global {{.*}}, align 8 > // CHECK-X86_64: @"OBJC_EHTYPE_$_EH2" = external global > // CHECK-X86_64: @"OBJC_EHTYPE_$_EH3" = global {{.*}}, section > "__DATA,__objc_const", align 8 > -// CHECK-X86_64: @"OBJC_LABEL_CLASS_$" = private global {{.*}}, section > "__DATA, __objc_classlist, regular, no_dead_strip", align 8 > +// CHECK-X86_64: @"OBJC_LABEL_CLASS_$" = private global {{.*}}, section > "__DATA,__objc_classlist,regular,no_dead_strip", align 8 > // CHECK-X86_64: define internal void @"\01-[A im0]" > // CHECK-X86_64: define internal void @"\01-[A(Cat) im1]" > > @@ -38,7 +38,7 @@ > // CHECK-ARMV6: @"OBJC_EHTYPE_$_EH1" = weak global {{.*}}, align 4 > // CHECK-ARMV6: @"OBJC_EHTYPE_$_EH2" = external global > // CHECK-ARMV6: @"OBJC_EHTYPE_$_EH3" = global {{.*}}, section > "__DATA,__objc_const", align 4 > -// CHECK-ARMV6: @"OBJC_LABEL_CLASS_$" = private global {{.*}}, section > "__DATA, __objc_classlist, regular, no_dead_strip", align 4 > +// CHECK-ARMV6: @"OBJC_LABEL_CLASS_$" = private global {{.*}}, section > "__DATA,__objc_classlist,regular,no_dead_strip", align 4 > // CHECK-ARMV6: define internal void @"\01-[A im0]" > // CHECK-ARMV6: define internal void @"\01-[A(Cat) im1]" > > > Modified: cfe/trunk/test/CodeGenObjC/non-lazy-classes.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/non-lazy-classes.m?rev=304661&r1=304660&r2=304661&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/non-lazy-classes.m (original) > +++ cfe/trunk/test/CodeGenObjC/non-lazy-classes.m Sat Jun 3 11:18:09 2017 > @@ -1,7 +1,7 @@ > // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | \ > // RUN: FileCheck %s > -// CHECK: @"OBJC_LABEL_NONLAZY_CLASS_$" = private global [1 x {{.*}}] > {{.*}}@"OBJC_CLASS_$_A"{{.*}}, section "__DATA, __objc_nlclslist, regular, > no_dead_strip", align 8 > -// CHECK: @"OBJC_LABEL_NONLAZY_CATEGORY_$" = private global [1 x {{.*}}] > {{.*}}@"\01l_OBJC_$_CATEGORY_A_$_Cat"{{.*}}, section "__DATA, > __objc_nlcatlist, regular, no_dead_strip", align 8 > +// CHECK: @"OBJC_LABEL_NONLAZY_CLASS_$" = private global [1 x {{.*}}] > {{.*}}@"OBJC_CLASS_$_A"{{.*}}, section > "__DATA,__objc_nlclslist,regular,no_dead_strip", align 8 > +// CHECK: @"OBJC_LABEL_NONLAZY_CATEGORY_$" = private global [1 x {{.*}}] > {{.*}}@"\01l_OBJC_$_CATEGORY_A_$_Cat"{{.*}}, section > "__DATA,__objc_nlcatlist,regular,no_dead_strip", align 8 > > @interface A @end > @implementation A > > Added: cfe/trunk/test/CodeGenObjC/sections.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/sections.m?rev=304661&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/sections.m (added) > +++ cfe/trunk/test/CodeGenObjC/sections.m Sat Jun 3 11:18:09 2017 > @@ -0,0 +1,72 @@ > +// RUN: %clang_cc1 -triple x86_64-unknown-windows > -fobjc-dispatch-method=mixed -fobjc-runtime=ios -emit-llvm -o - %s | > FileCheck %s -check-prefix CHECK-COFF > +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu > -fobjc-dispatch-method=mixed -fobjc-runtime=ios -emit-llvm -o - %s | > FileCheck %s -check-prefix CHECK-ELF > +// RUN: %clang_cc1 -triple x86_64-apple-ios -fobjc-dispatch-method=mixed > -fobjc-runtime=ios -emit-llvm -o - %s | FileCheck %s -check-prefix CHECK-MACHO > + > +__attribute__((__objc_root_class__)) > +@interface NSObject > ++ (void)load; > ++ (id)class; > +@end > + > +@protocol P > +@end > + > +@interface I<P> : NSObject > ++ (void)load; > +@end > + > +@implementation I > ++ (void)load; { } > +@end > + > +@implementation I(C) > ++ (void)load; { > + [super load]; > +} > +@end > + > +@interface J : NSObject > +- (void)m; > +@end > + > +_Bool f(J *j) { > + [j m]; > + return [I class] == @protocol(P); > +} > + > +// CHECK-COFF: @"OBJC_CLASSLIST_SUP_REFS_$_" = {{.*}}, section > ".objc_superrefs$B" > +// CHECK-COFF: @OBJC_SELECTOR_REFERENCES_ = {{.*}}, section ".objc_selrefs$B" > +// CHECK-COFF: @"OBJC_CLASSLIST_REFERENCES_$_" = {{.*}}, section > ".objc_classrefs$B" > +// CHECK-COFF: @"\01l_objc_msgSend_fixup_class" = {{.*}}, section > ".objc_msgrefs$B" > +// CHECK-COFF: @"\01l_OBJC_LABEL_PROTOCOL_$_P" = {{.*}}, section > ".objc_protolist$B" > +// CHECK-COFF: @"\01l_OBJC_PROTOCOL_REFERENCE_$_P" = {{.*}}, section > ".objc_protorefs$B" > +// CHECK-COFF: @"OBJC_LABEL_CLASS_$" = {{.*}}, section ".objc_classlist$B" > +// CHECK-COFF: @"OBJC_LABEL_NONLAZY_CLASS_$" = {{.*}}, section > ".objc_nlclslist$B" > +// CHECK-COFF: @"OBJC_LABEL_CATEGORY_$" = {{.*}}, section ".objc_catlist$B" > +// CHECK-COFF: @"OBJC_LABEL_NONLAZY_CATEGORY_$" = {{.*}}, section > ".objc_nlcatlist$B" > +// CHECK-COFF: !{{[0-9]+}} = !{i32 1, !"Objective-C Image Info Section", > !".objc_imageinfo$B"} > + > +// CHECK-ELF: @"OBJC_CLASSLIST_SUP_REFS_$_" = {{.*}}, section > "objc_superrefs" > +// CHECK-ELF: @OBJC_SELECTOR_REFERENCES_ = {{.*}}, section "objc_selrefs" > +// CHECK-ELF: @"OBJC_CLASSLIST_REFERENCES_$_" = {{.*}}, section > "objc_classrefs" > +// CHECK-ELF: @"\01l_objc_msgSend_fixup_class" = {{.*}}, section > "objc_msgrefs" > +// CHECK-ELF: @"\01l_OBJC_LABEL_PROTOCOL_$_P" = {{.*}}, section > "objc_protolist" > +// CHECK-ELF: @"\01l_OBJC_PROTOCOL_REFERENCE_$_P" = {{.*}}, section > "objc_protorefs" > +// CHECK-ELF: @"OBJC_LABEL_CLASS_$" = {{.*}}, section "objc_classlist" > +// CHECK-ELF: @"OBJC_LABEL_NONLAZY_CLASS_$" = {{.*}}, section > "objc_nlclslist" > +// CHECK-ELF: @"OBJC_LABEL_CATEGORY_$" = {{.*}}, section "objc_catlist" > +// CHECK-ELF: @"OBJC_LABEL_NONLAZY_CATEGORY_$" = {{.*}}, section > "objc_nlcatlist" > +// CHECK-ELF: !{{[0-9]+}} = !{i32 1, !"Objective-C Image Info Section", > !"objc_imageinfo"} > + > +// CHECK-MACHO: @"OBJC_CLASSLIST_SUP_REFS_$_" = {{.*}}, section > "__DATA,__objc_superrefs,regular,no_dead_strip" > +// CHECK-MACHO: @OBJC_SELECTOR_REFERENCES_ = {{.*}}, section > "__DATA,__objc_selrefs,literal_pointers,no_dead_strip" > +// CHECK-MACHO: @"OBJC_CLASSLIST_REFERENCES_$_" = {{.*}}, section > "__DATA,__objc_classrefs,regular,no_dead_strip" > +// CHECK-MACHO: @"\01l_objc_msgSend_fixup_class" = {{.*}}, section > "__DATA,__objc_msgrefs,coalesced" > +// CHECK-MACHO: @"\01l_OBJC_LABEL_PROTOCOL_$_P" = {{.*}}, section > "__DATA,__objc_protolist,coalesced,no_dead_strip" > +// CHECK-MACHO: @"\01l_OBJC_PROTOCOL_REFERENCE_$_P" = {{.*}}, section > "__DATA,__objc_protorefs,coalesced,no_dead_strip" > +// CHECK-MACHO: @"OBJC_LABEL_CLASS_$" = {{.*}}, section > "__DATA,__objc_classlist,regular,no_dead_strip" > +// CHECK-MACHO: @"OBJC_LABEL_NONLAZY_CLASS_$" = {{.*}}, section > "__DATA,__objc_nlclslist,regular,no_dead_strip" > +// CHECK-MACHO: @"OBJC_LABEL_CATEGORY_$" = {{.*}}, section > "__DATA,__objc_catlist,regular,no_dead_strip" > +// CHECK-MACHO: @"OBJC_LABEL_NONLAZY_CATEGORY_$" = {{.*}}, section > "__DATA,__objc_nlcatlist,regular,no_dead_strip" > +// CHECK-MACHO: !{{[0-9]+}} = !{i32 1, !"Objective-C Image Info Section", > !"__DATA,__objc_imageinfo,regular,no_dead_strip"} > + > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits