From: John McCall Date: Sat, 8 Feb 2014 00:41:16 +0000 (+0000) Subject: Remove the -fhidden-weak-vtables -cc1 option. It was dead, X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8f80a61914f9b26bcc5b218331fb2179418f7889;p=platform%2Fupstream%2Fllvm.git Remove the -fhidden-weak-vtables -cc1 option. It was dead, gross, and increasingly replaced through other mechanisms. llvm-svn: 201011 --- diff --git a/clang/include/clang/Driver/CC1Options.td b/clang/include/clang/Driver/CC1Options.td index 5ffeb43..a62e112 100644 --- a/clang/include/clang/Driver/CC1Options.td +++ b/clang/include/clang/Driver/CC1Options.td @@ -397,8 +397,6 @@ def fblocks_runtime_optional : Flag<["-"], "fblocks-runtime-optional">, HelpText<"Weakly link in the blocks runtime">; def fsjlj_exceptions : Flag<["-"], "fsjlj-exceptions">, HelpText<"Use SjLj style exceptions">; -def fhidden_weak_vtables : Flag<["-"], "fhidden-weak-vtables">, - HelpText<"Generate weak vtables and RTTI with hidden visibility">; def main_file_name : Separate<["-"], "main-file-name">, HelpText<"Main file name to use for debug info">; def split_dwarf_file : Separate<["-"], "split-dwarf-file">, diff --git a/clang/include/clang/Frontend/CodeGenOptions.def b/clang/include/clang/Frontend/CodeGenOptions.def index 396c360..1e81dd2 100644 --- a/clang/include/clang/Frontend/CodeGenOptions.def +++ b/clang/include/clang/Frontend/CodeGenOptions.def @@ -59,8 +59,6 @@ ENUM_CODEGENOPT(FPContractMode, FPContractModeKind, 2, FPC_On) CODEGENOPT(ForbidGuardVariables , 1, 0) ///< Issue errors if C++ guard variables ///< are required. CODEGENOPT(FunctionSections , 1, 0) ///< Set when -ffunction-sections is enabled. -CODEGENOPT(HiddenWeakVTables , 1, 0) ///< Emit weak vtables, RTTI, and thunks with - ///< hidden visibility. CODEGENOPT(InstrumentFunctions , 1, 0) ///< Set when -finstrument-functions is ///< enabled. CODEGENOPT(InstrumentForProfiling , 1, 0) ///< Set when -pg is enabled. diff --git a/clang/lib/CodeGen/CGRTTI.cpp b/clang/lib/CodeGen/CGRTTI.cpp index aa687b9..351b9fc 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(Ty)) { - const CXXRecordDecl *RD = cast(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 bca5f29..bd280ea 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 35f3421..4a381a8 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 c73e931..c0c1219 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(GD.getDecl()); diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index 9dad092..8feecea 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 b5dc819..8cfac9d 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 013ae74..d8c7d6e 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, diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index da58a038..3c75dd5 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -381,7 +381,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.DisableFree = Args.hasArg(OPT_disable_free); Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls); Opts.FloatABI = Args.getLastArgValue(OPT_mfloat_abi); - Opts.HiddenWeakVTables = Args.hasArg(OPT_fhidden_weak_vtables); Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable); Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision); Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) || diff --git a/clang/test/CodeGenCXX/rtti-linkage.cpp b/clang/test/CodeGenCXX/rtti-linkage.cpp index 42fe435..f1a0c80 100644 --- a/clang/test/CodeGenCXX/rtti-linkage.cpp +++ b/clang/test/CodeGenCXX/rtti-linkage.cpp @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -fhidden-weak-vtables -emit-llvm -o - | FileCheck %s -// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -fvisibility hidden -fhidden-weak-vtables -emit-llvm -o - | FileCheck -check-prefix=CHECK-WITH-HIDDEN %s +// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o - | FileCheck -check-prefix=CHECK-WITH-HIDDEN %s #include @@ -25,7 +25,7 @@ // CHECK: _ZTIM1CPS_ = internal unnamed_addr constant // CHECK: _ZTSM1A1C = internal constant // CHECK: _ZTS1A = linkonce_odr constant -// CHECK: _ZTI1A = linkonce_odr hidden unnamed_addr constant +// CHECK: _ZTI1A = linkonce_odr unnamed_addr constant // CHECK: _ZTIM1A1C = internal unnamed_addr constant // CHECK: _ZTSM1AP1C = internal constant // CHECK: _ZTIM1AP1C = internal unnamed_addr constant @@ -39,12 +39,12 @@ // CHECK: _ZTIFvN12_GLOBAL__N_11DEE = internal unnamed_addr constant // CHECK: _ZTSPFvvE = linkonce_odr constant // CHECK: _ZTSFvvE = linkonce_odr constant -// CHECK: _ZTIFvvE = linkonce_odr hidden unnamed_addr constant -// CHECK: _ZTIPFvvE = linkonce_odr hidden unnamed_addr constant +// CHECK: _ZTIFvvE = linkonce_odr unnamed_addr constant +// CHECK: _ZTIPFvvE = linkonce_odr unnamed_addr constant // CHECK: _ZTSN12_GLOBAL__N_11EE = internal constant // CHECK: _ZTIN12_GLOBAL__N_11EE = internal unnamed_addr constant // CHECK: _ZTSA10_i = linkonce_odr constant -// CHECK: _ZTIA10_i = linkonce_odr hidden unnamed_addr constant +// CHECK: _ZTIA10_i = linkonce_odr unnamed_addr constant // CHECK: _ZTI1TILj0EE = linkonce_odr unnamed_addr constant // CHECK: _ZTI1TILj1EE = weak_odr unnamed_addr constant // CHECK: _ZTI1TILj2EE = external constant diff --git a/clang/test/CodeGenCXX/rtti-visibility.cpp b/clang/test/CodeGenCXX/rtti-visibility.cpp index 40cee06..c4b206b 100644 --- a/clang/test/CodeGenCXX/rtti-visibility.cpp +++ b/clang/test/CodeGenCXX/rtti-visibility.cpp @@ -1,8 +1,6 @@ // RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -o %t -// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -fhidden-weak-vtables -emit-llvm -o %t.hidden // RUN: FileCheck --check-prefix=CHECK-TEST1 %s < %t // RUN: FileCheck --check-prefix=CHECK-TEST2 %s < %t -// RUN: FileCheck --check-prefix=CHECK-TEST2-HIDDEN %s < %t.hidden #include @@ -25,10 +23,6 @@ namespace Test2 { // CHECK-TEST2: @_ZTSN5Test21AE = linkonce_odr constant // CHECK-TEST2: @_ZTIN5Test21AE = linkonce_odr unnamed_addr constant struct A { }; - - // With -fhidden-weak-vtables, the typeinfo for A is marked hidden, but not its name. - // CHECK-TEST2-HIDDEN: _ZTSN5Test21AE = linkonce_odr constant - // CHECK-TEST2-HIDDEN: @_ZTIN5Test21AE = linkonce_odr hidden unnamed_addr constant void f() { (void)typeid(A); } diff --git a/clang/test/CodeGenCXX/thunks.cpp b/clang/test/CodeGenCXX/thunks.cpp index defb706..89e4db3 100644 --- a/clang/test/CodeGenCXX/thunks.cpp +++ b/clang/test/CodeGenCXX/thunks.cpp @@ -1,6 +1,5 @@ // RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables -emit-llvm -o - | FileCheck %s // RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables -emit-llvm -o - -O1 -disable-llvm-optzns | FileCheck %s -// RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables -fhidden-weak-vtables -emit-llvm -o - | FileCheck -check-prefix=CHECK-HIDDEN %s namespace Test1 { @@ -251,9 +250,7 @@ namespace Test10 { struct B { virtual void foo(); }; struct C : A, B { void foo() {} }; - // CHECK-HIDDEN-LABEL: define linkonce_odr void @_ZN6Test101C3fooEv - // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZThn8_N6Test101C3fooEv - + // Test later. void test() { C c; } @@ -366,6 +363,10 @@ namespace Test15 { /**** The following has to go at the end of the file ****/ +// This is from Test10: +// CHECK-LABEL: define linkonce_odr void @_ZN6Test101C3fooEv +// CHECK-LABEL: define linkonce_odr void @_ZThn8_N6Test101C3fooEv + // This is from Test5: // CHECK-LABEL: define linkonce_odr void @_ZTv0_n24_N5Test51B1fEv // CHECK-LABEL: define internal void @_ZThn8_N6Test4B12_GLOBAL__N_11C1fEv( diff --git a/clang/test/CodeGenCXX/vtable-linkage.cpp b/clang/test/CodeGenCXX/vtable-linkage.cpp index c17e333..dc2ce26 100644 --- a/clang/test/CodeGenCXX/vtable-linkage.cpp +++ b/clang/test/CodeGenCXX/vtable-linkage.cpp @@ -1,8 +1,6 @@ // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o %t -// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -fhidden-weak-vtables -emit-llvm -o %t.hidden // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -disable-llvm-optzns -O3 -emit-llvm -o %t.opt // RUN: FileCheck --check-prefix=CHECK %s < %t -// RUN: FileCheck --check-prefix=CHECK-HIDDEN %s < %t.hidden // RUN: FileCheck --check-prefix=CHECK-OPT %s < %t.opt namespace { @@ -95,10 +93,6 @@ void use_F() { // CHECK-DAG: @_ZTS1C = linkonce_odr constant // CHECK-DAG: @_ZTI1C = linkonce_odr unnamed_addr constant // CHECK-DAG: @_ZTT1C = linkonce_odr unnamed_addr constant -// CHECK-HIDDEN-DAG: @_ZTV1C = linkonce_odr hidden unnamed_addr constant -// CHECK-HIDDEN-DAG: @_ZTS1C = linkonce_odr constant -// CHECK-HIDDEN-DAG: @_ZTI1C = linkonce_odr hidden unnamed_addr constant -// CHECK-HIDDEN-DAG: @_ZTT1C = linkonce_odr hidden unnamed_addr constant // D has a key function that is defined in this translation unit so its vtable is // defined in the translation unit. @@ -119,18 +113,12 @@ void use_F() { // CHECK-DAG: @_ZTV1EIsE = weak_odr unnamed_addr constant // CHECK-DAG: @_ZTS1EIsE = weak_odr constant // CHECK-DAG: @_ZTI1EIsE = weak_odr unnamed_addr constant -// CHECK-HIDDEN-DAG: @_ZTV1EIsE = weak_odr unnamed_addr constant -// CHECK-HIDDEN-DAG: @_ZTS1EIsE = weak_odr constant -// CHECK-HIDDEN-DAG: @_ZTI1EIsE = weak_odr unnamed_addr constant // F is an explicit template instantiation without a key // function, so its vtable should have weak_odr linkage // CHECK-DAG: @_ZTV1FIsE = weak_odr unnamed_addr constant // CHECK-DAG: @_ZTS1FIsE = weak_odr constant // CHECK-DAG: @_ZTI1FIsE = weak_odr unnamed_addr constant -// CHECK-HIDDEN-DAG: @_ZTV1FIsE = weak_odr unnamed_addr constant -// CHECK-HIDDEN-DAG: @_ZTS1FIsE = weak_odr constant -// CHECK-HIDDEN-DAG: @_ZTI1FIsE = weak_odr unnamed_addr constant // E is an implicit template instantiation with a key function // defined in this translation unit, so its vtable should have