X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbegnuas.c;h=378b614a4db2c7a3d1f40fefb33e71fb3424b05e;hb=6f965967e27f2e4db1a7dbf5d050bd415fceeb5b;hp=46e16006e652ecbe8cc2ff57be60e8bff7a81390;hpb=efb58316e745bcec4fa46f76c8f2c69208a44928;p=libfirm diff --git a/ir/be/begnuas.c b/ir/be/begnuas.c index 46e16006e..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" @@ -755,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(); @@ -794,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, @@ -937,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);