X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbegnuas.c;h=378b614a4db2c7a3d1f40fefb33e71fb3424b05e;hb=5aba9af4ba804d64083d0c5899284ff8dfacf832;hp=5a90acf5142e70253004eec71fa6fa9dcd8ecd54;hpb=0a7d7324b9baa076d1322e82b92f8fc2c8f1892e;p=libfirm diff --git a/ir/be/begnuas.c b/ir/be/begnuas.c index 5a90acf51..378b614a4 100644 --- a/ir/be/begnuas.c +++ b/ir/be/begnuas.c @@ -42,6 +42,7 @@ #include "execfreq.h" #include "be_t.h" +#include "bearch.h" #include "beemitter.h" #include "bedwarf.h" @@ -95,8 +96,6 @@ static void emit_section_macho(be_gas_section_t section) case GAS_SECTION_DEBUG_FRAME: name = "section __DWARF,__debug_frame,regular,debug"; break; default: panic("unsupported scetion type 0x%X", section); } - be_emit_irprintf("\t.%s\n", name); - be_emit_write_line(); } else if (flags & GAS_SECTION_FLAG_COMDAT) { switch (base) { case GAS_SECTION_TEXT: name = "section __TEXT,__textcoal_nt,coalesced,pure_instructions"; break; @@ -111,6 +110,8 @@ static void emit_section_macho(be_gas_section_t section) } else { panic("unsupported section type 0x%X", section); } + be_emit_irprintf("\t.%s\n", name); + be_emit_write_line(); } static void emit_section_sparc(be_gas_section_t section, const ir_entity *entity) @@ -591,6 +592,9 @@ void be_gas_emit_function_epilog(const ir_entity *entity) be_emit_char('\n'); be_emit_write_line(); + + next_block_nr += 199; + next_block_nr -= next_block_nr % 100; } /** @@ -752,38 +756,35 @@ static void emit_size_type(size_t size) } } -static size_t emit_string_initializer(const ir_initializer_t *initializer) +static void emit_string_char(int c) { - size_t i, len; - - len = initializer->compound.n_initializers; - if (be_gas_object_file_format == OBJECT_FILE_FORMAT_MACH_O) { - be_emit_cstring("\t.ascii \""); - } else { - be_emit_cstring("\t.string \""); - len -= 1; + switch (c) { + case '"' : be_emit_cstring("\\\""); break; + case '\n': be_emit_cstring("\\n"); break; + case '\r': be_emit_cstring("\\r"); break; + case '\t': be_emit_cstring("\\t"); break; + case '\\': be_emit_cstring("\\\\"); break; + default : + if (isprint(c)) + be_emit_char(c); + else + be_emit_irprintf("\\%03o", c); + break; } +} - for (i = 0; i < len; ++i) { +static size_t emit_string_initializer(const ir_initializer_t *initializer) +{ + be_emit_cstring("\t.asciz \""); + + size_t len = initializer->compound.n_initializers; + for (size_t i = 0; i < len-1; ++i) { const ir_initializer_t *sub_initializer = get_initializer_compound_value(initializer, i); ir_tarval *tv = get_initializer_tarval(sub_initializer); int c = get_tarval_long(tv); - - switch (c) { - case '"' : be_emit_cstring("\\\""); break; - case '\n': be_emit_cstring("\\n"); break; - case '\r': be_emit_cstring("\\r"); break; - case '\t': be_emit_cstring("\\t"); break; - case '\\': be_emit_cstring("\\\\"); break; - default : - if (isprint(c)) - be_emit_char(c); - else - be_emit_irprintf("\\%03o", c); - break; - } + emit_string_char(c); } be_emit_cstring("\"\n"); be_emit_write_line(); @@ -791,6 +792,16 @@ static size_t emit_string_initializer(const ir_initializer_t *initializer) return initializer->compound.n_initializers; } +void be_gas_emit_cstring(const char *string) +{ + be_emit_cstring("\t.asciz \""); + for (const char *c = string; *c != '\0'; ++c) { + emit_string_char(*c); + } + be_emit_cstring("\"\n"); + be_emit_write_line(); +} + typedef enum normal_or_bitfield_kind { NORMAL = 0, TARVAL, @@ -934,7 +945,7 @@ static void emit_ir_initializer(normal_or_bitfield *vals, const ir_initializer_t *initializer, ir_type *type) { - assert((size_t) (vals - glob_vals) < max_vals); + assert((size_t) (vals - glob_vals) <= max_vals); if (initializer_is_string_const(initializer)) { assert(vals->kind != BITFIELD);