2013-06-21 72 views
2

是否可以在我的通行證中使用IR中的註釋?基本上我想用註釋中寫的基本塊頻率註釋的IR,如下所示,我需要頻率值在我的傳球中。我知道這是天真的方法,但它就足夠了。如何在我的通行證中使用LLVM IR中的註釋?

define internal void @MDFilter() #0 { 
entry: 
    ;;; Basic block executed 2 times. <-- I NEED THIS COMMENT AS A STRING IN MY PASS 
    %mdContext = alloca %struct.MD5_CTX, align 8 
    %bytes = alloca i32, align 4 
    %data = alloca [16 x i8], align 16 
    call void @MD5Init(%struct.MD5_CTX* %mdContext) 
    br label %while.cond 
    ;;; Out-edge counts: [2.000000e+00 -> while.cond] 

任何其他獲取此信息的方法也是受歡迎的。

回答

6

不,沒有辦法以這種方式使用註釋的內容,而不是沒有顯着改變IR解析器。但是,沒有必要重新發明輪子;在LLVM中有一種機制,其目的是爲精確地爲這些東西 - 從前端傳輸信息到LLVM傳遞 - 這是metadata

所以不管或誰是將此信息添加到IR應與元數據添加它來代替 - 看到這些來源如何做到這一點的詳細信息:

如果您無法控制數據生成,那麼您應該添加一些預處理步驟,將註釋轉換爲元數據。

到底IR應該是這個樣子:

 
define internal void @MDFilter() #0 { 
entry: 
    %mdContext = alloca %struct.MD5_CTX, align 8, !freq !1 
    %bytes = alloca i32, align 4 
    %data = alloca [16 x i8], align 16 
    call void @MD5Init(%struct.MD5_CTX* %mdContext) 
    br label %while.cond, !outedge !2 

... 

!1 = metadata !{i32 2} 
!2 = metadata !{float 2.0} 

和你通需要尋找這些!freq!outedge節點。

+0

確實,元數據是要走的路。我可以將元數據添加到基本塊對象嗎? 此外,IR由'llvm-prof'生成。 – shrm

+0

@mishr nope。由於每個基本塊至少包含一條指令,我認爲一個好方法是將元數據添加到第一條指令中。或者,您可以添加元數據而不將其與任何內容相關聯,並且元數據內容本身列出它所指的功能和基本塊(按名稱)。 – Oak

+0

@mishr和re:'llvm-prof',我認爲它實際上早於元數據機制。無論如何,看[源代碼](https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_28/tools/llvm-prof/llvm-prof.cpp),將它更改爲但是發出元數據。 – Oak