- renamed irop_flag_side_effect to irop_flag_uses_memory
[libfirm] / ir / be / begnuas.c
index 4b58de2..df927d5 100644 (file)
@@ -90,11 +90,11 @@ static const char *get_section_name(be_gas_section_t section) {
  * @param env      the emitter environment
  * @param section  the section to switch to
  */
-void be_gas_emit_switch_section(be_emit_env_t *env, be_gas_section_t section) {
-       be_emit_char(env, '\t');
-       be_emit_string(env, get_section_name(section));
-       be_emit_char(env, '\n');
-       be_emit_write_line(env);
+void be_gas_emit_switch_section(be_gas_section_t section) {
+       be_emit_char('\t');
+       be_emit_string(get_section_name(section));
+       be_emit_char('\n');
+       be_emit_write_line();
 }
 
 /**
@@ -435,7 +435,7 @@ static int ent_is_string_const(ir_entity *ent)
        n = get_compound_ent_n_values(ent);
        for (i = 0; i < n; ++i) {
                ir_node *irn = get_compound_ent_value(ent, i);
-               if(get_irn_opcode(irn) != iro_Const)
+               if (! is_Const(irn))
                        return 0;
 
                c = (int) get_tarval_long(get_Const_tarval(irn));
@@ -528,10 +528,8 @@ static void dump_compound_init(be_gas_decl_env_t *env, obstack_t *obst,
        for (i = 0; i < n; ++i) {
                int offset = get_compound_ent_value_offset_bytes(ent, i);
                int bits_remainder = get_compound_ent_value_offset_bit_remainder(ent, i);
-               const compound_graph_path *path = get_compound_ent_value_path(ent, i);
-               int path_len = get_compound_graph_path_length(path);
-               ir_entity *last_ent = get_compound_graph_path_node(path, path_len - 1);
-               int value_len = get_type_size_bits(get_entity_type(last_ent));
+               ir_node *value = get_compound_ent_value(ent, i);
+               int      value_len = get_mode_size_bits(get_irn_mode(value));
 
                offset += (value_len + bits_remainder + 7) >> 3;
 
@@ -548,13 +546,10 @@ static void dump_compound_init(be_gas_decl_env_t *env, obstack_t *obst,
 
        /* collect the values and store them at the offsets */
        for (i = 0; i < n; ++i) {
-               const compound_graph_path *path = get_compound_ent_value_path(ent, i);
-               int path_len = get_compound_graph_path_length(path);
                int offset = get_compound_ent_value_offset_bytes(ent, i);
                int offset_bits = get_compound_ent_value_offset_bit_remainder(ent, i);
-               ir_node *value = get_compound_ent_value(ent, i);
-               ir_entity *last_ent = get_compound_graph_path_node(path, path_len - 1);
-               int value_len = get_type_size_bits(get_entity_type(last_ent));
+               ir_node   *value = get_compound_ent_value(ent, i);
+               int    value_len = get_mode_size_bits(get_irn_mode(value));
                assert(offset >= 0);
                assert(offset_bits >= 0);
 
@@ -580,9 +575,13 @@ static void dump_compound_init(be_gas_decl_env_t *env, obstack_t *obst,
         last_bits = curr_bits;
                        }
                } else {
+                       int i;
+
                        assert(offset < last_ofs);
                        assert(vals[offset].kind == NORMAL);
-                       assert(vals[offset].v.value == NULL);
+                       for (i = 1; i < value_len / 8; ++i) {
+                               assert(vals[offset + i].v.value == NULL);
+                       }
                        vals[offset].v.value = value;
                }
        }
@@ -759,13 +758,16 @@ static void be_gas_dump_globals(ir_type *gt, be_gas_decl_env_t *env,
 /************************************************************************/
 
 /* Generate all entities. */
-void be_gas_emit_decls(be_emit_env_t *emit, const be_main_env_t *main_env,
+void be_gas_emit_decls(const be_main_env_t *main_env,
                        int only_emit_marked_entities)
 {
        be_gas_decl_env_t env;
-       obstack_t rodata, data, bss, ctor;
-       int    size;
-       char   *cp;
+       obstack_t         rodata;
+       obstack_t         data;
+       obstack_t         bss;
+       obstack_t         ctor;
+       int               size;
+       char              *cp;
 
        /* dump the global type */
        obstack_init(&rodata);
@@ -784,33 +786,33 @@ void be_gas_emit_decls(be_emit_env_t *emit, const be_main_env_t *main_env,
        size = obstack_object_size(&data);
        cp   = obstack_finish(&data);
        if (size > 0) {
-               be_gas_emit_switch_section(emit, GAS_SECTION_DATA);
-               be_emit_string_len(emit, cp, size);
-               be_emit_write_line(emit);
+               be_gas_emit_switch_section(GAS_SECTION_DATA);
+               be_emit_string_len(cp, size);
+               be_emit_write_line();
        }
 
        size = obstack_object_size(&rodata);
        cp   = obstack_finish(&rodata);
        if (size > 0) {
-               be_gas_emit_switch_section(emit, GAS_SECTION_RODATA);
-               be_emit_string_len(emit, cp, size);
-               be_emit_write_line(emit);
+               be_gas_emit_switch_section(GAS_SECTION_RODATA);
+               be_emit_string_len(cp, size);
+               be_emit_write_line();
        }
 
        size = obstack_object_size(&bss);
        cp   = obstack_finish(&bss);
        if (size > 0) {
-               be_gas_emit_switch_section(emit, GAS_SECTION_COMMON);
-               be_emit_string_len(emit, cp, size);
-               be_emit_write_line(emit);
+               be_gas_emit_switch_section(GAS_SECTION_COMMON);
+               be_emit_string_len(cp, size);
+               be_emit_write_line();
        }
 
        size = obstack_object_size(&ctor);
        cp   = obstack_finish(&ctor);
        if (size > 0) {
-               be_gas_emit_switch_section(emit, GAS_SECTION_CTOR);
-               be_emit_string_len(emit, cp, size);
-               be_emit_write_line(emit);
+               be_gas_emit_switch_section(GAS_SECTION_CTOR);
+               be_emit_string_len(cp, size);
+               be_emit_write_line();
        }
 
        obstack_free(&rodata, NULL);
@@ -831,11 +833,11 @@ void be_gas_emit_decls(be_emit_env_t *emit, const be_main_env_t *main_env,
        size = obstack_object_size(&data);
        cp   = obstack_finish(&data);
        if (size > 0) {
-               be_gas_emit_switch_section(emit, GAS_SECTION_TLS);
-               be_emit_cstring(emit, ".balign\t32\n");
-               be_emit_write_line(emit);
-               be_emit_string_len(emit, cp, size);
-               be_emit_write_line(emit);
+               be_gas_emit_switch_section(GAS_SECTION_TLS);
+               be_emit_cstring(".balign\t32\n");
+               be_emit_write_line();
+               be_emit_string_len(cp, size);
+               be_emit_write_line();
        }
 
        obstack_free(&data, NULL);