2017-08-25 65 views
2

我喜歡下面是如何傳播:在LLVM中傳播到MC級別的源代碼中添加新屬性?

void foo(int __attribute__((aligned(16)))* p) { ... } 

在這種情況下,指針的「alignedness」可在MC的水平,但它顯然是不使用LLVM-IR元數據的方式來實現這個。對齊信息對於某些目標非常重要,這些目標會根據此值更改代碼生成,我認爲我需要的更多的是這個屬性。

添加一個新的屬性,使其通過編譯器傳播的方式與「對齊」相同,有多難?所以,我已經爲LLVM-IR添加了一個新元素來執行此操作。我也希望最難的部分是讓LLVM的其他部分忽略這個新元素,當他們不關心它時。

確實很可惜,LLVM沒有一個通用的目標獨立方式來將解析器中的目標相關信息傳遞到後端。

在類似的question中建議使用'DebugLoc'方法,但是我認爲這是一個小問題,因爲這與調試無關。但如果這種方式的實施不那麼困難,那麼黑客可能是可以接受的。

更新: 會內聯彙編而不是使用新屬性在這裏工作嗎?如果是的話,有什麼優點/缺點?

回答

2

如您所示,對齊方式不使用元數據。

  • 爲了誰不知道:排列在所有相關的說明中提到(或明或暗地),因此,例如在疑問,功能將被編譯爲這樣的事情(注意對齊):

     
    define void @foo(i32*) { 
        %2 = alloca i32*, align 16  ; Allocate a 16-aligned pointer 
        store i32* %0, i32** %2, align 16 ; An aligned store to place the arg there 
        ... 
    

現在,如果你想要的一些信息附加到現有的指令且大多數編譯器的其餘部分忽略它們,使用元數據是一個好主意。但是,由於元數據是一個編譯器內部的抽象事物,所以在某些時候你必須實際做一些事情。通常情況下,通過添加自己的通行證來消耗它並相應地執行某些操作。

至於其中將您的通和如何實現它,它真的取決於你想傳遞的實際和預期效果。

+0

btw ...我的另一個疑問是OpenCL的地址空間如何在這種情況下工作......在我看來,也許這正是我要找的。 (我錯了嗎?) – eternalStudent

+1

@eternalStudent LLVM對某些值有其自己的addrspace修飾符。您可能對SPIR感興趣,這是一個基於LLVM的OpenCL IR,它依賴於它(https://www.khronos.org/registry/SPIR/specs/spir_spec-2.0.pdf,第2.2節)。所以我想你的問題的答案是這樣的東西被烘焙到語言中,所以添加它們並不簡單。 – Oak

+0

謝謝@Oak :)優秀的解釋! 從你說什麼,我明白,因此目標不可能基於OpenCL的地址空間做出代碼生成的決定? 元數據處理起來比較簡單,只是稍後需要將其轉換爲更多特定於目標的對象,以便在內存操作數信息中可用。添加一個pass以消耗LLVM-IR元數據是完全可以接受的。我只需要弄清楚我應該如何轉換它,以便它可以在調度時保持不變。這裏的任何想法? :) – eternalStudent