Merge tag 'tracing-pull-request' of https://gitlab.com/stefanha/qemu into staging

Pull request

Daniel's updated tracetool test suite that doesn't break Windows CI.

# -----BEGIN PGP SIGNATURE-----
#
# iQEzBAABCgAdFiEEhpWov9P5fNqsNXdanKSrs4Grc8gFAmjJo2gACgkQnKSrs4Gr
# c8gAWggAmFCi3KyeoJYLdw8ANZ46lDPV+GCtTKtCM68LtcSZKfrlNROWE/9UDI7V
# P3U/Xog01mqyWw4RX+SC90ckSWchMcLSN+TT8mZNfOTn8mcelyQkh4TDlguBLxlE
# Qz8PMwIxrKljP0bV9evZ1gk1CHkB8u1jPKLckiZRdI9rbjuxNkYTMyVSezCdfIhV
# dTDO1xf3oTDZq94591D0jSLHuF58MNXJHlA/q5OIdPCqu80Vo6cc8A8B5E1ZGKA5
# wzXaMY72GlX8RYwebXudHI0Sen6XyE3It+iWQYD8o6kgJ6kxBc0ljLxJCRE9O/d4
# D5hBgEgJ5S1ul4ggkBf5UKazF86EIQ==
# =YODs
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue 16 Sep 2025 10:50:32 AM PDT
# gpg:                using RSA key 8695A8BFD3F97CDAAC35775A9CA4ABB381AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" [unknown]
# gpg:                 aka "Stefan Hajnoczi <stefanha@gmail.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35  775A 9CA4 ABB3 81AB 73C8

