2012-03-19 132 views
4

有時我發現在LLVM IR標籤標識符開始使用逗號「;」,如 ; <label> 6 然而如我kown,逗號用於註釋。那麼,llvm如何才能在評論中找回標籤信息呢?我錯過了什麼嗎?
遵循一個簡單的測試。
C源文件:標籤的在LLVM IR代碼表達

#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代碼(同鐺-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 
} 

回答

2

在LLVM IR一個塊不需要顯式標籤。說明與導致%1,%2,%3的方式相同。 LLVM按遞增順序將數字分配給未命名的指令和塊。 br i1 %3...終止第一個塊,最後使用的數字標籤爲3,所以下一個塊被標記爲4.該塊以下一個br指令結束,最後使用的數字爲5,因此下一個和最後一個塊標記爲6.在首先,塊和指令共享相同的名稱空間似乎很奇怪,但請記住塊也是值。

+0

感謝您的幫助。這似乎有點奇怪。你能給我一些建議,讓我學習LLVM嗎? – bluesea 2012-03-20 03:07:13

1

儘管有這樣的措詞,並不是標籤,它只是對塊的引用。你是對的,這很混亂,請參閱this issue進行討論。

0

你可以嘗試的東西是在你的IR上運行instnamer pass,它會給所有的顯式名稱,所以你不必擔心找到隱式名字。