Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
#!/usr/bin/env python2.7
|
|
|
|
|
|
|
|
"""A test case update script.
|
|
|
|
|
|
|
|
This script is a utility to update LLVM X86 'llc' based test cases with new
|
|
|
|
FileCheck patterns. It can either update all of the tests in the file or
|
|
|
|
a single test function.
|
|
|
|
"""
|
|
|
|
|
|
|
|
import argparse
|
2016-03-24 18:30:38 +01:00
|
|
|
import os # Used to advertise this file's name ("autogenerated_note").
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
import string
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
import re
|
|
|
|
|
2016-03-23 22:40:53 +01:00
|
|
|
# Invoke the tool that is being tested.
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
def llc(args, cmd_args, ir):
|
|
|
|
with open(ir) as ir_file:
|
|
|
|
stdout = subprocess.check_output(args.llc_binary + ' ' + cmd_args,
|
|
|
|
shell=True, stdin=ir_file)
|
2016-01-27 22:13:18 +01:00
|
|
|
# Fix line endings to unix CR style.
|
|
|
|
stdout = stdout.replace('\r\n', '\n')
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
return stdout
|
|
|
|
|
|
|
|
|
2016-03-23 22:40:53 +01:00
|
|
|
# RegEx: this is where the magic happens.
|
|
|
|
|
2016-12-20 00:09:51 +01:00
|
|
|
ASM_FUNCTION_X86_RE = re.compile(
|
|
|
|
r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@(?P=func)\n[^:]*?'
|
|
|
|
r'(?P<body>^##?[ \t]+[^:]+:.*?)\s*'
|
2017-09-07 01:04:28 +02:00
|
|
|
r'^\s*(?:[^:\n]+?:\s*\n\s*\.size|\.cfi_endproc|\.globl|\.comm|\.(?:sub)?section|#+ -- End function)',
|
2016-12-20 00:09:51 +01:00
|
|
|
flags=(re.M | re.S))
|
|
|
|
|
|
|
|
ASM_FUNCTION_ARM_RE = re.compile(
|
|
|
|
r'^(?P<func>[0-9a-zA-Z_]+):\n' # f: (name of function)
|
|
|
|
r'\s+\.fnstart\n' # .fnstart
|
|
|
|
r'(?P<body>.*?)\n' # (body of the function)
|
2017-08-25 04:32:48 +02:00
|
|
|
r'.Lfunc_end[0-9]+:', # .Lfunc_end0: or # -- End function
|
2016-12-20 00:09:51 +01:00
|
|
|
flags=(re.M | re.S))
|
2016-03-23 22:40:53 +01:00
|
|
|
|
2017-08-25 21:33:18 +02:00
|
|
|
ASM_FUNCTION_AARCH64_RE = re.compile(
|
|
|
|
r'^_?(?P<func>[^:]+):[ \t]*\/\/[ \t]*@(?P=func)\n'
|
|
|
|
r'[ \t]+.cfi_startproc\n'
|
|
|
|
r'(?P<body>.*?)\n'
|
|
|
|
# This list is incomplete
|
|
|
|
r'.Lfunc_end[0-9]+:\n',
|
|
|
|
flags=(re.M | re.S))
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
|
2017-11-26 20:22:44 +01:00
|
|
|
ASM_FUNCTION_MIPS_RE = re.compile(
|
|
|
|
r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@(?P=func)\n[^:]*?' # f: (name of func)
|
|
|
|
r'(?:^[ \t]+\.(frame|f?mask|set).*?\n)+' # Mips+LLVM standard asm prologue
|
|
|
|
r'(?P<body>.*?)\n' # (body of the function)
|
|
|
|
r'(?:^[ \t]+\.(set|end).*?\n)+' # Mips+LLVM standard asm epilogue
|
|
|
|
r'(\$|\.L)func_end[0-9]+:\n', # $func_end0: (mips32 - O32) or
|
|
|
|
# .Lfunc_end0: (mips64 - NewABI)
|
|
|
|
flags=(re.M | re.S))
|
|
|
|
|
2016-12-22 21:59:39 +01:00
|
|
|
ASM_FUNCTION_PPC_RE = re.compile(
|
|
|
|
r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@(?P=func)\n'
|
|
|
|
r'\.Lfunc_begin[0-9]+:\n'
|
2018-01-17 19:48:50 +01:00
|
|
|
r'(?:[ \t]+.cfi_startproc\n)?'
|
2016-12-22 21:59:39 +01:00
|
|
|
r'(?:\.Lfunc_[gl]ep[0-9]+:\n(?:[ \t]+.*?\n)*)*'
|
|
|
|
r'(?P<body>.*?)\n'
|
|
|
|
# This list is incomplete
|
|
|
|
r'(?:^[ \t]*(?:\.long[ \t]+[^\n]+|\.quad[ \t]+[^\n]+)\n)*'
|
|
|
|
r'.Lfunc_end[0-9]+:\n',
|
|
|
|
flags=(re.M | re.S))
|
|
|
|
|
2017-11-08 15:24:42 +01:00
|
|
|
ASM_FUNCTION_RISCV_RE = re.compile(
|
|
|
|
r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@(?P=func)\n[^:]*?'
|
|
|
|
r'(?P<body>^##?[ \t]+[^:]+:.*?)\s*'
|
|
|
|
r'.Lfunc_end[0-9]+:\n',
|
|
|
|
flags=(re.M | re.S))
|
|
|
|
|
2017-03-17 08:11:42 +01:00
|
|
|
ASM_FUNCTION_SYSTEMZ_RE = re.compile(
|
|
|
|
r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@(?P=func)\n'
|
|
|
|
r'[ \t]+.cfi_startproc\n'
|
|
|
|
r'(?P<body>.*?)\n'
|
|
|
|
r'.Lfunc_end[0-9]+:\n',
|
|
|
|
flags=(re.M | re.S))
|
|
|
|
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
|
2017-08-25 21:33:18 +02:00
|
|
|
SCRUB_WHITESPACE_RE = re.compile(r'(?!^(| \w))[ \t]+', flags=re.M)
|
|
|
|
SCRUB_TRAILING_WHITESPACE_RE = re.compile(r'[ \t]+$', flags=re.M)
|
|
|
|
SCRUB_KILL_COMMENT_RE = re.compile(r'^ *#+ +kill:.*\n')
|
|
|
|
SCRUB_LOOP_COMMENT_RE = re.compile(
|
|
|
|
r'# =>This Inner Loop Header:.*|# in Loop:.*', flags=re.M)
|
|
|
|
|
|
|
|
SCRUB_X86_SHUFFLES_RE = (
|
|
|
|
re.compile(
|
|
|
|
r'^(\s*\w+) [^#\n]+#+ ((?:[xyz]mm\d+|mem)( \{%k\d+\}( \{z\})?)? = .*)$',
|
|
|
|
flags=re.M))
|
|
|
|
SCRUB_X86_SP_RE = re.compile(r'\d+\(%(esp|rsp)\)')
|
|
|
|
SCRUB_X86_RIP_RE = re.compile(r'[.\w]+\(%rip\)')
|
|
|
|
SCRUB_X86_LCP_RE = re.compile(r'\.LCPI[0-9]+_[0-9]+')
|
2017-10-20 23:55:23 +02:00
|
|
|
SCRUB_X86_RET_RE = re.compile(r'ret[l|q]')
|
2017-08-25 21:33:18 +02:00
|
|
|
|
|
|
|
RUN_LINE_RE = re.compile('^\s*;\s*RUN:\s*(.*)$')
|
|
|
|
TRIPLE_ARG_RE = re.compile(r'-mtriple=([^ ]+)')
|
|
|
|
TRIPLE_IR_RE = re.compile(r'^target\s+triple\s*=\s*"([^"]+)"$')
|
|
|
|
IR_FUNCTION_RE = re.compile('^\s*define\s+(?:internal\s+)?[^@]*@(\w+)\s*\(')
|
|
|
|
CHECK_PREFIX_RE = re.compile('--?check-prefix(?:es)?=(\S+)')
|
|
|
|
CHECK_RE = re.compile(r'^\s*;\s*([^:]+?)(?:-NEXT|-NOT|-DAG|-LABEL)?:')
|
|
|
|
|
2017-10-24 16:32:52 +02:00
|
|
|
def scrub_asm_x86(asm, args):
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
# Scrub runs of whitespace out of the assembly, but leave the leading
|
|
|
|
# whitespace in place.
|
2016-03-23 22:40:53 +01:00
|
|
|
asm = SCRUB_WHITESPACE_RE.sub(r' ', asm)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
# Expand the tabs used for indentation.
|
|
|
|
asm = string.expandtabs(asm, 2)
|
|
|
|
# Detect shuffle asm comments and hide the operands in favor of the comments.
|
2016-03-23 22:40:53 +01:00
|
|
|
asm = SCRUB_X86_SHUFFLES_RE.sub(r'\1 {{.*#+}} \2', asm)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
# Generically match the stack offset of a memory operand.
|
2016-03-23 22:40:53 +01:00
|
|
|
asm = SCRUB_X86_SP_RE.sub(r'{{[0-9]+}}(%\1)', asm)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
# Generically match a RIP-relative memory operand.
|
2016-03-23 22:40:53 +01:00
|
|
|
asm = SCRUB_X86_RIP_RE.sub(r'{{.*}}(%rip)', asm)
|
2016-06-11 22:39:21 +02:00
|
|
|
# Generically match a LCP symbol.
|
|
|
|
asm = SCRUB_X86_LCP_RE.sub(r'{{\.LCPI.*}}', asm)
|
2017-10-24 16:32:52 +02:00
|
|
|
if args.x86_extra_scrub:
|
|
|
|
# Avoid generating different checks for 32- and 64-bit because of 'retl' vs 'retq'.
|
|
|
|
asm = SCRUB_X86_RET_RE.sub(r'ret{{[l|q]}}', asm)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
# Strip kill operands inserted into the asm.
|
2016-03-23 22:40:53 +01:00
|
|
|
asm = SCRUB_KILL_COMMENT_RE.sub('', asm)
|
2015-02-04 11:46:48 +01:00
|
|
|
# Strip trailing whitespace.
|
2016-03-23 22:40:53 +01:00
|
|
|
asm = SCRUB_TRAILING_WHITESPACE_RE.sub(r'', asm)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
return asm
|
|
|
|
|
2017-10-24 16:32:52 +02:00
|
|
|
def scrub_asm_arm_eabi(asm, args):
|
2016-12-20 00:09:51 +01:00
|
|
|
# Scrub runs of whitespace out of the assembly, but leave the leading
|
|
|
|
# whitespace in place.
|
|
|
|
asm = SCRUB_WHITESPACE_RE.sub(r' ', asm)
|
|
|
|
# Expand the tabs used for indentation.
|
|
|
|
asm = string.expandtabs(asm, 2)
|
|
|
|
# Strip kill operands inserted into the asm.
|
|
|
|
asm = SCRUB_KILL_COMMENT_RE.sub('', asm)
|
|
|
|
# Strip trailing whitespace.
|
|
|
|
asm = SCRUB_TRAILING_WHITESPACE_RE.sub(r'', asm)
|
|
|
|
return asm
|
|
|
|
|
2017-10-24 16:32:52 +02:00
|
|
|
def scrub_asm_powerpc64(asm, args):
|
2016-12-22 21:59:39 +01:00
|
|
|
# Scrub runs of whitespace out of the assembly, but leave the leading
|
|
|
|
# whitespace in place.
|
|
|
|
asm = SCRUB_WHITESPACE_RE.sub(r' ', asm)
|
|
|
|
# Expand the tabs used for indentation.
|
|
|
|
asm = string.expandtabs(asm, 2)
|
2017-03-23 17:02:47 +01:00
|
|
|
# Stripe unimportant comments
|
|
|
|
asm = SCRUB_LOOP_COMMENT_RE.sub(r'', asm)
|
2016-12-22 21:59:39 +01:00
|
|
|
# Strip trailing whitespace.
|
|
|
|
asm = SCRUB_TRAILING_WHITESPACE_RE.sub(r'', asm)
|
|
|
|
return asm
|
|
|
|
|
2017-11-26 20:22:44 +01:00
|
|
|
def scrub_asm_mips(asm, args):
|
|
|
|
# Scrub runs of whitespace out of the assembly, but leave the leading
|
|
|
|
# whitespace in place.
|
|
|
|
asm = SCRUB_WHITESPACE_RE.sub(r' ', asm)
|
|
|
|
# Expand the tabs used for indentation.
|
|
|
|
asm = string.expandtabs(asm, 2)
|
|
|
|
# Strip trailing whitespace.
|
|
|
|
asm = SCRUB_TRAILING_WHITESPACE_RE.sub(r'', asm)
|
|
|
|
return asm
|
|
|
|
|
2017-11-09 21:01:25 +01:00
|
|
|
def scrub_asm_riscv(asm, args):
|
2017-11-08 15:24:42 +01:00
|
|
|
# Scrub runs of whitespace out of the assembly, but leave the leading
|
|
|
|
# whitespace in place.
|
|
|
|
asm = SCRUB_WHITESPACE_RE.sub(r' ', asm)
|
|
|
|
# Expand the tabs used for indentation.
|
|
|
|
asm = string.expandtabs(asm, 2)
|
|
|
|
# Strip trailing whitespace.
|
|
|
|
asm = SCRUB_TRAILING_WHITESPACE_RE.sub(r'', asm)
|
|
|
|
return asm
|
|
|
|
|
2017-10-24 16:32:52 +02:00
|
|
|
def scrub_asm_systemz(asm, args):
|
2017-03-17 08:11:42 +01:00
|
|
|
# Scrub runs of whitespace out of the assembly, but leave the leading
|
|
|
|
# whitespace in place.
|
|
|
|
asm = SCRUB_WHITESPACE_RE.sub(r' ', asm)
|
|
|
|
# Expand the tabs used for indentation.
|
|
|
|
asm = string.expandtabs(asm, 2)
|
|
|
|
# Strip trailing whitespace.
|
|
|
|
asm = SCRUB_TRAILING_WHITESPACE_RE.sub(r'', asm)
|
|
|
|
return asm
|
|
|
|
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
|
2016-03-24 18:15:42 +01:00
|
|
|
# Build up a dictionary of all the function bodies.
|
2016-12-22 21:59:39 +01:00
|
|
|
def build_function_body_dictionary(raw_tool_output, triple, prefixes, func_dict,
|
2017-10-24 16:32:52 +02:00
|
|
|
args):
|
2016-12-22 21:59:39 +01:00
|
|
|
target_handlers = {
|
|
|
|
'x86_64': (scrub_asm_x86, ASM_FUNCTION_X86_RE),
|
|
|
|
'i686': (scrub_asm_x86, ASM_FUNCTION_X86_RE),
|
|
|
|
'x86': (scrub_asm_x86, ASM_FUNCTION_X86_RE),
|
|
|
|
'i386': (scrub_asm_x86, ASM_FUNCTION_X86_RE),
|
2017-08-25 21:33:18 +02:00
|
|
|
'aarch64': (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_RE),
|
2016-12-22 21:59:39 +01:00
|
|
|
'arm-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
2017-02-24 22:47:44 +01:00
|
|
|
'thumb-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
2017-12-01 15:27:11 +01:00
|
|
|
'thumbv6': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv6-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv6t2': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv6t2-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv6m': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv6m-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv7': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv7-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv7m': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv7m-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
2017-02-24 22:47:44 +01:00
|
|
|
'thumbv8-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
2017-12-01 15:27:11 +01:00
|
|
|
'thumbv8m.base': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'thumbv8m.main': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'armv6': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'armv7': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'armv7-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
2017-02-24 04:04:11 +01:00
|
|
|
'armeb-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
2017-12-01 15:27:11 +01:00
|
|
|
'armv7eb-eabi': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
|
|
|
'armv7eb': (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
|
2017-11-26 20:22:44 +01:00
|
|
|
'mips': (scrub_asm_mips, ASM_FUNCTION_MIPS_RE),
|
2017-10-22 20:43:23 +02:00
|
|
|
'powerpc64': (scrub_asm_powerpc64, ASM_FUNCTION_PPC_RE),
|
|
|
|
'powerpc64le': (scrub_asm_powerpc64, ASM_FUNCTION_PPC_RE),
|
2017-11-08 15:24:42 +01:00
|
|
|
'riscv32': (scrub_asm_riscv, ASM_FUNCTION_RISCV_RE),
|
|
|
|
'riscv64': (scrub_asm_riscv, ASM_FUNCTION_RISCV_RE),
|
2017-03-17 08:11:42 +01:00
|
|
|
's390x': (scrub_asm_systemz, ASM_FUNCTION_SYSTEMZ_RE),
|
2016-12-22 21:59:39 +01:00
|
|
|
}
|
|
|
|
handlers = None
|
|
|
|
for prefix, s in target_handlers.items():
|
|
|
|
if triple.startswith(prefix):
|
|
|
|
handlers = s
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
raise KeyError('Triple %r is not supported' % (triple))
|
|
|
|
|
|
|
|
scrubber, function_re = handlers
|
2016-12-20 00:09:51 +01:00
|
|
|
for m in function_re.finditer(raw_tool_output):
|
2016-03-24 18:15:42 +01:00
|
|
|
if not m:
|
|
|
|
continue
|
|
|
|
func = m.group('func')
|
2017-10-24 16:32:52 +02:00
|
|
|
scrubbed_body = scrubber(m.group('body'), args)
|
2016-03-24 18:15:42 +01:00
|
|
|
if func.startswith('stress'):
|
|
|
|
# We only use the last line of the function body for stress tests.
|
|
|
|
scrubbed_body = '\n'.join(scrubbed_body.splitlines()[-1:])
|
2017-10-24 16:32:52 +02:00
|
|
|
if args.verbose:
|
2016-03-24 18:15:42 +01:00
|
|
|
print >>sys.stderr, 'Processing function: ' + func
|
|
|
|
for l in scrubbed_body.splitlines():
|
|
|
|
print >>sys.stderr, ' ' + l
|
|
|
|
for prefix in prefixes:
|
|
|
|
if func in func_dict[prefix] and func_dict[prefix][func] != scrubbed_body:
|
|
|
|
if prefix == prefixes[-1]:
|
|
|
|
print >>sys.stderr, ('WARNING: Found conflicting asm under the '
|
|
|
|
'same prefix: %r!' % (prefix,))
|
|
|
|
else:
|
|
|
|
func_dict[prefix][func] = None
|
|
|
|
continue
|
|
|
|
|
|
|
|
func_dict[prefix][func] = scrubbed_body
|
|
|
|
|
|
|
|
|
2016-12-22 21:59:39 +01:00
|
|
|
def add_checks(output_lines, run_list, func_dict, func_name):
|
2016-03-24 18:15:42 +01:00
|
|
|
printed_prefixes = []
|
2016-12-22 21:59:39 +01:00
|
|
|
for p in run_list:
|
|
|
|
checkprefixes = p[0]
|
2016-03-24 18:15:42 +01:00
|
|
|
for checkprefix in checkprefixes:
|
|
|
|
if checkprefix in printed_prefixes:
|
|
|
|
break
|
|
|
|
if not func_dict[checkprefix][func_name]:
|
|
|
|
continue
|
|
|
|
# Add some space between different check prefixes.
|
|
|
|
if len(printed_prefixes) != 0:
|
|
|
|
output_lines.append(';')
|
|
|
|
printed_prefixes.append(checkprefix)
|
|
|
|
output_lines.append('; %s-LABEL: %s:' % (checkprefix, func_name))
|
|
|
|
func_body = func_dict[checkprefix][func_name].splitlines()
|
|
|
|
output_lines.append('; %s: %s' % (checkprefix, func_body[0]))
|
|
|
|
for func_line in func_body[1:]:
|
|
|
|
output_lines.append('; %s-NEXT: %s' % (checkprefix, func_line))
|
|
|
|
# Add space between different check prefixes and the first line of code.
|
|
|
|
# output_lines.append(';')
|
|
|
|
break
|
|
|
|
return output_lines
|
|
|
|
|
|
|
|
|
|
|
|
def should_add_line_to_output(input_line, prefix_set):
|
|
|
|
# Skip any blank comment lines in the IR.
|
|
|
|
if input_line.strip() == ';':
|
|
|
|
return False
|
|
|
|
# Skip any blank lines in the IR.
|
|
|
|
#if input_line.strip() == '':
|
|
|
|
# return False
|
|
|
|
# And skip any CHECK lines. We're building our own.
|
|
|
|
m = CHECK_RE.match(input_line)
|
|
|
|
if m and m.group(1) in prefix_set:
|
|
|
|
return False
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
def main():
|
|
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
|
|
parser.add_argument('-v', '--verbose', action='store_true',
|
|
|
|
help='Show verbose output')
|
|
|
|
parser.add_argument('--llc-binary', default='llc',
|
|
|
|
help='The "llc" binary to use to generate the test case')
|
|
|
|
parser.add_argument(
|
|
|
|
'--function', help='The function in the test file to update')
|
2017-10-24 16:32:52 +02:00
|
|
|
parser.add_argument(
|
|
|
|
'--x86_extra_scrub', action='store_true',
|
|
|
|
help='Use more regex for x86 matching to reduce diffs between various subtargets')
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
parser.add_argument('tests', nargs='+')
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
2015-11-23 22:33:58 +01:00
|
|
|
autogenerated_note = ('; NOTE: Assertions have been autogenerated by '
|
2016-06-11 22:39:21 +02:00
|
|
|
'utils/' + os.path.basename(__file__))
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
|
|
|
|
for test in args.tests:
|
|
|
|
if args.verbose:
|
|
|
|
print >>sys.stderr, 'Scanning for RUN lines in test file: %s' % (test,)
|
|
|
|
with open(test) as f:
|
2016-03-24 18:15:42 +01:00
|
|
|
input_lines = [l.rstrip() for l in f]
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
|
2016-12-22 21:59:39 +01:00
|
|
|
triple_in_ir = None
|
|
|
|
for l in input_lines:
|
|
|
|
m = TRIPLE_IR_RE.match(l)
|
|
|
|
if m:
|
|
|
|
triple_in_ir = m.groups()[0]
|
|
|
|
break
|
|
|
|
|
2016-12-29 20:32:34 +01:00
|
|
|
raw_lines = [m.group(1)
|
2016-03-24 18:15:42 +01:00
|
|
|
for m in [RUN_LINE_RE.match(l) for l in input_lines] if m]
|
2016-12-29 20:32:34 +01:00
|
|
|
run_lines = [raw_lines[0]] if len(raw_lines) > 0 else []
|
|
|
|
for l in raw_lines[1:]:
|
2016-12-29 21:05:51 +01:00
|
|
|
if run_lines[-1].endswith("\\"):
|
|
|
|
run_lines[-1] = run_lines[-1].rstrip("\\") + " " + l
|
|
|
|
else:
|
|
|
|
run_lines.append(l)
|
2016-12-29 20:32:34 +01:00
|
|
|
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
if args.verbose:
|
|
|
|
print >>sys.stderr, 'Found %d RUN lines:' % (len(run_lines),)
|
|
|
|
for l in run_lines:
|
|
|
|
print >>sys.stderr, ' RUN: ' + l
|
|
|
|
|
2016-12-22 21:59:39 +01:00
|
|
|
run_list = []
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
for l in run_lines:
|
2016-11-07 18:47:21 +01:00
|
|
|
commands = [cmd.strip() for cmd in l.split('|', 1)]
|
|
|
|
llc_cmd = commands[0]
|
2016-12-22 21:59:39 +01:00
|
|
|
|
|
|
|
triple_in_cmd = None
|
|
|
|
m = TRIPLE_ARG_RE.search(llc_cmd)
|
|
|
|
if m:
|
|
|
|
triple_in_cmd = m.groups()[0]
|
|
|
|
|
2016-11-07 18:47:21 +01:00
|
|
|
filecheck_cmd = ''
|
|
|
|
if len(commands) > 1:
|
|
|
|
filecheck_cmd = commands[1]
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
if not llc_cmd.startswith('llc '):
|
|
|
|
print >>sys.stderr, 'WARNING: Skipping non-llc RUN line: ' + l
|
|
|
|
continue
|
|
|
|
|
|
|
|
if not filecheck_cmd.startswith('FileCheck '):
|
|
|
|
print >>sys.stderr, 'WARNING: Skipping non-FileChecked RUN line: ' + l
|
|
|
|
continue
|
|
|
|
|
|
|
|
llc_cmd_args = llc_cmd[len('llc'):].strip()
|
|
|
|
llc_cmd_args = llc_cmd_args.replace('< %s', '').replace('%s', '').strip()
|
|
|
|
|
2017-01-14 10:39:35 +01:00
|
|
|
check_prefixes = [item for m in CHECK_PREFIX_RE.finditer(filecheck_cmd)
|
|
|
|
for item in m.group(1).split(',')]
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
if not check_prefixes:
|
|
|
|
check_prefixes = ['CHECK']
|
|
|
|
|
|
|
|
# FIXME: We should use multiple check prefixes to common check lines. For
|
|
|
|
# now, we just ignore all but the last.
|
2016-12-22 21:59:39 +01:00
|
|
|
run_list.append((check_prefixes, llc_cmd_args, triple_in_cmd))
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
|
2016-03-24 18:15:42 +01:00
|
|
|
func_dict = {}
|
2016-12-22 21:59:39 +01:00
|
|
|
for p in run_list:
|
|
|
|
prefixes = p[0]
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
for prefix in prefixes:
|
2016-03-24 18:15:42 +01:00
|
|
|
func_dict.update({prefix: dict()})
|
2016-12-22 21:59:39 +01:00
|
|
|
for prefixes, llc_args, triple_in_cmd in run_list:
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
if args.verbose:
|
|
|
|
print >>sys.stderr, 'Extracted LLC cmd: llc ' + llc_args
|
|
|
|
print >>sys.stderr, 'Extracted FileCheck prefixes: ' + str(prefixes)
|
2016-03-24 18:15:42 +01:00
|
|
|
|
|
|
|
raw_tool_output = llc(args, llc_args, test)
|
2016-12-22 21:59:39 +01:00
|
|
|
if not (triple_in_cmd or triple_in_ir):
|
|
|
|
print >>sys.stderr, "Cannot find a triple. Assume 'x86'"
|
|
|
|
|
|
|
|
build_function_body_dictionary(raw_tool_output,
|
2017-10-24 16:32:52 +02:00
|
|
|
triple_in_cmd or triple_in_ir or 'x86', prefixes, func_dict, args)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
|
|
|
|
is_in_function = False
|
|
|
|
is_in_function_start = False
|
2016-11-07 19:08:19 +01:00
|
|
|
func_name = None
|
2016-12-22 21:59:39 +01:00
|
|
|
prefix_set = set([prefix for p in run_list for prefix in p[0]])
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
if args.verbose:
|
|
|
|
print >>sys.stderr, 'Rewriting FileCheck prefixes: %s' % (prefix_set,)
|
2016-03-24 18:15:42 +01:00
|
|
|
output_lines = []
|
|
|
|
output_lines.append(autogenerated_note)
|
2015-11-23 22:33:58 +01:00
|
|
|
|
2016-03-24 18:15:42 +01:00
|
|
|
for input_line in input_lines:
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
if is_in_function_start:
|
2016-03-24 18:15:42 +01:00
|
|
|
if input_line == '':
|
|
|
|
continue
|
|
|
|
if input_line.lstrip().startswith(';'):
|
|
|
|
m = CHECK_RE.match(input_line)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
if not m or m.group(1) not in prefix_set:
|
2016-03-24 18:15:42 +01:00
|
|
|
output_lines.append(input_line)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
continue
|
|
|
|
|
2016-03-24 18:15:42 +01:00
|
|
|
# Print out the various check lines here.
|
2016-12-22 21:59:39 +01:00
|
|
|
output_lines = add_checks(output_lines, run_list, func_dict, func_name)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
is_in_function_start = False
|
|
|
|
|
|
|
|
if is_in_function:
|
2016-03-24 18:15:42 +01:00
|
|
|
if should_add_line_to_output(input_line, prefix_set) == True:
|
|
|
|
# This input line of the function body will go as-is into the output.
|
|
|
|
output_lines.append(input_line)
|
|
|
|
else:
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
continue
|
2016-03-24 18:15:42 +01:00
|
|
|
if input_line.strip() == '}':
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
is_in_function = False
|
|
|
|
continue
|
|
|
|
|
2016-03-24 18:15:42 +01:00
|
|
|
if input_line == autogenerated_note:
|
2015-11-23 22:33:58 +01:00
|
|
|
continue
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
|
2016-03-24 18:15:42 +01:00
|
|
|
# If it's outside a function, it just gets copied to the output.
|
|
|
|
output_lines.append(input_line)
|
|
|
|
|
|
|
|
m = IR_FUNCTION_RE.match(input_line)
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
if not m:
|
|
|
|
continue
|
2016-11-07 19:08:19 +01:00
|
|
|
func_name = m.group(1)
|
|
|
|
if args.function is not None and func_name != args.function:
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
# When filtering on a specific function, skip all others.
|
|
|
|
continue
|
|
|
|
is_in_function = is_in_function_start = True
|
|
|
|
|
|
|
|
if args.verbose:
|
2016-03-24 18:15:42 +01:00
|
|
|
print>>sys.stderr, 'Writing %d lines to %s...' % (len(output_lines), test)
|
|
|
|
|
2016-01-27 22:13:18 +01:00
|
|
|
with open(test, 'wb') as f:
|
2016-03-24 18:15:42 +01:00
|
|
|
f.writelines([l + '\n' for l in output_lines])
|
Add a new utility script that helps update very simple regression tests.
This script is currently specific to x86 and limited to use with very
small regression or feature tests using 'llc' and 'FileCheck' in
a reasonably canonical way. It is in no way general purpose or robust at
this point. However, it works quite well for simple examples. Here is
the intended workflow:
- Make a change that requires updating N test files and M functions'
assertions within those files.
- Stash the change.
- Update those N test files' RUN-lines to look "canonical"[1].
- Refresh the FileCheck lines for either the entire file or select
functions by running this script.
- The script will parse the RUN lines and run the 'llc' binary you
give it according to each line, collecting the asm.
- It will then annotate each function with the appropriate FileCheck
comments to check every instruction from the start of the first
basic block to the last return.
- There will be numerous cases where the script either fails to remove
the old lines, or inserts checks which need to be manually editted,
but the manual edits tend to be deletions or replacements of
registers with FileCheck variables which are fast manual edits.
- A common pattern is to have the script insert complete checking of
every instruction, and then edit it down to only check the relevant
ones.
- Be careful to do all of these cleanups though! The script is
designed to make transferring and formatting the asm output of llc
into a test case fast, it is *not* designed to be authoratitive
about what constitutes a good test!
- Commit the nice fresh baseline of checks.
- Unstash your change and rebuild llc.
- Re-run script to regenerate the FileCheck annotations
- Remember to re-cleanup these annotations!!!
- Check the diff to make sure this is sane, checking the things you
expected it to, and check that the newly updated tests actually pass.
- Profit!
Also, I'm *terrible* at writing Python, and frankly I didn't spend a lot
of time making this script beautiful or well engineered. But it's useful
to me and may be useful to others so I thought I'd send it out.
http://reviews.llvm.org/D5546
llvm-svn: 225618
2015-01-12 05:43:18 +01:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|