简体   繁体   English

LLVM如何获取指令的返回值

[英]LLVM How to get return value of an instruction

I have a program which allocates memory from stack like this: 我有一个程序可以像这样从堆栈分配内存:

%x = alloca i32, align 4

In my pass I want to get the actual memory pointer that points to this allocated memory at runtime. 在我的过程中,我想获取在运行时指向此已分配内存的实际内存指针。 This should be %x. 这应该是%x。 How do I get the pointer in my pass? 如何通过我的通行证?

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

You can work with an Instruction* as a Value* (and Instruction inherits from Value), then you are working with the result / return value of that instruction. 您可以将Instruction *作为Value *使用(并且Instruction继承自Value),然后使用该指令的结果/返回值。 I have adapted some code from my LLVM Pass to demonstrate allocating space using alloca and then storing into that location. 我已经从LLVM Pass中修改了一些代码,以演示如何使用alloca分配空间,然后将其存储到该位置。 Notice that the results of the instructions can be directly passed to other instructions, as they are values. 注意,指令的结果可以作为值直接传递给其他指令。

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

If you want to store or load to %x you just use a store or lid instruction 如果要存储或加载到%x,则只需使用存储或盖子指令

If you want the numeric value of your pointer, use the ptrtoint instruction. 如果要使用指针的数值,请使用ptrtoint指令。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM