所以这就是我想要做的事情:
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传递中调用的外部函数,因为我不熟悉这些东西。帮助将不胜感激!
答案 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.html和http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html#details。