diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2012-03-30 19:44:53 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2012-03-30 19:44:53 +0000 |
commit | 0f30a12ce7b3d4d86c9ca9072f587da77c8eef34 (patch) | |
tree | 7065652fa4ad45d8dce3c6cb377f1c8c0f904cab /test/CodeGenCXX/static-init.cpp | |
parent | 40afb7d4f3840e5b9dcdf77086d9e4843fd5463a (diff) |
Revert r153723, and its follow-ups r153728 and r153733.
These patches cause us to miscompile and/or reject code with static
function-local variables in an extern-C context. Previously, we were
papering over this as long as the variables are within the same
translation unit, and had not seen any failures in the wild. We still
need a proper fix, which involves mangling static locals inside of an
extern-C block (as GCC already does), but this patch causes pretty
widespread regressions. Firefox, and many other applications no longer
build.
Lots of test cases have been posted to the list in response to this
commit, so there should be no problem reproducing the issues.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153768 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/static-init.cpp')
-rw-r--r-- | test/CodeGenCXX/static-init.cpp | 71 |
1 files changed, 0 insertions, 71 deletions
diff --git a/test/CodeGenCXX/static-init.cpp b/test/CodeGenCXX/static-init.cpp index 7e840f5622..a96cb7ac8e 100644 --- a/test/CodeGenCXX/static-init.cpp +++ b/test/CodeGenCXX/static-init.cpp @@ -3,7 +3,6 @@ // CHECK: @_ZZ1hvE1i = internal global i32 0, align 4 // CHECK: @base_req = global [4 x i8] c"foo\00", align 1 -// 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: @_ZGVZ2h2vE1i = linkonce_odr global i64 0 @@ -80,73 +79,3 @@ namespace union_static_local { c::main(); } } - -// rdar://problem/11091093 -// Static variables should be consistent across constructor -// or destructor variants. -namespace test2 { - struct A { - A(); - ~A(); - }; - - struct B : virtual A { - B(); - ~B(); - }; - - // If we ever implement this as a delegate ctor call, just change - // this to take variadic arguments or something. - extern int foo(); - B::B() { - static int x = foo(); - } - // CHECK: define void @_ZN5test21BC1Ev - // CHECK: load atomic i8* bitcast (i64* @_ZGVZN5test21BC1EvE1x to i8*) acquire, - // CHECK: call i32 @__cxa_guard_acquire(i64* @_ZGVZN5test21BC1EvE1x) - // CHECK: [[T0:%.*]] = call i32 @_ZN5test23fooEv() - // CHECK: store i32 [[T0]], i32* @_ZZN5test21BC1EvE1x, - // CHECK: call void @__cxa_guard_release(i64* @_ZGVZN5test21BC1EvE1x) - - // CHECK: define void @_ZN5test21BC2Ev - // CHECK: load atomic i8* bitcast (i64* @_ZGVZN5test21BC1EvE1x to i8*) acquire, - // CHECK: call i32 @__cxa_guard_acquire(i64* @_ZGVZN5test21BC1EvE1x) - // CHECK: [[T0:%.*]] = call i32 @_ZN5test23fooEv() - // CHECK: store i32 [[T0]], i32* @_ZZN5test21BC1EvE1x, - // CHECK: call void @__cxa_guard_release(i64* @_ZGVZN5test21BC1EvE1x) - - // This is just for completeness, because we actually emit this - // using a delegate dtor call. - B::~B() { - static int y = foo(); - } - // CHECK: define void @_ZN5test21BD1Ev( - // CHECK: call void @_ZN5test21BD2Ev( - - // CHECK: define void @_ZN5test21BD2Ev( - // CHECK: load atomic i8* bitcast (i64* @_ZGVZN5test21BD1EvE1y to i8*) acquire, - // CHECK: call i32 @__cxa_guard_acquire(i64* @_ZGVZN5test21BD1EvE1y) - // CHECK: [[T0:%.*]] = call i32 @_ZN5test23fooEv() - // CHECK: store i32 [[T0]], i32* @_ZZN5test21BD1EvE1y, - // CHECK: call void @__cxa_guard_release(i64* @_ZGVZN5test21BD1EvE1y) -} - -// This shouldn't error out. -namespace test3 { - struct A { - A(); - ~A(); - }; - - struct B : virtual A { - B(); - ~B(); - }; - - B::B() { - union U { char x; int i; }; - static U u = { 'a' }; - } - // CHECK: define void @_ZN5test31BC1Ev( - // CHECK: define void @_ZN5test31BC2Ev( -} |