40 lines
1.7 KiB
Python
Executable File
40 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Compile et exécute les régressions RTC avec ASan/UBSan sur un build QEMU existant."""
|
|
import argparse
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
import shlex
|
|
import subprocess
|
|
|
|
p = argparse.ArgumentParser(description=__doc__)
|
|
p.add_argument('--build', type=Path)
|
|
a = p.parse_args()
|
|
root = Path(__file__).resolve().parents[3]
|
|
build = (a.build or root / 'build').resolve()
|
|
source = Path(__file__).with_name('test-rtc.c')
|
|
commands = json.loads((build / 'compile_commands.json').read_text())
|
|
c = next(c for c in commands if c['file'].endswith('ipod_touch_pcf50633_pmu.c'))
|
|
old_root = str(Path(c['directory']).parent)
|
|
args = shlex.split(c['command'].replace(old_root, str(root)))
|
|
obj = str(build / 'test-ipod-rtc.o')
|
|
args[args.index('-c') + 1] = str(source)
|
|
args[args.index('-o') + 1] = obj
|
|
args[args.index('-MF') + 1] = obj + '.d'
|
|
args += ['-fsanitize=address,undefined', '-fno-omit-frame-pointer']
|
|
subprocess.run(args, cwd=build, check=True)
|
|
links = json.loads(subprocess.check_output(
|
|
['ninja', '-C', str(build), '-t', 'compdb', '-x', 'c_LINKER_RSP', 'c_LINKER'], text=True))
|
|
link = next(c for c in links if c.get('output') == 'qemu-system-arm')
|
|
args = shlex.split(link['command'].replace(old_root, str(root)))
|
|
args = [x for x in args if x not in (
|
|
'qemu-system-arm.p/system_main.c.o',
|
|
'libqemu-arm-softmmu.fa.p/hw_arm_ipod_touch_pcf50633_pmu.c.o')]
|
|
out = str(build / 'test-ipod-rtc')
|
|
args[args.index('-o') + 1] = out
|
|
args += [obj, '-fsanitize=address,undefined']
|
|
subprocess.run(args, cwd=build, check=True)
|
|
# QEMU conserve volontairement ses registres de types et sa boucle globale à la sortie.
|
|
env = dict(os.environ, ASAN_OPTIONS='detect_leaks=0', UBSAN_OPTIONS='halt_on_error=1')
|
|
subprocess.run([out], env=env, check=True)
|