如何获得一个指令的返回值

LLVM How to get return value of an instruction

本文关键字:一个 指令 返回值 何获得      更新时间:2023-10-16

我有一个程序,它从堆栈中分配内存,像这样:

%x = alloca i32, align 4

在我的传递中,我想获得在运行时指向该分配内存的实际内存指针。这应该是%x。我怎样才能拿到我的通行证?

Instruction* I;
if (AllocaInst* AI = dyn_cast<AllocaInst>(I)) {
    //How to get %x?
} 

您可以将指令*作为值*(并且指令继承自值),然后您正在处理该指令的结果/返回值。我从我的LLVM Pass中改编了一些代码来演示使用alloca分配空间,然后存储到该位置。请注意,指令的结果可以直接传递给其他指令,因为它们是值。

    // 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,只需使用store或lid指令

如果你想要指针的数值,使用ptrtoint指令