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
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191523 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance.cpp b/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance.cpp
index bd0666b..a0436c8 100644
--- a/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance.cpp
+++ b/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 @@
// 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 @@
// 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 @@
// 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 @@
// 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 @@
// 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 @@
// 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 @@
// 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 @@
// 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 @@
// 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();
};