Implement function type checker for the undefined behavior sanitizer.
This uses function prefix data to store function type information at the function pointer. Differential Revision: http://llvm-reviews.chandlerc.com/D1338 llvm-svn: 193058
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include "CGCXXABI.h"
|
||||
#include "CGDebugInfo.h"
|
||||
#include "CodeGenModule.h"
|
||||
#include "TargetInfo.h"
|
||||
#include "clang/AST/ASTContext.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/AST/DeclCXX.h"
|
||||
@@ -519,6 +520,22 @@ void CodeGenFunction::StartFunction(GlobalDecl GD,
|
||||
EmitOpenCLKernelMetadata(FD, Fn);
|
||||
}
|
||||
|
||||
// If we are checking function types, emit a function type signature as
|
||||
// prefix data.
|
||||
if (getLangOpts().CPlusPlus && SanOpts->Function) {
|
||||
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
|
||||
if (llvm::Constant *PrefixSig =
|
||||
CGM.getTargetCodeGenInfo().getUBSanFunctionSignature(CGM)) {
|
||||
llvm::Constant *FTRTTIConst =
|
||||
CGM.GetAddrOfRTTIDescriptor(FD->getType(), /*ForEH=*/true);
|
||||
llvm::Constant *PrefixStructElems[] = { PrefixSig, FTRTTIConst };
|
||||
llvm::Constant *PrefixStructConst =
|
||||
llvm::ConstantStruct::getAnon(PrefixStructElems, /*Packed=*/true);
|
||||
Fn->setPrefixData(PrefixStructConst);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
llvm::BasicBlock *EntryBB = createBasicBlock("entry", CurFn);
|
||||
|
||||
// Create a marker to make it easy to insert allocas into the entryblock
|
||||
|
||||
Reference in New Issue
Block a user