我喜歡下面是如何傳播:在LLVM中傳播到MC級別的源代碼中添加新屬性?
void foo(int __attribute__((aligned(16)))* p) { ... }
在這種情況下,指針的「alignedness」可在MC的水平,但它顯然是不使用LLVM-IR元數據的方式來實現這個。對齊信息對於某些目標非常重要,這些目標會根據此值更改代碼生成,我認爲我需要的更多的是這個屬性。
添加一個新的屬性,使其通過編譯器傳播的方式與「對齊」相同,有多難?所以,我已經爲LLVM-IR添加了一個新元素來執行此操作。我也希望最難的部分是讓LLVM的其他部分忽略這個新元素,當他們不關心它時。
確實很可惜,LLVM沒有一個通用的目標獨立方式來將解析器中的目標相關信息傳遞到後端。
在類似的question中建議使用'DebugLoc'方法,但是我認爲這是一個小問題,因爲這與調試無關。但如果這種方式的實施不那麼困難,那麼黑客可能是可以接受的。
更新: 會內聯彙編而不是使用新屬性在這裏工作嗎?如果是的話,有什麼優點/缺點?
btw ...我的另一個疑問是OpenCL的地址空間如何在這種情況下工作......在我看來,也許這正是我要找的。 (我錯了嗎?) – eternalStudent
@eternalStudent LLVM對某些值有其自己的addrspace修飾符。您可能對SPIR感興趣,這是一個基於LLVM的OpenCL IR,它依賴於它(https://www.khronos.org/registry/SPIR/specs/spir_spec-2.0.pdf,第2.2節)。所以我想你的問題的答案是這樣的東西被烘焙到語言中,所以添加它們並不簡單。 – Oak
謝謝@Oak :)優秀的解釋! 從你說什麼,我明白,因此目標不可能基於OpenCL的地址空間做出代碼生成的決定? 元數據處理起來比較簡單,只是稍後需要將其轉換爲更多特定於目標的對象,以便在內存操作數信息中可用。添加一個pass以消耗LLVM-IR元數據是完全可以接受的。我只需要弄清楚我應該如何轉換它,以便它可以在調度時保持不變。這裏的任何想法? :) – eternalStudent