+ fputs("}\n", env->file);
+}
+
+static void export_modes(io_env_t *env)
+{
+ int i, n_modes = get_irp_n_modes();
+
+ fputs("modes {\n", env->file);
+
+ for (i = 0; i < n_modes; i++) {
+ ir_mode *mode = get_irp_mode(i);
+ switch (get_mode_sort(mode))
+ {
+ case irms_auxiliary:
+ case irms_control_flow:
+ case irms_memory:
+ case irms_internal_boolean:
+ /* skip "internal" modes, which may not be user defined */
+ continue;
+ }
+
+ fprintf(env->file, "\tmode \"%s\" 0x%X %d %d %s %d %d ", get_mode_name(mode),
+ get_mode_sort(mode), get_mode_size_bits(mode), get_mode_sign(mode),
+ get_mode_arithmetic_name(get_mode_arithmetic(mode)), get_mode_modulo_shift(mode),
+ get_mode_n_vector_elems(mode));
+ if (mode_is_reference(mode)) {
+ write_mode(env, get_reference_mode_signed_eq(mode));
+ write_mode(env, get_reference_mode_unsigned_eq(mode));
+ }
+ fputc('\n', env->file);
+ }
+
+ fputs("}\n\n", env->file);
+}
+
+/** Exports the whole irp to the given file in a textual form. */
+void ir_export(const char *filename)
+{
+ io_env_t env;
+ int i, n_irgs = get_irp_n_irgs();
+
+ env.file = fopen(filename, "wt");
+ if (!env.file) {
+ perror(filename);
+ return;
+ }
+
+ export_modes(&env);
+
+ fputs("typegraph {\n", env.file);
+
+ type_walk_plus_frames(export_type_or_ent_pre, export_type_or_ent_post, &env);
+ /* TODO: Visit frame types and "types for value params"? */
+
+ for (i = 0; i < n_irgs; i++) {
+ ir_graph *irg = get_irp_irg(i);
+ ir_type *valuetype = get_irg_value_param_type(irg);
+
+ fprintf(env.file, "}\n\nirg %ld %ld %ld {\n", get_entity_nr(get_irg_entity(irg)),
+ get_type_nr(get_irg_frame_type(irg)),
+ valuetype == NULL ? -1 : get_type_nr(valuetype));
+
+ env.ignoreblocks = 0;
+ irg_block_walk_graph(irg, NULL, export_node, &env);
+
+ env.ignoreblocks = 1;
+ irg_walk_anchors(irg, NULL, export_node, &env);
+ }
+
+ fprintf(env.file, "}\n\nconstirg %ld {\n", get_irn_node_nr(get_const_code_irg()->current_block));
+
+ walk_const_code(NULL, export_node, &env);
+ fputs("}\n", env.file);
+
+ fclose(env.file);