=================================
LLVM Testing Infrastructure Guide
=================================

.. contents::
   :local:

.. toctree::
   :hidden:

   TestSuiteGuide
   TestSuiteMakefileGuide

Overview
========

This document is the reference manual for the LLVM testing
infrastructure. It documents the structure of the LLVM testing
infrastructure, the tools needed to use it, and how to add and run
tests.

Requirements
============

In order to use the LLVM testing infrastructure, you will need all of the
software required to build LLVM, as well as `Python <http://python.org>`_ 3.8 or
later.

LLVM Testing Infrastructure Organization
========================================

The LLVM testing infrastructure contains three major categories of tests:
unit tests, regression tests, and whole programs. The unit tests and regression
tests are contained inside the LLVM repository itself under ``llvm/unittests``
and ``llvm/test`` respectively and are expected to always pass. They should be
run before every commit.

The whole-program tests are referred to as the "LLVM test suite" (or
"test-suite") and are in the ``test-suite``
`repository on GitHub <https://github.com/llvm/llvm-test-suite.git>`_.
For historical reasons, these tests are also referred to as the "nightly
tests" in places, which is less ambiguous than "test-suite" and remains
in use although we run them much more often than nightly.

Unit tests
----------

Unit tests are written using `Google Test <https://github.com/google/googletest/blob/master/docs/primer.md>`_
and `Google Mock <https://github.com/google/googletest/blob/master/docs/gmock_for_dummies.md>`_
and are located in the ``llvm/unittests`` directory.
In general, unit tests are reserved for targeting the support library and other
generic data structure. We prefer relying on regression tests for testing
transformations and analysis on the IR.

Regression tests
----------------

The regression tests are small pieces of code that test a specific
feature of LLVM or trigger a specific bug in LLVM. The language they are
written in depends on the part of LLVM being tested. These tests are driven by
the :doc:`Lit <CommandGuide/lit>` testing tool (which is part of LLVM), and
are located in the ``llvm/test`` directory.

Typically, 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. For example, it can be a small
piece of LLVM IR distilled from an actual application or benchmark.

Testing Analysis
----------------

An analysis is a pass to infer properties on some part of the IR without
transforming it. They are tested in general using the same infrastructure as the
regression tests, by creating a separate "Printer" pass to consume the analysis
result and print it on the standard output in a textual format suitable for
FileCheck.
See `llvm/test/Analysis/BranchProbabilityInfo/loop.ll <https://github.com/llvm/llvm-project/blob/main/llvm/test/Analysis/BranchProbabilityInfo/loop.ll>`_
for an example of such test.

``test-suite``
--------------

The test suite contains whole programs, which 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 and C++.

These programs are compiled using a user-specified compiler and set of
flags, and then executed to capture the program output and timing
information. The output of these programs is compared to a reference
output to ensure that the program is being compiled correctly.

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.

The test-suite is located in the ``test-suite``
`repository on GitHub <https://github.com/llvm/llvm-test-suite.git>`_.

See the :doc:`TestSuiteGuide` for details.

Debugging Information tests
---------------------------

The test suite contains tests to check the quality of debugging information.
The tests are written in C-based languages or in LLVM assembly language.

These tests are compiled and run under a debugger. The debugger output
is checked to validate the debugging information. See ``README.txt`` in the
test suite for more information. This test suite is located in the
``cross-project-tests/debuginfo-tests`` directory.

Quick start
===========

The tests are located in two separate repositories. The unit and
regression tests are in the main "llvm"/ directory under the directories
``llvm/unittests`` and ``llvm/test`` (so you get these tests for free with the
main LLVM tree). Use ``make check-all`` to run the unit and regression tests
after building LLVM.

The ``test-suite`` module contains more comprehensive tests including whole C
and C++ programs. See the :doc:`TestSuiteGuide` for details.

Unit and Regression tests
-------------------------

To run all of the LLVM unit tests, use the ``check-llvm-unit`` target:

.. code-block:: bash

    % make check-llvm-unit

To run all of the LLVM regression tests, use the ``check-llvm`` target:

.. code-block:: bash

    % make check-llvm

In order to get reasonable testing performance, build LLVM and subprojects
in release mode, i.e.,

.. code-block:: bash

    % cmake -DCMAKE_BUILD_TYPE="Release" -DLLVM_ENABLE_ASSERTIONS=On

If you have `Clang <https://clang.llvm.org/>`_ checked out and built, you
can run the LLVM and Clang tests simultaneously using:

.. code-block:: bash

    % make check-all

To run the tests with Valgrind (Memcheck by default), use the ``LIT_OPTS`` make
variable to pass the required options to lit. For example, you can use:

.. code-block:: bash

    % make check LIT_OPTS="-v --vg --vg-leak"

to enable testing with Valgrind and with leak checking enabled.

To run individual tests or subsets of tests, you can use the ``llvm-lit``
script which is built as part of LLVM. For example, to run the
``Integer/BitPacked.ll`` test by itself, you can run:

