| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" | |
| "http://www.w3.org/TR/html4/strict.dtd"> | |
| <html> | |
| <head> | |
| <title>LLVM Test Suite Guide</title> | |
| <link rel="stylesheet" href="llvm.css" type="text/css"> | |
| </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> | |
| <ul> | |
| <li><a href="#codefragments">Code Fragments</a></li> | |
| <li><a href="#wholeprograms">Whole Programs</a></li> | |
| </ul></li> | |
| <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> | |
| <li><a href="#nightly">Running the nightly tester</a></li> | |
| </ol> | |
| <div class="doc_author"> | |
| <p>Written by John T. Criswell</p> | |
| </div> | |
| <!--===============================================================--> | |
| <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> | |
| <dt><a href="http://www.qmtest.com">QMTest</A></dt> | |
| <dd>The LLVM test suite uses QMTest to organize and run tests. <b>Note: | |
| you will need <a href="http://llvm.cs.uiuc.edu/qm-2.0.3.tar.gz">QMTest | |
| 2.0.3 (source tar.gz file)</a> to be successful. The tests do not run with | |
| any other version.</b></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"><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"><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> | |
| <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> | |
| <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></li> | |
| </ul></li> | |
| <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"><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> | |
| <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> | |
| <li>mc | |
| <p> Machine code tests. These tests verify that the LLVM assembly | |
| language file can be translated into native assembly code.</p></li> | |
| <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></li> | |
| </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"><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"><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> | |
| <!--===============================================================--> | |
| <div class="doc_section"><a name="nightly">Running the nightly tester</a></div> | |
| <!--===============================================================--> | |
| <div class="doc_text"> | |
| <p> | |
| The <a href="http://llvm.cs.uiuc.edu/testresults/">LLVM Nightly Testers</a> | |
| automatically check out an LLVM tree, build it, run the "nightly" | |
| program test (described above) and all of the regression tests, then | |
| delete the checked out tree. This tester is designed to ensure that | |
| programs don't break as well as keep track of LLVM's progress over time.</p> | |
| <p> | |
| If you'd like to set up an instance of the nightly tester to run on your | |
| machine, take a look at the comments at the top of the utils/NightlyTester.pl | |
| file. We usually run it from a crontab entry that looks ilke this: | |
| </p> | |
| <pre> | |
| 5 3 * * * LLVM_LIB_SEARCH_PATH=.../llvm-gcc/bytecode-libs $HOME/llvm/utils/NightlyTest.pl -parallel -enable-linscan ...CVSREPOSTRING... $HOME/buildtest-X86 $HOME/cvs/testresults-X86 | |
| </pre> | |
| <p> | |
| Take a look at the NightlyTest.pl file to see what all of the flags and | |
| strings do. If you start running the nightly tests, please let us know and | |
| we'll link your page to the global tester page. Thanks! | |
| </p> | |
| </div> | |
| <!-- *********************************************************************** --> | |
| <hr> | |
| <address> | |
| <a href="http://jigsaw.w3.org/css-validator/check/referer"><img | |
| src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a> | |
| <a href="http://validator.w3.org/check/referer"><img | |
| src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /></a> | |
| John T. Criswell<br> | |
| <a href="http://llvm.cs.uiuc.edu">The LLVM Compiler Infrastructure</a><br> | |
| Last modified: $Date$ | |
| </address> | |
| </body> | |
| </html> |