| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
| <link rel="stylesheet" href="llvm.css" type="text/css" media="screen" /> |
| <title>LLVM Test Suite Guide</title> |
| </head> |
| |
| <body> |
| |
| <div class="doc_title"> |
| LLVM Test Suite Guide |
| </div> |
| |
| <ol> |
| <li><a href="#overview">Overview</a></li> |
| <li><a href="#Requirements">Requirements</a></li> |
| <li><a href="#quick">Quick Start</a></li> |
| <li><a href="#org">LLVM Test Suite Organization</a></li> |
| <ul> |
| <li><a href="#codefragments">Code Fragments</a></li> |
| <li><a href="#wholeprograms">Whole Programs</a></li> |
| </ul> |
| <li><a href="#tree">LLVM Test Suite Tree</a></li> |
| <li><a href="#qmstructure">QMTest Structure</a></li> |
| <li><a href="#progstructure">Programs Structure</a></li> |
| <li><a href="#run">Running the LLVM Tests</a></li> |
| <p><b>Written by John T. Criswell</b></p> |
| </ol> |
| |
| <!--===============================================================--> |
| <div class="doc_section"><a name="overview">Overview</a></div> |
| <!--===============================================================--> |
| |
| <div class="doc_text"> |
| <p> |
| This document is the reference manual for the LLVM test suite. It |
| documents the structure of the LLVM test suite, the tools needed to |
| use it, and how to add and run tests. |
| </p> |
| </div> |
| |
| <!--===============================================================--> |
| <div class="doc_section"><a name="Requirements">Requirements</a></div> |
| <!--===============================================================--> |
| |
| <div class="doc_text"> |
| <p> |
| In order to use the LLVM test suite, you will need all of the software |
| required to build LLVM, plus the following: |
| </p> |
| <dl compact> |
| <dt><A HREF="http://www.qmtest.com">QMTest</A></dt> |
| <dd>The LLVM test suite uses QMTest to organize and |
| run tests.</dd> |
| |
| <dt><A HREF="http://www.python.org">Python</A></dt> |
| <dd>You will need a Python interpreter that works with |
| QMTest. Python will need zlib and SAX support |
| enabled.</dd> |
| </dl> |
| </div> |
| |
| <!--===============================================================--> |
| <div class="doc_section"><a name="quick">Quick Start</a></div> |
| <!--===============================================================--> |
| |
| <div class="doc_text"> |
| <p> |
| The tests are located in the LLVM source tree under the directory |
| <tt>llvm/test</tt>. To run all of the tests in LLVM, use the Master |
| Makefile in that directory: |
| </p> |
| <pre> |
| % gmake -C llvm/test |
| </pre> |
| |
| <p> |
| To run only the code fragment tests (i.e. those that do basic testing of |
| LLVM), run the tests organized by QMTest: |
| </p> |
| |
| <pre> |
| % gmake -C llvm/test qmtest |
| </pre> |
| |
| <p> |
| To run only the tests that compile and execute whole programs, run the |
| Programs tests: |
| </p> |
| |
| <pre> |
| % gmake -C llvm/test/Programs |
| </pre> |
| </div> |
| |
| <!--===============================================================--> |
| <div class="doc_section"><h2><a name="org">LLVM Test Suite |
| Organization </a></h2></div> |
| <!--===============================================================--> |
| |
| <div class="doc_text"> |
| <p>The LLVM test suite contains two major categories of tests: code |
| fragments and whole programs.</p> |
| </div> |
| |
| <div class="doc_subsection"><a name="codefragments">Code Fragments</a> |
| </div> |
| |
| <div class="doc_text"> |
| <p> |
| Code fragments are small pieces of code that test a specific |
| feature of LLVM or trigger a specific bug in LLVM. They are |
| usually written in LLVM assembly language, but can be |
| written in other languages if the test targets a |
| particular language front end. |
| </p><p> |
| Code fragments are not complete programs, and they are |
| never executed to determine correct behavior. |
| </p><p> |
| The tests in the Features and |
| Regression directories contain code fragments. |
| </p> |
| </div> |
| |
| <div class="doc_subsection"><a name="wholeprograms">Whole Programs</a> |
| </div> |
| |
| <div class="doc_text"> |
| <p> |
| Whole Programs are pieces of code which can be compiled and |
| linked into a stand-alone program that can be executed. These |
| programs are generally written in high level languages such as C |
| or C++, but sometimes they are written straight in LLVM |
| assembly. |
| </p><p> |
| These programs are compiled and then executed using several |
| different methods (native compiler, LLVM C backend, LLVM JIT, |
| LLVM native code generation, etc). The output of these programs |
| is compared to ensure that LLVM is compiling the program |
| correctly. |
| </p><p> |
| In addition to compiling and executing programs, whole program |
| tests serve as a way of benchmarking LLVM performance, both in |
| terms of the efficiency of the programs generated as well as the |
| speed with which LLVM compiles, optimizes, and generates code. |
| </p><p> |
| The Programs directory contains all tests which compile and |
| benchmark whole programs. |
| </p> |
| </div> |
| |
| <!--===============================================================--> |
| <div class="doc_section"><h2><a name="tree">LLVM Test Suite Tree</a> |
| </div> |
| <!--===============================================================--> |
| |
| <div class="doc_text"> |
| <p>Each type of test in the LLVM test suite has its own directory. The |
| major subtrees of the test suite directory tree are as follows:</p> |
| |
| <ul> |
| <li>Features |
| <p> |
| This directory contains sample codes that test various features |
| of the LLVM language. These pieces of sample code are run |
| through various assembler, disassembler, and optimizer passes. |
| </p> |
| |
| <li>Regression |
| <p> |
| This directory contains regression tests for LLVM. When a bug |
| is found in LLVM, a regression test containing just enough |
| code to reproduce the problem should be written and placed |
| somewhere underneath this directory. In most cases, this |
| will be a small piece of LLVM assembly language code, often |
| distilled from an actual application or benchmark. |
| </p> |
| |
| <li>Programs |
| <p> |
| The Programs directory contains programs that can be compiled |
| with LLVM and executed. These programs are compiled using the |
| native compiler and various LLVM backends. The output from the |
| program compiled with the native compiler is assumed correct; |
| the results from the other programs are compared to the native |
| program output and pass if they match. |
| </p><p> |
| In addition for testing correctness, the Programs directory |
| also performs timing tests of various LLVM optimizations. |
| It also records compilation times for the compilers and the |
| JIT. This information can be used to compare the |
| effectiveness of LLVM's optimizations and code generation. |
| </p><p> |
| The Programs directory is subdivided into several smaller |
| subdirectories: |
| </p> |
| |
| <ul> |
| <li>Programs/SingleSource |
| <p> |
| The SingleSource directory contains test programs that |
| are only a single source file in size. These are |
| usually small benchmark programs or small programs that |
| calculate a particular value. Several such programs are |
| grouped together in each directory. |
| </p> |
| |
| <li>Programs/MultiSource |
| <p> |
| The MultiSource directory contains subdirectories which |
| contain entire programs with multiple source files. |
| Large benchmarks and whole applications go here. |
| </p> |
| |
| <li>Programs/External |
| <p> |
| The External directory contains Makefiles for building |
| code that is external to (i.e. not distributed with) |
| LLVM. The most prominent member of this directory is |
| the SPEC 2000 benchmark suite. The presence and |
| location of these external programs is configured by the |
| LLVM <tt>configure</tt> script. |
| </p> |
| </ul> |
| |
| <p> |
| |
| <li>QMTest |
| <p> |
| This directory contains the QMTest information files. Inside |
| this directory are QMTest administration files and the Python |
| code that implements the LLVM test and database classes. |
| </p> |
| </ul> |
| </div> |
| |
| <!--===============================================================--> |
| <div class="doc_section"><h2><a name="qmstructure">QMTest Structure</a> |
| </div> |
| <!--===============================================================--> |
| |
| <div class="doc_text"> |
| <p> |
| The LLVM test suite is partially driven by QMTest and partially |
| driven by GNU Make. Specifically, the Features and Regression tests |
| are all driven by QMTest. The Programs directory is currently |
| driven by a set of Makefiles. |
| </p><p> |
| The QMTest system needs to have several pieces of information |
| available; these pieces of configuration information are known |
| collectively as the "context" in QMTest parlance. Since the context |
| for LLVM is relatively large, the master Makefile in llvm/test |
| sets it for you. |
| </p><p> |
| The LLVM database class makes the subdirectories of llvm/test a |
| QMTest test database. For each directory that contains tests driven by |
| QMTest, it knows what type of test the source file is and how to run it. |
| </p><p> |
| Hence, the QMTest namespace is essentially what you see in the |
| Feature and Regression directories, but there is some magic that |
| the database class performs (as described below). |
| </p><p> |
| The QMTest namespace is currently composed of the following tests and |
| test suites: |
| </p> |
| |
| <ul> |
| <li>Feature |
| <p> |
| These are the feature tests found in the Feature directory. |
| They are broken up into the following categories: |
| </p> |
| <ul> |
| <li>ad |
| <p> |
| Assembler/Disassembler tests. These tests verify that a |
| piece of LLVM assembly language can be assembled into |
| bytecode and then disassembled into the original |
| assembly language code. It does this several times to |
| ensure that assembled output can be disassembled and |
| disassembler output can be assembled. It also verifies |
| that the give assembly language file can be assembled |
| correctly. |
| </p> |
| |
| <li>opt |
| <p> |
| Optimizer tests. These tests verify that two of the |
| optimizer passes completely optimize a program (i.e. |
| after a single pass, they cannot optimize a program |
| any further). |
| </p> |
| |
| <li>mc |
| <p> |
| Machine code tests. These tests verify that the LLVM |
| assembly language file can be translated into native |
| assembly code. |
| </p> |
| |
| <li>cc |
| <p> |
| C code tests. These tests verify that the specified |
| LLVM assembly code can be converted into C source code |
| using the C backend. |
| </p> |
| </ul> |
| |
| <p> |
| The LLVM database class looks at every file in the Feature |
| directory and creates a fake test hierarchy containing |
| <tt>Feature.<testtype>.<testname></tt>. So, if you |
| add an LLVM assembly language file to the Feature directory, it |
| actually creates 5 new tests: assembler/disassembler, assembler, |
| optimizer, machine code, and C code. |
| </p> |
| |
| <li>Regression |
| <p> |
| These are the regression tests. There is one suite for each |
| subdirectory of the Regression directory. If you add a new |
| subdirectory there, you will need to modify, at least, the |
| <tt>RegressionMap</tt> variable in <tt>QMTest/llvmdb.py</tt> so |
| that QMTest knows how to run the tests in the new subdirectory. |
| </p> |
| </ul> |
| </div> |
| |
| <!--===============================================================--> |
| <div class="doc_section"><h2><a name="progstructure">Programs |
| Structure</a></div> |
| <!--===============================================================--> |
| |
| <div class="doc_text"> |
| <p> |
| As mentioned previously, the Programs tree in llvm/test provides three |
| types of tests: MultiSource, SingleSource, and External. Each tree is |
| then subdivided into several categories, including applications, |
| benchmarks, regression tests, code that is strange grammatically, etc. |
| These organizations should be relatively self explanatory. |
| </p><p> |
| In addition to the regular Programs tests, the Programs tree also |
| provides a mechanism for compiling the programs in different ways. If |
| the variable TEST is defined on the gmake command line, the test system |
| will include a Makefile named <tt>TEST.<value of TEST |
| variable>.Makefile</tt>. This Makefile can modify build rules to |
| yield different results. |
| </p><p> |
| For example, the LLVM nightly tester uses <tt>TEST.nightly.Makefile</tt> |
| to create the nightly test reports. To run the nightly tests, run |
| <tt>gmake TEST=nightly</tt>. |
| </p><p> |
| There are several TEST Makefiles available in the tree. Some of them |
| are designed for internal LLVM research and will not work outside of the |
| LLVM research group. They may still be valuable, however, as a guide to |
| writing your own TEST Makefile for any optimization or analysis passes |
| that you develop with LLVM. |
| </p> |
| </div> |
| |
| <!--===============================================================--> |
| <div class="doc_section"><h2><a name="run">Running the LLVM Tests</a> |
| </div> |
| <!--===============================================================--> |
| |
| <div class="doc_text"> |
| <p> |
| First, all tests are executed within the LLVM object directory tree. |
| They <i>are not</i> executed inside of the LLVM source tree. This is |
| because the test suite creates temporary files during execution. |
| </p><p> |
| The master Makefile in llvm/test is capable of running both the |
| QMTest driven tests and the Programs tests. By default, it will run |
| all of the tests. |
| </p><p> |
| To run only the QMTest driven tests, run <tt>gmake qmtest</tt> at the |
| command line in llvm/tests. To run a specific qmtest, suffix the test |
| name with ".t" when running gmake. |
| </p><p> |
| For example, to run the Regression.LLC tests, type |
| <tt>gmake Regression.LLC.t</tt> in llvm/tests. |
| </p><p> |
| Note that the Makefiles in llvm/test/Features and llvm/test/Regression |
| are gone. You must now use QMTest from the llvm/test directory to run |
| them. |
| </p><p> |
| To run the Programs test, cd into the llvm/test/Programs directory and |
| type <tt>gmake</tt>. Alternatively, you can type <tt>gmake |
| TEST=<type> test</tt> to run one of the specialized tests in |
| llvm/test/Programs/TEST.<type>.Makefile. For example, you could |
| run the nightly tester tests using the following commands: |
| </p> |
| |
| <pre> |
| % cd llvm/test/Programs |
| % gmake TEST=nightly test |
| </pre> |
| |
| <p> |
| Regardless of which test you're running, the results are printed on |
| standard output and standard error. You can redirect these results to a |
| file if you choose. |
| </p><p> |
| Some tests are known to fail. Some are bugs that we have not fixed yet; |
| others are features that we haven't added yet (or may never add). In |
| QMTest, the result for such tests will be XFAIL (eXpected FAILure). In |
| this way, you can tell the difference between an expected and unexpected |
| failure. |
| </p><p> |
| The Programs tests have no such feature as of this time. If the test |
| passes, only warnings and other miscellaneous output will be generated. |
| If a test fails, a large <program> FAILED message will be |
| displayed. This will help you separate benign warnings from actual test |
| failures. |
| </p> |
| </div> |
| |
| <!-- *********************************************************************** --> |
| |
| <hr><font size="-1"> |
| <address>John T. Criswell</address> |
| <a href="http://llvm.cs.uiuc.edu">The LLVM Compiler Infrastructure</a> |
| <br> |
| Last modified: $Date$ |
| </font> |
| |
| </body> |
| </html> |