r218141 - In the Itanium ABI, move stuff to the comdat of variables with static init.
Richard Smith
richard at metafoo.co.uk
Fri Oct 31 15:24:35 PDT 2014
On Fri, Sep 19, 2014 at 12:43 PM, Rafael Espindola <
rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Fri Sep 19 14:43:18 2014
> New Revision: 218141
>
> URL: http://llvm.org/viewvc/llvm-project?rev=218141&view=rev
> Log:
> In the Itanium ABI, move stuff to the comdat of variables with static init.
>
> Clang can already handle
>
> -------------------------------------------
> struct S {
> static const int x;
> };
> template<typename T> struct U {
> static const int k;
> };
> template<typename T> const int U<T>::k = T::x;
>
> const int S::x = 42;
> extern const int *f();
> const int *g() { return &U<S>::k; }
> int main() {
> return *f() + U<S>::k;
> }
>
> const int *f() { return &U<S>::k; }
> -------------------------------------------
>
> since r217264 which puts the .inint_array section in the same COMDAT
> as the variable.
>
> This patch allows the linker to more easily delete some dead code and data
> by
> putting the guard variable and init function in the same COMDAT.
>
> This is a fixed version of r218089.
>
> Modified:
> cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
> cfe/trunk/test/CodeGenCXX/static-data-member.cpp
> cfe/trunk/test/CodeGenCXX/static-init.cpp
>
> Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=218141&r1=218140&r2=218141&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original)
> +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Fri Sep 19 14:43:18 2014
> @@ -1666,6 +1666,15 @@ void ItaniumCXXABI::EmitGuardedInit(Code
> // If the variable is thread-local, so is its guard variable.
> guard->setThreadLocalMode(var->getThreadLocalMode());
>
> + // 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()) {
>
Hmm, why do you not do this for static local variables? They have the same
issue, as far as I can see.
+ llvm::Comdat *C = CGM.getModule().getOrInsertComdat(var->getName());
> + guard->setComdat(C);
> + var->setComdat(C);
> + CGF.CurFn->setComdat(C);
> + }
> +
> CGM.setStaticLocalDeclGuardAddress(&D, guard);
> }
>
>
> Modified: cfe/trunk/test/CodeGenCXX/static-data-member.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/static-data-member.cpp?rev=218141&r1=218140&r2=218141&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/static-data-member.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/static-data-member.cpp Fri Sep 19 14:43:18
> 2014
> @@ -1,9 +1,13 @@
> -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s |
> FileCheck %s
> +// RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm -o - %s | FileCheck
> %s
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | \
> +// RUN: FileCheck --check-prefix=MACHO %s
>
> // CHECK: @_ZN5test11A1aE = constant i32 10, align 4
> // CHECK: @_ZN5test212_GLOBAL__N_11AIiE1xE = internal global i32 0, align
> 4
> -// CHECK: @_ZN5test31AIiE1xE = weak_odr global i32 0, align 4
> -// CHECK: @_ZGVN5test31AIiE1xE = weak_odr global i64 0
> +// CHECK: @_ZN5test31AIiE1xE = weak_odr global i32 0, comdat
> $_ZN5test31AIiE1xE, align 4
> +// CHECK: @_ZGVN5test31AIiE1xE = weak_odr global i64 0, comdat
> $_ZN5test31AIiE1xE
> +// MACHO: @_ZGVN5test31AIiE1xE = weak_odr global i64 0
> +// MACHO-NOT: comdat
>
> // CHECK: _ZN5test51U2k0E = global i32 0
> // CHECK: _ZN5test51U2k1E = global i32 0
> @@ -60,7 +64,9 @@ namespace test3 {
> template <class T> int A<T>::x = foo();
> template struct A<int>;
>
> - // CHECK-LABEL: define internal void @__cxx_global_var_init1()
> + // CHECK-LABEL: define internal void @__cxx_global_var_init1() {{.*}}
> comdat $_ZN5test31AIiE1xE
> + // MACHO-LABEL: define internal void @__cxx_global_var_init1()
> + // MACHO-NOT: comdat
> // CHECK: [[GUARDBYTE:%.*]] = load i8* bitcast (i64*
> @_ZGVN5test31AIiE1xE to i8*)
> // CHECK-NEXT: [[UNINITIALIZED:%.*]] = icmp eq i8 [[GUARDBYTE]], 0
> // CHECK-NEXT: br i1 [[UNINITIALIZED]]
>
> Modified: cfe/trunk/test/CodeGenCXX/static-init.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/static-init.cpp?rev=218141&r1=218140&r2=218141&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/static-init.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/static-init.cpp Fri Sep 19 14:43:18 2014
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - |
> FileCheck %s
> +// RUN: %clang_cc1 %s -triple=x86_64-pc-linuxs -emit-llvm -o - |
> FileCheck %s
>
> // CHECK: @_ZZ1hvE1i = internal global i32 0, align 4
> // CHECK: @base_req = global [4 x i8] c"foo\00", align 1
> @@ -6,8 +6,11 @@
>
> // 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
>
> struct A {
> A();
> @@ -34,6 +37,8 @@ void h() {
> static const int i = a();
> }
>
> +// CHECK: define linkonce_odr void @_Z2h2v()
> +// CHECK-NOT: 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141031/94d79551/attachment.html>
More information about the cfe-commits
mailing list