blu*_*sea 8 compiler-construction llvm llvm-ir
有时我发现llvm IR中的标签标识符以逗号';'
; <label> 6
开头,但是如我所知,逗号用于注释.那么llvm如何在评论中检索标签信息呢?我错过了什么吗?
遵循一个简单的测试.
C源文件:
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
if ( a > 3)
a *= 2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
http://llvm.org/demo/index.cgi生成的llvm IR代码(与clang -c -emit-llvm main.c相同)如下:
; ModuleID = '/tmp/webcompile/_13654_0.bc'
@.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1
define i32 @main() nounwind uwtable {
%a = alloca i32, align 4
%1 = call i32 (i8*, ...)* @__isoc99_scanf(i8* getelementptr inbounds ([3 x i8]* @.str, i64 0, i64 0), i32* %a) nounwind
%2 = load i32* %a, align 4, !tbaa !0
%3 = icmp sgt i32 %2, 3
br i1 %3, label %4, label %6
; <label>:4 ; preds = %0
%5 = shl nsw i32 %2, 1
store i32 %5, i32* %a, align 4, !tbaa !0
br label %6
; <label>:6 ; preds = %4, %0
ret i32 0
}
Run Code Online (Sandbox Code Playgroud)
在LLVM IR中,块不需要显式标签。指令以相同的方式产生%1,%2,%3。LLVM按递增顺序将数字分配给未命名的指令和块。在br i1 %3...终止第一嵌段和最后使用的号标签是3,以便下一个块被标记为4,也就是说与下一个块结束br指令和最后使用的数量是5,因此下一个和最后块标记有6.起初,它块和指令共享相同的名称空间似乎很奇怪,但请记住,块也是值。