如何将参数传递给我在LLVM传递中使用CallInst :: Create(...)调用的外部函数?

时间:2017-01-10 07:32:49

标签: c++ llvm llvm-ir

所以这就是我想要做的事情:

     if(isa<CallInst>(&(*BI)) )
                {
        ArrayRef <Value *> arguments('c');
        StringRef fname = cast<CallInst>(&(*BI))->getCalledFunction()->getName();
        errs()<<fname + " was called\n";
        //CallInst *CI = dyn_cast<CallInst>(BI);
        if(fname=="pthread_mutex_lock"){
            Instruction *newInst = CallInst::Create(hook, arguments, "");
            BB->getInstList().insert(BI, newInst);
        }

其中“hook”是函数。我得到的错误是:

  

没有用于初始化的匹配构造函数         “数组引用”                           ArrayRef参数('c');

当我将ArrayRef <Value *> arguments('c')更改为ArrayRef <char> arguments('c')时,错误变为:

  

没有用于调用'Create'的匹配函数                                   指令* newInst = CallInst :: Create(hook,argume ...                                                          ^ ~~~~~~~~~~~~~~~   /.../llvm/IR/Instructions.h:1187:20:   注意:         候选函数不可行:没有已知的从'ArrayRef'转换为         'ArrayRef'用于第二个参数static CallInst * Create(Value * Func,                      ^ /.../llvm/llvm-3.4/include/llvm/IR/Instructions.h:1200:20:   注意:         候选函数不可行:没有已知的从'ArrayRef'转换为         'const llvm :: Twine'代表第二个参数static CallInst * Create(Value * F,const Twine&amp; NameStr =“”,                      ^ /.../llvm/llvm-3.4/include/llvm/IR/Instructions.h:1204:20:   注意:         候选函数不可行:没有已知的从'ArrayRef'转换为         'const llvm :: Twine'代表第二个参数static CallInst * Create(Value * F,const Twine&amp; NameStr,                      ^ /.../llvm/llvm-3.4/include/llvm/IR/Instructions.h:1194:20:   注意:         候选函数不可行:需要4个参数,但是提供了3个静态CallInst * Create(Value * Func,                      ^

我缺乏理解将参数传递给我在LLVM传递中调用的外部函数,因为我不熟悉这些东西。帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

CallInst :: Create需要ArrayRef&lt;价值*&gt;参数

所以现在初始化ArrayRef&lt;价值*&gt;参数('c'),这里没有内置构造函数将char'c'转换为Value *

你可以做到

ArrayRef< Value* > arguments(ConstantInt::get(Type::getInt8Ty(llvmContext), 'c'));

或 你可以直接将单个i8类型的整数传递给CallInst :: Create call

Instruction *newInst = CallInst::Create(hook, ArrayRef< Value* >{ConstantInt::get(Type::getInt8Ty(llvmContext), 'c')}, "");

有关详细信息,请参阅http://llvm.org/docs/doxygen/html/classllvm_1_1CallInst.htmlhttp://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html#details