* tag 'tracing-pull-request' of https://gitlab.com/stefanha/qemu:
  tracetool-test: allow to run in parallel
  qapi: switch to use QEMU_TEST_REGENERATE env var
  tracetool: drop the probe "__nocheck__" wrapping
  tracetool: add test suite for tracetool with reference output
  tracetool: include SPDX-License-Identifier in generated files
  tracetool: avoid space after "*" in arg types
  tracetool: eliminate trailing whitespace in C format
  checkpatch: cull trailing '*/' in SPDX check

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson
2025-09-17 09:46:42 -07:00
36 changed files with 826 additions and 21 deletions
+1
View File
@@ -3562,6 +3562,7 @@ F: scripts/tracetool/
F: scripts/qemu-trace-stap*
F: docs/tools/qemu-trace-stap.rst
F: docs/devel/tracing.rst
F: tests/tracetool/
T: git https://github.com/stefanha/qemu.git tracing
Simpletrace
+40
View File
@@ -178,6 +178,46 @@ parser (either fixing a bug or extending/modifying the syntax). To do this:
``qapi-schema += foo.json``
The reference output can be automatically updated to match the latest QAPI
code generator by running the tests with the QEMU_TEST_REGENERATE environment
variable set.
.. code::
QEMU_TEST_REGENERATE=1 make check-qapi-schema
The resulting changes must be reviewed by the author to ensure they match
the intended results before adding the updated reference output to the
same commit that alters the generator code.
.. _tracetool-tests:
Tracetool tests
~~~~~~~~~~~~~~~
The tracetool tests validate the generated source files used for defining
probes for various tracing backends and source formats. The test operates
by running the tracetool program against a sample trace-events file, and
comparing the generated output against known good reference output. The
tests can be run with:
.. code::
make check-tracetool
The reference output is stored in files under tests/tracetool, and when
the tracetool backend/format output is intentionally changed, the reference
files need to be updated. This can be automated by setting the
QEMU_TEST_REGENERATE=1 environment variable:
.. code::
QEMU_TEST_REGENERATE=1 make check-tracetool
The resulting changes must be reviewed by the author to ensure they match
the intended results, before adding the updated reference output to the
same commit that alters the generator code.
check-block
~~~~~~~~~~~
+3
View File
@@ -1368,6 +1368,9 @@ sub checkspdx {
$expr =~ s/^\s*//g;
$expr =~ s/\s*$//g;
# Cull C comment end
$expr =~ s/\*\/.*//;
my @bits = split / +/, $expr;
my $prefer = "GPL-2.0-or-later";
+7 -2
View File
@@ -170,10 +170,16 @@ class Arguments:
def __str__(self):
"""String suitable for declaring function arguments."""
def onearg(t, n):
if t[-1] == '*':
return "".join([t, n])
else:
return " ".join([t, n])
if len(self._args) == 0:
return "void"
else:
return ", ".join([ " ".join([t, n]) for t,n in self._args ])
return ", ".join([ onearg(t, n) for t,n in self._args ])
def __repr__(self):
"""Evaluable string representation for this object."""
@@ -332,7 +338,6 @@ class Event(object):
return self._FMT.findall(self.fmt)
QEMU_TRACE = "trace_%(name)s"
QEMU_TRACE_NOCHECK = "_nocheck__" + QEMU_TRACE
QEMU_TRACE_TCG = QEMU_TRACE + "_tcg"
QEMU_DSTATE = "_TRACE_%(NAME)s_DSTATE"
QEMU_BACKEND_DSTATE = "TRACE_%(NAME)s_BACKEND_DSTATE"
+2 -1
View File
@@ -22,6 +22,7 @@ def generate(events, backend, group):
header = "trace-" + group + ".h"
out('/* This file is autogenerated by tracetool, do not edit. */',
'/* SPDX-License-Identifier: GPL-2.0-or-later */',
'',
'#include "qemu/osdep.h"',
'#include "qemu/module.h"',
@@ -36,7 +37,7 @@ def generate(events, backend, group):
' .id = 0,',
' .name = \"%(name)s\",',
' .sstate = %(sstate)s,',
' .dstate = &%(dstate)s ',
' .dstate = &%(dstate)s',
'};',
event = e.api(e.QEMU_EVENT),
name = e.name,
+2 -1
View File
@@ -39,7 +39,8 @@ def generate(events, backend, group):
if not events and platform != "darwin":
return
out('/* This file is autogenerated by tracetool, do not edit. */'
out('/* This file is autogenerated by tracetool, do not edit. */',
'/* SPDX-License-Identifier: GPL-2.0-or-later */',
'',
'provider qemu {')
+2 -15
View File
@@ -19,6 +19,7 @@ def generate(events, backend, group):
header = "trace/control.h"
out('/* This file is autogenerated by tracetool, do not edit. */',
'/* SPDX-License-Identifier: GPL-2.0-or-later */',
'',
'#ifndef TRACE_%s_GENERATED_TRACERS_H' % group.upper(),
'#define TRACE_%s_GENERATED_TRACERS_H' % group.upper(),
@@ -63,7 +64,7 @@ def generate(events, backend, group):
out('',
'static inline void %(api)s(%(args)s)',
'{',
api=e.api(e.QEMU_TRACE_NOCHECK),
api=e.api(),
args=e.args)
if "disable" not in e.properties:
@@ -71,20 +72,6 @@ def generate(events, backend, group):
out('}')
cond = "true"
out('',
'static inline void %(api)s(%(args)s)',
'{',
' if (%(cond)s) {',
' %(api_nocheck)s(%(names)s);',
' }',
'}',
api=e.api(),
api_nocheck=e.api(e.QEMU_TRACE_NOCHECK),
args=e.args,
names=", ".join(e.args.names()),
cond=cond)
backend.generate_end(events, group)
+1
View File
@@ -88,6 +88,7 @@ def c_fmt_to_stap(fmt):
def generate(events, backend, group):
out('/* This file is autogenerated by tracetool, do not edit. */',
'/* SPDX-License-Identifier: GPL-2.0-or-later */',
'')
for event_id, e in enumerate(events):
@@ -22,6 +22,7 @@ def global_var_name(name):
def generate(events, backend, group):
out('/* This file is autogenerated by tracetool, do not edit. */',
'/* SPDX-License-Identifier: GPL-2.0-or-later */',
'')
for event_id, e in enumerate(events):
+1
View File
@@ -38,6 +38,7 @@ def generate(events, backend, group):
if "disable" not in e.properties]
out('/* This file is autogenerated by tracetool, do not edit. */',
'/* SPDX-License-Identifier: GPL-2.0-or-later */',
'')
for e in events:
+1
View File
@@ -20,6 +20,7 @@ def generate(events, backend, group):
if "disabled" not in e.properties]
out('/* This file is autogenerated by tracetool, do not edit. */',
'/* SPDX-License-Identifier: GPL-2.0-or-later */',
'',
'#include "qemu/osdep.h"',
'',
+1
View File
@@ -25,6 +25,7 @@ def generate(events, backend, group):
include = "trace-ust.h"
out('/* This file is autogenerated by tracetool, do not edit. */',
'/* SPDX-License-Identifier: GPL-2.0-or-later */',
'',
'#undef TRACEPOINT_PROVIDER',
'#define TRACEPOINT_PROVIDER qemu',
+1
View File
@@ -13,6 +13,7 @@ check-help:
@echo " $(MAKE) check-functional-TARGET Run functional tests for a given target"
@echo " $(MAKE) check-unit Run qobject tests"
@echo " $(MAKE) check-qapi-schema Run QAPI schema tests"
@echo " $(MAKE) check-tracetool Run tracetool generator tests"
@echo " $(MAKE) check-block Run block tests"
ifneq ($(filter $(all-check-targets), check-softfloat),)
@echo " $(MAKE) check-tcg Run TCG tests"
+1
View File
@@ -88,3 +88,4 @@ subdir('qapi-schema')
subdir('qtest')
subdir('migration-stress')
subdir('functional')
subdir('tracetool')
+5 -2
View File
@@ -165,7 +165,7 @@ def test_and_diff(test_name, dir_name, update):
if actual_out == expected_out and actual_err == expected_err:
return 0
print("%s %s" % (test_name, 'UPDATE' if update else 'FAIL'),
print("%s: %s" % (test_name, 'UPDATE' if update else 'FAIL'),
file=sys.stderr)
out_diff = difflib.unified_diff(expected_out, actual_out, outfp.name)
err_diff = difflib.unified_diff(expected_err, actual_err, errfp.name)
@@ -173,6 +173,9 @@ def test_and_diff(test_name, dir_name, update):
sys.stdout.writelines(err_diff)
if not update:
print(("\n%s: set QEMU_TEST_REGENERATE=1 to recreate reference output" +
"if the QAPI schema generator was intentionally changed") % test_name,
file=sys.stderr)
return 1
try:
@@ -197,7 +200,7 @@ def main(argv):
parser.add_argument('-d', '--dir', action='store', default='',
help="directory containing tests")
parser.add_argument('-u', '--update', action='store_true',
default='QAPI_TEST_UPDATE' in os.environ,
default='QEMU_TEST_REGENERATE' in os.environ,
help="update expected test results")
parser.add_argument('tests', nargs='*', metavar='TEST', action='store')
args = parser.parse_args()
+32
View File
@@ -0,0 +1,32 @@
/* This file is autogenerated by tracetool, do not edit. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include "qemu/osdep.h"
#include "qemu/module.h"
#include "trace-testsuite.h"
uint16_t _TRACE_TEST_BLAH_DSTATE;
uint16_t _TRACE_TEST_WIBBLE_DSTATE;
TraceEvent _TRACE_TEST_BLAH_EVENT = {
.id = 0,
.name = "test_blah",
.sstate = TRACE_TEST_BLAH_ENABLED,
.dstate = &_TRACE_TEST_BLAH_DSTATE
};
TraceEvent _TRACE_TEST_WIBBLE_EVENT = {
.id = 0,
.name = "test_wibble",
.sstate = TRACE_TEST_WIBBLE_ENABLED,
.dstate = &_TRACE_TEST_WIBBLE_DSTATE
};
TraceEvent *testsuite_trace_events[] = {
&_TRACE_TEST_BLAH_EVENT,
&_TRACE_TEST_WIBBLE_EVENT,
NULL,
};
static void trace_testsuite_register_events(void)
{
trace_event_register_group(testsuite_trace_events);
}
trace_init(trace_testsuite_register_events)
+10
View File
@@ -0,0 +1,10 @@
/* This file is autogenerated by tracetool, do not edit. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
provider qemu {
probe test_blah(void * context,const char * filename);
probe test_wibble(void * context,int value);
};
+45
View File
@@ -0,0 +1,45 @@
/* This file is autogenerated by tracetool, do not edit. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef TRACE_TESTSUITE_GENERATED_TRACERS_H
#define TRACE_TESTSUITE_GENERATED_TRACERS_H
#include "trace/control.h"
extern TraceEvent _TRACE_TEST_BLAH_EVENT;
extern TraceEvent _TRACE_TEST_WIBBLE_EVENT;
extern uint16_t _TRACE_TEST_BLAH_DSTATE;
extern uint16_t _TRACE_TEST_WIBBLE_DSTATE;
#define TRACE_TEST_BLAH_ENABLED 1
#define TRACE_TEST_WIBBLE_ENABLED 1
#ifndef SDT_USE_VARIADIC
#define SDT_USE_VARIADIC 1
#endif
#include "trace-dtrace-testsuite.h"
#undef SDT_USE_VARIADIC
#ifndef QEMU_TEST_BLAH_ENABLED
#define QEMU_TEST_BLAH_ENABLED() true
#endif
#ifndef QEMU_TEST_WIBBLE_ENABLED
#define QEMU_TEST_WIBBLE_ENABLED() true
#endif
#define TRACE_TEST_BLAH_BACKEND_DSTATE() ( \
QEMU_TEST_BLAH_ENABLED() || \
false)
static inline void trace_test_blah(void *context, const char *filename)
{
QEMU_TEST_BLAH(context, filename);
}
#define TRACE_TEST_WIBBLE_BACKEND_DSTATE() ( \
QEMU_TEST_WIBBLE_ENABLED() || \
false)
static inline void trace_test_wibble(void *context, int value)
{
QEMU_TEST_WIBBLE(context, value);
}
#endif /* TRACE_TESTSUITE_GENERATED_TRACERS_H */
+15
View File
@@ -0,0 +1,15 @@
/* This file is autogenerated by tracetool, do not edit. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
probe qemu.log.test_blah = qemu.test_blah ?
{
try {
argfilename_str = filename ? user_string_n(filename, 512) : "<null>"
} catch {}
printf("%d@%d test_blah Blah context=%p filename=%s\n", pid(), gettimeofday_ns(), context, argfilename_str)
}
probe qemu.log.test_wibble = qemu.test_wibble ?
{
printf("%d@%d test_wibble Wibble context=%p value=%d\n", pid(), gettimeofday_ns(), context, value)
}
+16
View File
@@ -0,0 +1,16 @@
/* This file is autogenerated by tracetool, do not edit. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
probe qemu.simpletrace.test_blah = qemu.test_blah ?
{
try {
argfilename_str = filename ? user_string_n(filename, 512) : "<null>"
} catch {}
argfilename_len = strlen(argfilename_str)
printf("%8b%8b%8b%4b%4b%8b%4b%.*s", 1, 0, gettimeofday_ns(), 24 + 8 + 4 + argfilename_len, pid(), context, argfilename_len, argfilename_len, argfilename_str)
}
probe qemu.simpletrace.test_wibble = qemu.test_wibble ?
{
printf("%8b%8b%8b%4b%4b%8b%8b", 1, 1, gettimeofday_ns(), 24 + 8 + 8, pid(), context, value)
}

Some files were not shown because too many files have changed in this diff Show More