在LLVM IR中,如何获取指针类型的指针对象值?
我正在写一张通行证,以便不断折叠。 像这样的C代码:在LLVM IR中,如何获取指针类型的指针对象值?,llvm,Llvm,我正在写一张通行证,以便不断折叠。 像这样的C代码: int a = 4; int b = a + 5; 我想将其转换为: int b = 4 + 5; 但是第一段代码将为inta生成一条指令: store i32 4, i32* %a, align 4 如何从我的过程中的指针“i32*%a”获取值“%a”? 因此,我可以将值%a的所有用法替换为ConstantInt?使用说明: %1 = load i32* %a, align 4 为此,首先需要获得值%a的所有用途 Val.user_
int a = 4;
int b = a + 5;
我想将其转换为:
int b = 4 + 5;
但是第一段代码将为inta
生成一条指令:
store i32 4, i32* %a, align 4
如何从我的过程中的指针“i32*%a”获取值“%a”?
因此,我可以将值%a的所有用法替换为ConstantInt?使用说明:
%1 = load i32* %a, align 4
为此,首先需要获得值%a的所有用途
Val.user_begin() to val.user_end() via Value::const_user_iterator it
并检查是否存在存储的指令,以及是否只存储const
if (const StoreInst* store = dyn_cast<StoreInst>(*it))
if(const StoreInst*store=dyn\u cast(*it))
然后可以用该常量替换所有实例。
注:这是您给出的inst的简单算法
a=5;b=a+4 如何在密码中加载地址?除非运行程序,否则
%a
的值未知。通行证不会运行程序。它只是检查和/或转换你的程序。哦,我明白了。但实际上,%a
是一个“常数”。那么有没有其他方法来做这个常数折叠呢?我知道地址中存储了一个常量4
,我想将%a
的所有用法替换为4
。我想您可能需要自己实现它。记住存储
中的值,并将其用作加载
中的替换项。但这可能会变得复杂,因为%a
可以加载到%1
,%2
。。。和其他变量链。您是在运行时还是在传递过程中试图修改全局变量“a”吗?否,“a”是堆栈内存位置,由alloca
分配。