summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/ModuleUtils.cpp
diff options
context:
space:
mode:
authorIsmail Pazarbasi <ismail.pazarbasi@gmail.com>2015-05-06 18:48:22 +0000
committerIsmail Pazarbasi <ismail.pazarbasi@gmail.com>2015-05-06 18:48:22 +0000
commit56ccf1c9d598b6038e974a799a350eeaf0dc525d (patch)
treed1ab0b6df3988187c1257699d408f6fd38604918 /llvm/lib/Transforms/Utils/ModuleUtils.cpp
parentd1b38c4b0bf4c912ed3251b45c2168b6f190d0b2 (diff)
downloadbcm5719-llvm-56ccf1c9d598b6038e974a799a350eeaf0dc525d.tar.gz
bcm5719-llvm-56ccf1c9d598b6038e974a799a350eeaf0dc525d.zip
Implement `createSanitizerCtor`, common helper function for all sanitizers
Summary: This helper function creates a ctor function, which calls sanitizer's init function with given arguments. This constructor is then expected to be added to module's ctors. The patch helps unifying how sanitizer constructor functions are created, and how init functions are called across all sanitizers. Reviewers: kcc, samsonov Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D8777 llvm-svn: 236627
Diffstat (limited to 'llvm/lib/Transforms/Utils/ModuleUtils.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/ModuleUtils.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
index 014574d859d..d69a81ec474 100644
--- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp
+++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
@@ -104,3 +104,24 @@ Function *llvm::checkSanitizerInterfaceFunction(Constant *FuncOrBitcast) {
Stream << "Sanitizer interface function redefined: " << *FuncOrBitcast;
report_fatal_error(Err);
}
+
+std::pair<Function *, Function *> llvm::createSanitizerCtorAndInitFunctions(
+ Module &M, StringRef CtorName, StringRef InitName,
+ ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> InitArgs) {
+ assert(!InitName.empty() && "Expected init function name");
+ assert(InitArgTypes.size() == InitArgTypes.size() &&
+ "Sanitizer's init function expects different number of arguments");
+ Function *Ctor = Function::Create(
+ FunctionType::get(Type::getVoidTy(M.getContext()), false),
+ GlobalValue::InternalLinkage, CtorName, &M);
+ BasicBlock *CtorBB = BasicBlock::Create(M.getContext(), "", Ctor);
+ IRBuilder<> IRB(ReturnInst::Create(M.getContext(), CtorBB));
+ Function *InitFunction =
+ checkSanitizerInterfaceFunction(M.getOrInsertFunction(
+ InitName, FunctionType::get(IRB.getVoidTy(), InitArgTypes, false),
+ AttributeSet()));
+ InitFunction->setLinkage(Function::ExternalLinkage);
+ IRB.CreateCall(InitFunction, InitArgs);
+ return std::make_pair(Ctor, InitFunction);
+}
+
OpenPOWER on IntegriCloud