summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2013-12-05 22:44:07 +0000
committerReid Kleckner <reid@kleckner.net>2013-12-05 22:44:07 +0000
commitae9451218f27a997a3c2724b6cd575be7cf47304 (patch)
tree02474aac459cacdc767c929bcd95204c71f3ff18 /clang/lib
parent01cfa94212a1e352145319554047aea3a637d709 (diff)
downloadbcm5719-llvm-ae9451218f27a997a3c2724b6cd575be7cf47304.tar.gz
bcm5719-llvm-ae9451218f27a997a3c2724b6cd575be7cf47304.zip
[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. llvm-svn: 196545
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/MicrosoftCXXABI.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp
index 6a45dba9975..044e572ed4a 100644
--- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp
+++ b/clang/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");
OpenPOWER on IntegriCloud