.. code-block:: bash

    % llvm-lit <path to llvm-project>/llvm/test/Integer/BitPacked.ll

.. note::
   The test files are in the ``llvm-project`` directory, not the directory you
   are building LLVM in.

Or you can run a whole folder of tests. To run all of the ARM CodeGen tests:

.. code-block:: bash

    % llvm-lit <path to llvm-project>/llvm/test/CodeGen/ARM

The regression tests will use the Python psutil module only if installed in a
**non-user** location. Under Linux, install with sudo or within a virtual
environment. Under Windows, install Python for all users and then run
``pip install psutil`` in an elevated command prompt.

For more information on using the :program:`lit` tool, see ``llvm-lit --help``
or the :doc:`lit man page <CommandGuide/lit>`.

Debugging Information tests
---------------------------

To run debugging information tests simply add the ``cross-project-tests``
project to your ``LLVM_ENABLE_PROJECTS`` define on the cmake
command-line.

Regression test structure
=========================

The LLVM regression tests are driven by :program:`lit` and are located in the
``llvm/test`` directory.

This directory contains a large array of small tests that exercise
various features of LLVM and to ensure that regressions do not occur.
The directory is broken into several subdirectories, each focused on a
particular area of LLVM.

Writing new regression tests
----------------------------

The regression test structure is very simple but does require some
information to be set. This information is gathered via ``cmake``
and is written to a file, ``test/lit.site.cfg.py`` in the build directory.
The ``llvm/test`` Makefile does this work for you.

In order for the regression tests to work, each directory of tests must
have a ``lit.local.cfg`` file. :program:`lit` looks for this file to determine
how to run the tests. This file is just Python code and thus is very
flexible, but we've standardized it for the LLVM regression tests. If
you're adding a directory of tests, just copy ``lit.local.cfg`` from
another directory to get running. The standard ``lit.local.cfg`` simply
specifies which files to look in for tests. Any directory that contains
only directories does not need the ``lit.local.cfg`` file. Read the :doc:`Lit
documentation <CommandGuide/lit>` for more information.

Each test file must contain lines starting with "RUN:" that tell :program:`lit`
how to run it. If there are no ``RUN`` lines, :program:`lit` will issue an error
while running a test.

``RUN`` lines are specified in the comments of the test program using the
keyword ``RUN`` followed by a colon, and lastly the command (pipeline)
to execute. Together, these lines form the "script" that :program:`lit`
executes to run the test case. The syntax of the ``RUN`` lines is similar to a
shell's syntax for pipelines including I/O redirection and variable
substitution. However, even though these lines may *look* like a shell
script, they are not. ``RUN`` lines are interpreted by :program:`lit`.
Consequently, the syntax differs from shell in a few ways. You can specify
as many ``RUN`` lines as needed.

:program:`lit` performs substitution on each ``RUN`` line to replace LLVM tool names
with the full paths to the executable built for each tool (in
``$(LLVM_OBJ_ROOT)/bin``). This ensures that :program:`lit` does
not invoke any stray LLVM tools in the user's path during testing.

Each ``RUN`` line is executed on its own, distinct from other lines unless
its last character is ``\``. This continuation character causes the ``RUN``
line to be concatenated with the next one. In this way, you can build up
long pipelines of commands without making huge line lengths. The lines
ending in ``\`` are concatenated until a ``RUN`` line that doesn't end in
``\`` is found. This concatenated set of ``RUN`` lines then constitutes one
execution. :program:`lit` will substitute variables and arrange for the pipeline
to be executed. If any process in the pipeline fails, the entire line (and
test case) fails too.

Below is an example of legal ``RUN`` lines in a ``.ll`` file:

.. code-block:: llvm

    ; RUN: llvm-as < %s | llvm-dis > %t1
    ; RUN: llvm-dis < %s.bc-13 > %t2
    ; RUN: diff %t1 %t2

As with a Unix shell, the ``RUN`` lines permit pipelines and I/O
redirection to be used.

There are some quoting rules that you must pay attention to when writing
your ``RUN`` lines. In general, nothing needs to be quoted. :program:`lit` won't
strip off any quote characters, so they will get passed to the invoked program.
To avoid this use curly braces to tell :program:`lit` that it should treat
everything enclosed as one value.

In general, you should strive to keep your ``RUN`` lines as simple as possible,
using them only to run tools that generate textual output you can then examine.
The recommended way to examine output to figure out if the test passes is using
the :doc:`FileCheck tool <CommandGuide/FileCheck>`. *[The usage of grep in ``RUN``
lines is deprecated - please do not send or commit patches that use it.]*

Put related tests into a single file rather than having a separate file per
test. Check if there are files already covering your feature and consider
adding your code there instead of creating a new file.

Generating assertions in regression tests
-----------------------------------------

Some regression test cases are very large and complex to write/update by hand.
In that case, to reduce the manual work, we can use the scripts available in
``llvm/utils/`` to generate the assertions.

For example, to generate assertions in an :program:`llc`-based test, after
adding one or more ``RUN`` lines, use:

 .. code-block:: bash

     % llvm/utils/update_llc_test_checks.py --llc-binary build/bin/llc test.ll

