Difference between revisions of "LDC Lit-based testsuite"
JohanEngelen (talk | contribs) (work in progress) |
JohanEngelen (talk | contribs) (Add FileCheck description) |
||
Line 10: | Line 10: | ||
The rest of this page will describe important functionality of the testsuite. It is very instructive to look at LLVM/Clang/LDC tests to see how different kind of tests can be constructed! | The rest of this page will describe important functionality of the testsuite. It is very instructive to look at LLVM/Clang/LDC tests to see how different kind of tests can be constructed! | ||
+ | |||
+ | == FileCheck == | ||
+ | |||
+ | [http://llvm.org/docs/CommandGuide/FileCheck.html FileCheck] is an LLVM tool that reads a file passed as argument and checks whether the input received from <tt>stdin</tt> corresponds to what that file says it should look like. Confusing? An example: | ||
+ | |||
+ | FileCheck test.d < test.ll | ||
+ | |||
+ | That command loads FileCheck with file <tt>test.d</tt>. That file contains directives for FileCheck (starting with <tt>// CHECK</tt>, telling it what to look for in <tt>stdin</tt>. The directive <tt>// CHECK: LDC is awesome</tt> will check that "LDC is awesome" appears in <tt>stdin</tt>. FileCheck will succeed when all checks are satisfied. | ||
+ | |||
+ | A typical test case does: | ||
+ | * Run LDC with some commandline flags and a D input file, and have it output LLVM IR to a temporary file. | ||
+ | * Run FileCheck with the D input file as parameter, passing the temporary LLVM IR file through <tt>stdin</tt> | ||
== A simple test case example == | == A simple test case example == |
Revision as of 08:58, 25 May 2016
This page describes the Lit-based test suite used for testing LDC.
Contents
Lit
Lit is a tool created by the LLVM developers to run compiler tests, written in Python.
Read about it from the horse's mouth: LLVM Blog: 'lit' it.
Lit is an important piece of LLVM's Testing Infrastructure.
LDC uses the Python package as available from https://pypi.python.org/pypi/lit , which can be best installed using Python's pip.
The rest of this page will describe important functionality of the testsuite. It is very instructive to look at LLVM/Clang/LDC tests to see how different kind of tests can be constructed!
FileCheck
FileCheck is an LLVM tool that reads a file passed as argument and checks whether the input received from stdin corresponds to what that file says it should look like. Confusing? An example:
FileCheck test.d < test.ll
That command loads FileCheck with file test.d. That file contains directives for FileCheck (starting with // CHECK, telling it what to look for in stdin. The directive // CHECK: LDC is awesome will check that "LDC is awesome" appears in stdin. FileCheck will succeed when all checks are satisfied.
A typical test case does:
- Run LDC with some commandline flags and a D input file, and have it output LLVM IR to a temporary file.
- Run FileCheck with the D input file as parameter, passing the temporary LLVM IR file through stdin
A simple test case example
To add a test case to the testsuite, all you have to do is create a file inside a subdirectory of the tests directory (not the d2 subdirectory!).
Let's say we created a file tests/codegen/attr_fastmath.d:
// RUN: %ldc -O0 -release -c -output-ll -of=%t.ll %s && FileCheck %s < %t.ll
import ldc.attributes;
@fastmath
double foo(double a, double b)
{
// CHECK: fmul fast
auto c += a * b;
}
Substitutions
"Features"
More complicated example
// Tests @target attribute for x86
// REQUIRES: atleast_llvm307
// REQUIRES: target_X86
// RUN: %ldc -O -c -mcpu=i386 -mtriple i386-linux-gnu -output-ll -of=%t.ll %s && FileCheck %s --check-prefix LLVM < %t.ll
// RUN: %ldc -O -c -mcpu=i386 -mtriple i386-linux-gnu -output-s -of=%t.s %s && FileCheck %s --check-prefix ASM < %t.s
import ldc.attributes;
// LLVM-LABEL: define{{.*}} void @{{.*}}foo
// ASM-LABEL: _D15attr_target_x863fooFPfPffZv:
void foo(float *A, float* B, float K) {
for (int i = 0; i < 128; ++i)
A[i] *= B[i] + K;
// ASM-NOT: addps
}
// LLVM-LABEL: define{{.*}} void @{{.*}}foo_sse
// LLVM-SAME: #[[SSE:[0-9]+]]
// ASM-LABEL: _D15attr_target_x867foo_sseFPfPffZv:
@(target("sse"))
void foo_sse(float *A, float* B, float K) {
for (int i = 0; i < 128; ++i)
A[i] *= B[i] + K;
// ASM: addps
}