These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / scripts / tracetool / format / tcg_helper_c.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 """
5 Generate trace/generated-helpers.c.
6 """
7
8 __author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
9 __copyright__  = "Copyright 2012-2016, Lluís Vilanova <vilanova@ac.upc.edu>"
10 __license__    = "GPL version 2 or (at your option) any later version"
11
12 __maintainer__ = "Stefan Hajnoczi"
13 __email__      = "stefanha@linux.vnet.ibm.com"
14
15
16 from tracetool import Arguments, out
17 from tracetool.transform import *
18 import tracetool.vcpu
19
20
21 def vcpu_transform_args(args, mode):
22     assert len(args) == 1
23     # NOTE: this name must be kept in sync with the one in "tcg_h"
24     args = Arguments([(args.types()[0], "__tcg_" + args.names()[0])])
25     if mode == "code":
26         return Arguments([
27             # Does cast from helper requirements to tracing types
28             ("CPUState *", "ENV_GET_CPU(%s)" % args.names()[0]),
29         ])
30     else:
31         args = Arguments([
32             # NOTE: Current helper code uses TCGv_env (CPUArchState*)
33             ("CPUArchState *", args.names()[0]),
34         ])
35         if mode == "header":
36             return args
37         elif mode == "wrapper":
38             return args.transform(HOST_2_TCG)
39         else:
40             assert False
41
42
43 def generate(events, backend):
44     events = [e for e in events
45               if "disable" not in e.properties]
46
47     out('/* This file is autogenerated by tracetool, do not edit. */',
48         '',
49         '#include "qemu/osdep.h"',
50         '#include "qemu-common.h"',
51         '#include "trace.h"',
52         '#include "exec/helper-proto.h"',
53         '',
54         )
55
56     for e in events:
57         if "tcg-exec" not in e.properties:
58             continue
59
60         e_args_api = tracetool.vcpu.transform_args(
61             "tcg_helper_c", e.original, "header").transform(
62                 HOST_2_TCG_COMPAT, TCG_2_TCG_HELPER_DEF)
63         e_args_call = tracetool.vcpu.transform_args(
64             "tcg_helper_c", e, "code")
65
66         out('void %(name_tcg)s(%(args_api)s)',
67             '{',
68             '    %(name)s(%(args_call)s);',
69             '}',
70             name_tcg="helper_%s_proxy" % e.api(),
71             name=e.api(),
72             args_api=e_args_api,
73             args_call=", ".join(e_args_call.casted()),
74             )