diff options
author | John McCall <rjmccall@apple.com> | 2014-02-08 00:41:16 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2014-02-08 00:41:16 +0000 |
commit | 8f80a61914f9b26bcc5b218331fb2179418f7889 (patch) | |
tree | 2bc390151610c494bf02a982af51e731c28615bb /clang/lib/CodeGen | |
parent | c444b5779029188a2b833a86e3c7712afc085845 (diff) | |
download | bcm5719-llvm-8f80a61914f9b26bcc5b218331fb2179418f7889.tar.gz bcm5719-llvm-8f80a61914f9b26bcc5b218331fb2179418f7889.zip |
Remove the -fhidden-weak-vtables -cc1 option. It was dead,
gross, and increasingly replaced through other mechanisms.
llvm-svn: 201011
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGRTTI.cpp | 38 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGVTT.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGVTables.cpp | 44 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 67 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 15 | ||||
-rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 4 |
7 files changed, 19 insertions, 153 deletions
diff --git a/clang/lib/CodeGen/CGRTTI.cpp b/clang/lib/CodeGen/CGRTTI.cpp index aa687b95609..351b9fc4e27 100644 --- a/clang/lib/CodeGen/CGRTTI.cpp +++ b/clang/lib/CodeGen/CGRTTI.cpp @@ -644,30 +644,20 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) { OldGV->eraseFromParent(); } - // GCC only relies on the uniqueness of the type names, not the - // type_infos themselves, so we can emit these as hidden symbols. - // But don't do this if we're worried about strict visibility - // compatibility. - if (const RecordType *RT = dyn_cast<RecordType>(Ty)) { - const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); - - CGM.setTypeVisibility(GV, RD, CodeGenModule::TVK_ForRTTI); - CGM.setTypeVisibility(TypeName, RD, CodeGenModule::TVK_ForRTTIName); - } else { - Visibility TypeInfoVisibility = DefaultVisibility; - if (CGM.getCodeGenOpts().HiddenWeakVTables && - Linkage == llvm::GlobalValue::LinkOnceODRLinkage) - TypeInfoVisibility = HiddenVisibility; - - // The type name should have the same visibility as the type itself. - Visibility ExplicitVisibility = Ty->getVisibility(); - TypeName->setVisibility(CodeGenModule:: - GetLLVMVisibility(ExplicitVisibility)); - - TypeInfoVisibility = minVisibility(TypeInfoVisibility, Ty->getVisibility()); - GV->setVisibility(CodeGenModule::GetLLVMVisibility(TypeInfoVisibility)); - } - + // Give the type_info object and name the formal visibility of the + // type itself. + Visibility formalVisibility = Ty->getVisibility(); + llvm::GlobalValue::VisibilityTypes llvmVisibility = + CodeGenModule::GetLLVMVisibility(formalVisibility); + TypeName->setVisibility(llvmVisibility); + GV->setVisibility(llvmVisibility); + + // Contra the Itanium ABI, we do not rely or guarantee strict + // address-equivalence of type_info objects. + // + // The main effect of setting this flag is that LLVM will + // automatically decrease the visibility of linkonce_odr type_info + // objects. GV->setUnnamedAddr(true); return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); diff --git a/clang/lib/CodeGen/CGVTT.cpp b/clang/lib/CodeGen/CGVTT.cpp index bca5f29d946..bd280ea14e8 100644 --- a/clang/lib/CodeGen/CGVTT.cpp +++ b/clang/lib/CodeGen/CGVTT.cpp @@ -95,7 +95,7 @@ CodeGenVTables::EmitVTTDefinition(llvm::GlobalVariable *VTT, VTT->setLinkage(Linkage); // Set the right visibility. - CGM.setTypeVisibility(VTT, RD, CodeGenModule::TVK_ForVTT); + CGM.setGlobalVisibility(VTT, RD); } llvm::GlobalVariable *CodeGenVTables::GetAddrOfVTT(const CXXRecordDecl *RD) { diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp index 35f3421fa5f..4a381a8d485 100644 --- a/clang/lib/CodeGen/CGVTables.cpp +++ b/clang/lib/CodeGen/CGVTables.cpp @@ -54,48 +54,6 @@ llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD, static void setThunkVisibility(CodeGenModule &CGM, const CXXMethodDecl *MD, const ThunkInfo &Thunk, llvm::Function *Fn) { CGM.setGlobalVisibility(Fn, MD); - - if (!CGM.getCodeGenOpts().HiddenWeakVTables) - return; - - // If the thunk has weak/linkonce linkage, but the function must be - // emitted in every translation unit that references it, then we can - // emit its thunks with hidden visibility, since its thunks must be - // emitted when the function is. - - // This follows CodeGenModule::setTypeVisibility; see the comments - // there for explanation. - - if ((Fn->getLinkage() != llvm::GlobalVariable::LinkOnceODRLinkage && - Fn->getLinkage() != llvm::GlobalVariable::WeakODRLinkage) || - Fn->getVisibility() != llvm::GlobalVariable::DefaultVisibility) - return; - - if (MD->getExplicitVisibility(ValueDecl::VisibilityForValue)) - return; - - switch (MD->getTemplateSpecializationKind()) { - case TSK_ExplicitInstantiationDefinition: - case TSK_ExplicitInstantiationDeclaration: - return; - - case TSK_Undeclared: - break; - - case TSK_ExplicitSpecialization: - case TSK_ImplicitInstantiation: - return; - break; - } - - // If there's an explicit definition, and that definition is - // out-of-line, then we can't assume that all users will have a - // definition to emit. - const FunctionDecl *Def = 0; - if (MD->hasBody(Def) && Def->isOutOfLine()) - return; - - Fn->setVisibility(llvm::GlobalValue::HiddenVisibility); } #ifndef NDEBUG @@ -626,7 +584,7 @@ CodeGenVTables::GenerateConstructionVTable(const CXXRecordDecl *RD, // Create the variable that will hold the construction vtable. llvm::GlobalVariable *VTable = CGM.CreateOrReplaceCXXRuntimeVariable(Name, ArrayType, Linkage); - CGM.setTypeVisibility(VTable, RD, CodeGenModule::TVK_ForConstructionVTable); + CGM.setGlobalVisibility(VTable, RD); // V-tables are always unnamed_addr. VTable->setUnnamedAddr(true); diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index c73e931c9d9..c0c1219f8d2 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -423,73 +423,6 @@ void CodeGenModule::setTLSMode(llvm::GlobalVariable *GV, GV->setThreadLocalMode(TLM); } -/// Set the symbol visibility of type information (vtable and RTTI) -/// associated with the given type. -void CodeGenModule::setTypeVisibility(llvm::GlobalValue *GV, - const CXXRecordDecl *RD, - TypeVisibilityKind TVK) const { - setGlobalVisibility(GV, RD); - - if (!CodeGenOpts.HiddenWeakVTables) - return; - - // We never want to drop the visibility for RTTI names. - if (TVK == TVK_ForRTTIName) - return; - - // We want to drop the visibility to hidden for weak type symbols. - // This isn't possible if there might be unresolved references - // elsewhere that rely on this symbol being visible. - - // This should be kept roughly in sync with setThunkVisibility - // in CGVTables.cpp. - - // Preconditions. - if (GV->getLinkage() != llvm::GlobalVariable::LinkOnceODRLinkage || - GV->getVisibility() != llvm::GlobalVariable::DefaultVisibility) - return; - - // Don't override an explicit visibility attribute. - if (RD->getExplicitVisibility(NamedDecl::VisibilityForType)) - return; - - switch (RD->getTemplateSpecializationKind()) { - // We have to disable the optimization if this is an EI definition - // because there might be EI declarations in other shared objects. - case TSK_ExplicitInstantiationDefinition: - case TSK_ExplicitInstantiationDeclaration: - return; - - // Every use of a non-template class's type information has to emit it. - case TSK_Undeclared: - break; - - // In theory, implicit instantiations can ignore the possibility of - // an explicit instantiation declaration because there necessarily - // must be an EI definition somewhere with default visibility. In - // practice, it's possible to have an explicit instantiation for - // an arbitrary template class, and linkers aren't necessarily able - // to deal with mixed-visibility symbols. - case TSK_ExplicitSpecialization: - case TSK_ImplicitInstantiation: - return; - } - - // If there's a key function, there may be translation units - // that don't have the key function's definition. But ignore - // this if we're emitting RTTI under -fno-rtti. - if (!(TVK != TVK_ForRTTI) || LangOpts.RTTI) { - // FIXME: what should we do if we "lose" the key function during - // the emission of the file? - if (Context.getCurrentKeyFunction(RD)) - return; - } - - // Otherwise, drop the visibility to hidden. - GV->setVisibility(llvm::GlobalValue::HiddenVisibility); - GV->setUnnamedAddr(true); -} - StringRef CodeGenModule::getMangledName(GlobalDecl GD) { const NamedDecl *ND = cast<NamedDecl>(GD.getDecl()); diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index 9dad092ec6a..8feecea1fea 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -593,21 +593,6 @@ public: /// for the thread-local variable declaration D. void setTLSMode(llvm::GlobalVariable *GV, const VarDecl &D) const; - /// TypeVisibilityKind - The kind of global variable that is passed to - /// setTypeVisibility - enum TypeVisibilityKind { - TVK_ForVTT, - TVK_ForVTable, - TVK_ForConstructionVTable, - TVK_ForRTTI, - TVK_ForRTTIName - }; - - /// setTypeVisibility - Set the visibility for the given global - /// value which holds information about a type. - void setTypeVisibility(llvm::GlobalValue *GV, const CXXRecordDecl *D, - TypeVisibilityKind TVK) const; - static llvm::GlobalValue::VisibilityTypes GetLLVMVisibility(Visibility V) { switch (V) { case DefaultVisibility: return llvm::GlobalValue::DefaultVisibility; diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index b5dc8195117..8cfac9d2c16 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -961,7 +961,7 @@ void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT, VTable->setLinkage(Linkage); // Set the right visibility. - CGM.setTypeVisibility(VTable, RD, CodeGenModule::TVK_ForVTable); + CGM.setGlobalVisibility(VTable, RD); // If this is the magic class __cxxabiv1::__fundamental_type_info, // we will emit the typeinfo for the fundamental types. This is the diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 013ae74dd22..d8c7d6ee5ab 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -843,7 +843,7 @@ void MicrosoftCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT, VTable->setInitializer(Init); VTable->setLinkage(Linkage); - CGM.setTypeVisibility(VTable, RD, CodeGenModule::TVK_ForVTable); + CGM.setGlobalVisibility(VTable, RD); } } @@ -1117,7 +1117,7 @@ void MicrosoftCXXABI::emitVBTableDefinition(const VBTableInfo &VBT, GV->setInitializer(Init); // Set the right visibility. - CGM.setTypeVisibility(GV, RD, CodeGenModule::TVK_ForVTable); + CGM.setGlobalVisibility(GV, RD); } llvm::Value *MicrosoftCXXABI::performThisAdjustment(CodeGenFunction &CGF, |