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