測試套件 Makefile 指南(已棄用)

概述

首先,所有測試都會在 LLVM 物件目錄樹中執行。它們*不會*在 LLVM 原始碼樹中執行。這是因為測試套件在執行期間會建立暫存檔案。

若要執行測試套件,您需要執行下列步驟

  1. 使用下列指令取出 test-suite 模組

    % git clone https://github.com/llvm/llvm-test-suite.git test-suite
    
  2. FIXME:這些指示已過時,無法運作。找出正確的做法,並將其寫在這裡。

  3. 設定並建置 llvm

  4. 設定並建置 llvm-gcc

  5. llvm-gcc 安裝在某個位置。

  6. *重新設定* 您要執行測試套件的每個建置樹(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 目錄。]

  7. 您現在可以從您的建置樹執行測試套件,如下所示

    % cd $LLVM_OBJ_ROOT/projects/test-suite
    % make
    

請注意,第二個和第三個步驟只需要執行一次。在您取出並設定好套件後,您就不需要再做一次(除非測試程式碼或設定腳本有變更)。

設定外部測試

若要執行 test-suite 模組中的外部測試,您必須指定 *–with-externals*。這項操作必須在*重新設定*步驟中完成(請參閱上文),而且 llvm 重新設定必須辨識先前建置的 llvm-gcc。如果缺少或忽略其中任何一項,外部測試將無法運作。

  • –with-externals

  • –with-externals=<目錄>

這會告訴 LLVM 在哪裡可以找到任何外部測試。它們預計會放在 <directory> 中特定命名的子目錄中。如果未指定 directoryconfigure 會使用預設值 /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 研究群組之外將無法使用。但是,它們仍然很有價值,可以作為編寫您自己的 TEST Makefile 的指南,以供您使用 LLVM 開發的任何最佳化或分析遍歷。

產生測試輸出

有許多方法可以執行測試並產生輸出。最簡單的方法是直接執行不帶參數的 gmake。這將使用多種不同的方法編譯和執行樹狀目錄中的所有程式,並比較結果。任何失敗都會在輸出中報告,但很可能會被其他輸出淹沒。不會明確報告遍歷。

稍微好一點的方法是執行 gmake TEST=sometest test,這將執行指定的測試,並且通常會在輸出中新增每個程式的摘要(取決於您使用的 sometest)。例如,nightly 測試會在每個程式之後明確輸出每個測試的 TEST-PASS 或 TEST-FAIL。雖然這些行仍然會被輸出淹沒,但可以輕鬆地在輸出目錄中 grep 輸出日誌。

更棒的是 reportreport.format 目標(其中 format 可以是 htmlcsvtextgraphs)。報表的確切內容取決於您正在執行的 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 搜尋命令輸出的正規表示式。有很多範例報表可以執行一些花俏的操作。