llvm IR代码中标签的表达

时间:2012-03-19 15:01:16

标签: 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;
}

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
}

3 个答案:

答案 0 :(得分:3)

在LLVM IR中,块不需要显式标签。说明与导致%1,%2,%3的方式相同。 LLVM按递增顺序为未命名的指令和块分配编号。 br i1 %3...终止第一个块,最后使用的数字标签为3,因此下一个块标记为4.该块以下一个br指令结束,最后使用的数字为5,因此下一个和最后一个块用6标记。首先,块和指令共享相同的命名空间似乎很奇怪,但请记住块也是值。

答案 1 :(得分:1)

尽管有措辞,但%4中的label %4不是标签,它只是对该块的引用。你是对的,这很令人困惑,请参阅this issue进行讨论。

答案 2 :(得分:1)

您可以尝试的是在IR上运行instnamer传递,这将为所有内容提供明确的名称,因此您无需担心找到隐式名称。