These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / scripts / tracetool / transform.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 """
5 Type-transformation rules.
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 def _transform_type(type_, trans):
17     if isinstance(trans, str):
18         return trans
19     elif isinstance(trans, dict):
20         if type_ in trans:
21             return _transform_type(type_, trans[type_])
22         elif None in trans:
23             return _transform_type(type_, trans[None])
24         else:
25             return type_
26     elif callable(trans):
27         return trans(type_)
28     else:
29         raise ValueError("Invalid type transformation rule: %s" % trans)
30
31
32 def transform_type(type_, *trans):
33     """Return a new type transformed according to the given rules.
34
35     Applies each of the transformation rules in trans in order.
36
37     If an element of trans is a string, return it.
38
39     If an element of trans is a function, call it with type_ as its only
40     argument.
41
42     If an element of trans is a dict, search type_ in its keys. If type_ is
43     a key, use the value as a transformation rule for type_. Otherwise, if
44     None is a key use the value as a transformation rule for type_.
45
46     Otherwise, return type_.
47
48     Parameters
49     ----------
50     type_ : str
51         Type to transform.
52     trans : list of function or dict
53         Type transformation rules.
54     """
55     if len(trans) == 0:
56         raise ValueError
57     res = type_
58     for t in trans:
59         res = _transform_type(res, t)
60     return res
61
62
63 ##################################################
64 # tcg -> host
65
66 def _tcg_2_host(type_):
67     if type_ == "TCGv":
68         # force a fixed-size type (target-independent)
69         return "uint64_t"
70     else:
71         return type_
72
73 TCG_2_HOST = {
74     "TCGv_i32": "uint32_t",
75     "TCGv_i64": "uint64_t",
76     "TCGv_ptr": "void *",
77     None: _tcg_2_host,
78     }
79
80
81 ##################################################
82 # host -> host compatible with tcg sizes
83
84 HOST_2_TCG_COMPAT = {
85     "uint8_t": "uint32_t",
86     }
87
88
89 ##################################################
90 # host/tcg -> tcg
91
92 def _host_2_tcg(type_):
93     if type_.startswith("TCGv"):
94         return type_
95     raise ValueError("Don't know how to translate '%s' into a TCG type\n" % type_)
96
97 HOST_2_TCG = {
98     "uint32_t": "TCGv_i32",
99     "uint64_t": "TCGv_i64",
100     "void *"  : "TCGv_ptr",
101     "CPUArchState *": "TCGv_env",
102     None: _host_2_tcg,
103     }
104
105
106 ##################################################
107 # tcg -> tcg helper definition
108
109 def _tcg_2_helper_def(type_):
110     if type_ == "TCGv":
111         return "target_ulong"
112     else:
113         return type_
114
115 TCG_2_TCG_HELPER_DEF = {
116     "TCGv_i32": "uint32_t",
117     "TCGv_i64": "uint64_t",
118     "TCGv_ptr": "void *",
119     None: _tcg_2_helper_def,
120     }
121
122
123 ##################################################
124 # tcg -> tcg helper declaration
125
126 def _tcg_2_tcg_helper_decl_error(type_):
127     raise ValueError("Don't know how to translate type '%s' into a TCG helper declaration type\n" % type_)
128
129 TCG_2_TCG_HELPER_DECL = {
130     "TCGv"    : "tl",
131     "TCGv_ptr": "ptr",
132     "TCGv_i32": "i32",
133     "TCGv_i64": "i64",
134     "TCGv_env": "env",
135     None: _tcg_2_tcg_helper_decl_error,
136     }
137
138
139 ##################################################
140 # host/tcg -> tcg temporal constant allocation
141
142 def _host_2_tcg_tmp_new(type_):
143     if type_.startswith("TCGv"):
144         return "tcg_temp_new_nop"
145     raise ValueError("Don't know how to translate type '%s' into a TCG temporal allocation" % type_)
146
147 HOST_2_TCG_TMP_NEW = {
148     "uint32_t": "tcg_const_i32",
149     "uint64_t": "tcg_const_i64",
150     "void *"  : "tcg_const_ptr",
151     None: _host_2_tcg_tmp_new,
152     }
153
154
155 ##################################################
156 # host/tcg -> tcg temporal constant deallocation
157
158 def _host_2_tcg_tmp_free(type_):
159     if type_.startswith("TCGv"):
160         return "tcg_temp_free_nop"
161     raise ValueError("Don't know how to translate type '%s' into a TCG temporal deallocation" % type_)
162
163 HOST_2_TCG_TMP_FREE = {
164     "uint32_t": "tcg_temp_free_i32",
165     "uint64_t": "tcg_temp_free_i64",
166     "void *"  : "tcg_temp_free_ptr",
167     None: _host_2_tcg_tmp_free,
168     }