测试套件 Makefile 指南(已弃用)

概述

首先,所有测试都在 LLVM 对象目录树中执行。它们不会在 LLVM 源代码树内执行。这是因为测试套件在执行期间会创建临时文件。

要运行测试套件,您需要执行以下步骤

  1. 使用以下命令检出test-suite模块:

    % git clone https://github.com/llvm/llvm-test-suite.git test-suite
    
  2. 待办:这些说明已过时,无法使用。找出正确的操作方法,并将其记录在此处。

  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.<value of TEST variable>.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。尽管这些行仍然淹没在输出中,但很容易在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命令输出的正则表达式。有很多示例报告可以执行复杂的操作。