mirror of
https://github.com/mborgerson/xemu.git
synced 2026-03-25 23:44:45 +00:00
Generating .rs files makes it possible to support tracing in rust. This support comprises a new format, and common code that converts the C expressions in trace-events to Rust. In particular, types need to be converted, and PRI macros expanded. As of this commit no backend generates Rust code, but it is already possible to use tracetool to generate Rust sources; they are not functional but they compile and contain tracepoint functions. [Move Rust argument conversion from Event to Arguments; string support. - Paolo] Signed-off-by: Tanish Desai <tanishdesai37@gmail.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-ID: <20250929154938.594389-9-pbonzini@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
"""
|
|
trace-DIR.rs
|
|
"""
|
|
|
|
__author__ = "Tanish Desai <tanishdesai37@gmail.com>"
|
|
__copyright__ = "Copyright 2025, Tanish Desai <tanishdesai37@gmail.com>"
|
|
__license__ = "GPL version 2 or (at your option) any later version"
|
|
|
|
__maintainer__ = "Stefan Hajnoczi"
|
|
__email__ = "stefanha@redhat.com"
|
|
|
|
|
|
from tracetool import out
|
|
|
|
|
|
def generate(events, backend, group):
|
|
out('// SPDX-License-Identifier: GPL-2.0-or-later',
|
|
'// This file is @generated by tracetool, do not edit.',
|
|
'',
|
|
'#[allow(unused_imports)]',
|
|
'use std::ffi::c_char;',
|
|
'#[allow(unused_imports)]',
|
|
'use util::bindings;',
|
|
'',
|
|
'#[inline(always)]',
|
|
'fn trace_event_state_is_enabled(dstate: u16) -> bool {',
|
|
' (unsafe { trace_events_enabled_count }) != 0 && dstate != 0',
|
|
'}',
|
|
'',
|
|
'extern "C" {',
|
|
' static mut trace_events_enabled_count: u32;',
|
|
'}',)
|
|
|
|
out('extern "C" {')
|
|
|
|
for e in events:
|
|
out(' static mut %s: u16;' % e.api(e.QEMU_DSTATE))
|
|
out('}')
|
|
|
|
backend.generate_begin(events, group)
|
|
|
|
for e in events:
|
|
out('',
|
|
'#[inline(always)]',
|
|
'#[allow(dead_code)]',
|
|
'pub fn %(api)s(%(args)s)',
|
|
'{',
|
|
api=e.api(e.QEMU_TRACE),
|
|
args=e.args.rust_decl())
|
|
|
|
if "disable" not in e.properties:
|
|
backend.generate(e, group, check_trace_event_get_state=False)
|
|
if backend.check_trace_event_get_state:
|
|
event_id = 'TRACE_' + e.name.upper()
|
|
out(' if trace_event_state_is_enabled(unsafe { _%(event_id)s_DSTATE}) {',
|
|
event_id = event_id,
|
|
api=e.api())
|
|
backend.generate(e, group, check_trace_event_get_state=True)
|
|
out(' }')
|
|
out('}')
|
|
|
|
backend.generate_end(events, group)
|