| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
| <html> |
| <head> |
| <title>LLVM Test Suite Guide</title> |
| </head> |
| |
| <body bgcolor=white> |
| |
| <center><h1>LLVM Test Suite Guide<br></h1></center> |
| |
| <!--===============================================================--> |
| <h2><a name="overview">Overview</a><hr></h2> |
| <!--===============================================================--> |
| |
| 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. |
| |
| <!--===============================================================--> |
| <h2><a name="Requirements">Requirements</a><hr></h2> |
| <!--===============================================================--> |
| |
| In order to use the LLVM test suite, you will need all of the software |
| required to build LLVM, plus the following: |
| <dl compact> |
| <dt><A HREF="http://www.qmtest.com">QMTest</A> |
| <dd> |
| The LLVM test suite uses QMTest to organize and run tests. |
| <p> |
| |
| <dt><A HREF="http://www.python.org">Python</A> |
| <dd> |
| You will need a python interpreter that works with QMTest. |
| Python will need zlib and SAX support enabled. |
| <p> |
| </dl> |
| |
| <!--===============================================================--> |
| <h2><a name="quick">Quick Start</a><hr></h2> |
| <!--===============================================================--> |
| |
| To run all of the tests in LLVM, use the Master Makefile in llvm/test: |
| <p> |
| <tt> |
| cd test |
| <br> |
| make |
| </tt> |
| |
| <p> |
| |
| To run only the code fragment tests (i.e. those that do basic testing of |
| LLVM), run the tests organized by QMTest: |
| <p> |
| |
| <tt> |
| cd test |
| <br> |
| make qmtest |
| </tt> |
| |
| <p> |
| |
| To run only the tests that compile and execute whole programs, run the |
| Programs tests: |
| <p> |
| |
| <tt> |
| cd test/Programs |
| <br> |
| make |
| </tt> |
| <p> |
| |
| <!--===============================================================--> |
| <h2><a name="org">LLVM Test Suite Organization</a><hr></h2> |
| <!--===============================================================--> |
| |
| The LLVM test suite contains two major types of tests: |
| <ul> |
| <li>Code Fragments<br> |
| 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> |
| Code fragments are not complete programs, and they are never executed |
| to determine correct behavior. |
| <p> |
| The tests in the llvm/test/Features and llvm/test/Regression directories |
| contain code fragments. |
| |
| <li>Whole Programs<br> |
| 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> |
| 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> |
| 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> |
| The test/Programs directory contains all tests which compile and |
| benchmark whole programs. |
| </ul> |
| |
| <!--===============================================================--> |
| <h2><a name="tree">LLVM Test Suite Tree</a><hr></h2> |
| <!--===============================================================--> |
| |
| The LLVM test suite is broken up into the following directory |
| hierarchy: |
| |
| <ul> |
| <li> Features<br> |
| 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<br> |
| 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<br> |
| 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> |
| 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> |
| The Programs directory is subdivided into several smaller |
| subdirectories: |
| <ul> |
| <li>SingleSource<br> |
| 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>MultiSource<br> |
| The MultiSource directory contains subdirectories which contain |
| entire programs with multiple source files. Large benchmarks and |
| whole applications go here. |
| <p> |
| |
| <li>External<br> |
| 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. |
| </ul> |
| |
| <p> |
| |
| <li>QMTest<br> |
| 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. |
| </ul> |
| |
| <!--===============================================================--> |
| <h2><a name="qmstructure">QMTest Structure</a><hr></h2> |
| <!--===============================================================--> |
| |
| 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> |
| |
| 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> |
| |
| The LLVM database class makes the directory tree underneath 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> |
| |
| Hence, the QMTest namespace is essentially what you see in |
| llvm/test/Feature and llvm/test/Regression, but there is some magic that |
| the database class performs (as described below). |
| |
| <p> |
| |
| The QMTest namespace is currently composed of the following tests and |
| test suites: |
| |
| <ul> |
| <li>Feature<br> |
| These are the feature tests found in llvm/test/Feature. They are broken |
| up into the following categories: |
| <ul> |
| <li>ad<br> |
| 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<br> |
| 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<br> |
| Machine code tests. These tests verify that the LLVM assembly |
| language file can be translated into native assembly code. |
| <p> |
| |
| <li>cc<br> |
| C code tests. These tests verify that the specified LLVM assembly |
| code can be converted into C source code using the C backend. |
| </ul> |
| |
| <p> |
| |
| The LLVM database class looks at every file in llvm/test/Feature and |
| creates a fake test hierarchy containing |
| Feature.<testtype>.<testname>. |
| So, if you add an LLVM assembly language file to llvm/test/Feature, it |
| actually creates 5 news test: assembler/disassembler, assembler, |
| optimizer, machine code, and C code. |
| |
| <li>Regression<br> |
| These are the regression tests. There is one suite for each directory |
| in llvm/test/Regression. |
| <p> |
| |
| If you add a new directory to llvm/test/Regression, you will need to |
| modify llvm/test/QMTest/llvmdb.py so that it knows what sorts of tests |
| are in it and how to run them. |
| </ul> |
| |
| <!--===============================================================--> |
| <h2><a name="progstructure">Programs Structure</a><hr></h2> |
| <!--===============================================================--> |
| 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> |
| 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 TEST.<value of TEST variable>.Makefile. This Makefile can modify |
| build rules that yield different results. |
| <p> |
| For example, the LLVM nightly tester uses TEST.nightly.Makefile to create the |
| nightly test reports. To run the nightly tests, run <tt>gmake |
| TEST=nightly</tt>. |
| <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. |
| |
| <!--===============================================================--> |
| <h2><a name="run">Running the LLVM Tests</a><hr></h2> |
| <!--===============================================================--> |
| |
| 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> |
| |
| 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> |
| To run only the QMTest driven tests, run <tt>make qmtest</tt> at the |
| command line in llvm/tests. To run a specific qmtest, suffix the test name |
| with ".t" when running make. |
| <p> |
| For example, to run the Regression.LLC tests, type |
| <tt>make Regression.LLC.t</tt> in llvm/tests. |
| <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> |
| |
| To run the Programs test, cd into the llvm/test/Programs directory |
| and type <tt>make</tt>. Alternatively, you can type <tt>make |
| 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> |
| <tt> |
| cd llvm/test/Programs |
| <br> |
| make TEST=nightly test |
| </tt> |
| |
| <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> |
| 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> |
| 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. |
| |
| <hr> |
| |
| </body> |
| </html> |