From 8b5987eba5a080962cbc98ce5f006db3aa62ae2e Mon Sep 17 00:00:00 2001 From: Timur Iskhodzhanov Date: Fri, 27 Sep 2013 14:48:01 +0000 Subject: Abstract out the emission of vtables, add basic support for vtable emission when using -cxx-abi microsoft Reviewed at http://llvm-reviews.chandlerc.com/D1532 llvm-svn: 191523 --- ...abi-vtables-multiple-nonvirtual-inheritance.cpp | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance.cpp') diff --git a/clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance.cpp b/clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance.cpp index bd0666b7d6b..a0436c8e810 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance.cpp @@ -19,6 +19,8 @@ // RUN: FileCheck --check-prefix=RET-THUNKS-Test4 %s < %t // RUN: FileCheck --check-prefix=RET-THUNKS-Test5 %s < %t +// RUN: FileCheck --check-prefix=MANGLING %s < %t + struct Empty { // Doesn't have a vftable! }; @@ -51,6 +53,9 @@ struct Test1: A, B { // NO-THUNKS-Test1: VFTable indices for 'no_thunks::Test1' (1 entries) // NO-THUNKS-Test1-NEXT: 0 | void no_thunks::Test1::f() + // MANGLING-DAG: @"\01??_7Test1@no_thunks@@6BA@@@" + // MANGLING-DAG: @"\01??_7Test1@no_thunks@@6BB@@@" + // Overrides only the left child's method (A::f), needs no thunks. virtual void f(); }; @@ -102,6 +107,8 @@ struct Test4 : Empty, A { // NO-THUNKS-Test4: VFTable indices for 'no_thunks::Test4' (1 entries). // NO-THUNKS-Test4-NEXT: 0 | void no_thunks::Test4::f() + // MANGLING-DAG: @"\01??_7Test4@no_thunks@@6B@" + virtual void f(); }; @@ -127,6 +134,11 @@ struct Test5: Test1, Test2 { // NO-THUNKS-Test5: VFTable indices for 'no_thunks::Test5' (1 entries). // NO-THUNKS-Test5-NEXT: 1 | void no_thunks::Test5::z() + // MANGLING-DAG: @"\01??_7Test5@no_thunks@@6BA@@Test1@1@@" + // MANGLING-DAG: @"\01??_7Test5@no_thunks@@6BA@@Test2@1@@" + // MANGLING-DAG: @"\01??_7Test5@no_thunks@@6BB@@Test1@1@@" + // MANGLING-DAG: @"\01??_7Test5@no_thunks@@6BB@@Test2@1@@" + virtual void z(); }; @@ -143,6 +155,9 @@ struct Test6: Test1 { // NO-THUNKS-Test6: VFTable indices for 'no_thunks::Test6' (1 entries). // NO-THUNKS-Test6-NEXT: 0 | void no_thunks::Test6::f() + // MANGLING-DAG: @"\01??_7Test6@no_thunks@@6BA@@@" + // MANGLING-DAG: @"\01??_7Test6@no_thunks@@6BB@@@" + // Overrides both no_thunks::Test1::f and A::f. virtual void f(); }; @@ -203,6 +218,9 @@ struct Test9: A, D { // NO-THUNKS-Test9: VFTable indices for 'no_thunks::Test9' (1 entries). // NO-THUNKS-Test9-NEXT: 1 | void no_thunks::Test9::h() + // MANGLING-DAG: @"\01??_7Test9@no_thunks@@6BA@@@" + // MANGLING-DAG: @"\01??_7Test9@no_thunks@@6BD@1@@" + virtual void h(); }; @@ -228,6 +246,9 @@ struct Test1: A, D { // PURE-VIRTUAL-Test1-NEXT: via vfptr at offset 4 // PURE-VIRTUAL-Test1-NEXT: 0 | void pure_virtual::Test1::g() + // MANGLING-DAG: @"\01??_7Test1@pure_virtual@@6BA@@@" + // MANGLING-DAG: @"\01??_7Test1@pure_virtual@@6BD@1@@" + // Overrides only the right child's method (pure_virtual::D::g), needs this adjustment but // not thunks. virtual void g(); @@ -254,6 +275,9 @@ struct Test1 : B, C { // THIS-THUNKS-Test1: VFTable indices for 'this_adjustment::Test1' (1 entries). // THIS-THUNKS-Test1-NEXT: 0 | void this_adjustment::Test1::g() + // MANGLING-DAG: @"\01??_7Test1@this_adjustment@@6BB@@@" + // MANGLING-DAG: @"\01??_7Test1@this_adjustment@@6BC@@@" + virtual void g(); }; @@ -278,6 +302,10 @@ struct Test2 : A, B, C { // THIS-THUNKS-Test2-NEXT: via vfptr at offset 4 // THIS-THUNKS-Test2-NEXT: 0 | void this_adjustment::Test2::g() + // MANGLING-DAG: @"\01??_7Test2@this_adjustment@@6BA@@@" + // MANGLING-DAG: @"\01??_7Test2@this_adjustment@@6BB@@@" + // MANGLING-DAG: @"\01??_7Test2@this_adjustment@@6BC@@@" + virtual void g(); }; @@ -337,6 +365,8 @@ struct Test1 : Ret1 { // RET-THUNKS-Test1: VFTable indices for 'return_adjustment::Test1' (1 entries). // RET-THUNKS-Test1-NEXT: 2 | this_adjustment::Test1 *return_adjustment::Test1::foo() + // MANGLING-DAG: @"\01??_7Test1@return_adjustment@@6B@" + virtual this_adjustment::Test1* foo(); }; -- cgit v1.2.3