xref: /openbmc/qemu/scripts/tracetool/format/d.py (revision a4c141dca466ed3e9451f147efe6304b1b659ff5)
152ef093aSLluís Vilanova# -*- coding: utf-8 -*-
252ef093aSLluís Vilanova
352ef093aSLluís Vilanova"""
430b572efSLluís Vilanovatrace/generated-tracers.dtrace (DTrace only).
552ef093aSLluís Vilanova"""
652ef093aSLluís Vilanova
752ef093aSLluís Vilanova__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
830b572efSLluís Vilanova__copyright__  = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>"
952ef093aSLluís Vilanova__license__    = "GPL version 2 or (at your option) any later version"
1052ef093aSLluís Vilanova
1152ef093aSLluís Vilanova__maintainer__ = "Stefan Hajnoczi"
12f892b494SPhilippe Mathieu-Daudé__email__      = "stefanha@redhat.com"
1352ef093aSLluís Vilanova
1452ef093aSLluís Vilanova
1552ef093aSLluís Vilanovafrom tracetool import out
160807162eSRoman Bolshakovfrom sys import platform
1752ef093aSLluís Vilanova
1852ef093aSLluís Vilanova
190b7e89b1SStefan Hajnoczi# Reserved keywords from
200b7e89b1SStefan Hajnoczi# https://wikis.oracle.com/display/DTrace/Types,+Operators+and+Expressions
210b7e89b1SStefan HajnocziRESERVED_WORDS = (
220b7e89b1SStefan Hajnoczi    'auto', 'goto', 'sizeof', 'break', 'if', 'static', 'case', 'import',
230b7e89b1SStefan Hajnoczi    'string', 'char', 'inline', 'stringof', 'const', 'int', 'struct',
240b7e89b1SStefan Hajnoczi    'continue', 'long', 'switch', 'counter', 'offsetof', 'this',
250b7e89b1SStefan Hajnoczi    'default', 'probe', 'translator', 'do', 'provider', 'typedef',
260b7e89b1SStefan Hajnoczi    'double', 'register', 'union', 'else', 'restrict', 'unsigned',
270b7e89b1SStefan Hajnoczi    'enum', 'return', 'void', 'extern', 'self', 'volatile', 'float',
280b7e89b1SStefan Hajnoczi    'short', 'while', 'for', 'signed', 'xlate',
290b7e89b1SStefan Hajnoczi)
300b7e89b1SStefan Hajnoczi
310b7e89b1SStefan Hajnoczi
3280dd5c49SDaniel P. Berrangedef generate(events, backend, group):
331dad2ce9SLluís Vilanova    events = [e for e in events
341dad2ce9SLluís Vilanova              if "disable" not in e.properties]
351dad2ce9SLluís Vilanova
36b33b890cSStefan Hajnoczi    # SystemTap's dtrace(1) warns about empty "provider qemu {}" but is happy
37b33b890cSStefan Hajnoczi    # with an empty file.  Avoid the warning.
380807162eSRoman Bolshakov    # But dtrace on macOS can't deal with empty files.
390807162eSRoman Bolshakov    if not events and platform != "darwin":
40b33b890cSStefan Hajnoczi        return
41b33b890cSStefan Hajnoczi
421dad2ce9SLluís Vilanova    out('/* This file is autogenerated by tracetool, do not edit. */'
431dad2ce9SLluís Vilanova        '',
441dad2ce9SLluís Vilanova        'provider qemu {')
451dad2ce9SLluís Vilanova
461dad2ce9SLluís Vilanova    for e in events:
470b7e89b1SStefan Hajnoczi        args = []
480b7e89b1SStefan Hajnoczi        for type_, name in e.args:
490807162eSRoman Bolshakov            if platform == "darwin":
500807162eSRoman Bolshakov                # macOS dtrace accepts only C99 _Bool
510807162eSRoman Bolshakov                if type_ == 'bool':
520807162eSRoman Bolshakov                    type_ = '_Bool'
530807162eSRoman Bolshakov                if type_ == 'bool *':
540807162eSRoman Bolshakov                    type_ = '_Bool *'
550807162eSRoman Bolshakov                # It converts int8_t * in probe points to char * in header
560807162eSRoman Bolshakov                # files and introduces [-Wpointer-sign] warning.
570807162eSRoman Bolshakov                # Avoid it by changing probe type to signed char * beforehand.
580807162eSRoman Bolshakov                if type_ == 'int8_t *':
590807162eSRoman Bolshakov                    type_ = 'signed char *'
60*35e28cb0SStefan Hajnoczi
61*35e28cb0SStefan Hajnoczi            # SystemTap dtrace(1) emits a warning when long long is used
62*35e28cb0SStefan Hajnoczi            type_ = type_.replace('unsigned long long', 'uint64_t')
63*35e28cb0SStefan Hajnoczi            type_ = type_.replace('signed long long', 'int64_t')
64*35e28cb0SStefan Hajnoczi            type_ = type_.replace('long long', 'int64_t')
65*35e28cb0SStefan Hajnoczi
660b7e89b1SStefan Hajnoczi            if name in RESERVED_WORDS:
670b7e89b1SStefan Hajnoczi                name += '_'
680b7e89b1SStefan Hajnoczi            args.append(type_ + ' ' + name)
691dad2ce9SLluís Vilanova
701dad2ce9SLluís Vilanova        # Define prototype for probe arguments
711dad2ce9SLluís Vilanova        out('',
721dad2ce9SLluís Vilanova            'probe %(name)s(%(args)s);',
731dad2ce9SLluís Vilanova            name=e.name,
740b7e89b1SStefan Hajnoczi            args=','.join(args))
751dad2ce9SLluís Vilanova
761dad2ce9SLluís Vilanova    out('',
771dad2ce9SLluís Vilanova        '};')
78