我正在尝试使用LLVM的指针分析,我找到了Andersen指针分析的实现.但是,我是LLVM的新手,我遇到了一些问题.
例如,对于这个简单的C程序(test.c)
int a;
int main()
{
int *p, *q;
a = 20;
p = &a;
q = p;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译的LLVM IR是
5 @a = common global i32 0, align 4
6
7 ; Function Attrs: nounwind uwtable
8 define i32 @main() #0 {
9 entry:
10 %retval = alloca i32, align 4
11 %p = alloca i32*, align 8
12 %q = alloca i32*, align 8
13 store i32 0, i32* %retval
14 store i32 20, i32* @a, align 4
15 store i32* @a, i32** %p, align 8
16 %0 = load i32** %p, align 8
17 store i32* %0, i32** %q, align 8
18 ret i32 0
19 }
Run Code Online (Sandbox Code Playgroud)
我在程序上运行别名分析
$ opt -load ../Release+Asserts/lib/libAnders.so -anders-aa -aa-eval -print-all-alias-modref-info -disable-output < test.bc
Run Code Online (Sandbox Code Playgroud)
结果是
Function: main: 5 pointers, 0 call sites
NoAlias: i32* %retval, i32** %p
NoAlias: i32* %retval, i32** %q
NoAlias: i32** %p, i32** %q
NoAlias: i32* %retval, i32* @a
NoAlias: i32* @a, i32** %p
NoAlias: i32* @a, i32** %q
NoAlias: i32* %0, i32* %retval
NoAlias: i32* %0, i32** %p
NoAlias: i32* %0, i32** %q
MustAlias: i32* %0, i32* @a
Run Code Online (Sandbox Code Playgroud)
这使我感到困惑,因为(p,q)和{a}是明显的别名.我运行-basicaa并获得类似的结果.
所以我想知道LLVM如何处理IR级别的指针变量?结果是否提供了足够的信息,以便其他分析或优化发现它有用?其他通行证如何使用这些信息?谢谢.