r225705 - [patch][pr19848] Produce explicit comdats in clang.

Hans Wennborg hans at chromium.org
Wed Jan 21 12:51:04 PST 2015


Many thanks!

On Wed, Jan 21, 2015 at 12:40 PM, Rafael EspĂ­ndola
<rafael.espindola at gmail.com> wrote:
> As discussed on IRC, I have reverted this from the 3.6 branch.
>
> There were a few followup patches, but only this one was in the 3.6
> branch. There is also one open PR about it, so it seems better to have
> this feature just wait for 3.7.
>
>
> On 12 January 2015 at 17:13, Rafael Espindola
> <rafael.espindola at gmail.com> wrote:
>> Author: rafael
>> Date: Mon Jan 12 16:13:53 2015
>> New Revision: 225705
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=225705&view=rev
>> Log:
>> [patch][pr19848] Produce explicit comdats in clang.
>>
>> The llvm IR until recently had no support for comdats. This was a problem when
>> targeting C++ on ELF/COFF as just using weak linkage would cause quite a bit of
>> dead bits to remain on the executable (unless -ffunction-sections,
>> -fdata-sections and --gc-sections were used).
>>
>> To fix the problem, llvm's codegen will just assume that any weak or linkonce
>> that is not in an explicit comdat should be output in one with the same name as
>> the global.
>>
>> This unfortunately breaks cases like pr19848 where a weak symbol is not
>> xpected to be part of any comdat.
>>
>> Now that we have explicit comdats in the IR, we can finally get both cases
>> right.
>>
>> This first patch just makes clang give explicit comdats to GlobalValues where
>> t is allowed to.
>>
>> A followup patch to llvm will then stop implicitly producing comdats.
>>
>> Modified:
>>     cfe/trunk/lib/CodeGen/CGDecl.cpp
>>     cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
>>     cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>>     cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
>>     cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp
>>     cfe/trunk/test/CodeGen/ms-declspecs.c
>>     cfe/trunk/test/CodeGenCXX/cxx11-exception-spec.cpp
>>     cfe/trunk/test/CodeGenCXX/dllexport-members.cpp
>>     cfe/trunk/test/CodeGenCXX/dllexport.cpp
>>     cfe/trunk/test/CodeGenCXX/dllimport.cpp
>>     cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members-exported.cpp
>>     cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members.cpp
>>     cfe/trunk/test/CodeGenCXX/split-stacks.cpp
>>     cfe/trunk/test/CodeGenCXX/static-init.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Mon Jan 12 16:13:53 2015
>> @@ -206,6 +206,9 @@ llvm::Constant *CodeGenModule::getOrCrea
>>    GV->setAlignment(getContext().getDeclAlign(&D).getQuantity());
>>    setGlobalVisibility(GV, &D);
>>
>> +  if (supportsCOMDAT() && GV->isWeakForLinker())
>> +    GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
>> +
>>    if (D.getTLSKind())
>>      setTLSMode(GV, D);
>>
>>
>> Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Mon Jan 12 16:13:53 2015
>> @@ -267,15 +267,7 @@ void CodeGenModule::EmitPointerToInitFun
>>    addUsedGlobal(PtrArray);
>>
>>    // If the GV is already in a comdat group, then we have to join it.
>> -  llvm::Comdat *C = GV->getComdat();
>> -
>> -  // LinkOnce and Weak linkage are lowered down to a single-member comdat group.
>> -  // Make an explicit group so we can join it.
>> -  if (!C && (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage())) {
>> -    C = TheModule.getOrInsertComdat(GV->getName());
>> -    GV->setComdat(C);
>> -  }
>> -  if (C)
>> +  if (llvm::Comdat *C = GV->getComdat())
>>      PtrArray->setComdat(C);
>>  }
>>
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Mon Jan 12 16:13:53 2015
>> @@ -1928,6 +1928,31 @@ void CodeGenModule::MaybeHandleStaticInE
>>      R.first->second = nullptr;
>>  }
>>
>> +static bool shouldBeInCOMDAT(CodeGenModule &CGM, const Decl &D) {
>> +  if (!CGM.supportsCOMDAT())
>> +    return false;
>> +
>> +  if (D.hasAttr<SelectAnyAttr>())
>> +    return true;
>> +
>> +  GVALinkage Linkage;
>> +  if (auto *VD = dyn_cast<VarDecl>(&D))
>> +    Linkage = CGM.getContext().GetGVALinkageForVariable(VD);
>> +  else
>> +    Linkage = CGM.getContext().GetGVALinkageForFunction(cast<FunctionDecl>(&D));
>> +
>> +  switch (Linkage) {
>> +  case GVA_Internal:
>> +  case GVA_AvailableExternally:
>> +  case GVA_StrongExternal:
>> +    return false;
>> +  case GVA_DiscardableODR:
>> +  case GVA_StrongODR:
>> +    return true;
>> +  }
>> +  llvm_unreachable("No such linkage");
>> +}
>> +
>>  void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
>>    llvm::Constant *Init = nullptr;
>>    QualType ASTTy = D->getType();
>> @@ -2071,6 +2096,9 @@ void CodeGenModule::EmitGlobalVarDefinit
>>      setTLSMode(GV, *D);
>>    }
>>
>> +  if (shouldBeInCOMDAT(*this, *D))
>> +    GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
>> +
>>    // Emit the initializer function if necessary.
>>    if (NeedsGlobalCtor || NeedsGlobalDtor)
>>      EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
>> @@ -2405,6 +2433,9 @@ void CodeGenModule::EmitGlobalFunctionDe
>>
>>    MaybeHandleStaticInExternC(D, Fn);
>>
>> +  if (shouldBeInCOMDAT(*this, *D))
>> +    Fn->setComdat(TheModule.getOrInsertComdat(Fn->getName()));
>> +
>>    CodeGenFunction(*this).GenerateCode(D, Fn, FI);
>>
>>    setFunctionDefinitionAttributes(D, Fn);
>>
>> Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Mon Jan 12 16:13:53 2015
>> @@ -1711,11 +1711,12 @@ void ItaniumCXXABI::EmitGuardedInit(Code
>>
>>      // The ABI says: It is suggested that it be emitted in the same COMDAT group
>>      // as the associated data object
>> -    if (!D.isLocalVarDecl() && var->isWeakForLinker() && CGM.supportsCOMDAT()) {
>> -      llvm::Comdat *C = CGM.getModule().getOrInsertComdat(var->getName());
>> +    llvm::Comdat *C = var->getComdat();
>> +    if (!D.isLocalVarDecl() && C) {
>>        guard->setComdat(C);
>> -      var->setComdat(C);
>>        CGF.CurFn->setComdat(C);
>> +    } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
>> +      guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
>>      }
>>
>>      CGM.setStaticLocalDeclGuardAddress(&D, guard);
>>
>> Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Mon Jan 12 16:13:53 2015
>> @@ -1829,18 +1829,10 @@ void MicrosoftCXXABI::EmitThreadLocalIni
>>      llvm::Function *F = CXXThreadLocalInits[I];
>>
>>      // If the GV is already in a comdat group, then we have to join it.
>> -    llvm::Comdat *C = GV->getComdat();
>> -
>> -    // LinkOnce and Weak linkage are lowered down to a single-member comdat
>> -    // group.
>> -    // Make an explicit group so we can join it.
>> -    if (!C && (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage())) {
>> -      C = CGM.getModule().getOrInsertComdat(GV->getName());
>> -      GV->setComdat(C);
>> +    if (llvm::Comdat *C = GV->getComdat())
>>        AddToXDU(F)->setComdat(C);
>> -    } else {
>> +    else
>>        NonComdatInits.push_back(F);
>> -    }
>>    }
>>
>>    if (!NonComdatInits.empty()) {
>>
>> Modified: cfe/trunk/test/CodeGen/ms-declspecs.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-declspecs.c?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/ms-declspecs.c (original)
>> +++ cfe/trunk/test/CodeGen/ms-declspecs.c Mon Jan 12 16:13:53 2015
>> @@ -2,8 +2,8 @@
>>
>>  __declspec(selectany) int x1 = 1;
>>  const __declspec(selectany) int x2 = 2;
>> -// CHECK: @x1 = weak_odr global i32 1, align 4
>> -// CHECK: @x2 = weak_odr constant i32 2, align 4
>> +// CHECK: @x1 = weak_odr global i32 1, comdat, align 4
>> +// CHECK: @x2 = weak_odr constant i32 2, comdat, align 4
>>
>>  struct __declspec(align(16)) S {
>>    char x;
>>
>> Modified: cfe/trunk/test/CodeGenCXX/cxx11-exception-spec.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx11-exception-spec.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/cxx11-exception-spec.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/cxx11-exception-spec.cpp Mon Jan 12 16:13:53 2015
>> @@ -22,9 +22,9 @@ template<> void S<short>::f() { h(); }
>>  // CHECK: define {{.*}} @_ZN1SIA2_sE1fEv() [[NUW]]
>>  template<> void S<short[2]>::f() noexcept { h(); }
>>
>> -// CHECK: define {{.*}} @_Z1fIDsEvv() [[NONE]] {
>> +// CHECK: define {{.*}} @_Z1fIDsEvv() [[NONE]] comdat {
>>  template void f<char16_t>();
>> -// CHECK: define {{.*}} @_Z1fIA2_DsEvv() [[NUW]]  {
>> +// CHECK: define {{.*}} @_Z1fIA2_DsEvv() [[NUW]] comdat {
>>  template void f<char16_t[2]>();
>>
>>  // CHECK: define {{.*}} @_ZN1SIDsE1fEv()
>> @@ -34,9 +34,9 @@ template void S<char16_t>::f();
>>  template void S<char16_t[2]>::f();
>>
>>  void h() {
>> -  // CHECK: define {{.*}} @_Z1fIiEvv() [[NUW]] {
>> +  // CHECK: define {{.*}} @_Z1fIiEvv() [[NUW]] comdat {
>>    f<int>();
>> -  // CHECK: define {{.*}} @_Z1fIA2_iEvv() [[NONE]] {
>> +  // CHECK: define {{.*}} @_Z1fIA2_iEvv() [[NONE]] comdat {
>>    f<int[2]>();
>>
>>    // CHECK: define {{.*}} @_ZN1SIiE1fEv() [[NUW]]
>> @@ -45,9 +45,9 @@ void h() {
>>    // CHECK-NOT: [[NUW]]
>>    S<int[2]>::f();
>>
>> -  // CHECK: define {{.*}} @_Z1fIfEvv() [[NUW]] {
>> +  // CHECK: define {{.*}} @_Z1fIfEvv() [[NUW]] comdat {
>>    void (*f1)() = &f<float>;
>> -  // CHECK: define {{.*}} @_Z1fIdEvv() [[NONE]] {
>> +  // CHECK: define {{.*}} @_Z1fIdEvv() [[NONE]] comdat {
>>    void (*f2)() = &f<double>;
>>
>>    // CHECK: define {{.*}} @_ZN1SIfE1fEv() [[NUW]]
>> @@ -56,9 +56,9 @@ void h() {
>>    // CHECK-NOT: [[NUW]]
>>    void (*f4)() = &S<double>::f;
>>
>> -  // CHECK: define {{.*}} @_Z1fIA4_cEvv() [[NUW]] {
>> +  // CHECK: define {{.*}} @_Z1fIA4_cEvv() [[NUW]] comdat {
>>    (void)&f<char[4]>;
>> -  // CHECK: define {{.*}} @_Z1fIcEvv() [[NONE]] {
>> +  // CHECK: define {{.*}} @_Z1fIcEvv() [[NONE]] comdat {
>>    (void)&f<char>;
>>
>>    // CHECK: define {{.*}} @_ZN1SIA4_cE1fEv() [[NUW]]
>>
>> Modified: cfe/trunk/test/CodeGenCXX/dllexport-members.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllexport-members.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/dllexport-members.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/dllexport-members.cpp Mon Jan 12 16:13:53 2015
>> @@ -110,9 +110,9 @@ public:
>>
>>    // MSC-DAG: @"\01?StaticField at ExportMembers@@2HA"               = dllexport global i32 1, align 4
>>    // MSC-DAG: @"\01?StaticConstField at ExportMembers@@2HB"          = dllexport constant i32 1, align 4
>> -  // MSC-DAG: @"\01?StaticConstFieldEqualInit at ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4
>> -  // MSC-DAG: @"\01?StaticConstFieldBraceInit at ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4
>> -  // MSC-DAG: @"\01?ConstexprField at ExportMembers@@2HB"            = weak_odr dllexport constant i32 1, align 4
>> +  // MSC-DAG: @"\01?StaticConstFieldEqualInit at ExportMembers@@2HB" = weak_odr dllexport constant i32 1, comdat, align 4
>> +  // MSC-DAG: @"\01?StaticConstFieldBraceInit at ExportMembers@@2HB" = weak_odr dllexport constant i32 1, comdat, align 4
>> +  // MSC-DAG: @"\01?ConstexprField at ExportMembers@@2HB"            = weak_odr dllexport constant i32 1, comdat, align 4
>>    // GNU-DAG: @_ZN13ExportMembers11StaticFieldE                   = dllexport global i32 1, align 4
>>    // GNU-DAG: @_ZN13ExportMembers16StaticConstFieldE              = dllexport constant i32 1, align 4
>>    // GNU-DAG: @_ZN13ExportMembers25StaticConstFieldEqualInitE     = dllexport constant i32 1, align 4
>> @@ -233,9 +233,9 @@ public:
>>
>>    // MSC-DAG: @"\01?StaticField at Nested@ExportMembers@@2HA"               = dllexport global i32 1, align 4
>>    // MSC-DAG: @"\01?StaticConstField at Nested@ExportMembers@@2HB"          = dllexport constant i32 1, align 4
>> -  // MSC-DAG: @"\01?StaticConstFieldEqualInit at Nested@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4
>> -  // MSC-DAG: @"\01?StaticConstFieldBraceInit at Nested@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4
>> -  // MSC-DAG: @"\01?ConstexprField at Nested@ExportMembers@@2HB"            = weak_odr dllexport constant i32 1, align 4
>> +  // MSC-DAG: @"\01?StaticConstFieldEqualInit at Nested@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, comdat, align 4
>> +  // MSC-DAG: @"\01?StaticConstFieldBraceInit at Nested@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, comdat, align 4
>> +  // MSC-DAG: @"\01?ConstexprField at Nested@ExportMembers@@2HB"            = weak_odr dllexport constant i32 1, comdat, align 4
>>    // GNU-DAG: @_ZN13ExportMembers6Nested11StaticFieldE                   = dllexport global i32 1, align 4
>>    // GNU-DAG: @_ZN13ExportMembers6Nested16StaticConstFieldE              = dllexport constant i32 1, align 4
>>    // GNU-DAG: @_ZN13ExportMembers6Nested25StaticConstFieldEqualInitE     = dllexport constant i32 1, align 4
>> @@ -599,21 +599,21 @@ template<typename T> const int MemVarTmp
>>  template<typename T> const int MemVarTmpl::ExportedStaticVar;
>>
>>  // Export implicit instantiation of an exported member variable template.
>> -// MSC-DAG: @"\01??$ExportedStaticVar at UImplicitInst_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, align 4
>> -// GNU-DAG: @_ZN10MemVarTmpl17ExportedStaticVarI21ImplicitInst_ExportedEE       = weak_odr dllexport constant i32 1, align 4
>> +// MSC-DAG: @"\01??$ExportedStaticVar at UImplicitInst_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, comdat, align 4
>> +// GNU-DAG: @_ZN10MemVarTmpl17ExportedStaticVarI21ImplicitInst_ExportedEE       = weak_odr dllexport constant i32 1, comdat, align 4
>>  int useMemVarTmpl() { return MemVarTmpl::ExportedStaticVar<ImplicitInst_Exported>; }
>>
>>  // Export explicit instantiation declaration of an exported member variable
>>  // template.
>> -// MSC-DAG: @"\01??$ExportedStaticVar at UExplicitDecl_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, align 4
>> -// GNU-DAG: @_ZN10MemVarTmpl17ExportedStaticVarI21ExplicitDecl_ExportedEE       = weak_odr dllexport constant i32 1, align 4
>> +// MSC-DAG: @"\01??$ExportedStaticVar at UExplicitDecl_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, comdat, align 4
>> +// GNU-DAG: @_ZN10MemVarTmpl17ExportedStaticVarI21ExplicitDecl_ExportedEE       = weak_odr dllexport constant i32 1, comdat, align 4
>>  extern template const int MemVarTmpl::ExportedStaticVar<ExplicitDecl_Exported>;
>>         template const int MemVarTmpl::ExportedStaticVar<ExplicitDecl_Exported>;
>>
>>  // Export explicit instantiation definition of an exported member variable
>>  // template.
>> -// MSC-DAG: @"\01??$ExportedStaticVar at UExplicitInst_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, align 4
>> -// GNU-DAG: @_ZN10MemVarTmpl17ExportedStaticVarI21ExplicitInst_ExportedEE       = weak_odr dllexport constant i32 1, align 4
>> +// MSC-DAG: @"\01??$ExportedStaticVar at UExplicitInst_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, comdat, align 4
>> +// GNU-DAG: @_ZN10MemVarTmpl17ExportedStaticVarI21ExplicitInst_ExportedEE       = weak_odr dllexport constant i32 1, comdat, align 4
>>  template const int MemVarTmpl::ExportedStaticVar<ExplicitInst_Exported>;
>>
>>  // Export specialization of an exported member variable template.
>> @@ -630,15 +630,15 @@ template<> const int MemVarTmpl::Exporte
>>
>>  // Export explicit instantiation declaration of a non-exported member variable
>>  // template.
>> -// MSC-DAG: @"\01??$StaticVar at UExplicitDecl_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, align 4
>> -// GNU-DAG: @_ZN10MemVarTmpl9StaticVarI21ExplicitDecl_ExportedEE        = weak_odr dllexport constant i32 1, align 4
>> +// MSC-DAG: @"\01??$StaticVar at UExplicitDecl_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, comdat, align 4
>> +// GNU-DAG: @_ZN10MemVarTmpl9StaticVarI21ExplicitDecl_ExportedEE        = weak_odr dllexport constant i32 1, comdat, align 4
>>  extern template __declspec(dllexport) const int MemVarTmpl::StaticVar<ExplicitDecl_Exported>;
>>         template __declspec(dllexport) const int MemVarTmpl::StaticVar<ExplicitDecl_Exported>;
>>
>>  // Export explicit instantiation definition of a non-exported member variable
>>  // template.
>> -// MSC-DAG: @"\01??$StaticVar at UExplicitInst_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, align 4
>> -// GNU-DAG: @_ZN10MemVarTmpl9StaticVarI21ExplicitInst_ExportedEE        = weak_odr dllexport constant i32 1, align 4
>> +// MSC-DAG: @"\01??$StaticVar at UExplicitInst_Exported@@@MemVarTmpl@@2HB" = weak_odr dllexport constant i32 1, comdat, align 4
>> +// GNU-DAG: @_ZN10MemVarTmpl9StaticVarI21ExplicitInst_ExportedEE        = weak_odr dllexport constant i32 1, comdat, align 4
>>  template __declspec(dllexport) const int MemVarTmpl::StaticVar<ExplicitInst_Exported>;
>>
>>  // Export specialization of a non-exported member variable template.
>>
>> Modified: cfe/trunk/test/CodeGenCXX/dllexport.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllexport.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/dllexport.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/dllexport.cpp Mon Jan 12 16:13:53 2015
>> @@ -110,43 +110,43 @@ template<typename T> __declspec(dllexpor
>>  USEVAR(VarTmplImplicitDef<ImplicitInst_Exported>)
>>
>>  // Export definition.
>> -// MSC-DAG: @"\01??$VarTmplInit1 at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z12VarTmplInit1I21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$VarTmplInit1 at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z12VarTmplInit1I21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, comdat, align 4
>>  template<typename T> __declspec(dllexport) int VarTmplInit1 = 1;
>>  INSTVAR(VarTmplInit1<ExplicitInst_Exported>)
>>
>> -// MSC-DAG: @"\01??$VarTmplInit2 at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z12VarTmplInit2I21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$VarTmplInit2 at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z12VarTmplInit2I21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, comdat, align 4
>>  template<typename T> int __declspec(dllexport) VarTmplInit2 = 1;
>>  INSTVAR(VarTmplInit2<ExplicitInst_Exported>)
>>
>>  // Declare, then export definition.
>> -// MSC-DAG: @"\01??$VarTmplDeclInit at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z15VarTmplDeclInitI21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$VarTmplDeclInit at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z15VarTmplDeclInitI21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, comdat, align 4
>>  template<typename T> __declspec(dllexport) extern int VarTmplDeclInit;
>>  template<typename T>                              int VarTmplDeclInit = 1;
>>  INSTVAR(VarTmplDeclInit<ExplicitInst_Exported>)
>>
>>  // Redeclarations
>> -// MSC-DAG: @"\01??$VarTmplRedecl1 at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z14VarTmplRedecl1I21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$VarTmplRedecl1 at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z14VarTmplRedecl1I21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, comdat, align 4
>>  template<typename T> __declspec(dllexport) extern int VarTmplRedecl1;
>>  template<typename T> __declspec(dllexport)        int VarTmplRedecl1 = 1;
>>  INSTVAR(VarTmplRedecl1<ExplicitInst_Exported>)
>>
>> -// MSC-DAG: @"\01??$VarTmplRedecl2 at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z14VarTmplRedecl2I21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$VarTmplRedecl2 at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z14VarTmplRedecl2I21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, comdat, align 4
>>  template<typename T> __declspec(dllexport) extern int VarTmplRedecl2;
>>  template<typename T>                              int VarTmplRedecl2 = 1;
>>  INSTVAR(VarTmplRedecl2<ExplicitInst_Exported>)
>>
>> -// MSC-DAG: @"\01??$ExternalVarTmpl at UExplicitInst_Exported@@@ns@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_ZN2ns15ExternalVarTmplI21ExplicitInst_ExportedEE        = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$ExternalVarTmpl at UExplicitInst_Exported@@@ns@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_ZN2ns15ExternalVarTmplI21ExplicitInst_ExportedEE        = weak_odr dllexport global i32 1, comdat, align 4
>>  namespace ns { template<typename T> __declspec(dllexport) int ExternalVarTmpl = 1; }
>>  INSTVAR(ns::ExternalVarTmpl<ExplicitInst_Exported>)
>>
>> -// MSC-DAG: @"\01??$ExternalAutoTypeVarTmpl at UExplicitInst_Exported@@@@3UExternal@@A" = weak_odr dllexport global %struct.External zeroinitializer, align 4
>> -// GNU-DAG: @_Z23ExternalAutoTypeVarTmplI21ExplicitInst_ExportedE                    = weak_odr dllexport global %struct.External zeroinitializer, align 4
>> +// MSC-DAG: @"\01??$ExternalAutoTypeVarTmpl at UExplicitInst_Exported@@@@3UExternal@@A" = weak_odr dllexport global %struct.External zeroinitializer, comdat, align 4
>> +// GNU-DAG: @_Z23ExternalAutoTypeVarTmplI21ExplicitInst_ExportedE                    = weak_odr dllexport global %struct.External zeroinitializer, comdat, align 4
>>  template<typename T> __declspec(dllexport) auto ExternalAutoTypeVarTmpl = External();
>>  template External ExternalAutoTypeVarTmpl<ExplicitInst_Exported>;
>>
>> @@ -155,19 +155,19 @@ template<typename T> int VarTmpl = 1;
>>  template<typename T> __declspec(dllexport) int ExportedVarTmpl = 1;
>>
>>  // Export implicit instantiation of an exported variable template.
>> -// MSC-DAG: @"\01??$ExportedVarTmpl at UImplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z15ExportedVarTmplI21ImplicitInst_ExportedE          = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$ExportedVarTmpl at UImplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z15ExportedVarTmplI21ImplicitInst_ExportedE          = weak_odr dllexport global i32 1, comdat, align 4
>>  USEVAR(ExportedVarTmpl<ImplicitInst_Exported>)
>>
>>  // Export explicit instantiation declaration of an exported variable template.
>> -// MSC-DAG: @"\01??$ExportedVarTmpl at UImplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z15ExportedVarTmplI21ExplicitDecl_ExportedE          = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$ExportedVarTmpl at UImplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z15ExportedVarTmplI21ExplicitDecl_ExportedE          = weak_odr dllexport global i32 1, comdat, align 4
>>  extern template int ExportedVarTmpl<ExplicitDecl_Exported>;
>>         template int ExportedVarTmpl<ExplicitDecl_Exported>;
>>
>>  // Export explicit instantiation definition of an exported variable template.
>> -// MSC-DAG: @"\01??$ExportedVarTmpl at UImplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z15ExportedVarTmplI21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$ExportedVarTmpl at UImplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z15ExportedVarTmplI21ExplicitInst_ExportedE          = weak_odr dllexport global i32 1, comdat, align 4
>>  template __declspec(dllexport) int ExportedVarTmpl<ExplicitInst_Exported>;
>>
>>  // Export specialization of an exported variable template.
>> @@ -187,14 +187,14 @@ template<> int ExportedVarTmpl<ExplicitS
>>
>>
>>  // Export explicit instantiation declaration of a non-exported variable template.
>> -// MSC-DAG: @"\01??$VarTmpl at UExplicitDecl_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z7VarTmplI21ExplicitDecl_ExportedE           = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$VarTmpl at UExplicitDecl_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z7VarTmplI21ExplicitDecl_ExportedE           = weak_odr dllexport global i32 1, comdat, align 4
>>  extern template __declspec(dllexport) int VarTmpl<ExplicitDecl_Exported>;
>>         template __declspec(dllexport) int VarTmpl<ExplicitDecl_Exported>;
>>
>>  // Export explicit instantiation definition of a non-exported variable template.
>> -// MSC-DAG: @"\01??$VarTmpl at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, align 4
>> -// GNU-DAG: @_Z7VarTmplI21ExplicitInst_ExportedE           = weak_odr dllexport global i32 1, align 4
>> +// MSC-DAG: @"\01??$VarTmpl at UExplicitInst_Exported@@@@3HA" = weak_odr dllexport global i32 1, comdat, align 4
>> +// GNU-DAG: @_Z7VarTmplI21ExplicitInst_ExportedE           = weak_odr dllexport global i32 1, comdat, align 4
>>  template __declspec(dllexport) int VarTmpl<ExplicitInst_Exported>;
>>
>>  // Export specialization of a non-exported variable template.
>>
>> Modified: cfe/trunk/test/CodeGenCXX/dllimport.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/dllimport.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/dllimport.cpp Mon Jan 12 16:13:53 2015
>> @@ -243,7 +243,7 @@ __declspec(dllimport) __attribute__((noi
>>  USE(noinline)
>>
>>  // MSC2-NOT: @"\01?alwaysInline@@YAXXZ"()
>> -// GNU2-NOT: @_Z12alwaysInlinev()
>> +// GNU-DAG: define linkonce_odr void @_Z12alwaysInlinev() {{.*}} comdat {
>>  __declspec(dllimport) __attribute__((always_inline)) inline void alwaysInline() {}
>>  USE(alwaysInline)
>>
>>
>> Modified: cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members-exported.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members-exported.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members-exported.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members-exported.cpp Mon Jan 12 16:13:53 2015
>> @@ -17,6 +17,6 @@ struct __declspec(dllexport) S {
>>    };
>>  };
>>
>> -// CHECK: @"\01?x at S@@2FB" = weak_odr dllexport constant i16 42, align 2
>> -// CHECK: @"\01?y at S@@2W4Enum@@B" = weak_odr dllexport constant i32 2, align 4
>> +// CHECK: @"\01?x at S@@2FB" = weak_odr dllexport constant i16 42, comdat, align 2
>> +// CHECK: @"\01?y at S@@2W4Enum@@B" = weak_odr dllexport constant i32 2, comdat, align 4
>>  // CHECK-NOT: NonExported
>>
>> Modified: cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/ms-integer-static-data-members.cpp Mon Jan 12 16:13:53 2015
>> @@ -26,7 +26,7 @@ const int S::x = 5;
>>
>>
>>  // Inline initialization.
>> -// CHECK-INLINE: @"\01?x at S@@2HB" = linkonce_odr constant i32 5, align 4
>> +// CHECK-INLINE: @"\01?x at S@@2HB" = linkonce_odr constant i32 5, comdat, align 4
>>
>>  // Out-of-line initialization.
>>  // CHECK-OUTOFLINE: @"\01?x at S@@2HB" = constant i32 5, align 4
>>
>> Modified: cfe/trunk/test/CodeGenCXX/split-stacks.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/split-stacks.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/split-stacks.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/split-stacks.cpp Mon Jan 12 16:13:53 2015
>> @@ -18,7 +18,7 @@ int nosplit() {
>>
>>  // CHECK-SEGSTK: define i32 @_Z3foov() [[SS:#[0-9]+]] {
>>  // CHECK-SEGSTK: define i32 @_Z7nosplitv() [[NSS1:#[0-9]+]] {
>> -// CHECK-SEGSTK: define linkonce_odr i32 @_Z8tnosplitIiEiv() [[NSS2:#[0-9]+]] {
>> +// CHECK-SEGSTK: define linkonce_odr i32 @_Z8tnosplitIiEiv() [[NSS2:#[0-9]+]] comdat {
>>  // CHECK-SEGSTK-NOT: [[NSS1]] = { {{.*}} "split-stack" {{.*}} }
>>  // CHECK-SEGSTK-NOT: [[NSS2]] = { {{.*}} "split-stack" {{.*}} }
>>  // CHECK-SEGSTK: [[SS]] = { {{.*}} "split-stack" {{.*}} }
>> @@ -27,7 +27,7 @@ int nosplit() {
>>
>>  // CHECK-NOSEGSTK: define i32 @_Z3foov() [[NSS0:#[0-9]+]] {
>>  // CHECK-NOSEGSTK: define i32 @_Z7nosplitv() [[NSS1:#[0-9]+]] {
>> -// CHECK-NOSEGSTK: define linkonce_odr i32 @_Z8tnosplitIiEiv() [[NSS2:#[0-9]+]] {
>> +// CHECK-NOSEGSTK: define linkonce_odr i32 @_Z8tnosplitIiEiv() [[NSS2:#[0-9]+]] comdat {
>>  // CHECK-NOSEGSTK-NOT: [[NSS1]] = { {{.*}} "split-stack" {{.*}} }
>>  // CHECK-NOSEGSTK-NOT: [[NSS2]] = { {{.*}} "split-stack" {{.*}} }
>>  // CHECK-NOSEGSTK-NOT: [[NSS3]] = { {{.*}} "split-stack" {{.*}} }
>>
>> Modified: cfe/trunk/test/CodeGenCXX/static-init.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/static-init.cpp?rev=225705&r1=225704&r2=225705&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/static-init.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/static-init.cpp Mon Jan 12 16:13:53 2015
>> @@ -7,10 +7,8 @@
>>  // CHECK: @_ZZN5test31BC1EvE1u = internal global { i8, [3 x i8] } { i8 97, [3 x i8] undef }, align 4
>>  // CHECK: @_ZZN5test1L6getvarEiE3var = internal constant [4 x i32] [i32 1, i32 0, i32 2, i32 4], align 16
>>
>> -// CHECK: @_ZZ2h2vE1i = linkonce_odr global i32 0
>> -// CHECK-NOT: comdat
>> -// CHECK: @_ZGVZ2h2vE1i = linkonce_odr global i64 0
>> -// CHECK-NOT: comdat
>> +// CHECK: @_ZZ2h2vE1i = linkonce_odr global i32 0, comdat, align
>> +// CHECK: @_ZGVZ2h2vE1i = linkonce_odr global i64 0, comdat{{$}}
>>
>>  struct A {
>>    A();
>> @@ -37,8 +35,7 @@ void h() {
>>    static const int i = a();
>>  }
>>
>> -// CHECK: define linkonce_odr void @_Z2h2v()
>> -// CHECK-NOT: comdat
>> +// CHECK: define linkonce_odr void @_Z2h2v() {{.*}} comdat {
>>  inline void h2() {
>>    static int i = a();
>>  }
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list