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

Rafael EspĂ­ndola rafael.espindola at gmail.com
Wed Jan 21 12:40:22 PST 2015


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