diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2015-04-02 00:23:30 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2015-04-02 00:23:30 +0000 |
commit | 1a7488afaa2419eca0728b9e7adea48b03539cc1 (patch) | |
tree | 25b11642e512ec6692a2eec1775bd8b8c37c0de1 /clang/lib/CodeGen/CGClass.cpp | |
parent | 943206da8e1227822bc61ae86d2ce373c3d736fc (diff) | |
download | llvm-1a7488afaa2419eca0728b9e7adea48b03539cc1.zip llvm-1a7488afaa2419eca0728b9e7adea48b03539cc1.tar.gz llvm-1a7488afaa2419eca0728b9e7adea48b03539cc1.tar.bz2 |
Implement CFI type checks for non-virtual calls.
This uses the same class metadata currently used for virtual call and
cast checks.
The new flag is -fsanitize=cfi-nvcall. For consistency, the -fsanitize=cfi-vptr
flag has been renamed -fsanitize=cfi-vcall.
Differential Revision: http://reviews.llvm.org/D8756
llvm-svn: 233874
Diffstat (limited to 'clang/lib/CodeGen/CGClass.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGClass.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 84d6437..bd15c12 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -2088,14 +2088,6 @@ llvm::Value *CodeGenFunction::GetVTablePtr(llvm::Value *This, return VTable; } -void CodeGenFunction::EmitVTablePtrCheckForCall(const CXXMethodDecl *MD, - llvm::Value *VTable) { - if (!SanOpts.has(SanitizerKind::CFIVptr)) - return; - - EmitVTablePtrCheck(MD->getParent(), VTable); -} - // If a class has a single non-virtual base and does not introduce or override // virtual member functions or fields, it will have the same layout as its base. // This function returns the least derived such class. @@ -2131,6 +2123,15 @@ LeastDerivedClassWithSameLayout(const CXXRecordDecl *RD) { RD->bases_begin()->getType()->getAsCXXRecordDecl()); } +void CodeGenFunction::EmitVTablePtrCheckForCall(const CXXMethodDecl *MD, + llvm::Value *VTable) { + const CXXRecordDecl *ClassDecl = MD->getParent(); + if (!SanOpts.has(SanitizerKind::CFICastStrict)) + ClassDecl = LeastDerivedClassWithSameLayout(ClassDecl); + + EmitVTablePtrCheck(ClassDecl, VTable); +} + void CodeGenFunction::EmitVTablePtrCheckForCast(QualType T, llvm::Value *Derived, bool MayBeNull) { |