From 8d9453a1b6d4d592315cd2e7b8084de4cbdf7ed5 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 12 Mar 2014 18:26:14 +0000 Subject: [PATCH] PR19113: Emit 'vtable' TBAA metadata when loading a vptr in a pointer-to-member-function call. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203691 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/ItaniumCXXABI.cpp | 3 +-- test/CodeGen/tbaa-for-vptr.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index db9e35db4e..f6e9d9d768 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/lib/CodeGen/ItaniumCXXABI.cpp @@ -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; diff --git a/test/CodeGen/tbaa-for-vptr.cpp b/test/CodeGen/tbaa-for-vptr.cpp index 2fe97678ba..ea51b63258 100644 --- a/test/CodeGen/tbaa-for-vptr.cpp +++ b/test/CodeGen/tbaa-for-vptr.cpp @@ -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"} -- 2.40.0