測試套件 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=<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 輸出日誌。

更好的是 reportreport.format 目標(其中 formathtmlcsvtextgraphs 之一)。報告的確切內容取決於您正在執行的 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。有許多範例報告可以執行複雜的操作。