diff options
Diffstat (limited to 'lib/Transforms/Utils/ModuleUtils.cpp')
| -rw-r--r-- | lib/Transforms/Utils/ModuleUtils.cpp | 23 | 
1 files changed, 16 insertions, 7 deletions
| diff --git a/lib/Transforms/Utils/ModuleUtils.cpp b/lib/Transforms/Utils/ModuleUtils.cpp index 0d623df77a67e..dbe42c201dd4f 100644 --- a/lib/Transforms/Utils/ModuleUtils.cpp +++ b/lib/Transforms/Utils/ModuleUtils.cpp @@ -130,13 +130,25 @@ void llvm::appendToCompilerUsed(Module &M, ArrayRef<GlobalValue *> Values) {  Function *llvm::checkSanitizerInterfaceFunction(Constant *FuncOrBitcast) {    if (isa<Function>(FuncOrBitcast))      return cast<Function>(FuncOrBitcast); -  FuncOrBitcast->dump(); +  FuncOrBitcast->print(errs()); +  errs() << '\n';    std::string Err;    raw_string_ostream Stream(Err);    Stream << "Sanitizer interface function redefined: " << *FuncOrBitcast;    report_fatal_error(Err);  } +Function *llvm::declareSanitizerInitFunction(Module &M, StringRef InitName, +                                             ArrayRef<Type *> InitArgTypes) { +  assert(!InitName.empty() && "Expected init function name"); +  Function *F = checkSanitizerInterfaceFunction(M.getOrInsertFunction( +      InitName, +      FunctionType::get(Type::getVoidTy(M.getContext()), InitArgTypes, false), +      AttributeList())); +  F->setLinkage(Function::ExternalLinkage); +  return F; +} +  std::pair<Function *, Function *> llvm::createSanitizerCtorAndInitFunctions(      Module &M, StringRef CtorName, StringRef InitName,      ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> InitArgs, @@ -144,22 +156,19 @@ std::pair<Function *, Function *> llvm::createSanitizerCtorAndInitFunctions(    assert(!InitName.empty() && "Expected init function name");    assert(InitArgs.size() == InitArgTypes.size() &&           "Sanitizer's init function expects different number of arguments"); +  Function *InitFunction = +      declareSanitizerInitFunction(M, InitName, InitArgTypes);    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);    if (!VersionCheckName.empty()) {      Function *VersionCheckFunction =          checkSanitizerInterfaceFunction(M.getOrInsertFunction(              VersionCheckName, FunctionType::get(IRB.getVoidTy(), {}, false), -            AttributeSet())); +            AttributeList()));      IRB.CreateCall(VersionCheckFunction, {});    }    return std::make_pair(Ctor, InitFunction); | 
