aboutsummaryrefslogtreecommitdiff
path: root/scripts/tracetool/format/rs.py
blob: 32ac4e597704848e52bad17cef317657313c3d66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 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)