Test case for historical reasons
[libfirm] / ir / be / begnuas.c
index ab6f56b..8cc6ec5 100644 (file)
@@ -249,27 +249,33 @@ 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;
        }
 
@@ -430,35 +436,35 @@ 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));
-                       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;
 
-               default:
-                       assert(0 && "dump_atomic_init(): unknown IR-node");
+       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));
+               return;
+
+       default:
+               panic("dump_atomic_init(): unsupported IR-node %+F", init);
        }
 }
 
@@ -1214,14 +1220,21 @@ static void dump_global(be_gas_decl_env_t *env, ir_entity *ent)
                                be_emit_write_line();
                                break;
                        }
-               } else if (section == GAS_SECTION_PIC_TRAMPOLINES) {
+               } else if (section == GAS_SECTION_PIC_TRAMPOLINES
+                               || section == GAS_SECTION_PIC_SYMBOLS) {
                        if (be_gas_flavour == GAS_FLAVOUR_MACH_O) {
                                be_emit_cstring("\t.indirect_symbol ");
                                be_emit_ident(get_entity_ident(ent));
                                be_emit_char('\n');
                                be_emit_write_line();
-                               be_emit_cstring("\thlt ; hlt ; hlt ; hlt ; hlt\n");
-                               be_emit_write_line();
+                               if (section == GAS_SECTION_PIC_TRAMPOLINES) {
+                                       be_emit_cstring("\thlt ; hlt ; hlt ; hlt ; hlt\n");
+                                       be_emit_write_line();
+                               } else {
+                                       assert(section == GAS_SECTION_PIC_SYMBOLS);
+                                       be_emit_cstring("\t.long 0\n");
+                                       be_emit_write_line();
+                               }
                        } else {
                                panic("PIC trampolines not yet supported in this gas mode");
                        }
@@ -1248,7 +1261,7 @@ static void dump_global(be_gas_decl_env_t *env, ir_entity *ent)
                                dump_compound_init(env, ent);
                                break;
                        default:
-                               assert(0);
+                               panic("Unimplemented type kind in dump_global()");
                        }
                }
        }