add tbaa metadata to vtable pointer loads/stores

llvm-svn: 153447
This commit is contained in:
Kostya Serebryany 2012-03-26 17:03:51 +00:00
parent db534a4eb9
commit 141e46faf0
6 changed files with 39 additions and 2 deletions

View File

@ -1514,7 +1514,8 @@ CodeGenFunction::InitializeVTablePointer(BaseSubobject Base,
llvm::Type *AddressPointPtrTy =
VTableAddressPoint->getType()->getPointerTo();
VTableField = Builder.CreateBitCast(VTableField, AddressPointPtrTy);
Builder.CreateStore(VTableAddressPoint, VTableField);
llvm::StoreInst *Store = Builder.CreateStore(VTableAddressPoint, VTableField);
CGM.DecorateInstruction(Store, CGM.getTBAAInfoForVTablePtr());
}
void
@ -1597,7 +1598,9 @@ void CodeGenFunction::InitializeVTablePointers(const CXXRecordDecl *RD) {
llvm::Value *CodeGenFunction::GetVTablePtr(llvm::Value *This,
llvm::Type *Ty) {
llvm::Value *VTablePtrSrc = Builder.CreateBitCast(This, Ty->getPointerTo());
return Builder.CreateLoad(VTablePtrSrc, "vtable");
llvm::Instruction *VTable = Builder.CreateLoad(VTablePtrSrc, "vtable");
CGM.DecorateInstruction(VTable, CGM.getTBAAInfoForVTablePtr());
return VTable;
}
static const CXXRecordDecl *getMostDerivedClassDecl(const Expr *Base) {

View File

@ -182,6 +182,12 @@ llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) {
return TBAA->getTBAAInfo(QTy);
}
llvm::MDNode *CodeGenModule::getTBAAInfoForVTablePtr() {
if (!TBAA)
return 0;
return TBAA->getTBAAInfoForVTablePtr();
}
void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst,
llvm::MDNode *TBAAInfo) {
Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo);

View File

@ -448,6 +448,7 @@ public:
bool shouldUseTBAA() const { return TBAA != 0; }
llvm::MDNode *getTBAAInfo(QualType QTy);
llvm::MDNode *getTBAAInfoForVTablePtr();
bool isTypeConstant(QualType QTy, bool ExcludeCtorDtor);

View File

@ -179,3 +179,7 @@ CodeGenTBAA::getTBAAInfo(QualType QTy) {
// For now, handle any other kind of type conservatively.
return MetadataCache[Ty] = getChar();
}
llvm::MDNode *CodeGenTBAA::getTBAAInfoForVTablePtr() {
return getTBAAInfoForNamedType("vtable pointer", getRoot());
}

View File

@ -68,6 +68,10 @@ public:
/// getTBAAInfo - Get the TBAA MDNode to be used for a dereference
/// of the given type.
llvm::MDNode *getTBAAInfo(QualType QTy);
/// getTBAAInfoForVTablePtr - Get the TBAA MDNode to be used for a
/// dereference of a vtable pointer.
llvm::MDNode *getTBAAInfoForVTablePtr();
};
} // end namespace CodeGen

View File

@ -0,0 +1,19 @@
// RUN: %clang_cc1 -emit-llvm -o - -O1 %s | FileCheck %s
// Check that we generate TBAA for vtable pointer loads and stores.
struct A {
virtual int foo() const ;
virtual ~A();
};
void CreateA() {
new A;
}
void CallFoo(A *a) {
a->foo();
}
// CHECK: %vtable = load {{.*}} !tbaa !0
// CHECK: store {{.*}} !tbaa !0
// CHECK: !0 = metadata !{metadata !"vtable pointer", metadata !1}
// CHECK: !1 = metadata !{metadata !"Simple C/C++ TBAA", null}