LLVM如何获取指令的return值
LLVM How to get return value of an instruction
我有一个从堆栈分配内存的程序,如下所示:
%x = alloca i32, align 4
在我的传递中,我想在运行时获取指向该分配内存的实际内存指针。这应该是 %x。如何在我的通行证中获取指针?
Instruction* I;
if (AllocaInst* AI = dyn_cast<AllocaInst>(I)) {
//How to get %x?
}
您可以将指令*用作值*(并且指令继承自值),然后您将使用该指令的结果/return 值。我从我的 LLVM Pass 中改编了一些代码来演示使用 alloca 分配 space 然后存储到该位置。请注意,指令的结果可以直接传递给其他指令,因为它们是值。
// M is the module
// ci is the current instruction
LLVMContext &ctx = M.getContext();
Type* int32Ty = Type::getInt32Ty(ctx);
Type* int8Ty = Type::getInt8Ty(ctx);
Type* voidPtrTy = int8Ty->getPointerTo();
// Get an identifier for rand()
Constant* = M.getOrInsertFunction("rand", FunctionType::get(cct.int32Ty, false));
// Construct the struct and allocate space
Type* strTy[] = {int32Ty, voidPtrTy};
Type* t = StructType::create(strTy);
Instruction* nArg = new AllocaInst(t, "Wrapper Struct", ci);
// Add Store insts here
Value* gepArgs[2] = {ConstantInt::get(int32Ty, 0), ConstantInt::get(int32Ty, 0)};
Instruction* prand = GetElementPtrInst::Create(NULL, nArg, ArrayRef<Value*>(gepArgs, 2), "RandPtr", ci);
// Get a random number
Instruction* tRand = CallInst::Create(getRand, "", ci);
// Store the random number into the struct
Instruction* stPRand = new StoreInst(tRand, prand, ci);
如果您想存储或加载到 %x,您只需使用存储或盖指令
如果您想要指针的数值,请使用 ptrtoint 指令。
我有一个从堆栈分配内存的程序,如下所示:
%x = alloca i32, align 4
在我的传递中,我想在运行时获取指向该分配内存的实际内存指针。这应该是 %x。如何在我的通行证中获取指针?
Instruction* I;
if (AllocaInst* AI = dyn_cast<AllocaInst>(I)) {
//How to get %x?
}
您可以将指令*用作值*(并且指令继承自值),然后您将使用该指令的结果/return 值。我从我的 LLVM Pass 中改编了一些代码来演示使用 alloca 分配 space 然后存储到该位置。请注意,指令的结果可以直接传递给其他指令,因为它们是值。
// M is the module
// ci is the current instruction
LLVMContext &ctx = M.getContext();
Type* int32Ty = Type::getInt32Ty(ctx);
Type* int8Ty = Type::getInt8Ty(ctx);
Type* voidPtrTy = int8Ty->getPointerTo();
// Get an identifier for rand()
Constant* = M.getOrInsertFunction("rand", FunctionType::get(cct.int32Ty, false));
// Construct the struct and allocate space
Type* strTy[] = {int32Ty, voidPtrTy};
Type* t = StructType::create(strTy);
Instruction* nArg = new AllocaInst(t, "Wrapper Struct", ci);
// Add Store insts here
Value* gepArgs[2] = {ConstantInt::get(int32Ty, 0), ConstantInt::get(int32Ty, 0)};
Instruction* prand = GetElementPtrInst::Create(NULL, nArg, ArrayRef<Value*>(gepArgs, 2), "RandPtr", ci);
// Get a random number
Instruction* tRand = CallInst::Create(getRand, "", ci);
// Store the random number into the struct
Instruction* stPRand = new StoreInst(tRand, prand, ci);
如果您想存储或加载到 %x,您只需使用存储或盖指令
如果您想要指针的数值,请使用 ptrtoint 指令。