Use backtracking in find_original_value() for the flags emitter.
[libfirm] / ir / be / begnuas.c
index fbacf8c..1079824 100644 (file)
@@ -249,31 +249,37 @@ static void dump_arith_tarval(tarval *tv, int bytes)
                return;
 
        case 12:
-               be_emit_irprintf("0x%02x%02x%02x%02x%02x%02x%02x%02x"
-                                  "%02x%02x%02x%02x", get_tarval_sub_bits(tv, 11),
-                               get_tarval_sub_bits(tv, 10), get_tarval_sub_bits(tv, 9),
-                               get_tarval_sub_bits(tv, 8), get_tarval_sub_bits(tv, 7),
-                               get_tarval_sub_bits(tv, 6), get_tarval_sub_bits(tv, 5),
-                               get_tarval_sub_bits(tv, 4), get_tarval_sub_bits(tv, 3),
-                               get_tarval_sub_bits(tv, 2), get_tarval_sub_bits(tv, 1),
-                               get_tarval_sub_bits(tv, 0));
+               /* Beware: Mixed endian output!  One little endian number emitted as
+                * three longs.  Each long initializer is written in big endian. */
+               be_emit_irprintf(
+                       "\t.long\t0x%02x%02x%02x%02x\n"
+                       "\t.long\t0x%02x%02x%02x%02x\n"
+                       "\t.long\t0x%02x%02x%02x%02x",
+                       get_tarval_sub_bits(tv,  3), get_tarval_sub_bits(tv,  2),
+                       get_tarval_sub_bits(tv,  1), get_tarval_sub_bits(tv,  0),
+                       get_tarval_sub_bits(tv,  7), get_tarval_sub_bits(tv,  6),
+                       get_tarval_sub_bits(tv,  5), get_tarval_sub_bits(tv,  4),
+                       get_tarval_sub_bits(tv, 11), get_tarval_sub_bits(tv, 10),
+                       get_tarval_sub_bits(tv,  9), get_tarval_sub_bits(tv,  8)
+               );
                return;
 
        case 16:
-               be_emit_irprintf("0x%02x%02x%02x%02x%02x%02x%02x%02x"
-                                              "%02x%02x%02x%02x%02x%02x%02x%02x",
+               be_emit_irprintf(
+                       "\t.long\t0x%02x%02x%02x%02x0x%02x%02x%02x%02x0x%02x%02x%02x%02x0x%02x%02x%02x%02x",
                        get_tarval_sub_bits(tv, 15), get_tarval_sub_bits(tv, 16),
                        get_tarval_sub_bits(tv, 13), get_tarval_sub_bits(tv, 12),
                        get_tarval_sub_bits(tv, 11), get_tarval_sub_bits(tv, 10),
-                       get_tarval_sub_bits(tv, 9), get_tarval_sub_bits(tv, 8),
-                       get_tarval_sub_bits(tv, 7), get_tarval_sub_bits(tv, 6),
-                       get_tarval_sub_bits(tv, 5), get_tarval_sub_bits(tv, 4),
-                       get_tarval_sub_bits(tv, 3), get_tarval_sub_bits(tv, 2),
-                       get_tarval_sub_bits(tv, 1), get_tarval_sub_bits(tv, 0));
+                       get_tarval_sub_bits(tv,  9), get_tarval_sub_bits(tv,  8),
+                       get_tarval_sub_bits(tv,  7), get_tarval_sub_bits(tv,  6),
+                       get_tarval_sub_bits(tv,  5), get_tarval_sub_bits(tv,  4),
+                       get_tarval_sub_bits(tv,  3), get_tarval_sub_bits(tv,  2),
+                       get_tarval_sub_bits(tv,  1), get_tarval_sub_bits(tv,  0)
+               );
                return;
        }
 
-       panic("Can't dump a tarval with %d bytes\n", bytes);
+       panic("Can't dump a tarval with %d bytes", bytes);
 }
 
 /**
@@ -495,7 +501,7 @@ static void dump_size_type(size_t size) {
                break;
 
        default:
-               panic("Try to dump a type with %u bytes\n", (unsigned) size);
+               panic("Try to dump a type with %u bytes", (unsigned)size);
        }
 }
 
@@ -806,7 +812,7 @@ static void dump_bitfield(normal_or_bitfield *vals, size_t offset_bits,
                panic("bitfield initializer is compound");
        }
        if (tv == NULL) {
-               panic("Couldn't get numeric value for bitfield initializer\n");
+               panic("Couldn't get numeric value for bitfield initializer");
        }
 
        /* normalize offset */
@@ -1050,7 +1056,7 @@ static void dump_compound_init(be_gas_decl_env_t *env, ir_entity *ent)
                        tarval *tv = get_atomic_init_tv(value);
                        unsigned char curr_bits, last_bits = 0;
                        if (tv == NULL) {
-                               panic("Couldn't get numeric value for bitfield initializer '%s'\n",
+                               panic("Couldn't get numeric value for bitfield initializer '%s'",
                                      get_entity_ld_name(ent));
                        }
                        /* normalize offset */
@@ -1183,7 +1189,8 @@ static void dump_global(be_gas_decl_env_t *env, ir_entity *ent)
                emit_align(align);
        }
 
-       if (visibility != visibility_external_allocated && !emit_as_common) {
+       if (visibility != visibility_external_allocated && !emit_as_common
+                       && be_gas_flavour == GAS_FLAVOUR_ELF) {
                be_emit_cstring("\t.type\t");
                be_emit_ident(ld_ident);
                be_emit_cstring(", @object\n\t.size\t");