mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 02:26:07 +00:00
[ms-cxxabi] Fix vbptr offsets in memptrs when the vbptr is in an nvbase
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. llvm-svn: 183318
This commit is contained in:
parent
cabc8822f2
commit
ae748148c1
@ -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.
|
||||
|
@ -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*),
|
||||
|
Loading…
x
Reference in New Issue
Block a user