為什麼Apple的Clang生成的LLVM IR比開源的Clang生成的IR要讀者友好?

開源版本的clang生成出來的ir BasicBlock的名字都是沒有的,而apple的clang生成出來的ir的BasicBlock都會有很可讀的名字,比如entry,

land.rhs, land.end, if.then 等等

=====

後來發現貌似是我搞反了…Apple clang貌似沒有自己編譯的有…

不過我發現這東西似乎並不是很可靠,所以分析的時候還是不能有任何依賴BasicBlock名字的東西


我也發現了。我本地編譯的trunk debug clang名字就較友好,公司里工具鏈編譯出來就沒啥好名字。既然我隨手編譯出來的原生clang就挺友好,那這裡應該沒有陰謀論,一句話都不說,這是墜好的。至於到底哪個選項導致了這點我也懶得找。

另外不要用「聰明」這個詞。你想表達的是「讀者友好」。「Compiler A is smarter than B」意思就是A生的代碼比B跑得還快/佔用內存少/代碼體積小。我就是看著這麼激動人心的標題想進來干一架,結果你給我看個這個。。(


這跟Apple Clang沒有關係,這跟編譯Clang與LLVM的選項有關係,尤其是assertion的開啟。

比如以下的代碼:

int main() {
int i = 47;

if (i &> 3) {

} else {
}
}

我使用編譯選項不帶assertion開啟的clang

然而我使用了-DLLVM_ENABLE_ASSERTIONS=On編譯以後的clang

可以看到,這個label名字就出來了。而對於Apple Clang,至少我用的Apple Clang也是沒有label名字的,應該也是跟編譯出來的這個Apple Clang選項也有關係。


開源版本的生成的BB一般名字默認都是"&:n"(n是數字)這種形式,一個br指令要跳轉到這個BB的時候後面會跟上%n,開源版本默認的變數命名也都是%i(i是數字)這種,但是在你使用llvm的api插入的時候是可以給你插入的BB命名為if.end或者_else,_end等可讀性強的名字的,應該是Apple的clang做的時候命名規則跟開源版本的不一致,畢竟Apple嘛!


推薦閱讀:

如何評價Clang with Microsoft CodeGen?
windows下如何使用clang來編譯c++14項目?
想在程序runtime的時候動態編譯其他code為.bc file,有什麼辦法?
Clang parser是完全手寫的嗎?
在編譯C語言代碼時,Clang跟gcc編譯器哪一個編譯出來的程序運行更快?特別是在浮點運算方面。

TAG:Clang | LLVM | 中間表示編譯原理 |