enhanced version
[libfirm] / ir / be / begnuas.c
index 6f47d68..fc8dc4a 100644 (file)
@@ -416,18 +416,27 @@ static void do_dump_atomic_init(be_gas_decl_env_t *env, ir_node *init)
                return;
 
                case iro_Add:
+                       if (!mode_is_int(mode) && !mode_is_reference(mode)) {
+                               panic("Constant must be int or pointer for '+' to work");
+                       }
                        do_dump_atomic_init(env, get_Add_left(init));
                        be_emit_cstring(" + ");
                        do_dump_atomic_init(env, get_Add_right(init));
                        return;
 
                case iro_Sub:
+                       if (!mode_is_int(mode) && !mode_is_reference(mode)) {
+                               panic("Constant must be int or pointer for '-' to work");
+                       }
                        do_dump_atomic_init(env, get_Sub_left(init));
                        be_emit_cstring(" - ");
                        do_dump_atomic_init(env, get_Sub_right(init));
                        return;
 
                case iro_Mul:
+                       if (!mode_is_int(mode) && !mode_is_reference(mode)) {
+                               panic("Constant must be int or pointer for '*' to work");
+                       }
                        do_dump_atomic_init(env, get_Mul_left(init));
                        be_emit_cstring(" * ");
                        do_dump_atomic_init(env, get_Mul_right(init));
@@ -932,13 +941,14 @@ static void dump_initializer(be_gas_decl_env_t *env, ir_entity *entity)
 
        /* now write values sorted */
        for (k = 0; k < size; ) {
-               int space = 0, skip = 0;
+               int space     = 0;
+               int elem_size = 1;
                if (vals[k].kind == NORMAL) {
                        if(vals[k].v.value != NULL) {
                                dump_atomic_init(env, vals[k].v.value);
-                               skip = get_mode_size_bytes(get_irn_mode(vals[k].v.value)) - 1;
+                               elem_size = get_mode_size_bytes(get_irn_mode(vals[k].v.value));
                        } else {
-                               space = 1;
+                               elem_size = 0;
                        }
                } else if(vals[k].kind == TARVAL) {
                        tarval *tv   = vals[k].v.tarval;
@@ -946,7 +956,7 @@ static void dump_initializer(be_gas_decl_env_t *env, ir_entity *entity)
 
                        assert(tv != NULL);
 
-                       skip = size - 1;
+                       elem_size = size;
                        dump_size_type(size);
                        dump_arith_tarval(tv, size);
                        be_emit_char('\n');
@@ -957,13 +967,11 @@ static void dump_initializer(be_gas_decl_env_t *env, ir_entity *entity)
                        be_emit_write_line();
                }
 
-               ++k;
+               k += elem_size;
                while (k < size && vals[k].kind == NORMAL && vals[k].v.value == NULL) {
                        ++space;
                        ++k;
                }
-               space -= skip;
-               assert(space >= 0);
 
                /* a gap */
                if (space > 0) {