bescripts: Copy all common node attributes into the constructor variants.
[libfirm] / ir / be / begnuas.c
index 5a90acf..378b614 100644 (file)
@@ -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);