Recognize class's visibility attribute and set its linkage
to private extern (in objc2 nonfragile abi).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63460 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index b5e3804..7f58570 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -573,7 +573,8 @@
llvm::GlobalVariable * BuildClassMetaData(std::string &ClassName,
llvm::Constant *IsAGV,
llvm::Constant *SuperClassGV,
- llvm::Constant *ClassRoGV);
+ llvm::Constant *ClassRoGV,
+ bool HiddenVisibility);
llvm::Constant *GetMethodConstant(const ObjCMethodDecl *MD);
@@ -3361,7 +3362,8 @@
std::string &ClassName,
llvm::Constant *IsAGV,
llvm::Constant *SuperClassGV,
- llvm::Constant *ClassRoGV) {
+ llvm::Constant *ClassRoGV,
+ bool HiddenVisibility) {
std::vector<llvm::Constant*> Values(5);
Values[0] = IsAGV;
Values[1] = SuperClassGV
@@ -3384,6 +3386,8 @@
&CGM.getModule());
GV->setSection("__DATA, __objc_const");
GV->setAlignment(GetPointerAlign());
+ if (HiddenVisibility)
+ GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
UsedGlobals.push_back(GV);
return GV;
}
@@ -3421,7 +3425,8 @@
llvm::GlobalVariable *SuperClassGV, *IsAGV;
- if (IsClassHidden(ID->getClassInterface()))
+ bool classIsHidden = IsClassHidden(ID->getClassInterface());
+ if (classIsHidden)
flags |= OBJC2_CLS_HIDDEN;
if (!ID->getClassInterface()->getSuperClass()) {
// class is root
@@ -3467,11 +3472,12 @@
InstanceSize,ID);
std::string TClassName = ObjCMetaClassName + ClassName;
llvm::GlobalVariable *MetaTClass =
- BuildClassMetaData(TClassName, IsAGV, SuperClassGV, CLASS_RO_GV);
+ BuildClassMetaData(TClassName, IsAGV, SuperClassGV, CLASS_RO_GV,
+ classIsHidden);
// Metadata for the class
flags = CLS;
- if (IsClassHidden(ID->getClassInterface()))
+ if (classIsHidden)
flags |= OBJC2_CLS_HIDDEN;
if (!ID->getClassInterface()->getSuperClass()) {
flags |= CLS_ROOT;
@@ -3532,7 +3538,8 @@
TClassName = ObjCClassName + ClassName;
llvm::GlobalVariable *ClassMD =
- BuildClassMetaData(TClassName, MetaTClass, SuperClassGV, CLASS_RO_GV);
+ BuildClassMetaData(TClassName, MetaTClass, SuperClassGV, CLASS_RO_GV,
+ classIsHidden);
DefinedClasses.push_back(ClassMD);
}
@@ -3745,6 +3752,11 @@
Ivar->getAccessControl() == ObjCIvarDecl::Protected);
if (!globalVisibility)
IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
+ else
+ if (const ObjCInterfaceDecl *OID = ID->getClassInterface())
+ if (IsClassHidden(OID))
+ IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
+
IvarOffsetGV->setSection("__DATA, __objc_const");
UsedGlobals.push_back(IvarOffsetGV);