# LLVM Testing Infrastructure Guide

```{contents}
:local:
```

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