我试图使用LLVM C ++绑定来编写一个生成以下IR的传递
%1 = call i64 @time(i64* null) #3
@time
这里是C标准库time()
函数。
这是我编写的代码
void Pass::Insert(BasicBlock *bb, Type *timety, Module *m) {
Type *timetype[1];
timetype[0] = timety;
ArrayRef<Type *> timeTypeAref(timetype, 1);
Value *args[1];
args[0] = ConstantInt::get(timety, 0, false);
ArrayRef<Value *> argsRef(args, 1);
FunctionType *signature = FunctionType::get(timety, false);
Function *timeFunc =
Function::Create(signature, Function::ExternalLinkage, "time", m);
IRBuilder<> Builder(&*(bb->getFirstInsertionPt()));
AllocaInst *a1 = Builder.CreateAlloca(timety, nullptr, Twine("a1"));
CallInst *c1 = Builder.CreateCall(timeFunc, args, Twine("time"));
}
这会编译,但在运行时会导致以下错误
Incorrect number of arguments passed to called function!
%time = call i64 @time(i64 0)
据我所知,我需要传递一个int64指针,它指向nullptr
,但我无法弄清楚如何做到这一点。
答案 0 :(得分:1)
LLVM提供了一个ConstantPointerNull
类,它完全符合我的要求 - 它返回所需类型的空指针。
所有需要更改的行都是以args[0] = ...
开头的行
args[0] = ConstantPointerNull::get(PointerType::get(timety, 0));
。