This will generate FileCheck assertions, and insert a ``NOTE:`` line at the
top to indicate that assertions were automatically generated.

If you want to update assertions in an existing test case, pass the `-u` option
which first checks the ``NOTE:`` line exists and matches the script name.

Sometimes, a test absolutely depends on hand-written assertions and should not
have assertions automatically generated. In that case, add the text ``NOTE: Do
not autogenerate`` to the first line, and the scripts will skip that test. It
is a good idea to explain why generated assertions will not work for the test
so future developers will understand what is going on.

These are the most common scripts and their purposes/applications in generating
assertions:

.. code-block:: none

  update_analyze_test_checks.py
  opt -passes='print<cost-model>'

  update_cc_test_checks.py
  C/C++, or clang/clang++ (IR checks)

  update_llc_test_checks.py
  llc (assembly checks)

  update_mca_test_checks.py
  llvm-mca

  update_mir_test_checks.py
  llc (MIR checks)

  update_test_checks.py
  opt

  update_llubi_test_checks.py
  llubi

Precommit workflow for tests
----------------------------

If the test does not crash, assert, or infinite loop, commit the test with
baseline check-lines first. That is, the test will show a miscompile or
missing optimization. Add a "TODO" or "FIXME" comment to indicate that
something is expected to change in a test.

A follow-up patch with code changes to the compiler will then show check-line
differences to the tests, so it is easier to see the effect of the patch.
Remove TODO/FIXME comments added in the previous step if a problem is solved.

Baseline tests (no-functional-change or NFC patch) may be pushed to main
without pre-commit review if you have commit access.

Best practices for regression tests
-----------------------------------

- Use auto-generated check lines (produced by the scripts mentioned above)
  whenever feasible.
- Include comments about what is tested/expected in a particular test. If there
  are relevant issues in the bug tracker, add references to those bug reports
  (for example, "See PR999 for more details").
- Avoid undefined behavior and poison/undef values unless necessary. For
  example, do not use patterns like ``br i1 undef``, which are likely to break
  as a result of future optimizations.
- Minimize tests by removing unnecessary instructions, metadata, attributes,
  etc. Tools like ``llvm-reduce`` can help automate this.
- Outside PhaseOrdering tests, only run a minimal set of passes. For example,
  prefer ``opt -S -passes=instcombine`` over ``opt -S -O3``.
- Avoid unnamed instructions/blocks (such as ``%0`` or ``1:``), because they may
  require renumbering on future test modifications. These can be removed by
  running the test through ``opt -S -passes=instnamer``.
- Try to give values (including variables, blocks and functions) meaningful
  names, and avoid retaining complex names generated by the optimization
  pipeline (such as ``%foo.0.0.0.0.0.0``).

Extra files
-----------

If your test requires extra files besides the file containing the ``RUN:`` lines,
and the extra files are small, consider specifying them in the same file and
using ``split-file`` to extract them. For example,

.. code-block:: llvm

  ; RUN: split-file %s %t
  ; RUN: llvm-link -S %t/a.ll %t/b.ll | FileCheck %s

  ; CHECK: ...

  ;--- a.ll
  ...
  ;--- b.ll
  ...

