forked from OSchip/llvm-project
(objc2 nonfragile-abi specific). If the translation unit includes an implementation
of a subclass (direct or indirect) of a weak_import root class, emit a weak reference for the root class's metaclass (should complete radar 6815425). llvm-svn: 90249
This commit is contained in:
parent
0a2c0bcb14
commit
a6227fd896
|
@ -4134,23 +4134,19 @@ void CGObjCNonFragileABIMac::FinishNonFragileABIModule() {
|
|||
"\01L_OBJC_LABEL_CLASS_$",
|
||||
"__DATA, __objc_classlist, regular, no_dead_strip");
|
||||
|
||||
bool hasWeakImport = false;
|
||||
for (unsigned i = 0; i < DefinedClasses.size(); i++) {
|
||||
llvm::GlobalValue *IMPLGV = DefinedClasses[i];
|
||||
if (IMPLGV->getLinkage() != llvm::GlobalValue::ExternalWeakLinkage)
|
||||
continue;
|
||||
IMPLGV->setLinkage(llvm::GlobalValue::ExternalLinkage);
|
||||
hasWeakImport = true;
|
||||
}
|
||||
|
||||
if (hasWeakImport) {
|
||||
for (unsigned i = 0; i < DefinedMetaClasses.size(); i++) {
|
||||
llvm::GlobalValue *IMPLGV = DefinedMetaClasses[i];
|
||||
if (IMPLGV->getLinkage() != llvm::GlobalValue::ExternalWeakLinkage)
|
||||
continue;
|
||||
IMPLGV->setLinkage(llvm::GlobalValue::ExternalLinkage);
|
||||
}
|
||||
}
|
||||
for (unsigned i = 0; i < DefinedMetaClasses.size(); i++) {
|
||||
llvm::GlobalValue *IMPLGV = DefinedMetaClasses[i];
|
||||
if (IMPLGV->getLinkage() != llvm::GlobalValue::ExternalWeakLinkage)
|
||||
continue;
|
||||
IMPLGV->setLinkage(llvm::GlobalValue::ExternalLinkage);
|
||||
}
|
||||
|
||||
AddModuleClassList(DefinedNonLazyClasses,
|
||||
"\01L_OBJC_LABEL_NONLAZY_CLASS_$",
|
||||
|
@ -4437,9 +4433,12 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
|
|||
while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
|
||||
Root = Super;
|
||||
IsAGV = GetClassGlobal(ObjCMetaClassName + Root->getNameAsString());
|
||||
if (Root->hasAttr<WeakImportAttr>())
|
||||
IsAGV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
|
||||
// work on super class metadata symbol.
|
||||
std::string SuperClassName =
|
||||
ObjCMetaClassName + ID->getClassInterface()->getSuperClass()->getNameAsString();
|
||||
ObjCMetaClassName +
|
||||
ID->getClassInterface()->getSuperClass()->getNameAsString();
|
||||
SuperClassGV = GetClassGlobal(SuperClassName);
|
||||
if (ID->getClassInterface()->getSuperClass()->hasAttr<WeakImportAttr>())
|
||||
SuperClassGV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// RUN: clang-cc -fobjc-nonfragile-abi -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-X86-64 %s
|
||||
|
||||
__attribute__((weak_import)) @interface WeakClass
|
||||
__attribute__((weak_import)) @interface WeakRootClass @end
|
||||
|
||||
__attribute__((weak_import)) @interface WeakClass : WeakRootClass
|
||||
@end
|
||||
|
||||
@interface MySubclass : WeakClass @end
|
||||
|
@ -26,9 +28,21 @@ int main() {
|
|||
[WeakClass3 message];
|
||||
}
|
||||
|
||||
// CHECK-X86-64: OBJC_METACLASS_$_WeakRootClass" = extern_weak global
|
||||
// CHECK-X86-64: OBJC_METACLASS_$_WeakClass" = extern_weak global
|
||||
// CHECK-X86-64: OBJC_CLASS_$_WeakClass" = extern_weak global
|
||||
// CHECK-X86-64: OBJC_CLASS_$_WeakClass1" = extern_weak global
|
||||
// CHECK-X86-64: OBJC_CLASS_$_WeakClass3" = extern_weak global
|
||||
|
||||
// Root is being implemented here. No extern_weak.
|
||||
__attribute__((weak_import)) @interface Root @end
|
||||
|
||||
@interface Super : Root @end
|
||||
|
||||
@interface Sub : Super @end
|
||||
|
||||
@implementation Sub @end
|
||||
|
||||
@implementation Root @end
|
||||
|
||||
// CHECK-NOT-X86-64: OBJC_METACLASS_$_Root" = extern_weak global
|
||||
|
|
Loading…
Reference in New Issue