From c9a92c2a8db0d3a23a57a264839ce883ce22602e Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 11 Mar 2014 00:25:05 +0000 Subject: [PATCH] Objective-C IRGen. Fixes several regressions caused by changes made to setting of ObjC linkages. //rdar://16206443 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203521 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGObjCMac.cpp | 36 +++++++++++++++++--- test/CodeGenObjC/weak-metaclass-visibility.m | 33 ++++++++++++++++++ 2 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 test/CodeGenObjC/weak-metaclass-visibility.m diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 8bc14f6483..80a0324d0c 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -890,6 +890,9 @@ protected: /// DefinedClasses - List of defined classes. SmallVector DefinedClasses; + + /// ImplementedClasses - List of @implemented classes. + SmallVector ImplementedClasses; /// DefinedNonLazyClasses - List of defined "non-lazy" classes. SmallVector DefinedNonLazyClasses; @@ -1323,7 +1326,7 @@ private: llvm::Constant *SuperClassGV, llvm::Constant *ClassRoGV, bool HiddenVisibility, - bool Weak = false); + bool Weak); llvm::Constant *GetMethodConstant(const ObjCMethodDecl *MD); @@ -3156,6 +3159,7 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) { GV = CreateMetadataVar(Name, Init, Section, 4, true); assertPrivateName(GV); DefinedClasses.push_back(GV); + ImplementedClasses.push_back(Interface); // method definition entries must be clear for next implementation. MethodDefinitions.clear(); } @@ -4404,9 +4408,17 @@ llvm::Constant *CGObjCMac::EmitModuleSymbols() { // The runtime expects exactly the list of defined classes followed // by the list of defined categories, in a single array. SmallVector Symbols(NumClasses + NumCategories); - for (unsigned i=0; igetImplementation()) + // We are implementing a weak imported interface. Give it external linkage + if (ID->isWeakImported() && !IMP->isWeakImported()) + DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); + Symbols[i] = llvm::ConstantExpr::getBitCast(DefinedClasses[i], ObjCTypes.Int8PtrTy); + } for (unsigned i=0; igetImplementation()) + // We are implementing a weak imported interface. Give it external linkage + if (ID->isWeakImported() && !IMP->isWeakImported()) + DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); + } + AddModuleClassList(DefinedClasses, "\01L_OBJC_LABEL_CLASS_$", "__DATA, __objc_classlist, regular, no_dead_strip"); @@ -5833,7 +5855,8 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) { if (!ID->getClassInterface()->getSuperClass()) { // class is root flags |= NonFragileABI_Class_Root; - SuperClassGV = GetClassGlobal(ObjCClassName + ClassName); + SuperClassGV = GetClassGlobal(ObjCClassName + ClassName, + ID->getClassInterface()->isWeakImported()); IsAGV = GetClassGlobal(ObjCMetaClassName + ClassName, ID->getClassInterface()->isWeakImported()); @@ -5906,8 +5929,10 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) { TClassName = ObjCClassName + ClassName; llvm::GlobalVariable *ClassMD = BuildClassMetaData(TClassName, MetaTClass, SuperClassGV, CLASS_RO_GV, - classIsHidden); + classIsHidden, + ID->getClassInterface()->isWeakImported()); DefinedClasses.push_back(ClassMD); + ImplementedClasses.push_back(ID->getClassInterface()); // Determine if this class is also "non-lazy". if (ImplementationIsNonLazy(ID)) @@ -6697,7 +6722,8 @@ CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF, if (!Entry) { std::string ClassName(getClassSymbolPrefix() + ID->getNameAsString()); - llvm::GlobalVariable *ClassGV = GetClassGlobal(ClassName); + llvm::GlobalVariable *ClassGV = GetClassGlobal(ClassName, + ID->isWeakImported()); Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy, false, llvm::GlobalValue::PrivateLinkage, diff --git a/test/CodeGenObjC/weak-metaclass-visibility.m b/test/CodeGenObjC/weak-metaclass-visibility.m new file mode 100644 index 0000000000..1f76197d84 --- /dev/null +++ b/test/CodeGenObjC/weak-metaclass-visibility.m @@ -0,0 +1,33 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +// rdar://16206443 + +@interface NSObject +- (void) finalize; +@end + +__attribute__((availability(macosx,introduced=9876.5))) +@interface MyClass : NSObject ++ (void)someClassMethod; +- (void)someInstanceMethod; +@end + +@implementation MyClass ++ (void)someClassMethod { +} + +- (void)someInstanceMethod { + [MyClass someClassMethod]; + [super finalize]; +} +@end + +void kit() +{ + MyClass *wrapper = [MyClass alloc]; +} + +// CHECK: @"OBJC_CLASS_$_MyClass" = global %struct._class_t +// CHECK: @"OBJC_METACLASS_$_NSObject" = external global %struct._class_t +// CHECK: @"OBJC_METACLASS_$_MyClass" = global %struct._class_t +// CHECK: @"OBJC_CLASS_$_NSObject" = external global %struct._class_t + -- 2.50.1