diff options
author | Piotr Padlewski <prazek@google.com> | 2015-08-17 23:33:49 +0000 |
---|---|---|
committer | Piotr Padlewski <prazek@google.com> | 2015-08-17 23:33:49 +0000 |
commit | 3d2de530b3a1e8bc0d24b1e354507bf222b04d92 (patch) | |
tree | 00ebc32d70dec18fa686f86df6fea13d91afac18 /test/CodeGenCXX/vtable-available-externally.cpp | |
parent | 66a4b6a202b4afa3738c43dfa8795fc8d617a730 (diff) |
Generating assumption loads of vptr after ctor call
Generating call assume(icmp %vtable, %global_vtable) after constructor
call for devirtualization purposes.
For more info go to:
http://lists.llvm.org/pipermail/cfe-dev/2015-July/044227.html
http://reviews.llvm.org/D11859
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@245257 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/vtable-available-externally.cpp')
-rw-r--r-- | test/CodeGenCXX/vtable-available-externally.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/test/CodeGenCXX/vtable-available-externally.cpp b/test/CodeGenCXX/vtable-available-externally.cpp index ab090936cb..860a3fa118 100644 --- a/test/CodeGenCXX/vtable-available-externally.cpp +++ b/test/CodeGenCXX/vtable-available-externally.cpp @@ -182,8 +182,8 @@ void f() { namespace Test9 { // all virtual functions are outline, so we can assume that it will // be generated in translation unit where foo is defined -// CHECK-TEST9: @_ZTVN5Test91AE = available_externally unnamed_addr constant -// CHECK-TEST9: @_ZTVN5Test91BE = available_externally unnamed_addr constant +// CHECK-TEST9-DAG: @_ZTVN5Test91AE = available_externally unnamed_addr constant +// CHECK-TEST9-DAG: @_ZTVN5Test91BE = available_externally unnamed_addr constant struct A { virtual void foo(); virtual void bar(); @@ -206,7 +206,7 @@ void g() { namespace Test10 { // because A's key function is defined here, vtable is generated in this TU -// CHECK-TEST10: @_ZTVN6Test101AE = unnamed_addr constant +// CHECK-TEST10-DAG: @_ZTVN6Test101AE = unnamed_addr constant struct A { virtual void foo(); virtual void bar(); @@ -214,14 +214,14 @@ struct A { void A::foo() {} // Because key function is inline we will generate vtable as linkonce_odr -// CHECK-TEST10: @_ZTVN6Test101DE = linkonce_odr unnamed_addr constant +// CHECK-TEST10-DAG: @_ZTVN6Test101DE = linkonce_odr unnamed_addr constant struct D : A { void bar(); }; inline void D::bar() {} // because B has outline key function then we can refer to -// CHECK-TEST10: @_ZTVN6Test101BE = available_externally unnamed_addr constant +// CHECK-TEST10-DAG: @_ZTVN6Test101BE = available_externally unnamed_addr constant struct B : A { void foo(); void bar(); @@ -230,7 +230,7 @@ struct B : A { // C's key function (car) is outline, but C has inline virtual function so we // can't guarantee that we will be able to refer to bar from name // so (at the moment) we can't emit vtable available_externally -// CHECK-TEST10: @_ZTVN6Test101CE = external unnamed_addr constant +// CHECK-TEST10-DAG: @_ZTVN6Test101CE = external unnamed_addr constant struct C : A { void bar() {} // defined in body - not key function virtual inline void gar(); // inline in body - not key function @@ -238,7 +238,7 @@ struct C : A { }; // no key function, vtable will be generated everywhere it will be used -// CHECK-TEST10: @_ZTVN6Test101EE = linkonce_odr unnamed_addr constant +// CHECK-TEST10-DAG: @_ZTVN6Test101EE = linkonce_odr unnamed_addr constant struct E : A {}; void g(A& a) { |