【发布时间】:2017-10-02 20:29:31
【问题描述】:
在下面的示例中,我试图提取每条指令引用的所有全局变量,但我总是遗漏一些。
... // inside a BB
for (Instruction * I : BB) {
for (Use &U : I->operands()) {
if(GlobalVariable * GV = dyn_cast<GlobalVariable >(U)){
// Do something with GV
GV->dump();
}
}
}
但是当我的目标是获取以下全局值时:
@end = global i8 0, align 1
@.str = private unnamed_addr constant [4 x i8] c"YES\00", align 1
@.str.2 = private unnamed_addr constant [3 x i8] c"NO\00", align 1
define void @TempF() {
entry:
%tmp8 = load i8, i8* @end, align 1
%tmp9 = trunc i8 %tmp8 to i1
%tmp10 = select i1 %tmp9, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0)
ret void
}
在这个 IR 上运行我的通行证时,只有 @end = global i8 0, align 1 被打印出来。但不是...
@.str = private unnamed_addr constant [4 x i8] c"YES\00", align 1
@.str.2 = private unnamed_addr constant [3 x i8] c"NO\00", align 1
我知道@.str 不像@end 那样是操作数的一部分。 @.str 是被其中一个操作数引用的东西。
我必须进行哪些修改才能在操作数中获取全局变量?
【问题讨论】:
-
如果你
->dump()在你的 if 之外怎么办?那你还看到了哪些其他操作数?可能你需要另一个 if(s) 来对它们的内容采取相应的行动,不是吗? -
@Stanislav,是的,在看到@Brian 的回答后,我完全同意你的看法。但我想避免为每个极端情况编写代码。我想我会通过构建一个包含所有非 GV 运算符的集合并验证哪些可能有操作数 (
getNumOperands()!=0) 来解决它,类似于 Brian 所做的,但也许通过将它们转换为指令。仍在努力实施。我假设只有指令有操作数是正确的吗?
标签: c++ compiler-construction llvm