測試套件 Makefile 指南 (已棄用)¶
概述¶
首先,所有測試都在 LLVM 物件目錄樹中執行。它們並非在 LLVM 原始碼樹中執行。這是因為測試套件在執行期間會建立暫存檔。
若要執行測試套件,您需要使用以下步驟
檢出
test-suite
模組,使用% git clone https://github.com/llvm/llvm-test-suite.git test-suite
FIXME: 這些指示已過時且無法運作。請找出正確的做法,並在此處寫下來。
配置並構建
llvm
。配置並構建
llvm-gcc
。將
llvm-gcc
安裝到某處。從您要執行測試套件的每個構建樹(LLVM 物件目錄樹)的頂層重新配置
llvm
,就像您在構建 LLVM 之前所做的那樣。在重新配置期間,您必須執行以下操作之一:(1)將您剛構建的
llvm-gcc
放在您的路徑中,或者(2)使用--with-llvmgccdir=$LLVM_GCC_DIR
指定您剛構建的llvm-gcc
的安裝目錄。您還必須告知配置機制,測試套件是可用的,以便可以為您的構建樹進行配置
% cd $LLVM_OBJ_ROOT ; $LLVM_SRC_ROOT/configure [--with-llvmgccdir=$LLVM_GCC_DIR]
[請記住,
$LLVM_GCC_DIR
是您安裝 llvm-gcc 的目錄,而不是其 src 或 obj 目錄。]您現在可以從您的構建樹執行測試套件,如下所示
% cd $LLVM_OBJ_ROOT/projects/test-suite % make
請注意,第二和第三步驟只需要執行一次。在您檢出並配置套件後,您無需再次執行(除非測試程式碼或配置腳本變更)。
配置外部測試¶
為了在 test-suite
模組中執行外部測試,您必須指定 –with-externals。這必須在重新配置步驟(見上文)期間完成,並且 llvm
重新配置必須識別先前構建的 llvm-gcc
。如果缺少或忽略其中任何一項,外部測試將無法運作。
–with-externals
–with-externals=<directory>
這告訴 LLVM 在哪裡找到任何外部測試。它們預期位於 <directory
> 中具有特定名稱的子目錄中。如果未指定 directory
,則 configure
使用預設值 /home/vadve/shared/benchmarks/speccpu2000/benchspec
。LLVM 已知的子目錄名稱包括
spec95
speccpu2000
speccpu2006
povray31
其他子目錄會不時新增,並且可以從 configure
確定。
執行不同測試¶
除了常規的「完整程式」測試之外,test-suite
模組還提供了一種以不同方式編譯程式的機制。如果在 gmake
命令列上定義了變數 TEST,則測試系統將包含一個名為 TEST.<TEST 變數的值>.Makefile
的 Makefile。此 Makefile 可以修改構建規則以產生不同的結果。
例如,LLVM 夜間測試器使用 TEST.nightly.Makefile
來建立夜間測試報告。若要執行夜間測試,請執行 gmake TEST=nightly
。
樹狀結構中有幾個可用的 TEST Makefile。其中一些是為 LLVM 內部研究而設計的,並且在 LLVM 研究組外部無法運作。然而,對於為您使用 LLVM 開發的任何最佳化或分析傳遞編寫自己的 TEST Makefile,它們仍然可能很有價值,作為指南。
生成測試輸出¶
有許多方法可以執行測試並生成輸出。最簡單的方法是直接執行不帶任何引數的 gmake
。這將使用多種不同的方法編譯並執行樹狀結構中的所有程式,並比較結果。任何失敗都會在輸出中報告,但很可能淹沒在其他輸出中。通過不會明確報告。
稍微好一點的方法是執行 gmake TEST=sometest test
,它會執行指定的測試,並且通常會將每個程式的摘要新增至輸出(取決於您使用的 sometest)。例如,nightly
測試會在每個程式之後的每個測試明確輸出 TEST-PASS 或 TEST-FAIL。儘管這些行仍然淹沒在輸出中,但可以輕鬆地在 Output 目錄中 grep 輸出日誌。
更好的是 report
和 report.format
目標(其中 format
是 html
、csv
、text
或 graphs
之一)。報告的確切內容取決於您正在執行的 TEST
,但文字結果始終在執行結束時顯示,並且結果始終儲存在 report.<type>.format
檔案中(當使用 TEST=<type>
執行時)。report
還會生成一個名為 report.<type>.raw.out
的檔案,其中包含整個測試執行的輸出。
為測試套件編寫自訂測試¶
假設您可以執行測試套件(例如,「gmake TEST=nightly report
」應該可以運作),針對樹狀結構中的每個程式執行最佳化或程式碼產生器組件、收集統計資料或執行自訂正確性檢查非常容易。基本上,這就是夜間測試器的工作方式,它只是一般框架的一個範例。
假設您有一個 LLVM 最佳化傳遞,並且您想查看它觸發了多少次。您應該做的第一件事是將 LLVM 統計資訊新增到您的傳遞中,這將統計您關心的事物的計數。
接下來,您可以設定一個測試和一個報告,以收集這些資訊並將其格式化以便於查看。這包含兩個檔案,一個「test-suite/TEST.XXX.Makefile
」片段(其中 XXX 是您的測試名稱)和一個「test-suite/TEST.XXX.report
」檔案,指示如何將輸出格式化為表格。測試套件中包含許多不同複雜程度的範例報告,並且該框架非常通用。
如果您有興趣測試最佳化傳遞,請查看「libcalls」測試作為範例。它可以像這樣執行
% cd llvm/projects/test-suite/MultiSource/Benchmarks # or some other level
% make TEST=libcalls report
這將執行一堆操作,然後最終列印出如下表格
Name | total | #exit |
...
FreeBench/analyzer/analyzer | 51 | 6 |
FreeBench/fourinarow/fourinarow | 1 | 1 |
FreeBench/neural/neural | 19 | 9 |
FreeBench/pifft/pifft | 5 | 3 |
MallocBench/cfrac/cfrac | 1 | * |
MallocBench/espresso/espresso | 52 | 12 |
MallocBench/gs/gs | 4 | * |
Prolangs-C/TimberWolfMC/timberwolfmc | 302 | * |
Prolangs-C/agrep/agrep | 33 | 12 |
Prolangs-C/allroots/allroots | * | * |
Prolangs-C/assembler/assembler | 47 | * |
Prolangs-C/bison/mybison | 74 | * |
...
這基本上是 grep -stats 輸出並以表格形式顯示它。您也可以使用「TEST=libcalls report.html」目標以 HTML 形式取得表格,report.csv 和 report.tex 也是如此。
此程式碼的來源位於 test-suite/TEST.libcalls.*
中。格式非常簡單:Makefile 指示如何執行測試(在本例中為「opt -simplify-libcalls -stats
」),並且報告包含輸出的每一列的一行。第一個值是列的標頭,第二個值是用於 grep 命令輸出的 regex。有許多範例報告可以執行複雜的操作。