| <!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> | |
| % make -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> | |
| % make -C llvm/test qmtest | |
| </pre> | |
| <p> | |
| To run only the tests that compile and execute whole programs, run the | |
| Programs tests: | |
| </p> | |
| <pre> | |
| % make -C llvm/test/Programs | |
| </pre> | |
| </div> | |
| <!--===============================================================--> | |
| <div class="doc_section"><h2><a name="org">LLVM Test Suite | |
| Organization </a></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>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><p> | |
| For example, to run the Regression.LLC tests, type | |
| <tt>make 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>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> | |
| <pre> | |
| % cd llvm/test/Programs | |
| % make 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> |