我在llvm IR中有一个int32_t *类型变量,它存储了存储int32的地方的地址。
我想在llvm ir
中设置此int32_t *变量的值我们说地址是1223.然后我尝试了以下内容。它是否正确?它似乎无法运作
store i64 1223, i32** %1
我将地址1223存储在int64_t常量int中(因为这是一个64位机器),我正在创建一个存储指令,将该值存储在存储i32 *的内存中。
有更好的方法吗?
答案 0 :(得分:2)
所有LLVM指令都是严格类型的,需要操作数来保持类型的正确性。虽然您的方法适用于C语言,它具有不太严格的类型规则,但它不适用于LLVM。您必须将整数常量显式转换为指针:
%2 = inttoptr i64 1223 to i32*
store i32* %2, i32** %1
将整数类型转换为指针会使程序" type-unsafe"通过inttoptr指令明确可见。
您可以在 3.6区分安全和不安全代码中阅读更多相关说明: LLVM指令集和编译策略中的转换指令:http://llvm.org/pubs/2002-08-09-LLVMCompilationStrategy.html < / p>
答案 1 :(得分:0)
我认为Validate pass表示你做错了,而且StoreInst的类型不匹配。
您正在尝试将i64变量保存到i32内存区域,这显然是一个问题。 要使整数变量成为指针,必须使用inttoptr强制转换来转换地址:
store i32* inttoptr (i64 1223 to i32*), i32** %1