我有一些LLVM代码,我想引用现有的变量。我正在进行JIT并在我的过程中执行此代码,因此我希望该函数直接引用我现在拥有的变量。
例如,
int64_t begin, end;
auto&& con = g.module->getContext();
std::vector<llvm::Type*> types = { llvm::Type::getInt64PtrTy(con), llvm::Type::getInt64PtrTy(con) };
auto tramp = llvm::Function::Create(llvm::FunctionType::get(llvm::Type::getVoidTy(con), types, false), llvm::GlobalValue::LinkageTypes::ExternalLinkage, "", g.module.get());
auto bb = llvm::BasicBlock::Create(con, "entry", tramp);
auto builder = llvm::IRBuilder<>(bb);
auto call = builder.CreateCall(g.module->getFunction(failfunc->GetName()));
builder.CreateStore(builder.CreateExtractValue(call, { tupty->GetFieldIndex(1) }), &begin);
builder.CreateStore(builder.CreateExtractValue(call, { tupty->GetFieldIndex(2) }), &end);
builder.CreateRetVoid();
显然我不能直接通过&amp; begin和&amp; end here,因为它们不是llvm::Value
s。但是,如何创建一个直接指向它的LLVM指针值,我可以传递给CreateStore
?
答案 0 :(得分:5)
就JIT而言,这些本地人的内容和地址只是常数。
因此,如果您想传递begin
的内容,请使用:
Constant* beginConstInt = ConstantInt::get(Type::Int64Ty, begin);
如果你想获得它的地址,你必须首先创建一个整数常量,然后将其转换为指针:
Constant* beginConstAddress = ConstantInt::get(Type::Int64Ty, (int64_t)&begin);
Value* beginConstPtr = ConstantExpr::getIntToPtr(
beginConstAddress , PointerType::getUnqual(Type::Int64Ty));
例如,如果begin
的地址为1000,则生成的常量应为inttoptr (i64 1000 to i64*)
。所以你的store
看起来像是:
store i64 %extractvalue, i64* inttoptr (i64 1000 to i64*)