(TL; DontWannaRead - 跳到這個答案的末尾)
要回答你的問題正確,你首先需要了解的區別編譯器的front-end和back-end(特別是第一個)。
Clang是C,C++,Objective C和Objective C++語言的編譯器前端(http://en.wikipedia.org/wiki/Clang)。
鏘的職責是以下內容:
即,從C++源代碼(或C,或目標C,等等。)翻譯成LLVM IR,什麼應該該文本較低級表示代碼做。爲了做到這一點,Clang使用了許多子模塊,其描述可以在任何體面的編譯器構建書中找到:詞法分析器,語法分析器+語義分析器(Sema)等。
LLVM是一組庫,其主要任務是執行以下操作:假設我們有以下C的LLVM IR表示++函數
int double_this_number(int num) {
int result = 0;
result = num;
result = result * 2;
return result;
}
的LLVM的核心通過應優化 LLVM IR代碼:
做什麼用優化的LLVM IR代碼是完全由你:你可以把它翻譯成x86_64的executab或者修改它,然後將其作爲ARM可執行代碼或GPU可執行代碼吐出。這取決於你的項目的目標。
術語「後端」經常令人困惑,因爲有許多論文將LLVM庫定義爲編譯器鏈中的「中端」,並將「後端」定義爲執行代碼生成的最終模塊(LLVM IR可執行代碼或其他不再需要編譯器處理的其他內容)。其他來源指LLVM作爲Clang的後端。無論哪種方式,他們的角色都是明確的,他們提供了一個強大的機制:無論您的目標語言是什麼(C++,C,Objective C,Python等),如果您有一個將其轉換爲LLVM IR的前端,您可以使用相同的一組LLVM庫對其進行優化,只要您擁有目標體系結構的後端,就可以生成優化的可執行代碼。
回顧LLVM是一組庫(不只是優化過程也data structures,實用模塊,診斷模塊,等等。),也鏘在其前結束過程利用許多 LLVM庫。每隔 LLVM模塊遠離Clang,你不能真的撕裂,因爲後者是建立在前一套上的。
至於爲什麼Clang被說成是「編譯驅動程序」:Clang管理對命令行參數的解釋(描述和許多聲明是TableGen'd,並且它們可能需要比簡單的grep更多地通過根據所需/可能的優化和轉換級別設置CodeGenOptions
並調用相應的模塊(clangCodeGen
BackendUtil.cpp
是填充模塊通過管理器的優化和應用)和工具(例如Windows ld
鏈接器)。它從一開始就引導編譯過程結束。
最後,我會建議閱讀Clang和LLVM文檔,他們很有說服力,大多數問題應該首先在那裏尋找答案。
這可能是另一個XY問題。如果你得到這個問題的答案,你打算解決什麼問題? – MSalters 2014-11-03 13:44:15
@MSalters我只是想知道clang如何驅動llvm來完成優化工作。我正在研究一個*似乎需要clang sanitizer和llvm IR通過分析的項目,所以我想知道關於clang如何工作的詳細信息。基本上我們想實現一個像clang一樣工作的(非常輕量級的)驅動程序,但是針對端到端代碼漏洞檢查。 – 2014-11-03 13:49:31
對,我已經覺得在某個地方真的有問題了。你會不會更好地爲LLVM編寫目標語言描述並進行編譯? LLVM編譯器不限於定位x86或ARM,它可以擴展。通過定義合適的目標語言,您的漏洞將在最終輸出中脫穎而出。 – MSalters 2014-11-03 13:53:58