diff options
author | Peter Maydell | 2020-10-05 14:12:55 +0200 |
---|---|---|
committer | Peter Maydell | 2020-10-05 14:12:55 +0200 |
commit | 0ac0b47c44b4be6cbce26777a1a5968cc8f025a5 (patch) | |
tree | 02d95d3ad0efc145b0b84da900b09f62b017a184 /scripts/check_sparse.py | |
parent | Merge remote-tracking branch 'remotes/rth-gitlab/tags/pull-cap-20201003' into... (diff) | |
parent | dockerfiles: add diffutils to Fedora (diff) | |
download | qemu-0ac0b47c44b4be6cbce26777a1a5968cc8f025a5.tar.gz qemu-0ac0b47c44b4be6cbce26777a1a5968cc8f025a5.tar.xz qemu-0ac0b47c44b4be6cbce26777a1a5968cc8f025a5.zip |
Merge remote-tracking branch 'remotes/bonzini-gitlab/tags/for-upstream' into staging
* move target configuration to default-configs/targets (myself)
* Memory failure event (Zhenwei)
# gpg: Signature made Mon 05 Oct 2020 08:14:29 BST
# gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83
# gpg: issuer "pbonzini@redhat.com"
# gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full]
# gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full]
# Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1
# Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83
* remotes/bonzini-gitlab/tags/for-upstream:
dockerfiles: add diffutils to Fedora
tests: tcg: do not use implicit rules
target-i386: post memory failure event to QMP
qapi/run-state.json: introduce memory failure event
target-i386: seperate MCIP & MCE_MASK error reason
meson: move sparse detection to Meson and rewrite check_sparse.py
default-configs: remove redundant keys
default-configs: use TARGET_ARCH key
configure: move OpenBSD W^X test to meson
default-configs: remove default-configs/devices for user-mode targets
configure: remove target configuration
configure: remove useless config-target.mak symbols
configure: compute derivatives of target name in meson
configure: remove dead variable
configure: move accelerator logic to meson
configure: rewrite accelerator defaults as tests
configure: convert accelerator variables to meson options
default-configs: move files to default-configs/devices/
travis: remove TCI test
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
# Conflicts:
# configure
Diffstat (limited to 'scripts/check_sparse.py')
-rw-r--r-- | scripts/check_sparse.py | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/scripts/check_sparse.py b/scripts/check_sparse.py index 0de7aa55d9..2956124442 100644 --- a/scripts/check_sparse.py +++ b/scripts/check_sparse.py @@ -1,25 +1,59 @@ #! /usr/bin/env python3 -# Invoke sparse based on the contents of compile_commands.json +# Invoke sparse based on the contents of compile_commands.json, +# also working around several deficiencies in cgcc's command line +# parsing import json import subprocess +import os import sys import shlex -def extract_cflags(shcmd): - cflags = shlex.split(shcmd) - return [x for x in cflags - if x.startswith('-D') or x.startswith('-I') or x.startswith('-W') - or x.startswith('-std=')] +def cmdline_for_sparse(sparse, cmdline): + # Do not include the C compiler executable + skip = True + arg = False + out = sparse + ['-no-compile'] + for x in cmdline: + if arg: + out.append(x) + arg = False + continue + if skip: + skip = False + continue + # prevent sparse from treating output files as inputs + if x == '-MF' or x == '-MQ' or x == '-o': + skip = True + continue + # cgcc ignores -no-compile if it sees -M or -MM? + if x.startswith('-M'): + continue + # sparse does not understand these! + if x == '-iquote' or x == '-isystem': + x = '-I' + if x == '-I': + arg = True + out.append(x) + return out -cflags = sys.argv[1:-1] -with open(sys.argv[-1], 'r') as fd: +root_path = os.getenv('MESON_BUILD_ROOT') +def build_path(s): + return s if not root_path else os.path.join(root_path, s) + +ccjson_path = build_path(sys.argv[1]) +with open(ccjson_path, 'r') as fd: compile_commands = json.load(fd) +sparse = sys.argv[2:] +sparse_env = os.environ.copy() for cmd in compile_commands: - cmd = ['sparse'] + cflags + extract_cflags(cmd['command']) + [cmd['file']] - print(' '.join((shlex.quote(x) for x in cmd))) - r = subprocess.run(cmd) + cmdline = shlex.split(cmd['command']) + cmd = cmdline_for_sparse(sparse, cmdline) + print('REAL_CC=%s' % shlex.quote(cmdline[0]), + ' '.join((shlex.quote(x) for x in cmd))) + sparse_env['REAL_CC'] = cmdline[0] + r = subprocess.run(cmd, env=sparse_env, cwd=root_path) if r.returncode != 0: sys.exit(r.returncode) |