]>
Commit | Line | Data |
---|---|---|
341ea691 LV |
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>" | |
864a2178 | 9 | __copyright__ = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>" |
341ea691 LV |
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 | ||
3d211d9f | 16 | from tracetool import Arguments, out |
341ea691 | 17 | from tracetool.transform import * |
3d211d9f LV |
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 | |
29a0af61 | 28 | ("CPUState *", "env_cpu(%s)" % args.names()[0]), |
3d211d9f LV |
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 | |
341ea691 LV |
41 | |
42 | ||
80dd5c49 | 43 | def generate(events, backend, group): |
0ab8ed18 DB |
44 | if group == "root": |
45 | header = "trace-root.h" | |
46 | else: | |
47 | header = "trace.h" | |
48 | ||
341ea691 LV |
49 | events = [e for e in events |
50 | if "disable" not in e.properties] | |
51 | ||
52 | out('/* This file is autogenerated by tracetool, do not edit. */', | |
53 | '', | |
2aef8c91 | 54 | '#include "qemu/osdep.h"', |
341ea691 | 55 | '#include "qemu-common.h"', |
33c11879 | 56 | '#include "cpu.h"', |
341ea691 | 57 | '#include "exec/helper-proto.h"', |
7609ffb9 | 58 | '#include "%s"' % header, |
341ea691 LV |
59 | '', |
60 | ) | |
61 | ||
62 | for e in events: | |
63 | if "tcg-exec" not in e.properties: | |
64 | continue | |
65 | ||
3d211d9f LV |
66 | e_args_api = tracetool.vcpu.transform_args( |
67 | "tcg_helper_c", e.original, "header").transform( | |
68 | HOST_2_TCG_COMPAT, TCG_2_TCG_HELPER_DEF) | |
69 | e_args_call = tracetool.vcpu.transform_args( | |
70 | "tcg_helper_c", e, "code") | |
341ea691 | 71 | |
3d211d9f | 72 | out('void %(name_tcg)s(%(args_api)s)', |
341ea691 | 73 | '{', |
864a2178 | 74 | # NOTE: the check was already performed at TCG-generation time |
3d211d9f | 75 | ' %(name)s(%(args_call)s);', |
341ea691 LV |
76 | '}', |
77 | name_tcg="helper_%s_proxy" % e.api(), | |
864a2178 | 78 | name=e.api(e.QEMU_TRACE_NOCHECK), |
3d211d9f LV |
79 | args_api=e_args_api, |
80 | args_call=", ".join(e_args_call.casted()), | |
341ea691 | 81 | ) |