From c3ed6328a2332dd84a476a2a1ba2fcafd741ed76 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 5 Dec 2013 22:44:07 +0000 Subject: [PATCH] [ms-cxxabi] bitcast to i8* to deref a data member pointer This was causing us to miscompile llvm::SymbolTableListTraits::getListOwner(), which uses data member pointers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196545 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MicrosoftCXXABI.cpp | 5 +++++ .../microsoft-abi-member-pointers.cpp | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 6a45dba997..044e572ed4 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1691,6 +1691,11 @@ MicrosoftCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF, Base = AdjustVirtualBase(CGF, RD, Base, VirtualBaseAdjustmentOffset, VBPtrOffset); } + + // Cast to char*. + Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS)); + + // Apply the offset, which we assume is non-null. llvm::Value *Addr = Builder.CreateInBoundsGEP(Base, FieldOffset, "memptr.offset"); diff --git a/test/CodeGenCXX/microsoft-abi-member-pointers.cpp b/test/CodeGenCXX/microsoft-abi-member-pointers.cpp index c0dcd3cf83..dca9f170a9 100644 --- a/test/CodeGenCXX/microsoft-abi-member-pointers.cpp +++ b/test/CodeGenCXX/microsoft-abi-member-pointers.cpp @@ -537,3 +537,23 @@ int A::*reinterpret(int C::*mp) { } } + +namespace Test3 { +// Make sure we cast 'this' to i8* before using GEP. + +struct A { + int a; + int b; +}; + +int *load_data(A *a, int A::*mp) { + return &(a->*mp); +// CHECK-LABEL: define i32* @"\01?load_data@Test3@@YAPAHPAUA@1@PQ21@H@Z"{{.*}} { +// CHECK: %[[a:.*]] = load %"struct.Test3::A"** %{{.*}}, align 4 +// CHECK: %[[mp:.*]] = load i32* %{{.*}}, align 4 +// CHECK: %[[a_i8:.*]] = bitcast %"struct.Test3::A"* %[[a]] to i8* +// CHECK: getelementptr inbounds i8* %[[a_i8]], i32 %[[mp]] +// CHECK: } +} + +} -- 2.40.0