r203521 - Objective-C IRGen. Fixes several regressions caused by changes made
Fariborz Jahanian
fjahanian at apple.com
Mon Mar 10 17:25:05 PDT 2014
Author: fjahanian
Date: Mon Mar 10 19:25:05 2014
New Revision: 203521
URL: http://llvm.org/viewvc/llvm-project?rev=203521&view=rev
Log:
Objective-C IRGen. Fixes several regressions caused by changes made
to setting of ObjC linkages. //rdar://16206443
Added:
cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m
Modified:
cfe/trunk/lib/CodeGen/CGObjCMac.cpp
Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=203521&r1=203520&r2=203521&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Mon Mar 10 19:25:05 2014
@@ -890,6 +890,9 @@ protected:
/// DefinedClasses - List of defined classes.
SmallVector<llvm::GlobalValue*, 16> DefinedClasses;
+
+ /// ImplementedClasses - List of @implemented classes.
+ SmallVector<const ObjCInterfaceDecl*, 16> ImplementedClasses;
/// DefinedNonLazyClasses - List of defined "non-lazy" classes.
SmallVector<llvm::GlobalValue*, 16> 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 ObjC
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::EmitModuleSym
// The runtime expects exactly the list of defined classes followed
// by the list of defined categories, in a single array.
SmallVector<llvm::Constant*, 8> Symbols(NumClasses + NumCategories);
- for (unsigned i=0; i<NumClasses; i++)
+ for (unsigned i=0; i<NumClasses; i++) {
+ const ObjCInterfaceDecl *ID = ImplementedClasses[i];
+ assert(ID);
+ if (ObjCImplementationDecl *IMP = ID->getImplementation())
+ // 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; i<NumCategories; i++)
Symbols[NumClasses + i] =
llvm::ConstantExpr::getBitCast(DefinedCategories[i],
@@ -5534,6 +5546,16 @@ void CGObjCNonFragileABIMac::FinishNonFr
// Build list of all implemented class addresses in array
// L_OBJC_LABEL_CLASS_$.
+
+ for (unsigned i=0, NumClasses=ImplementedClasses.size(); i<NumClasses; i++) {
+ const ObjCInterfaceDecl *ID = ImplementedClasses[i];
+ assert(ID);
+ if (ObjCImplementationDecl *IMP = ID->getImplementation())
+ // 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::GenerateCla
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::GenerateCla
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::EmitSuperClassRe
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,
Added: cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m?rev=203521&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m (added)
+++ cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m Mon Mar 10 19:25:05 2014
@@ -0,0 +1,33 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
+// rdar://16206443
+
+ at interface NSObject
+- (void) finalize;
+ at end
+
+__attribute__((availability(macosx,introduced=9876.5)))
+ at interface MyClass : NSObject
++ (void)someClassMethod;
+- (void)someInstanceMethod;
+ at end
+
+ at implementation MyClass
++ (void)someClassMethod {
+}
+
+- (void)someInstanceMethod {
+ [MyClass someClassMethod];
+ [super finalize];
+}
+ at 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
+
More information about the cfe-commits
mailing list