2014-11-03 130 views
13

有人告訴我,clang是一個像gcc一樣工作的驅動程序,用於預處理,編譯和鏈接工作。在編譯和鏈接過程中,據我所知,實際上是llvm進行優化("-O1", "-O2", "-O3", "-Os", "-flto")。鏗鏘是如何引導C/C++代碼優化的?

但我只是不明白如何 llvm涉及

看來,編譯源代碼甚至不需要一個靜態庫,如libLLVMCore.a,而不是爲Debian的包鏗鏘依賴於另一個叫libllvm-3.4包(鐺的版本是3.4),其中包含libLLVM-3.4.so(.1),確實鐺使用此共享庫優化?

我檢查鐺源代碼了一會兒,發現include/clang/Driver/Options.td包含相關的選項,但遺憾的是我沒有找到源文件包括這個文件,所以我還沒有意識到的機制。

我希望有人可能會給我一些提示。

+1

這可能是另一個XY問題。如果你得到這個問題的答案,你打算解決什麼問題? – MSalters 2014-11-03 13:44:15

+0

@MSalters我只是想知道clang如何驅動llvm來完成優化工作。我正在研究一個*似乎需要clang sanitizer和llvm IR通過分析的項目,所以我想知道關於clang如何工作的詳細信息。基本上我們想實現一個像clang一樣工作的(非常輕量級的)驅動程序,但是針對端到端代碼漏洞檢查。 – 2014-11-03 13:49:31

+0

對,我已經覺得在某個地方真的有問題了。你會不會更好地爲LLVM編寫目標語言描述並進行編譯? LLVM編譯器不限於定位x86或ARM,它可以擴展。通過定義合適的目標語言,您的漏洞將在最終輸出中脫穎而出。 – MSalters 2014-11-03 13:53:58

回答

18

(TL; DontWannaRead - 跳到這個答案的末尾)

要回答你的問題正確,你首先需要了解的區別編譯器的front-endback-end(特別是第一個)。

Clang是C,C++,Objective C和Objective C++語言的編譯器前端http://en.wikipedia.org/wiki/Clang)。

鏘的職責是以下內容:

enter image description here

即,從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代碼:

enter image description here

做什麼用優化的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並調用相應的模塊(clangCodeGenBackendUtil.cpp是填充模塊通過管理器的優化和應用)和工具(例如Windows ld鏈接器)。它從一開始就引導編譯過程結束。

最後,我會建議閱讀Clang和LLVM文檔,他們很有說服力,大多數問題應該首先在那裏尋找答案。

+1

我想我的問題有些模棱兩可,但你給了這樣一個很好的答案,告訴我如何深入到IR一代,特別是最後三段;非常感謝! – 2014-11-04 02:16:27

+2

順便說一句,你能告訴什麼是生成圖片的工具? – 2014-11-04 02:18:09

+0

@洪緒晨我用Publisher – 2014-11-04 09:38:50

9

它不完全像海灣合作委員會,所以不要花太多時間試圖精確匹配兩者。

LLVM編譯器是一種特定語言LLVM的編譯器。 Clang所做的是將C++代碼編譯爲LLVM,而不進行優化。然後,Clang可以調用LLVM編譯器來編譯該LLVM代碼以優化程序集。

+1

我知道他們是不完全一樣,但我希望獲得*更多細節*關於* how * clang調用llvm編譯器來執行優化工作。 – 2014-11-03 13:42:39