【发布时间】:2017-07-06 10:39:53
【问题描述】:
使用 ModulePass,我的目标是向上遍历 SSA 图:从一个具有 0..2 个操作数的语句(大多数操作码都属于该语句)开始,我想找出两件事:
- 操作数是元数据/常量(简单:只需尝试转换为常量类型)还是变量?
- 如果它是一个变量,请获取定义它的 Statement(因为 LLVM IR 是 SSA 形式,这是一个格式良好的查询),这样我就可以递归地继续这个遍历。
例如,假设以下 LLVM IR:
define i32 @mul_add(i32 %x, i32 %y, i32 %z) {
entry:
%tmp = mul i32 %x, %y
%tmp2 = add i32 %tmp, %z
ret i32 %tmp2
}
我将从 return 语句开始。现在我想知道我返回的是什么:
- 我将为自己获取 return 语句的操作数
- 我检测到操作数是一个名为 %tmp2 的变量
- 我将为自己获取定义 %tmp2 的语句的操作数
- 我会先遍历第一个操作数,%tmp
- (...)
- %x 是一个函数参数,因此可能是我遍历的结束(或者是它?)
- (...继续此 DFS 中的其他分支...)
我将如何使用 C++ API 来实现这些步骤?
【问题讨论】:
-
"适当使用"
标签: llvm llvm-ir llvm-c++-api