 81dee729c1
			
		
	
	
		81dee729c1
		
	
	
	
	
		
			
			Over time various systemtap reserved words have been blacklisted in the trace backend generator. The list is not complete though, so there is continued risk of problems in the future. Preempt such problems by specifying the full list of systemtap keywords listed in its parser as identified here: http://sourceware.org/ml/systemtap/2012-q4/msg00157.html Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| """
 | |
| DTrace/SystemTAP backend.
 | |
| """
 | |
| 
 | |
| __author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
 | |
| __copyright__  = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
 | |
| __license__    = "GPL version 2 or (at your option) any later version"
 | |
| 
 | |
| __maintainer__ = "Stefan Hajnoczi"
 | |
| __email__      = "stefanha@linux.vnet.ibm.com"
 | |
| 
 | |
| 
 | |
| from tracetool import out
 | |
| 
 | |
| 
 | |
| PROBEPREFIX = None
 | |
| 
 | |
| def _probeprefix():
 | |
|     if PROBEPREFIX is None:
 | |
|         raise ValueError("you must set PROBEPREFIX")
 | |
|     return PROBEPREFIX
 | |
| 
 | |
| 
 | |
| BINARY = None
 | |
| 
 | |
| def _binary():
 | |
|     if BINARY is None:
 | |
|         raise ValueError("you must set BINARY")
 | |
|     return BINARY
 | |
| 
 | |
| 
 | |
| def c(events):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| def h(events):
 | |
|     out('#include "trace-dtrace.h"',
 | |
|         '')
 | |
| 
 | |
|     for e in events:
 | |
|         out('static inline void trace_%(name)s(%(args)s) {',
 | |
|             '    QEMU_%(uppername)s(%(argnames)s);',
 | |
|             '}',
 | |
|             name = e.name,
 | |
|             args = e.args,
 | |
|             uppername = e.name.upper(),
 | |
|             argnames = ", ".join(e.args.names()),
 | |
|             )
 | |
| 
 | |
| 
 | |
| def d(events):
 | |
|     out('provider qemu {')
 | |
| 
 | |
|     for e in events:
 | |
|         args = str(e.args)
 | |
| 
 | |
|         # DTrace provider syntax expects foo() for empty
 | |
|         # params, not foo(void)
 | |
|         if args == 'void':
 | |
|             args = ''
 | |
| 
 | |
|         # Define prototype for probe arguments
 | |
|         out('',
 | |
|             'probe %(name)s(%(args)s);',
 | |
|             name = e.name,
 | |
|             args = args,
 | |
|             )
 | |
| 
 | |
|     out('',
 | |
|         '};')
 | |
| 
 | |
| 
 | |
| # Technically 'self' is not used by systemtap yet, but
 | |
| # they recommended we keep it in the reserved list anyway
 | |
| RESERVED_WORDS = (
 | |
|     'break', 'catch', 'continue', 'delete', 'else', 'for',
 | |
|     'foreach', 'function', 'global', 'if', 'in', 'limit',
 | |
|     'long', 'next', 'probe', 'return', 'self', 'string',
 | |
|     'try', 'while'
 | |
|     )
 | |
| 
 | |
| def stap(events):
 | |
|     for e in events:
 | |
|         # Define prototype for probe arguments
 | |
|         out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")',
 | |
|             '{',
 | |
|             probeprefix = _probeprefix(),
 | |
|             name = e.name,
 | |
|             binary = _binary(),
 | |
|             )
 | |
| 
 | |
|         i = 1
 | |
|         if len(e.args) > 0:
 | |
|             for name in e.args.names():
 | |
|                 # Append underscore to reserved keywords
 | |
|                 if name in RESERVED_WORDS:
 | |
|                     name += '_'
 | |
|                 out('  %s = $arg%d;' % (name, i))
 | |
|                 i += 1
 | |
| 
 | |
|         out('}')
 | |
| 
 | |
|     out()
 |