diff options
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 10 | ||||
-rw-r--r-- | lib/CodeGen/CGRTTI.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 75 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.h | 5 |
5 files changed, 18 insertions, 76 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 961233aab6..02cd8f89a2 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -180,7 +180,7 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl, } // Finally, set up the alias with its proper name and attributes. - SetCommonAttributes(AliasDecl.getDecl(), Alias); + SetCommonAttributes(cast<NamedDecl>(AliasDecl.getDecl()), Alias); return false; } diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 9ed3733a66..098157474b 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -2197,7 +2197,7 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) { CGM.getContext().getASTObjCImplementationLayout(ID).getSize() / 8; // FIXME: Set CXX-structors flag. - if (CGM.getDeclVisibilityMode(ID->getClassInterface()) == LangOptions::Hidden) + if (ID->getClassInterface()->getVisibility() == HiddenVisibility) Flags |= eClassFlags_Hidden; std::vector<llvm::Constant*> InstanceMethods, ClassMethods; @@ -2282,7 +2282,7 @@ llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID, unsigned Flags = eClassFlags_Meta; unsigned Size = CGM.getTargetData().getTypeAllocSize(ObjCTypes.ClassTy); - if (CGM.getDeclVisibilityMode(ID->getClassInterface()) == LangOptions::Hidden) + if (ID->getClassInterface()->getVisibility() == HiddenVisibility) Flags |= eClassFlags_Hidden; std::vector<llvm::Constant*> Values(12); @@ -4968,7 +4968,7 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) { llvm::GlobalVariable *SuperClassGV, *IsAGV; bool classIsHidden = - CGM.getDeclVisibilityMode(ID->getClassInterface()) == LangOptions::Hidden; + ID->getClassInterface()->getVisibility() == HiddenVisibility; if (classIsHidden) flags |= OBJC2_CLS_HIDDEN; if (ID->getNumIvarInitializers()) @@ -5263,7 +5263,7 @@ CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID, // well (i.e., in ObjCIvarOffsetVariable). if (Ivar->getAccessControl() == ObjCIvarDecl::Private || Ivar->getAccessControl() == ObjCIvarDecl::Package || - CGM.getDeclVisibilityMode(ID) == LangOptions::Hidden) + ID->getVisibility() == HiddenVisibility) IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility); else IvarOffsetGV->setVisibility(llvm::GlobalValue::DefaultVisibility); @@ -6237,7 +6237,7 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID, ID->getIdentifier()->getName())); } - if (CGM.getLangOptions().getVisibilityMode() == LangOptions::Hidden) + if (CGM.getLangOptions().getVisibilityMode() == HiddenVisibility) Entry->setVisibility(llvm::GlobalValue::HiddenVisibility); Entry->setAlignment(CGM.getTargetData().getABITypeAlignment( ObjCTypes.EHTypeTy)); diff --git a/lib/CodeGen/CGRTTI.cpp b/lib/CodeGen/CGRTTI.cpp index 2659bd0821..6dad2a044e 100644 --- a/lib/CodeGen/CGRTTI.cpp +++ b/lib/CodeGen/CGRTTI.cpp @@ -113,7 +113,7 @@ public: } if (const RecordType *RT = Ty->getAs<RecordType>()) if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) - return CGM.getDeclVisibilityMode(RD) == LangOptions::Hidden; + return RD->getVisibility() == HiddenVisibility; return false; } diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 9199f6cfbd..d35965e2c4 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -164,81 +164,23 @@ void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type, getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg; } -LangOptions::VisibilityMode -CodeGenModule::getDeclVisibilityMode(const Decl *D) const { - if (const VarDecl *VD = dyn_cast<VarDecl>(D)) - if (VD->getStorageClass() == SC_PrivateExtern) - return LangOptions::Hidden; - - if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>()) { - switch (attr->getVisibility()) { - default: assert(0 && "Unknown visibility!"); - case VisibilityAttr::Default: - return LangOptions::Default; - case VisibilityAttr::Hidden: - return LangOptions::Hidden; - case VisibilityAttr::Protected: - return LangOptions::Protected; - } - } - - if (getLangOptions().CPlusPlus) { - // Entities subject to an explicit instantiation declaration get default - // visibility. - if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { - if (Function->getTemplateSpecializationKind() - == TSK_ExplicitInstantiationDeclaration) - return LangOptions::Default; - } else if (const ClassTemplateSpecializationDecl *ClassSpec - = dyn_cast<ClassTemplateSpecializationDecl>(D)) { - if (ClassSpec->getSpecializationKind() - == TSK_ExplicitInstantiationDeclaration) - return LangOptions::Default; - } else if (const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) { - if (Record->getTemplateSpecializationKind() - == TSK_ExplicitInstantiationDeclaration) - return LangOptions::Default; - } else if (const VarDecl *Var = dyn_cast<VarDecl>(D)) { - if (Var->isStaticDataMember() && - (Var->getTemplateSpecializationKind() - == TSK_ExplicitInstantiationDeclaration)) - return LangOptions::Default; - } - - // If -fvisibility-inlines-hidden was provided, then inline C++ member - // functions get "hidden" visibility by default. - if (getLangOptions().InlineVisibilityHidden) - if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) - if (Method->isInlined()) - return LangOptions::Hidden; - } - - // If this decl is contained in a class, it should have the same visibility - // as the parent class. - if (const DeclContext *DC = D->getDeclContext()) - if (DC->isRecord()) - return getDeclVisibilityMode(cast<Decl>(DC)); - - return getLangOptions().getVisibilityMode(); -} - void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, - const Decl *D) const { + const NamedDecl *D) const { // Internal definitions always have default visibility. if (GV->hasLocalLinkage()) { GV->setVisibility(llvm::GlobalValue::DefaultVisibility); return; } - switch (getDeclVisibilityMode(D)) { - default: assert(0 && "Unknown visibility!"); - case LangOptions::Default: + switch (D->getVisibility()) { + case DefaultVisibility: return GV->setVisibility(llvm::GlobalValue::DefaultVisibility); - case LangOptions::Hidden: + case HiddenVisibility: return GV->setVisibility(llvm::GlobalValue::HiddenVisibility); - case LangOptions::Protected: + case ProtectedVisibility: return GV->setVisibility(llvm::GlobalValue::ProtectedVisibility); } + llvm_unreachable("unknown visibility!"); } /// Set the symbol visibility of type information (vtable and RTTI) @@ -498,7 +440,10 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, void CodeGenModule::SetCommonAttributes(const Decl *D, llvm::GlobalValue *GV) { - setGlobalVisibility(GV, D); + if (isa<NamedDecl>(D)) + setGlobalVisibility(GV, cast<NamedDecl>(D)); + else + GV->setVisibility(llvm::GlobalValue::DefaultVisibility); if (D->hasAttr<UsedAttr>()) AddUsedGlobal(GV); diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index d050eea3f5..68898cf5d0 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -257,12 +257,9 @@ public: static void DecorateInstruction(llvm::Instruction *Inst, llvm::MDNode *TBAAInfo); - /// getDeclVisibilityMode - Compute the visibility of the decl \arg D. - LangOptions::VisibilityMode getDeclVisibilityMode(const Decl *D) const; - /// setGlobalVisibility - Set the visibility for the given LLVM /// GlobalValue. - void setGlobalVisibility(llvm::GlobalValue *GV, const Decl *D) const; + void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const; /// setTypeVisibility - Set the visibility for the given global /// value which holds information about a type. |