]> granicus.if.org Git - clang/commitdiff
PR19113: Emit 'vtable' TBAA metadata when loading a vptr in a pointer-to-member-funct...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 12 Mar 2014 18:26:14 +0000 (18:26 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 12 Mar 2014 18:26:14 +0000 (18:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203691 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/ItaniumCXXABI.cpp
test/CodeGen/tbaa-for-vptr.cpp

index db9e35db4e51497439fff7bef7bf1adc7dfbe318..f6e9d9d7681140141cd5e587f2954b0ca119fe83 100644 (file)
@@ -359,8 +359,7 @@ llvm::Value *ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
 
   // Cast the adjusted this to a pointer to vtable pointer and load.
   llvm::Type *VTableTy = Builder.getInt8PtrTy();
-  llvm::Value *VTable = Builder.CreateBitCast(This, VTableTy->getPointerTo());
-  VTable = Builder.CreateLoad(VTable, "memptr.vtable");
+  llvm::Value *VTable = CGF.GetVTablePtr(This, VTableTy);
 
   // Apply the offset.
   llvm::Value *VTableOffset = FnAsInt;
index 2fe97678baf519ece0b8e3a5c56713895b6f1e39..ea51b63258c4e511ec16425fca9294e59c6d456b 100644 (file)
@@ -17,12 +17,19 @@ void CreateA() {
   new A;
 }
 
-void CallFoo(A *a) {
+void CallFoo(A *a, int (A::*fp)() const) {
   a->foo();
+  (a->*fp)();
 }
 
+// CHECK-LABEL: @_Z7CallFoo
 // CHECK: %{{.*}} = load {{.*}} !tbaa ![[NUM:[0-9]+]]
+// CHECK: br i1
+// CHECK: load {{.*}}, !tbaa ![[NUM]]
+//
+// CHECK-LABEL: @_ZN1AC2Ev
 // CHECK: store {{.*}} !tbaa ![[NUM]]
+//
 // CHECK: [[NUM]] = metadata !{metadata [[TYPE:!.*]], metadata [[TYPE]], i64 0}
 // CHECK: [[TYPE]] = metadata !{metadata !"vtable pointer", metadata !{{.*}}
 // NOTBAA-NOT: = metadata !{metadata !"Simple C/C++ TBAA"}