]> granicus.if.org Git - clang/commitdiff
[ms-cxxabi] Fix vbptr offsets in memptrs when the vbptr is in an nvbase
authorReid Kleckner <reid@kleckner.net>
Wed, 5 Jun 2013 15:58:29 +0000 (15:58 +0000)
committerReid Kleckner <reid@kleckner.net>
Wed, 5 Jun 2013 15:58:29 +0000 (15:58 +0000)
Also addresses a review comment from John from on r180985 by removing
the "== -1" check, since it's now reusing the correct code which has the
comment.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@183318 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MicrosoftCXXABI.cpp
test/CodeGenCXX/microsoft-abi-member-pointers.cpp

index 7a8a0a6eea6b1b70779a54688f31988715db8af3..1bb2c55f5598f579804553e66037f0766bfd3331 100644 (file)
@@ -661,12 +661,8 @@ MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField,
       CGM.IntTy, NonVirtualBaseAdjustment.getQuantity()));
 
   if (hasVBPtrOffsetField(Inheritance)) {
-    // FIXME: We actually need to search non-virtual bases for vbptrs.
-    int64_t VBPtrOffset =
-      getContext().getASTRecordLayout(RD).getVBPtrOffset().getQuantity();
-    if (VBPtrOffset == -1)
-      VBPtrOffset = 0;
-    fields.push_back(llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset));
+    fields.push_back(llvm::ConstantInt::get(
+      CGM.IntTy, GetVBPtrOffsetFromBases(RD).getQuantity()));
   }
 
   // The rest of the fields are adjusted by conversions to a more derived class.
index c4eba8248c35d492ae4c82cef1d894b49ff2c1f2..4771fd4a5a99b55e25b92749795f7e90fe9d5ebd 100644 (file)
@@ -68,7 +68,7 @@ void (Virtual ::*v_f_memptr)();
 // CHECK: @"\01?v_f_memptr@@3P8Virtual@@AEXXZA" = global { i8*, i32, i32 } zeroinitializer, align 4
 
 // We can define Unspecified after locking in the inheritance model.
-struct Unspecified : Virtual {
+struct Unspecified : Multiple, Virtual {
   void foo();
   int u;
 };
@@ -86,7 +86,7 @@ void (Unspecified::*u_f_mp)() = &Unspecified::foo;
 // CHECK: @"\01?v_f_mp@Const@@3P8Virtual@@AEXXZA" =
 // CHECK:   global { i8*, i32, i32 } { i8* bitcast ({{.*}} @"\01?foo@Virtual@@QAEXXZ" to i8*), i32 0, i32 0 }, align 4
 // CHECK: @"\01?u_f_mp@Const@@3P8Unspecified@@AEXXZA" =
-// CHECK:   global { i8*, i32, i32, i32 } { i8* bitcast ({{.*}} @"\01?foo@Unspecified@@QAEXXZ" to i8*), i32 0, i32 0, i32 0 }, align 4
+// CHECK:   global { i8*, i32, i32, i32 } { i8* bitcast ({{.*}} @"\01?foo@Unspecified@@QAEXXZ" to i8*), i32 0, i32 12, i32 0 }, align 4
 }
 
 namespace CastParam {
@@ -156,7 +156,7 @@ void EmitNonVirtualMemberPointers() {
 // CHECK:     { i8* bitcast (void (%{{.*}}*)* @"\01?foo@Virtual@@QAEXXZ" to i8*), i32 0, i32 0 },
 // CHECK:     { i8*, i32, i32 }* %{{.*}}, align 4
 // CHECK:   store { i8*, i32, i32, i32 }
-// CHECK:     { i8* bitcast (void (%{{.*}}*)* @"\01?foo@Unspecified@@QAEXXZ" to i8*), i32 0, i32 0, i32 0 },
+// CHECK:     { i8* bitcast (void (%{{.*}}*)* @"\01?foo@Unspecified@@QAEXXZ" to i8*), i32 0, i32 12, i32 0 },
 // CHECK:     { i8*, i32, i32, i32 }* %{{.*}}, align 4
 // CHECK:   store { i8*, i32, i32, i32 }
 // CHECK:     { i8* bitcast (void (%{{.*}}*)* @"\01?foo@UnspecWithVBPtr@@QAEXXZ" to i8*),