| 
									
										
										
										
											2014-05-30 14:12:01 +02:00
										 |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | Generate trace/generated-helpers-wrappers.h. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __author__     = "Lluís Vilanova <vilanova@ac.upc.edu>" | 
					
						
							| 
									
										
										
										
											2016-02-25 17:43:38 +01:00
										 |  |  | __copyright__  = "Copyright 2012-2016, Lluís Vilanova <vilanova@ac.upc.edu>" | 
					
						
							| 
									
										
										
										
											2014-05-30 14:12:01 +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 | 
					
						
							|  |  |  | from tracetool.transform import * | 
					
						
							| 
									
										
										
										
											2016-02-25 17:43:38 +01:00
										 |  |  | import tracetool.vcpu | 
					
						
							| 
									
										
										
										
											2014-05-30 14:12:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-04 14:35:59 +01:00
										 |  |  | def generate(events, backend, group): | 
					
						
							| 
									
										
										
										
											2014-05-30 14:12:01 +02:00
										 |  |  |     events = [e for e in events | 
					
						
							|  |  |  |               if "disable" not in e.properties] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     out('/* This file is autogenerated by tracetool, do not edit. */', | 
					
						
							|  |  |  |         '', | 
					
						
							|  |  |  |         '#define tcg_temp_new_nop(v) (v)', | 
					
						
							|  |  |  |         '#define tcg_temp_free_nop(v)', | 
					
						
							|  |  |  |         '', | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for e in events: | 
					
						
							|  |  |  |         if "tcg-exec" not in e.properties: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # tracetool.generate always transforms types to host | 
					
						
							| 
									
										
										
										
											2016-02-25 17:43:38 +01:00
										 |  |  |         e_args = tracetool.vcpu.transform_args("tcg_helper_c", e.original, "wrapper") | 
					
						
							| 
									
										
										
										
											2014-05-30 14:12:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # mixed-type to TCG helper bridge | 
					
						
							|  |  |  |         args_tcg_compat = e_args.transform(HOST_2_TCG_COMPAT) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         code_new = [ | 
					
						
							|  |  |  |             "%(tcg_type)s __%(name)s = %(tcg_func)s(%(name)s);" % | 
					
						
							|  |  |  |             {"tcg_type": transform_type(type_, HOST_2_TCG), | 
					
						
							|  |  |  |              "tcg_func": transform_type(type_, HOST_2_TCG_TMP_NEW), | 
					
						
							|  |  |  |              "name": name} | 
					
						
							|  |  |  |             for (type_, name) in args_tcg_compat | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         code_free = [ | 
					
						
							|  |  |  |             "%(tcg_func)s(__%(name)s);" % | 
					
						
							|  |  |  |             {"tcg_func": transform_type(type_, HOST_2_TCG_TMP_FREE), | 
					
						
							|  |  |  |              "name": name} | 
					
						
							|  |  |  |             for (type_, name) in args_tcg_compat | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         gen_name = "gen_helper_" + e.api() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         out('static inline void %(name)s(%(args)s)', | 
					
						
							|  |  |  |             '{', | 
					
						
							|  |  |  |             '    %(code_new)s', | 
					
						
							|  |  |  |             '    %(proxy_name)s(%(tmp_names)s);', | 
					
						
							|  |  |  |             '    %(code_free)s', | 
					
						
							|  |  |  |             '}', | 
					
						
							|  |  |  |             name=gen_name, | 
					
						
							|  |  |  |             args=e_args, | 
					
						
							|  |  |  |             proxy_name=gen_name + "_proxy", | 
					
						
							|  |  |  |             code_new="\n    ".join(code_new), | 
					
						
							|  |  |  |             code_free="\n    ".join(code_free), | 
					
						
							|  |  |  |             tmp_names=", ".join(["__%s" % name for _, name in e_args]), | 
					
						
							|  |  |  |             ) |