mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +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>
 |