# LLVM Testing Infrastructure Guide


```{toctree}
:hidden:

TestSuiteGuide
```

## 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:

```bash
% make check-llvm-unit
```

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

```bash
% make check-llvm
```

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

```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:

```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:

```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:

```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:

```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:

```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.

If new tests depend on a separate LLVM pull request, wait at least a day after
merging the LLVM PR before merging the
[test-suite](https://github.com/llvm/llvm-test-suite.git) PR.  This avoids test
failures when the merged test suite runs before the compiler updates.

### 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:

```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:

```
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 partially automate this, but usually
  some manual cleanup is still required.
- 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`).
- Omit target triples and datalayouts when possible. If the test case only
  exercises the code path of interest with a specific target triple
  and/or datalayout, then they should be in the test, but otherwise they
  should be omitted to allow the test to run without requiring a specific
  backend to be built.
- Put tests in the right place. Prefer to add additional test cases to
  an existing file rather than creating a new one. If your test requires
  a specific target, prefer putting it in a target-specific test
  subdirectory rather than requiring a specific backend to be built with a
  `REQUIRES:` line.
- Use a minimal number of non-default (`CHECK-<prefix>`) check prefixes.
  Avoid setting a check prefix if all `FileCheck` invocations in the test
  expect the same output.

### 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,

```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:

```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.

```
; 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'
```

```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.

```
# 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.

```
# 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`:

```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:

```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:

```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:

```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:

```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.

```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.

```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:

```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:

```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 {ref}`recursiveExpansionLimit <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}`:

```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:

```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:

```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.
