X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=scripts%2Fgen_ir_io.py;h=2fab4b0158a4ba569dcc77a355e08c9befa3955a;hb=d543bd3efe5deadc0a34423cb8645db7ff9ce704;hp=2deead73df8d1d26f0807d58c8e6953a770c3ae7;hpb=9d3c8631459f431c313160dab5778e8a7b88dd92;p=libfirm diff --git a/scripts/gen_ir_io.py b/scripts/gen_ir_io.py index 2deead73d..2fab4b015 100755 --- a/scripts/gen_ir_io.py +++ b/scripts/gen_ir_io.py @@ -26,9 +26,9 @@ def format_block(node): if hasattr(node, "knownBlock"): if hasattr(node, "knownGraph"): return "" - return "current_ir_graph" + return "irg" else: - return "get_node(env, preds[0])" + return "preds[0]" def format_arguments(string): args = re.split('\s*\n\s*', string) @@ -53,26 +53,25 @@ def get_io_type(type, attrname, node): exportcmd = "write_mode(env, %(val)s);" elif type == "ir_entity*": importcmd = "ir_entity *%s = read_entity(env);" % attrname - exportcmd = """fprintf(env->file, "%%ld ", get_entity_nr(%(val)s));""" + exportcmd = "write_entity_ref(env, %(val)s);" elif type == "ir_type*": importcmd = "ir_type *%s = read_type(env);" % attrname - exportcmd = """fprintf(env->file, "%%ld ", get_type_nr(%(val)s));""" + exportcmd = "write_type_ref(env, %(val)s);" elif type == "long" and node.name == "Proj": importcmd = "long %s = read_long(env);" % attrname - exportcmd = """fprintf(env->file, "%%ld ", %(val)s);""" - elif type == "pn_Cmp" or type == "ir_where_alloc": + exportcmd = "write_long(env, %(val)s);" + elif type == "ir_relation" or type == "ir_where_alloc": importcmd = "%s %s = (%s) read_long(env);" % (type, attrname, type) - exportcmd = """fprintf(env->file, "%%ld ", (long) %(val)s);""" - elif type == "ir_cons_flags" and node.name == "Store": - importcmd = "ir_cons_flags %s = get_cons_flags(env);" % attrname - exportcmd = """write_pin_state(env, irn); - write_volatility(env, irn); - write_align(env, irn);""" - elif type == "ir_cons_flags" and node.name == "Load": - importcmd = "ir_cons_flags %s = get_cons_flags(env);" % attrname - exportcmd = """write_pin_state(env, irn); - write_volatility(env, irn); - write_align(env, irn);""" + exportcmd = "write_long(env, (long) %(val)s);" + elif type == "ir_align": + importcmd = "ir_align %s = read_align(env);" % attrname + exportcmd = "write_align(env, %(val)s);" + elif type == "ir_volatility": + importcmd = "ir_volatility %s = read_volatility(env);" % attrname + exportcmd = "write_volatility(env, %(val)s);" + elif type == "ir_cons_flags": + importcmd = "ir_cons_flags %s = cons_none;" % attrname + exportcmd = "" # can't really export cons_flags elif type == "op_pin_state": importcmd = "op_pin_state %s = read_pin_state(env);" % attrname exportcmd = "write_pin_state(env, irn);" @@ -86,14 +85,14 @@ def get_io_type(type, attrname, node): importcmd = "cond_jmp_predicate %s = read_cond_jmp_predicate(env);" % attrname exportcmd = "write_cond_jmp_predicate(env, irn);" elif type == "int": - importcmd = "int %s = (int) read_long(env);" % attrname - exportcmd = """fprintf(env->file, "%%d ", %(val)s);""" + importcmd = "int %s = read_int(env);" % attrname + exportcmd = "write_int(env, %(val)s);" elif type == "unsigned": - importcmd = "unsigned %s = (unsigned) read_long(env);" % attrname - exportcmd = """fprintf(env->file, "%%u ", %(val)s);""" + importcmd = "unsigned %s = read_unsigned(env);" % attrname + exportcmd = "write_unsigned(env, %(val)s);" elif type == "long": importcmd = "long %s = read_long(env);" % attrname - exportcmd = """fprintf(env->file, "%%ld ", %(val)s);""" + exportcmd = "write_long(env, %(val)s);" else: warning("cannot generate import/export for node %s: unsupported attribute type: %s" % (node.name, type)) importcmd = """// BAD: %s %s @@ -123,49 +122,21 @@ def preprocess_node(node): # construct node arguments arguments = [ ] initargs = [ ] - specialconstrs = [ ] - i = 0 + i = 1 for input in node.ins: - arguments.append("prednodes[%i]" % i) + arguments.append("preds[%i]" % i) i += 1 if node.arity == "variable" or node.arity == "dynamic": - arguments.append("numpreds - %i" % (i + 1)) - arguments.append("prednodes + %i" % i) + arguments.append("numpreds - %i" % i) + arguments.append("preds + %i" % i) if not hasattr(node, "mode"): arguments.append("mode") - attrs_with_special = 0 for attr in node.attrs: prepare_attr(node, attr) - if "special" in attr: - if not "init" in attr: - warning("Node type %s has an attribute with a \"special\" entry but without \"init\"" % node.name) - sys.exit(1) - - if attrs_with_special != 0: - warning("Node type %s has more than one attribute with a \"special\" entry" % node.name) - sys.exit(1) - - attrs_with_special += 1 - - if "prefix" in attr["special"]: - specialname = attr["special"]["prefix"] + node.name - elif "suffix" in attr["special"]: - specialname = node.name + attr["special"]["suffix"] - else: - error("Unknown special constructor type for node type %s" % node.name) - sys.exit(1) - - specialconstrs.append( - dict( - constrname = specialname, - attrname = attr["name"], - value = attr["special"]["init"] - ) - ) - elif "init" in attr: + if "init" in attr: if attr["type"] == "op_pin_state": initfunc = "set_irn_pinned" else: @@ -180,7 +151,6 @@ def preprocess_node(node): node.arguments = arguments node.initargs = initargs - node.special_constructors = specialconstrs export_attrs_template = env.from_string(''' case iro_{{node.name}}: @@ -199,15 +169,6 @@ import_attrs_template = env.from_string(''' {% for attr in node.constructor_args %} {{attr.importcmd}} {% endfor -%} - {% for special in node.special_constructors %} - if ({{special.attrname}} == {{special.value}}) - newnode = new_r_{{special.constrname}}( -{%- filter arguments %} -{{node|block}} -{{node.arguments|args}} -{% endfilter %}); - else - {% endfor -%} newnode = new_r_{{node.name}}( {%- filter arguments %} {{node|block}} @@ -228,10 +189,6 @@ def main(argv): sys.exit(1) gendir = argv[2] - # these nodes don't work correctly yet for some reasons... - niynodes = [ "ASM" ] - # these have custom im-/export code - customcode = [ "Start", "End", "Anchor", "SymConst", "Block", "Deleted" ] real_nodes = [] for node in ir_spec.nodes: @@ -240,8 +197,9 @@ def main(argv): real_nodes.append(node) file = open(gendir + "/gen_irio_export.inl", "w"); + file.write("/* Warning: automatically generated code */") for node in real_nodes: - if node.__name__ in niynodes: + if node.customSerializer: continue preprocess_node(node) @@ -250,17 +208,17 @@ def main(argv): file.close() file = open(gendir + "/gen_irio_import.inl", "w"); + file.write("/* Warning: automatically generated code */") for node in real_nodes: - if node.name in customcode or node.name in niynodes: + if node.customSerializer: continue file.write(import_attrs_template.render(vars())) file.write("\n") file.close() file = open(gendir + "/gen_irio_lex.inl", "w"); + file.write("/* Warning: automatically generated code */") for node in real_nodes: - if node.name in niynodes: - continue file.write("\tINSERT(tt_iro, \"%s\", iro_%s);\n" % (node.name, node.name)); file.close()