forked from OSchip/llvm-project
add tbaa metadata to vtable pointer loads/stores
llvm-svn: 153447
This commit is contained in:
parent
db534a4eb9
commit
141e46faf0
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}
|
Loading…
Reference in New Issue