forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 58
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[utils] Add script to generate elaborated IR and assembly tests (llvm…
…#89026) 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., large amount of debug information output from Clang), the current practice is to include the C/C++ source file and the generation instructions as comments. This is inconvenient when regeneration is needed. This patch adds `llvm/utils/update_test_body.py` to allow easier regeneration. `ld.lld --debug-names` tests (llvm#86508) utilize this script for Clang-generated assembly tests. Note: `-o pipefail` is standard (since https://www.austingroupbugs.net/view.php?id=789) but not supported by dash. Link: https://discourse.llvm.org/t/utility-to-generate-elaborated-assembly-ir-tests/78408
- Loading branch information
Showing
14 changed files
with
314 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
13 changes: 13 additions & 0 deletions
13
llvm/test/tools/UpdateTestChecks/update_test_body/Inputs/basic-asm.test.expected
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# RUN: cp %s %t && %update_test_body %t 2>&1 | count 0 | ||
# RUN: diff -u %S/Inputs/basic-asm.test.expected %t | ||
|
||
.ifdef GEN | ||
#--- a.txt | ||
.long 0 | ||
#--- b.txt | ||
.long 1 | ||
#--- gen | ||
cat a.txt b.txt | ||
.endif | ||
.long 0 | ||
.long 1 |
16 changes: 16 additions & 0 deletions
16
llvm/test/tools/UpdateTestChecks/update_test_body/Inputs/basic.test.expected
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
; RUN: cp %s %t && %update_test_body %t 2>&1 | count 0 | ||
; RUN: diff -u %S/Inputs/basic.test.expected %t | ||
|
||
;--- a.txt | ||
@a = global i32 0 | ||
;--- b.txt | ||
@b = global i32 0 | ||
;--- gen | ||
cat a.txt | ||
echo ';--- b.ll' | ||
cat b.txt | ||
|
||
;--- a.ll | ||
@a = global i32 0 | ||
;--- b.ll | ||
@b = global i32 0 |
11 changes: 11 additions & 0 deletions
11
llvm/test/tools/UpdateTestChecks/update_test_body/basic-asm.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# RUN: cp %s %t && %update_test_body %t 2>&1 | count 0 | ||
# RUN: diff -u %S/Inputs/basic-asm.test.expected %t | ||
|
||
.ifdef GEN | ||
#--- a.txt | ||
.long 0 | ||
#--- b.txt | ||
.long 1 | ||
#--- gen | ||
cat a.txt b.txt | ||
.endif |
13 changes: 13 additions & 0 deletions
13
llvm/test/tools/UpdateTestChecks/update_test_body/basic.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
; RUN: cp %s %t && %update_test_body %t 2>&1 | count 0 | ||
; RUN: diff -u %S/Inputs/basic.test.expected %t | ||
|
||
;--- a.txt | ||
@a = global i32 0 | ||
;--- b.txt | ||
@b = global i32 0 | ||
;--- gen | ||
cat a.txt | ||
echo ';--- b.ll' | ||
cat b.txt | ||
|
||
;--- a.ll |
13 changes: 13 additions & 0 deletions
13
llvm/test/tools/UpdateTestChecks/update_test_body/empty-stdout.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# RUN: cp %s %t && not %update_test_body %t 2>&1 | FileCheck %s | ||
# RUN: diff -u %t %s | ||
|
||
# CHECK: stdout is empty; forgot -o - ? | ||
|
||
.ifdef GEN | ||
#--- a.txt | ||
.long 0 | ||
#--- b.txt | ||
.long 1 | ||
#--- gen | ||
true | ||
.endif |
7 changes: 7 additions & 0 deletions
7
llvm/test/tools/UpdateTestChecks/update_test_body/gen-absent.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
# RUN: cp %s %t && not %update_test_body %t 2>&1 | FileCheck %s | ||
|
||
# CHECK: 'gen' does not exist | ||
|
||
.ifdef GEN | ||
#--- a.txt | ||
.endif |
11 changes: 11 additions & 0 deletions
11
llvm/test/tools/UpdateTestChecks/update_test_body/gen-fail.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# RUN: cp %s %t && not %update_test_body %t 2>&1 | FileCheck %s | ||
|
||
# CHECK: log | ||
# CHECK-NEXT: 'gen' failed | ||
|
||
.ifdef GEN | ||
#--- gen | ||
echo log >&2 | ||
false # gen fails due to sh -e | ||
true | ||
.endif |
8 changes: 8 additions & 0 deletions
8
llvm/test/tools/UpdateTestChecks/update_test_body/gen-unterminated.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# RUN: cp %s %t && not %update_test_body %t 2>&1 | FileCheck %s | ||
|
||
# CHECK: 'gen' should be followed by another part (---) or .endif | ||
|
||
#--- a.txt | ||
.long 0 | ||
#--- gen | ||
cat a.txt |
4 changes: 4 additions & 0 deletions
4
llvm/test/tools/UpdateTestChecks/update_test_body/lit.local.cfg
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
import platform | ||
|
||
if platform.system() == "Windows": | ||
config.unsupported = True |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 7 additions & 7 deletions
14
llvm/test/tools/llvm-dwarfdump/X86/prettyprint_type_units_split_v5.s
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
#!/usr/bin/env python3 | ||
"""Generate test body using split-file and a custom script. | ||
The script will prepare extra files with `split-file`, invoke `gen`, and then | ||
rewrite the part after `gen` with its stdout. | ||
https://llvm.org/docs/TestingGuide.html#elaborated-tests | ||
Example: | ||
PATH=/path/to/clang_build/bin:$PATH llvm/utils/update_test_body.py path/to/test.s | ||
""" | ||
import argparse | ||
import contextlib | ||
import os | ||
import re | ||
import subprocess | ||
import sys | ||
import tempfile | ||
|
||
|
||
@contextlib.contextmanager | ||
def cd(directory): | ||
cwd = os.getcwd() | ||
os.chdir(directory) | ||
try: | ||
yield | ||
finally: | ||
os.chdir(cwd) | ||
|
||
|
||
def process(args, path): | ||
prolog = [] | ||
seen_gen = False | ||
with open(path) as f: | ||
for line in f.readlines(): | ||
line = line.rstrip() | ||
prolog.append(line) | ||
if (seen_gen and re.match(r"(.|//)---", line)) or line.startswith(".endif"): | ||
break | ||
if re.match(r"(.|//)--- gen", line): | ||
seen_gen = True | ||
else: | ||
print( | ||
"'gen' should be followed by another part (---) or .endif", | ||
file=sys.stderr, | ||
) | ||
return 1 | ||
|
||
if not seen_gen: | ||
print("'gen' does not exist", file=sys.stderr) | ||
return 1 | ||
with tempfile.TemporaryDirectory(prefix="update_test_body_") as dir: | ||
try: | ||
# If the last line starts with ".endif", remove it. | ||
sub = subprocess.run( | ||
["split-file", "-", dir], | ||
input="\n".join( | ||
prolog[:-1] if prolog[-1].startswith(".endif") else prolog | ||
).encode(), | ||
capture_output=True, | ||
check=True, | ||
) | ||
except subprocess.CalledProcessError as ex: | ||
sys.stderr.write(ex.stderr.decode()) | ||
return 1 | ||
with cd(dir): | ||
if args.shell: | ||
print(f"invoke shell in the temporary directory '{dir}'") | ||
subprocess.run([os.environ.get("SHELL", "sh")]) | ||
return 0 | ||
|
||
sub = subprocess.run( | ||
["sh", "-eu", "gen"], | ||
capture_output=True, | ||
# Don't encode the directory information to the Clang output. | ||
# Remove unneeded details (.ident) as well. | ||
env=dict( | ||
os.environ, | ||
CCC_OVERRIDE_OPTIONS="#^-fno-ident", | ||
PWD="/proc/self/cwd", | ||
), | ||
) | ||
sys.stderr.write(sub.stderr.decode()) | ||
if sub.returncode != 0: | ||
print("'gen' failed", file=sys.stderr) | ||
return sub.returncode | ||
if not sub.stdout: | ||
print("stdout is empty; forgot -o - ?", file=sys.stderr) | ||
return 1 | ||
content = sub.stdout.decode() | ||
|
||
with open(path, "w") as f: | ||
# Print lines up to '.endif'. | ||
print("\n".join(prolog), file=f) | ||
# Then print the stdout of 'gen'. | ||
f.write(content) | ||
|
||
|
||
parser = argparse.ArgumentParser( | ||
description="Generate test body using split-file and a custom script" | ||
) | ||
parser.add_argument("files", nargs="+") | ||
parser.add_argument( | ||
"--shell", action="store_true", help="invoke shell instead of 'gen'" | ||
) | ||
args = parser.parse_args() | ||
for path in args.files: | ||
retcode = process(args, path) | ||
if retcode != 0: | ||
sys.exit(retcode) |