| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | Generate .stp file (DTrace with SystemTAP only). | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __author__     = "Lluís Vilanova <vilanova@ac.upc.edu>" | 
					
						
							| 
									
										
										
										
											2014-02-23 20:37:40 +01:00
										 |  |  | __copyright__  = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  | __license__    = "GPL version 2 or (at your option) any later version" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __maintainer__ = "Stefan Hajnoczi" | 
					
						
							|  |  |  | __email__      = "stefanha@linux.vnet.ibm.com" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from tracetool import out | 
					
						
							| 
									
										
										
										
											2014-02-23 20:37:40 +01:00
										 |  |  | from tracetool.backend.dtrace import binary, probeprefix | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 20:37:40 +01:00
										 |  |  | # 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' | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-22 21:46:04 +08:00
										 |  |  | def stap_escape(identifier): | 
					
						
							|  |  |  |     # Append underscore to reserved keywords | 
					
						
							|  |  |  |     if identifier in RESERVED_WORDS: | 
					
						
							|  |  |  |         return identifier + '_' | 
					
						
							|  |  |  |     return identifier | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-04 14:35:59 +01:00
										 |  |  | def generate(events, backend, group): | 
					
						
							| 
									
										
										
										
											2014-02-23 20:37:40 +01:00
										 |  |  |     events = [e for e in events | 
					
						
							|  |  |  |               if "disable" not in e.properties] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     out('/* This file is autogenerated by tracetool, do not edit. */', | 
					
						
							|  |  |  |         '') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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(): | 
					
						
							| 
									
										
										
										
											2014-06-22 21:46:04 +08:00
										 |  |  |                 name = stap_escape(name) | 
					
						
							| 
									
										
										
										
											2014-02-23 20:37:40 +01:00
										 |  |  |                 out('  %s = $arg%d;' % (name, i)) | 
					
						
							|  |  |  |                 i += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         out('}') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     out() |