【问题标题】:llvm pass: How to insert a variable using existing variable valuellvm pass:如何使用现有变量值插入变量
【发布时间】:2014-10-12 13:36:55
【问题描述】:

我定义了int a = 5;在源代码中,我将源代码转换为 LLVM IR:

%a = alloca i32, align 4
store i32 5, i32* %a, align 4

我想通过写一个 pass 来插入 int b = a;。我将int a=5; int b=a 编译到 LLVM IR 中,它首先加载“a”,然后存储它。我还检查了 doxygen,其中 LoadInst 是LoadInst (Value *Ptr, const Twine &NameStr, Instruction *InsertBefore) 不过,我不知道如何获得“a”的Value

如何获取变量值?

【问题讨论】:

    标签: llvm llvm-c++-api


    【解决方案1】:

    在 LLVM IR 中的序列

    int a = 5;
    int b = a;
    

    不做任何优化,翻译为

    %a = alloca i32, align 4
    %b = alloca i32, align 4
    store i32 5, i32* %a, align 4
    %0 = load i32* %a, align 4
    store i32 %0, i32* %b, align 4
    

    这对应于两个AllocaInsts、两个StoreInsts和一个LoadInst如下

    警告:前面有未经测试/未编译的伪代码

    ConstantInt* const_int_5 = ConstantInt::get(llvmContext, APInt(32, StringRef("5"), 10));
    
    AllocaInst* a_alloc = new AllocaInst(IntegerType::get(llvmContext, 32), "a");
    AllocaInst* b_alloc = new AllocaInst(IntegerType::get(llvmContext, 32), "b");
    StoreInst* store_5 = new StoreInst(const_int_5, a_alloc, false);
    LoadInst* load_from_a = new LoadInst(a_alloc, "", false);
    StoreInst* store_b = new StoreInst(load_from_a, b_alloc, false);
    

    您可能会感到困惑,因为 指令是 LLVM API 中的值,这要归功于精心设计的继承层次结构。

    【讨论】:

    • 对不起,我猜你误解了我的真正意思。我可以使用llc -march 得到类似的答案。我应该如何将我的问题中的 IR 代码转换为您答案中的 IR 代码?由于 IR 代码中已经存在 alloca 和 store inst,我应该怎么做才能得到“a_alloca”?
    • 我听不懂你这句话的英文。是否要将“a”变量的名称更改为“a_alloca”?如果是这样,更改AllocaInst构造函数的const Twine &Name=""参数
    • 我认为 OP 只是想在他的传递中添加第二个局部变量 b(带有新的 AllocaInst)并使用 已经存在 局部变量 'a 的值对其进行初始化'。为此,他需要告诉 LoadInst 访问局部变量“a”。问题是如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2017-05-31
    • 2014-10-03
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2010-12-12
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多