mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9676 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			430 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			430 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!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>
 |