2017-01-10 216 views
0

原来这就是我想要做的事:如何将参数传递给我在LLVM传递中使用CallInst :: Create(...)调用的外部函数?

 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); 
     } 

其中“钩子”是功能。我得到的错误是:

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

当我改变ArrayRef <Value *> arguments('c')ArrayRef <char> arguments('c')误差变:

没有匹配函数调用 '创建' 指令* newinst中= CallInst ::创建(钩,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'静态CallInst * Create(Value * F,const Twine & NameStr =“”, ^ /.../llvm/llvm-3.4/include/llvm/IR/Instructions.h:1204:20: 注意: 候选函数不可行:没有已知的从'ArrayRef'转换为 'const llvm :: Twine'的第二个参数静态CallInst *创建(Value * F,常量Twine & NameStr, ^ /.../llvm/ llvm-3.4/include/llvm/IR/Instructions.h:1194:20: 注意: 候选函数不可行:需要4个参数,但3人提供的静态CallInst *创建(价值* Func键, ^

我也没有认识到参数传递给外部函数我在LLVM通过打电话,因为我是新来这个东西。帮助将不胜感激!

回答

1

CallInst:创建需要数组引用<值*>的参数

所以现在当你初始化数组引用<值*>参数(“C”),这里没有内置的构造函数来转换字符“C”以价值*

你可以做

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

或 你可以直接传递给CallInst单I8整数类型:: Create调用

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

+0

谢谢您的回复,我现在可以传递一个字符。但如何处理字符数组(我想传递一个字符串)? –

+0

尝试llvm :: ConstantDataArray :: get(context,string)请参阅http://llvm.org/docs/doxygen/html/classllvm_1_1ConstantDataArray.html –