3 from jinja2 import Environment, Template
6 def format_args(arglist):
7 #argstrings = map(lambda arg : arg["name"], arglist)
8 #return ", ".join(argstrings)
14 def format_ifnset(string, node, key):
19 def format_block(node):
20 if node.get("knownBlock"):
23 return ", get_node(env, preds[0])"
26 env.filters['args'] = format_args
27 env.filters['ifnset'] = format_ifnset
28 env.filters['block'] = format_block
30 def get_io_type(type, attrname, nodename):
32 importcmd = "tarval *%s = read_tv(env);" % attrname
33 exportcmd = "write_tarval(env, %(val)s);";
34 elif type == "ir_mode*":
35 importcmd = "ir_mode *%s = read_mode(env);" % attrname
36 exportcmd = "write_mode(env, %(val)s);"
37 elif type == "ir_entity*":
38 importcmd = "ir_entity *%s = read_entity(env);" % attrname
39 exportcmd = """fprintf(env->file, "%%ld ", get_entity_nr(%(val)s));"""
40 elif type == "ir_type*":
41 importcmd = "ir_type *%s = read_type(env);" % attrname
42 exportcmd = """fprintf(env->file, "%%ld ", get_type_nr(%(val)s));"""
43 elif type == "long" and nodename == "Proj":
44 importcmd = "long %s = read_long(env);" % attrname
45 exportcmd = """fprintf(env->file, "%%ld ", %(val)s);"""
46 elif type == "pn_Cmp" or type == "ir_where_alloc":
47 importcmd = "%s %s = (%s) read_long(env);" % (type, attrname, type)
48 exportcmd = """fprintf(env->file, "%%ld ", (long) %(val)s);"""
49 elif type == "ir_cons_flags" and nodename == "Store":
50 importcmd = "ir_cons_flags %s = get_cons_flags(env);" % attrname
51 exportcmd = """write_pin_state(env, irn);
52 write_volatility(env, irn);
53 write_align(env, irn);"""
54 elif type == "ir_cons_flags" and nodename == "Load":
55 importcmd = "ir_cons_flags %s = get_cons_flags(env);" % attrname
56 exportcmd = """write_pin_state(env, irn);
57 write_volatility(env, irn);
58 write_align(env, irn);"""
59 elif type == "op_pin_state":
60 importcmd = "op_pin_state %s = read_pin_state(env);" % attrname
61 exportcmd = "write_pin_state(env, irn);"
62 elif type == "ir_builtin_kind":
63 importcmd = "ir_builtin_kind %s = read_builtin_kind(env);" % attrname
64 exportcmd = "write_builtin_kind(env, irn);"
65 elif type == "cond_kind":
66 importcmd = "cond_kind %s = read_cond_kind(env);" % attrname
67 exportcmd = "write_cond_kind(env, irn);"
68 elif type == "cond_jmp_predicate":
69 importcmd = "cond_jmp_predicate %s = read_cond_jmp_predicate(env);" % attrname
70 exportcmd = "write_cond_jmp_predicate(env, irn);"
72 importcmd = "int %s = (int) read_long(env);" % attrname
73 exportcmd = """fprintf(env->file, "%%d ", %(val)s);"""
75 importcmd = "long %s = read_long(env);" % attrname
76 exportcmd = """fprintf(env->file, "%%ld ", %(val)s);"""
78 print "UNKNOWN TYPE: %s" % type
79 importcmd = """// BAD: %s %s
80 %s %s = (%s) 0;""" % (type, attrname, type, attrname, type)
81 exportcmd = "// BAD: %s" % type
82 return (importcmd, exportcmd)
84 """ if type == "ir_type*":
85 java_type = "firm.Type"
88 from_wrapper = "firm.Type.createWrapper(%s)"
89 elif type == "ir_mode*":
90 java_type = "firm.Mode"
93 from_wrapper = "new firm.Mode(%s)"
94 elif type == "tarval*":
95 java_type = "firm.TargetValue"
98 from_wrapper = "new firm.TargetValue(%s)"
99 elif type == "pn_Cmp":
106 wrap_type = "com.sun.jna.NativeLong"
107 to_wrapper = "new com.sun.jna.NativeLong(%s)"
108 from_wrapper = "%s.intValue()"
109 elif type == "cons_flags":
110 java_type = "firm.bindings.binding_ircons.ir_cons_flags"
112 to_wrapper = "%s.val"
113 from_wrapper = "firm.bindings.binding_ircons.ir_cons_flags.getEnum(%s)"
114 elif type == "ir_where_alloc":
115 java_type = "firm.bindings.binding_ircons.ir_where_alloc"
117 to_wrapper = "%s.val"
118 from_wrapper = "firm.bindings.binding_ircons.ir_where_alloc.getEnum(%s)"
119 elif type == "ir_entity*":
120 java_type = "firm.Entity"
121 wrap_type = "Pointer"
122 to_wrapper = "%s.ptr"
123 from_wrapper = "new firm.Entity(%s)"
130 return (java_type,wrap_type,to_wrapper,from_wrapper)"""
132 def prepare_attr(nodename, attr):
133 (importcmd,exportcmd) = get_io_type(attr["type"], attr["name"], nodename)
134 attr["importcmd"] = importcmd
135 attr["exportcmd"] = exportcmd % {"val": "get_%s_%s(irn)" % (nodename, attr["name"])}
137 def preprocess_node(nodename, node):
139 parent = ir_spec.nodes[node["is_a"]]
140 node["ins"] = parent["ins"]
142 node["outs"] = parent["outs"]
143 if "ins" not in node:
146 node["mode"] = "mode_T"
147 if "arity" not in node:
148 node["arity"] = len(node["ins"])
149 if "attrs" not in node:
151 if "constructor_args" not in node:
152 node["constructor_args"] = []
154 # construct node arguments
159 for input in node["ins"]:
160 arguments.append("prednodes[%i]" % i)
163 # Special case for Builtin...
164 if nodename == "Builtin":
165 for attr in node["attrs"]:
166 if attr["name"] == "kind":
167 prepare_attr(nodename, attr)
168 arguments.append(attr["name"])
170 if node["arity"] == "variable" or node["arity"] == "dynamic":
171 arguments.append("numpreds - %i" % (i + 1))
172 arguments.append("prednodes + %i" % i)
174 if "mode" not in node:
175 arguments.append("mode")
177 attrs_with_special = 0
178 for attr in node["attrs"]:
179 if nodename == "Builtin" and attr["name"] == "kind":
181 prepare_attr(nodename, attr)
182 if "special" in attr:
183 if not "init" in attr:
184 print "Node type %s has an attribute with a \"special\" entry but without \"init\"" % nodename
187 if attrs_with_special != 0:
188 print "Node type %s has more than one attribute with a \"special\" entry" % nodename
191 attrs_with_special += 1
193 if "prefix" in attr["special"]:
194 specialname = attr["special"]["prefix"] + nodename
195 elif "suffix" in attr["special"]:
196 specialname = nodename + attr["special"]["suffix"]
198 print "Unknown special constructor type for node type %s" %nodename
201 specialconstrs.append(
203 constrname = specialname,
204 attrname = attr["name"],
205 value = attr["special"]["init"]
209 initargs.append(attr["name"])
211 arguments.append(attr["name"])
213 for arg in node["constructor_args"]:
214 prepare_attr(nodename, arg)
215 arguments.append(arg["name"])
217 node["arguments"] = arguments
218 node["initargs"] = initargs
219 node["special_constructors"] = specialconstrs
221 export_attrs_template = env.from_string('''
222 case iro_{{nodename}}:
223 {{"write_mode(env, get_irn_mode(irn));"|ifnset(node,"mode")}}
224 {% for attr in node.attrs %}{{attr.exportcmd}}
226 {% for attr in node.constructor_args %}{{attr.exportcmd}}
227 {% endfor %}break;''')
229 import_attrs_template = env.from_string('''
230 case iro_{{nodename}}:
232 {{"ir_mode *mode = read_mode(env);"|ifnset(node,"mode")}}
233 {% for attr in node.attrs %}{{attr.importcmd}}
235 {% for attr in node.constructor_args %}{{attr.importcmd}}
237 {% for special in node.special_constructors %}if({{special.attrname}} == {{special.value}})
238 newnode = new_r_{{special.constrname}}(current_ir_graph{{node|block}}{{node["arguments"]|args}});
240 newnode = new_r_{{nodename}}(current_ir_graph{{node|block}}{{node["arguments"]|args}});
241 {% for initarg in node.initargs %}set_{{nodename}}_{{initarg}}(newnode, {{initarg}});
248 """the main function"""
251 print "usage: %s specname(ignored) destdirectory" % argv[0]
256 file = open(gendir + "/gen_irio_export.inl", "w");
257 for nodename, node in ir_spec.nodes.iteritems():
258 preprocess_node(nodename, node)
259 if not "abstract" in node:
260 file.write(export_attrs_template.render(vars()))
264 file = open(gendir + "/gen_irio_import.inl", "w");
265 for nodename, node in ir_spec.nodes.iteritems():
266 if not "abstract" in node and nodename != "Start" and nodename != "End" and nodename != "Anchor" and nodename != "SymConst" and nodename != "Block":
267 file.write(import_attrs_template.render(vars()))
272 file = open(gendir + "/gen_irio_lex.inl", "w");
273 for nodename, node in ir_spec.nodes.iteritems():
274 if not "abstract" in node:
275 file.write("\tINSERT(\"" + nodename + "\", tt_iro, iro_" + nodename + ");\n");
278 if __name__ == "__main__":