diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-09-19 19:43:18 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-09-19 19:43:18 +0000 |
commit | 2ae4b631fc82698f771bc53bbcd971f3673212ef (patch) | |
tree | 01091f762401265885e5954f15aec2bc21e410e0 /clang/test/CodeGenCXX/static-init.cpp | |
parent | 0fd6fd4fd45be23c885f6fa0654c780773ce9517 (diff) | |
download | llvm-2ae4b631fc82698f771bc53bbcd971f3673212ef.zip llvm-2ae4b631fc82698f771bc53bbcd971f3673212ef.tar.gz llvm-2ae4b631fc82698f771bc53bbcd971f3673212ef.tar.bz2 |
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.
llvm-svn: 218141
Diffstat (limited to 'clang/test/CodeGenCXX/static-init.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/static-init.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/clang/test/CodeGenCXX/static-init.cpp b/clang/test/CodeGenCXX/static-init.cpp index d23ead4..a9debe3 100644 --- a/clang/test/CodeGenCXX/static-init.cpp +++ b/clang/test/CodeGenCXX/static-init.cpp @@ -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(); } |