Fix a bunch of VTT layout bugs, add simple tests for VTT layout.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93709 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGenCXX/virt.cpp b/test/CodeGenCXX/virt.cpp
index 4578039..bdb05ea 100644
--- a/test/CodeGenCXX/virt.cpp
+++ b/test/CodeGenCXX/virt.cpp
@@ -375,13 +375,13 @@
 // CHECK-LP64-NEXT: .quad   (__ZTV7test8_D) + 32
 // CHECK-LP64-NEXT: .quad   (__ZTC7test8_D8_8test8_B2) + 32
 // CHECK-LP64-NEXT: .quad   (__ZTC7test8_D8_9test8_B2a) + 32
-// CHECK-LP64-NEXT  .quad   (__ZTC7test8_D8_9test8_B2a) + 64
-// CHECK-LP64-NEXT  .quad   (__ZTC7test8_D8_9test8_B2a) + 96
-// CHECK-LP64-NEXT  .quad   (__ZTC7test8_D8_8test8_B2) + 72
-// CHECK-LP64-NEXT  .quad   (__ZTC7test8_D8_8test8_B2) + 104
-// CHECK-LP64-NEXT  .quad   (__ZTV7test8_D) + 72
-// CHECK-LP64: .quad   (__ZTV7test8_D) + 160
-// CHECK-LP64: .quad   (__ZTV7test8_D) + 192
+// CHECK-LP64-NEXT: .quad   (__ZTC7test8_D8_9test8_B2a) + 64
+// CHECK-LP64-NEXT: .quad   (__ZTC7test8_D8_9test8_B2a) + 96
+// CHECK-LP64-NEXT: .quad   (__ZTC7test8_D8_8test8_B2) + 72
+// CHECK-LP64-NEXT: .quad   (__ZTC7test8_D8_8test8_B2) + 104
+// CHECK-LP64-NEXT: .quad   (__ZTV7test8_D) + 72
+// CHECK-LP64-NEXT: .quad   (__ZTV7test8_D) + 160
+// CHECK-LP64-NEXT: .quad   (__ZTV7test8_D) + 192
 
 
 struct test9_B3 { virtual void funcB3(); int i; };
diff --git a/test/CodeGenCXX/vtt-layout.cpp b/test/CodeGenCXX/vtt-layout.cpp
new file mode 100644
index 0000000..1e78c90
--- /dev/null
+++ b/test/CodeGenCXX/vtt-layout.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
+
+namespace Test1 {
+struct A { };
+
+struct B : virtual A { 
+  virtual void f();
+};
+
+void B::f() { } 
+}
+
+// Test1::B should just have a single entry in its VTT, which points to the vtable.
+// CHECK: @_ZTTN5Test11BE = constant [1 x i8*] [i8* bitcast (i8** getelementptr inbounds ([4 x i8*]* @_ZTVN5Test11BE, i64 0, i64 3) to i8*)]
+
+namespace Test2 {
+  struct A { };
+
+  struct B : A { virtual void f(); };
+  struct C : virtual B { };
+
+  C c;
+}
+
+// Check that we don't add a secondary virtual pointer for Test2::A, since Test2::A doesn't have any virtual member functions or bases.
+// CHECK: @_ZTTN5Test21CE = weak_odr constant [2 x i8*] [i8* bitcast (i8** getelementptr inbounds ([5 x i8*]* @_ZTVN5Test21CE, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([5 x i8*]* @_ZTVN5Test21CE, i64 0, i64 4) to i8*)] ; <[2 x i8*]*> [#uses=0]