#ifndef LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
#define LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
+#include "llvm/ADT/ArrayRef.h"
+#include <utility> // for std::pair
+
namespace llvm {
class Module;
class GlobalValue;
class GlobalVariable;
class Constant;
+class StringRef;
+class Value;
+class Type;
template <class PtrType> class SmallPtrSetImpl;
/// Append F to the list of global ctors of module M with the given Priority.
// with the same name, their prototypes must match, otherwise
// getOrInsertFunction returns a bitcast.
Function *checkSanitizerInterfaceFunction(Constant *FuncOrBitcast);
+
+/// \brief Creates sanitizer constructor function, and calls sanitizer's init
+/// function from it.
+/// \return Returns pair of pointers to constructor, and init functions
+/// respectively.
+std::pair<Function *, Function *> createSanitizerCtorAndInitFunctions(
+ Module &M, StringRef CtorName, StringRef InitName,
+ ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> InitArgs);
} // End llvm namespace
#endif // LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
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);
+}
+