X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbegnuas.c;h=c2b87bf197f4f531369b888790d00f2ac95be19a;hb=bd31a5350ce9e110c058b4ad2223d460c9eb5c4e;hp=5f580e2823f920f53f0a28e73f106884069c7326;hpb=b579e419af5f808beaece80de8538a42c9740bc6;p=libfirm diff --git a/ir/be/begnuas.c b/ir/be/begnuas.c index 5f580e282..c2b87bf19 100644 --- a/ir/be/begnuas.c +++ b/ir/be/begnuas.c @@ -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(); } /** @@ -168,7 +168,10 @@ static void dump_arith_tarval(obstack_t *obst, tarval *tv, int bytes) } } -const char *gnu_label_prefix(void) { +/** + * Return the label prefix for labeled blocks. + */ +const char *be_gas_label_prefix(void) { return ".LG"; } @@ -176,7 +179,7 @@ const char *gnu_label_prefix(void) { * Dump a label. */ static void dump_label(obstack_t *obst, ir_label_t label) { - obstack_printf(obst, "%s%ld", gnu_label_prefix(), label); + obstack_printf(obst, "%s%ld", be_gas_label_prefix(), label); } /** @@ -557,32 +560,33 @@ static void dump_compound_init(be_gas_decl_env_t *env, obstack_t *obst, if (offset_bits != 0 || (value_len != 8 && value_len != 16 && value_len != 32 && value_len != 64)) { - tarval *shift, *shifted; 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", get_entity_ld_name(ent)); } - tv = tarval_convert_to(tv, mode_Lu); - shift = new_tarval_from_long(offset_bits, mode_Is); - shifted = tarval_shl(tv, shift); - if (shifted == tarval_bad || shifted == tarval_undefined) { - panic("Couldn't shift numeric value for bitfield initializer '%s'\n", - get_entity_ld_name(ent)); - } + /* normalize offset */ + offset += offset_bits >> 3; + offset_bits &= 7; - for (j = 0; value_len > 0; ++j) { + for (j = 0; value_len + offset_bits > 0; ++j) { assert(offset + j < last_ofs); assert(vals[offset + j].kind == BITFIELD || vals[offset + j].v.value == NULL); vals[offset + j].kind = BITFIELD; - vals[offset + j].v.bf_val |= get_tarval_sub_bits(shifted, j); - value_len -= 8 - offset_bits; - offset_bits = 0; + curr_bits = get_tarval_sub_bits(tv, j); + vals[offset + j].v.bf_val |= (last_bits >> (8 - offset_bits)) | (curr_bits << offset_bits); + value_len -= 8; + 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 +763,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 +791,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 +838,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);