為什麼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
可以看到,這個label名字就出來了。而對於Apple Clang,至少我用的Apple Clang也是沒有label名字的,應該也是跟編譯出來的這個Apple Clang選項也有關係。
開源版本的生成的BB一般名字默認都是"&
※如何評價Clang with Microsoft CodeGen?
※windows下如何使用clang來編譯c++14項目?
※想在程序runtime的時候動態編譯其他code為.bc file,有什麼辦法?
※Clang parser是完全手寫的嗎?
※在編譯C語言代碼時,Clang跟gcc編譯器哪一個編譯出來的程序運行更快?特別是在浮點運算方面。