The parts are separated by the regex ``^(.|//)--- <part>``.

If you want to test relative line numbers like ``[[#@LINE+1]]``, specify
``--leading-lines`` to add leading empty lines to preserve line numbers.

If the extra files are large, the idiomatic place to put them is in a subdirectory ``Inputs``.
You can then refer to the extra files as ``%S/Inputs/foo.bar``.

For example, consider ``test/Linker/ident.ll``. The directory structure is
as follows::

  test/
    Linker/
      ident.ll
      Inputs/
        ident.a.ll
        ident.b.ll

For convenience, these are the contents:

.. code-block:: llvm

  ;;;;; ident.ll:

  ; RUN: llvm-link %S/Inputs/ident.a.ll %S/Inputs/ident.b.ll -S | FileCheck %s

  ; Verify that multiple input llvm.ident metadata are linked together.

  ; CHECK-DAG: !llvm.ident = !{!0, !1, !2}
  ; CHECK-DAG: "Compiler V1"
  ; CHECK-DAG: "Compiler V2"
  ; CHECK-DAG: "Compiler V3"

  ;;;;; Inputs/ident.a.ll:

  !llvm.ident = !{!0, !1}
  !0 = metadata !{metadata !"Compiler V1"}
  !1 = metadata !{metadata !"Compiler V2"}

  ;;;;; Inputs/ident.b.ll:

  !llvm.ident = !{!0}
  !0 = metadata !{metadata !"Compiler V3"}

For symmetry, ``ident.ll`` is just a dummy file that doesn't
actually participate in the test besides holding the ``RUN:`` lines.

.. note::

  Some existing tests use ``RUN: true`` in extra files instead of just
  putting the extra files in an ``Inputs/`` directory. This pattern is
  deprecated.

Elaborated tests
----------------

Generally, IR and assembly test files benefit from being cleaned to remove
unnecessary details. However, for tests requiring elaborate IR or assembly
files where cleanup is less practical (e.g., a large amount of debug information
output from Clang), you can include generation instructions within
``split-file`` part called ``gen``. Then, run
``llvm/utils/update_test_body.py`` on the test file to generate the needed
content.

.. code-block:: none

    ; RUN: rm -rf %t && split-file %s %t && cd %t
    ; RUN: opt -S a.ll ... | FileCheck %s

    ; CHECK: hello

    ;--- a.cc
    int va;
    ;--- gen
    clang --target=x86_64-linux -S -emit-llvm -g a.cc -o -

    ;--- a.ll
    # content generated by the script 'gen'

.. code-block:: bash

   PATH=/path/to/clang_build/bin:$PATH llvm/utils/update_test_body.py path/to/test.ll

The script will prepare extra files with ``split-file``, invoke ``gen``, and
then rewrite the part after ``gen`` with its stdout.

For convenience, if the test needs a single assembly file, you can also wrap
``gen`` and its required files with ``.ifdef`` and ``.endif``. Then you can
skip ``split-file`` in ``RUN`` lines.

.. code-block:: none

    # RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o a.o
    # RUN: ... | FileCheck %s

    # CHECK: hello

    .ifdef GEN
    #--- a.cc
    int va;
    #--- gen
    clang --target=x86_64-linux -S -g a.cc -o -
    .endif
    # content generated by the script 'gen'

.. note::

  Consider specifying an explicit target triple to avoid differences when
  regeneration is needed on another machine.

  ``gen`` is invoked with ``PWD`` set to ``/proc/self/cwd``. Clang commands
  don't need ``-fdebug-compilation-dir=`` since its default value is ``PWD``.

  Check prefixes should be placed before ``.endif`` since the part after
  ``.endif`` is replaced.

If the test body contains multiple files, you can print ``---`` separators and
utilize ``split-file`` in ``RUN`` lines.

.. code-block:: none

    # RUN: rm -rf %t && split-file %s %t && cd %t
    ...

    #--- a.cc
    int va;
    #--- b.cc
    int vb;
    #--- gen
    clang --target=x86_64-linux -S -O1 -g a.cc -o -
    echo '#--- b.s'
    clang --target=x86_64-linux -S -O1 -g b.cc -o -
    #--- a.s

Fragile tests
-------------

It is easy to write a fragile test that could fail spuriously if the tool being
tested outputs a full path to the input file.  For example, :program:`opt` by
default outputs a ``ModuleID``:

.. code-block:: console

  $ cat example.ll
  define i32 @main() nounwind {
      ret i32 0
  }

  $ opt -S /path/to/example.ll
  ; ModuleID = '/path/to/example.ll'

  define i32 @main() nounwind {
      ret i32 0
  }

``ModuleID`` can unexpectedly match against ``CHECK`` lines.  For example:

.. code-block:: llvm

  ; RUN: opt -S %s | FileCheck

  define i32 @main() nounwind {
      ; CHECK-NOT: load
      ret i32 0
  }

This test will fail if placed into a ``download`` directory.

To make your tests robust, always use ``opt ... < %s`` in the ``RUN`` line.
:program:`opt` does not output a ``ModuleID`` when input comes from stdin.

Platform-Specific Tests
-----------------------

Whenever adding tests that require the knowledge of a specific platform,
either related to code generated, specific output or back-end features,
you must isolate the features, so that buildbots that
run on different architectures (and don't even compile all back-ends),
don't fail.

The first problem is to check for target-specific output, for example sizes
of structures, paths and architecture names, for example:

* Tests containing Windows paths will fail on Linux and vice versa.
* Tests that check for ``x86_64`` somewhere in the text will fail anywhere else.
* Tests where the debug information calculates the size of types and structures.

Also, if the test relies on any behaviour that is coded in any back-end, it must
go in its own directory. So, for instance, code generator tests for ARM go
into ``test/CodeGen/ARM`` and so on. Those directories contain a special
``lit`` configuration file that ensures all tests in that directory will
only run if a specific back-end is compiled and available.

For instance, on ``test/CodeGen/ARM``, the ``lit.local.cfg`` is:

.. code-block:: python

  config.suffixes = ['.ll', '.c', '.cpp', '.test']
  if not 'ARM' in config.root.targets:
    config.unsupported = True

Other platform-specific tests are those that depend on a specific feature
of a specific sub-architecture, for example only to Intel chips that support ``AVX2``.

For instance, ``test/CodeGen/X86/psubus.ll`` tests three sub-architecture
variants:

.. code-block:: llvm

  ; RUN: llc -mcpu=core2 < %s | FileCheck %s -check-prefix=SSE2
  ; RUN: llc -mcpu=corei7-avx < %s | FileCheck %s -check-prefix=AVX1
  ; RUN: llc -mcpu=core-avx2 < %s | FileCheck %s -check-prefix=AVX2

And the checks are different:

.. code-block:: llvm

  ; SSE2: @test1
  ; SSE2: psubusw LCPI0_0(%rip), %xmm0
  ; AVX1: @test1
  ; AVX1: vpsubusw LCPI0_0(%rip), %xmm0, %xmm0
  ; AVX2: @test1
  ; AVX2: vpsubusw LCPI0_0(%rip), %xmm0, %xmm0

So, if you're testing for a behaviour that you know is platform-specific or
depends on special features of sub-architectures, you must add the specific
triple, test with the specific FileCheck and put it into the specific
directory that will filter out all other architectures.


Constraining test execution
---------------------------

Some tests can be run only in specific configurations, such as
with debug builds or on particular platforms. Use ``REQUIRES``
and ``UNSUPPORTED`` to control when the test is enabled.

Some tests are expected to fail. For example, there may be a known bug
that the test detects. Use ``XFAIL`` to mark a test as an expected failure.
An ``XFAIL`` test will be successful if its execution fails, and
will be a failure if its execution succeeds.

.. code-block:: llvm

    ; This test will be only enabled in the build with asserts.
    ; REQUIRES: asserts
    ; This test is disabled when running on Linux.
    ; UNSUPPORTED: system-linux
    ; This test is expected to fail when targeting PowerPC.
    ; XFAIL: target=powerpc{{.*}}

``REQUIRES`` and ``UNSUPPORTED`` and ``XFAIL`` all accept a comma-separated
list of boolean expressions. The values in each expression may be:

- Features added to ``config.available_features`` by configuration files such as ``lit.cfg``.
  String comparison of features is case-sensitive. Furthermore, a boolean expression can
  contain any Python regular expression enclosed in ``{{ }}``, in which case the boolean
  expression is satisfied if any feature matches the regular expression. Regular
  expressions can appear inside an identifier, so for example ``he{{l+}}o`` would match
  ``helo``, ``hello``, ``helllo``, and so on.
- The default target triple, preceded by the string ``target=`` (for example,
  ``target=x86_64-pc-windows-msvc``). Typically, regular expressions are used
  to match parts of the triple (for example, ``target={{.*}}-windows{{.*}}``
  to match any Windows target triple).

| ``REQUIRES`` enables the test if all expressions are true.
| ``UNSUPPORTED`` disables the test if any expression is true.
| ``XFAIL`` expects the test to fail if any expression is true.

Use, ``XFAIL: *`` if the test is expected to fail everywhere. Similarly, use
``UNSUPPORTED: target={{.*}}`` to disable the test everywhere.

.. code-block:: llvm

    ; This test is disabled when running on Windows,
    ; and is disabled when targeting Linux, except for Android Linux.
    ; UNSUPPORTED: system-windows, target={{.*linux.*}} && !target={{.*android.*}}
    ; This test is expected to fail when targeting PowerPC or running on Darwin.
    ; XFAIL: target=powerpc{{.*}}, system-darwin


Tips for writing constraints
----------------------------

**``REQUIRES`` and ``UNSUPPORTED``**

These are logical inverses. In principle, ``UNSUPPORTED`` isn't absolutely
necessary (the logical negation could be used with ``REQUIRES`` to get
exactly the same effect), but it can make these clauses easier to read and
understand. Generally, people use ``REQUIRES`` to state things that the test
depends on to operate correctly, and ``UNSUPPORTED`` to exclude cases where
the test is expected never to work.

**``UNSUPPORTED`` and ``XFAIL``**

Both of these indicate that the test isn't expected to work; however, they
have different effects. ``UNSUPPORTED`` causes the test to be skipped;
this saves execution time, but then you'll never know whether the test
actually would start working. Conversely, ``XFAIL`` actually runs the test
but expects a failure output, taking extra execution time but alerting you
if/when the test begins to behave correctly (an ``XPASS`` test result). You
need to decide which is more appropriate in each case.

**Using ``target=...``**

Checking the target triple can be tricky; it's easy to mis-specify. For
example, ``target=mips{{.*}}`` will match not only mips, but also mipsel,
mips64, and mips64el. ``target={{.*}}-linux-gnu`` will match
x86_64-unknown-linux-gnu, but not armv8l-unknown-linux-gnueabihf.
Prefer to use hyphens to delimit triple components (``target=mips-{{.*}}``)
and it's generally a good idea to use a trailing wildcard to allow for
unexpected suffixes.

Also, it's generally better to write regular expressions that use entire
triple components than to do something clever to shorten them. For
example, to match both freebsd and netbsd in an expression, you could write
``target={{.*(free|net)bsd.*}}`` and that would work. However, it would
prevent a ``grep freebsd`` from finding this test. Better to use:
``target={{.+-freebsd.*}} || target={{.+-netbsd.*}}``


Substitutions
-------------

Besides replacing LLVM tool names, the following substitutions are performed in
``RUN`` lines:

``%%``
   Replaced by a single ``%``. This allows escaping other substitutions.

``%s``
   File path to the test case's source. This is suitable for passing on the
   command line as the input to an LLVM tool.

   Example: ``/home/user/llvm/test/MC/ELF/foo_test.s``

``%S``
   Directory path to the test case's source.

   Example: ``/home/user/llvm/test/MC/ELF``

``%t``
   File path to a temporary file name that can be used for this test case.
   The file name won't conflict with other test cases. You can append to it
   if you need multiple temporaries. This is useful as the destination of
   some redirected output.

   Example: ``/home/user/llvm.build/test/MC/ELF/Output/foo_test.s.tmp``

``%T``
   Directory of ``%t``. Deprecated. Shouldn't be used, because it can be easily
   misused and cause race conditions between tests.

   Use ``rm -rf %t && mkdir %t`` instead if a temporary directory is necessary.

   Example: ``/home/user/llvm.build/test/MC/ELF/Output``

``%{pathsep}``

   Expands to the path separator, i.e. ``:`` (or ``;`` on Windows).

``%{fs-src-root}``
   Expands to the root component of file system paths for the source directory,
   i.e. ``/`` on Unix systems or ``C:\`` (or another drive) on Windows.

``%{fs-tmp-root}``
   Expands to the root component of file system paths for the test's temporary
   directory, i.e. ``/`` on Unix systems or ``C:\`` (or another drive) on
   Windows.

``%{fs-sep}``
   Expands to the file system separator, i.e. ``/`` or ``\`` on Windows.

``%/s, %/S, %/t, %/T``

  Act like the corresponding substitution above but replace any ``\``
  character with a ``/``. This is useful to normalize path separators.

   Example: ``%s:  C:\Desktop Files/foo_test.s.tmp``

   Example: ``%/s: C:/Desktop Files/foo_test.s.tmp``

``%{s:real}, %{S:real}, %{t:real}, %{T:real}``
``%{/s:real}, %{/S:real}, %{/t:real}, %{/T:real}``

  Act like the corresponding substitution, including with ``/``, but use
  the real path by expanding all symbolic links and substitute drives.

   Example: ``%s:  S:\foo_test.s.tmp``

   Example: ``%{/s:real}: C:/SDrive/foo_test.s.tmp``

``%:s, %:S, %:t, %:T``

  Act like the corresponding substitution above but remove colons at
  the beginning of Windows paths. This is useful to allow concatenation
  of absolute paths on Windows to produce a legal path.

   Example: ``%s:  C:\Desktop Files\foo_test.s.tmp``

   Example: ``%:s: C\Desktop Files\foo_test.s.tmp``

``%errc_<ERRCODE>``

 Some error messages may be substituted to allow different spellings
 based on the host platform.

   The following error codes are currently supported:
   ENOENT, EISDIR, EINVAL, EACCES.

   Example: ``Linux %errc_ENOENT: No such file or directory``

   Example: ``Windows %errc_ENOENT: no such file or directory``

``%if feature %{<if branch>%} %else %{<else branch>%}``

 Conditional substitution: if ``feature`` is available it expands to
 ``<if branch>``, otherwise it expands to ``<else branch>``.
 ``%else %{<else branch>%}`` is optional and treated like ``%else %{%}``
 if not present.

``%(line)``, ``%(line+<number>)``, ``%(line-<number>)``

  The number of the line where this substitution is used, with an
  optional integer offset.  These expand only if they appear
  immediately in ``RUN:``, ``DEFINE:``, and ``REDEFINE:`` directives.
  Occurrences in substitutions defined elsewhere are never expanded.
  For example, this can be used in tests with multiple ``RUN`` lines,
  which reference the test file's line numbers.

**LLVM-specific substitutions:**

``%shlibext``
   The suffix for the host platforms shared library files. This includes the
   period as the first character.

   Example: ``.so`` (Linux), ``.dylib`` (macOS), ``.dll`` (Windows)

``%exeext``
   The suffix for the host platforms executable files. This includes the
   period as the first character.

   Example: ``.exe`` (Windows), empty on Linux.

**Clang-specific substitutions:**

``%clang``
   Invokes the Clang driver.

``%clang_cpp``
   Invokes the Clang driver as the preprocessor.

``%clang_cl``
   Invokes the CL-compatible Clang driver.

``%clangxx``
   Invokes the G++-compatible Clang driver.

``%clang_cc1``
   Invokes the Clang frontend.

``%itanium_abi_triple``, ``%ms_abi_triple``
   These substitutions can be used to get the current target triple adjusted to
   the desired ABI. For example, if the test suite is running with the
   ``i686-pc-win32`` target, ``%itanium_abi_triple`` will expand to
   ``i686-pc-mingw32``. This allows a test to run with a specific ABI without
   constraining it to a specific triple.

**FileCheck-specific substitutions:**

``%ProtectFileCheckOutput``
   This should precede a ``FileCheck`` call if and only if the call's textual
   output affects test results.  It's usually easy to tell: just look for
   redirection or piping of the ``FileCheck`` call's stdout or stderr.

.. _Test-specific substitutions:

**Test-specific substitutions:**

Additional substitutions can be defined as follows:

- Lit configuration files (e.g., ``lit.cfg`` or ``lit.local.cfg``) can define
  substitutions for all tests in a test directory.  They do so by extending the
  substitution list, ``config.substitutions``.  Each item in the list is a tuple
  consisting of a pattern and its replacement, which lit applies as plain text
  (even if it contains sequences that Python's ``re.sub`` considers to be
  escape sequences).
- To define substitutions within a single test file, lit supports the
  ``DEFINE:`` and ``REDEFINE:`` directives, described in detail below.  So that
  they have no effect on other test files, these directives modify a copy of the
  substitution list that is produced by lit configuration files.

For example, the following directives can be inserted into a test file to define
``%{cflags}`` and ``%{fcflags}`` substitutions with empty initial values, which
serve as the parameters of another newly defined ``%{check}`` substitution:

.. code-block:: llvm

    ; DEFINE: %{cflags} =
    ; DEFINE: %{fcflags} =

    ; DEFINE: %{check} =                                                  \
    ; DEFINE:   %clang_cc1 -verify -fopenmp -fopenmp-version=51 %{cflags} \
    ; DEFINE:              -emit-llvm -o - %s |                           \
    ; DEFINE:     FileCheck %{fcflags} %s

Alternatively, the above substitutions can be defined in a lit configuration
file to be shared with other test files.  Either way, the test file can then
specify directives like the following to redefine the parameter substitutions as
desired before each use of ``%{check}`` in a ``RUN:`` line:

.. code-block:: llvm

    ; REDEFINE: %{cflags} = -triple x86_64-apple-darwin10.6.0 -fopenmp-simd
    ; REDEFINE: %{fcflags} = -check-prefix=SIMD
    ; RUN: %{check}

    ; REDEFINE: %{cflags} = -triple x86_64-unknown-linux-gnu -fopenmp-simd
    ; REDEFINE: %{fcflags} = -check-prefix=SIMD
    ; RUN: %{check}

    ; REDEFINE: %{cflags} = -triple x86_64-apple-darwin10.6.0
    ; REDEFINE: %{fcflags} = -check-prefix=NO-SIMD
    ; RUN: %{check}

    ; REDEFINE: %{cflags} = -triple x86_64-unknown-linux-gnu
    ; REDEFINE: %{fcflags} = -check-prefix=NO-SIMD
    ; RUN: %{check}

Besides providing initial values, the initial ``DEFINE:`` directives for the
parameter substitutions in the above example serve a second purpose: they
establish the substitution order so that both ``%{check}`` and its parameters
expand as desired.  There's a simple way to remember the required definition
order in a test file: define a substitution before any substitution that might
refer to it.

In general, substitution expansion behaves as follows:

- Upon arriving at each ``RUN:`` line, lit expands all substitutions in that
  ``RUN:`` line using their current values from the substitution list.  No
  substitution expansion is performed immediately at ``DEFINE:`` and
  ``REDEFINE:`` directives except ``%(line)``, ``%(line+<number>)``, and
  ``%(line-<number>)``.
- When expanding substitutions in a ``RUN:`` line, lit makes only one pass
  through the substitution list by default.  In this case, a substitution must
  have been inserted earlier in the substitution list than any substitution
  appearing in its value in order for the latter to expand.  (For greater
  flexibility, you can enable multiple passes through the substitution list by
  setting `recursiveExpansionLimit`_ in a lit configuration file.)
- While lit configuration files can insert anywhere in the substitution list,
  the insertion behavior of the ``DEFINE:`` and ``REDEFINE:`` directives is
  specified below and is designed specifically for the use case presented in the
  example above.
- Defining a substitution in terms of itself, whether directly or via other
  substitutions, should be avoided.  It usually produces an infinitely recursive
  definition that cannot be fully expanded.  It does *not* define the
  substitution in terms of its previous value, even when using ``REDEFINE:``.

The relationship between the ``DEFINE:`` and ``REDEFINE:`` directive is
analogous to the relationship between a variable declaration and variable
assignment in many programming languages:

- ``DEFINE: %{name} = value``

   This directive assigns the specified value to a new substitution whose
   pattern is ``%{name}``, or it reports an error if there is already a
   substitution whose pattern contains ``%{name}`` because that could produce
   confusing expansions (e.g., a lit configuration file might define a
   substitution with the pattern ``%{name}\[0\]``).  The new substitution is
   inserted at the start of the substitution list so that it will expand first.
   Thus, its value can contain any substitution previously defined, whether in
   the same test file or in a lit configuration file, and both will expand.

- ``REDEFINE: %{name} = value``

   This directive assigns the specified value to an existing substitution whose
   pattern is ``%{name}``, or it reports an error if there are no substitutions
   with that pattern or if there are multiple substitutions whose patterns
   contain ``%{name}``.  The substitution's current position in the substitution
   list does not change so that expansion order relative to other existing
   substitutions is preserved.

The following properties apply to both the ``DEFINE:`` and ``REDEFINE:``
directives:

- **Substitution name**: In the directive, whitespace immediately before or
  after ``%{name}`` is optional and discarded.  ``%{name}`` must start with
  ``%{``, it must end with ``}``, and the rest must start with a letter or
  underscore and contain only alphanumeric characters, hyphens, underscores, and
  colons.  This syntax has a few advantages:

    - It is impossible for ``%{name}`` to contain sequences that are special in
      Python's ``re.sub`` patterns.  Otherwise, attempting to specify
      ``%{name}`` as a substitution pattern in a lit configuration file could
      produce confusing expansions.
    - The braces help avoid the possibility that another substitution's pattern
      will match part of ``%{name}`` or vice-versa, producing confusing
      expansions.  However, the patterns of substitutions defined by lit
      configuration files and by lit itself are not restricted to this form, so
      overlaps are still theoretically possible.

- **Substitution value**: The value includes all text from the first
  non-whitespace character after ``=`` to the last non-whitespace character.  If
  there is no non-whitespace character after ``=``, the value is the empty
  string.  Escape sequences that can appear in Python ``re.sub`` replacement
  strings are treated as plain text in the value.
- **Line continuations**: If the last non-whitespace character on the line after
  ``:`` is ``\``, then the next directive must use the same directive keyword
  (e.g., ``DEFINE:``) , and it is an error if there is no additional directive.
  That directive serves as a continuation.  That is, before following the rules
  above to parse the text after ``:`` in either directive, lit joins that text
  together to form a single directive, replaces the ``\`` with a single space,
  and removes any other whitespace that is now adjacent to that space.  A
  continuation can be continued in the same manner.  A continuation containing
  only whitespace after its ``:`` is an error.

.. _recursiveExpansionLimit:

**recursiveExpansionLimit:**

As described in the previous section, when expanding substitutions in a ``RUN:``
line, lit makes only one pass through the substitution list by default.  Thus,
if substitutions are not defined in the proper order, some will remain in the
``RUN:`` line unexpanded.  For example, the following directives refer to
``%{inner}`` within ``%{outer}`` but do not define ``%{inner}`` until after
``%{outer}``:

.. code-block:: llvm

    ; By default, this definition order does not enable full expansion.

    ; DEFINE: %{outer} = %{inner}
    ; DEFINE: %{inner} = expanded

    ; RUN: echo '%{outer}'

``DEFINE:`` inserts substitutions at the start of the substitution list, so
``%{inner}`` expands first but has no effect because the original ``RUN:`` line
does not contain ``%{inner}``.  Next, ``%{outer}`` expands, and the output of
the ``echo`` command becomes:

.. code-block:: shell

    %{inner}

Of course, one way to fix this simple case is to reverse the definitions of
``%{outer}`` and ``%{inner}``.  However, if a test has a complex set of
substitutions that can all reference each other, there might not exist a
sufficient substitution order.

To address such use cases, lit configuration files support
``config.recursiveExpansionLimit``, which can be set to a non-negative integer
to specify the maximum number of passes through the substitution list.  Thus, in
the above example, setting the limit to 2 would cause lit to make a second pass
that expands ``%{inner}`` in the ``RUN:`` line, and the output from the ``echo``
command would then be:

.. code-block:: shell

    expanded

To improve performance, lit will stop making passes when it notices the ``RUN:``
line has stopped changing.  In the above example, setting the limit higher than
2 is thus harmless.

To facilitate debugging, after reaching the limit, lit will make one extra pass
and report an error if the ``RUN:`` line changes again.  In the above example,
setting the limit to 1 will thus cause lit to report an error instead of
producing incorrect output.

Options
-------

The llvm lit configuration allows some things to be customized with user options:

``llc``, ``opt``, ...
    Substitute the respective llvm tool name with a custom command line. This
    allows to specify custom paths and default arguments for these tools.
    Example:

    % llvm-lit "-Dllc=llc -verify-machineinstrs"

``run_long_tests``
    Enable the execution of long running tests.

``llvm_site_config``
    Load the specified lit configuration instead of the default one.


Other Features
--------------

To make ``RUN`` line writing easier, several helper programs are available. These
helpers are in the ``PATH`` when running tests, so you can just call them using
their name. For example:

``not``
   This program runs its arguments and then inverts the result code from it.
   Zero result codes become 1. Non-zero result codes become 0.

To make the output more useful, :program:`lit` will scan
the lines of the test case for ones that contain a pattern that matches
``PR[0-9]+``. This is the syntax for specifying a PR (Problem Report) number
that is related to the test case. The number after "PR" specifies the
LLVM Bugzilla number. When a PR number is specified, it will be used in
the pass/fail reporting. This is useful to quickly get some context when
a test fails.

Finally, any line that contains "END." will cause the special
interpretation of lines to terminate. This is generally done right after
the last ``RUN:`` line. This has two side effects:

(a) it prevents special interpretation of lines that are part of the test
    program, not the instructions to the test case, and

(b) it speeds things up for really big test cases by avoiding
    interpretation of the remainder of the file.
