【问题标题】:Setting a pointer value in LLVM IR在 LLVM IR 中设置指针值
【发布时间】:2015-03-19 13:54:04
【问题描述】:

我在 llvm IR 中有一个 int32_t* 类型变量,它存储了存储 int32 的位置的地址。

我想在 llvm ir 中设置这个 int32_t* 变量的值

假设地址是 1223。然后我尝试了以下方法。它是否正确?好像不行

store i64 1223, i32** %1

我将地址 1223 存储在 int64_t 常量 int 中(因为这是一台 64 位机器),并且我正在创建一个存储指令来将此值存储在存储 i32* 的内存中。

有没有更好的办法?

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    所有 LLVM 指令都是严格类型化的,并且要求操作数保持类型正确性。尽管您的方法适用于诸如 C 等类型规则不太严格的语言,但它不适用于 LLVM。您必须将整数常量显式转换为指针:

    %2 = inttoptr i64 1223 to i32*
    store i32* %2, i32** %1
    

    将整数类型转换为指针会使程序“类型不安全”,这通过 inttoptr 指令明确可见。

    您可以在LLVM 指令集和编译策略中阅读3.6 区分安全和不安全代码:强制转换指令中有关该指令的更多信息:http://llvm.org/pubs/2002-08-09-LLVMCompilationStrategy.html

    【讨论】:

      【解决方案2】:

      我假设验证通行证表明您做错了什么并且您的 StoreInst 类型不匹配。

      您正在尝试将 i64 变量保存到 i32 内存区域,这显然是个问题。 要使整数变量成为指针,您必须使用 inttoptr 转换来转换地址:

      store i32* inttoptr (i64 1223 to i32*), i32** %1
      

      【讨论】:

      • 不,verifyModule 对我所做的很满意。该程序运行良好。但我会听从你的建议,因为这似乎是正确的做法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2014-07-31
      相关资源
      最近更新 更多