2.2.2 使用DragonEgg和LLVM工具了解編譯流程
如果希望看到前端的運行情況,請使用-S -fplugin-arg-dragonegg-emit-ir標志,該標志將產生以LLVM IR代碼表示的人工可讀文件。
一旦編譯器將程序轉換為IR則停止編譯,并將內存中的表示內容寫入磁盤的能力是LLVM的一個獨有特征。大多數其他編譯器無法做到這一點,在欣賞LLVM IR如何表示源程序之后,可以手動使用多個LLVM工具繼續完成編譯過程。以下命令調用一個特殊的匯編程序,將LLVM從文本形式轉換為二進制形式,仍保存在磁盤上。
llvm-as hello.11 -o hello.bc
如果你愿意,可以用一個特殊的IR反匯編器(llvm-dis) 把它翻譯回可讀的形式。以下工具將在顯示成功完成代碼轉換的相關統計信息的同時,進行獨立于編譯目標的變化。
opt -stats hello.bc -o hello.bc
再強調下,-stats標志是可選的,由于hello.s是一個匯編文件,因此既可以使用GNU binutiles匯編器,也可以使用LLVM匯編器,在下面命令中,我們將使用LLVM匯編器。
llvm-mc -filetype=obj hello.S -o hello.o
因為LLVM鏈接器項目lld目前正在開發中,還沒有集成到核心LLVM項目中,所以LLVM默認使用你的系統鏈接器。因此,如果沒有lld,可以使用常規的編譯器驅動程序來完成編譯。這會激活你的系統鏈接器。
gcc hello.o -c hello
出于性能方面的原因,除了目標文件之外,真正的LLVM編譯器驅動程序在任何階段都不會將程序表示內容寫入磁盤,因為它仍然缺少集成的鏈接器,會使用內存中表示內容并協調幾個LLVM組件進行編譯。
2.2.3 理解LLVM測試套件
LLVM測試套件包括一套用于測試LLVM 編譯器的官方基準程序。該測試套件對于LLVM開發人員非常有用,通過編譯和運行這些程序來驗證優化和編譯器的改進。如果正在使用LLVM的非穩定版本,或者更改了LLVM源代碼并懷疑某些功能不能正常工作,那么可以自行運行該測試套件。在LLVM主源代碼樹中存在更簡單的LLVM回歸測試和單元測試,可以使用make check-all 輕松運行他們。測試條件不同于傳統的回歸測試和單元測試,因為它包含了整個基準程序。
必須將LLVM測試套件放到LLVM源代碼樹中。以允許LLVM構建系統識別它,可以從http://llvm.org/release/3.4/test-suite-3.4.src.tar.gz 找到版本3.4的資源。
要獲取源代碼,請使用以下命令。
wget http://llvm.org/release/3.4/test-suite-3.4.src.tar.gz
如果你喜歡使用GIT,請使用以下命令。
cd llvm/projects
git clone http://llvm.org/git/llvm-project/test-suite.git
需要重新生成LLVM的構建文件才能使用測試套件。在此特例中,不能使用CMake。必須使用經典的配置腳本來構建測試套件。讀者可以參考弟1章中介紹的配置步驟。
測試套件有一套Makefile文件,用于測試和檢查基準。也可以提供一個自定義的Makefile 來評估自定義程序。請將自定義Makefile 文件放在測試套件的源代碼目錄中,并使用命名模版llvm/projects/test-suite/TEST.<custom> Makefile命名該文件,其中,
必須將<custom>記號替換為所需的任何名稱,比如llvm/projects/test-suite/TEST.example.Makefile
在配置期間,將在基準測試程序將要運行的LLVM對象目錄中創建測試套件的目錄。要運行并測試示例Makefile文件。
cd your-llvm-build-folder/projects/test-suite
2.2.4 使用LLDB
LLDB項目是一個用LLVM基礎架構構建的調試器,作為在Mac OS X上的Xcode 5調試器而被積極開發出來,從2011年開始開發到寫本書為止,LLDB還沒有在Xcode范圍之外發布一個穩定的版本。可以從http://llvm.org/release/3.4/lldb-3.4.src.tar.gz獲取LLDB資源。像許多依賴于LLVM的項目一樣,可以通過將其集成到LLVM構建系統中來輕松構建它,要做到這一點,只需將其源代碼放在LLVM toos文件中,如下例所示。
wget http://llvm.org/release/3.4/lldb-3.4.src.tar.gz
tar xvf lldb-3.4.src.tar.gz
也可以使用其SVN存儲庫來獲得最新版本。
cd llvm/tools
svn checkout http://llvm.org/svn/llvm-project/lldb/trunk lldb
如果你愿意,還可以使用GIT鏡像來獲取它。