bescripts: Copy all common node attributes into the constructor variants.
[libfirm] / ir / be / begnuas.c
index 89d852e..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;
 }
 
 /**
@@ -730,7 +734,7 @@ static void emit_init_expression(be_gas_decl_env_t *env, ir_node *init)
                return;
 
        default:
-               panic("emit_atomic_init(): unsupported IR-node %+F", init);
+               panic("unsupported IR-node %+F", init);
        }
 }
 
@@ -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);
@@ -1358,14 +1369,10 @@ void be_gas_begin_block(const ir_node *block, bool needs_label)
        }
 
        if (be_options.verbose_asm) {
-               int           arity;
-               ir_graph     *irg       = get_irn_irg(block);
-               ir_exec_freq *exec_freq = be_get_irg_exec_freq(irg);
-
                be_emit_pad_comment();
                be_emit_irprintf("/* %+F preds:", block);
 
-               arity = get_irn_arity(block);
+               int arity = get_irn_arity(block);
                if (arity == 0) {
                        be_emit_cstring(" none");
                } else {
@@ -1376,11 +1383,7 @@ void be_gas_begin_block(const ir_node *block, bool needs_label)
                                be_gas_emit_block_name(predblock);
                        }
                }
-               if (exec_freq != NULL) {
-                       be_emit_irprintf(", freq: %.3f",
-                                        get_block_execfreq(exec_freq, block));
-               }
-               be_emit_cstring(" */");
+               be_emit_irprintf(", freq: %.3f */", get_block_execfreq(block));
        }
        be_emit_char('\n');
        be_emit_write_line();
@@ -1530,14 +1533,13 @@ static void emit_global_decls(const be_main_env_t *main_env)
 void be_emit_jump_table(const ir_node *node, const ir_switch_table *table,
                         ir_entity *entity, get_cfop_target_func get_cfop_target)
 {
-       unsigned          n_outs    = arch_get_irn_n_outs(node);
-       const ir_node   **targets   = XMALLOCNZ(const ir_node*, n_outs);
-       size_t            n_entries = ir_switch_table_get_n_entries(table);
-       unsigned long     length    = 0;
-       size_t            e;
-       const ir_edge_t  *edge;
-       unsigned          i;
-       const ir_node   **labels;
+       unsigned        n_outs    = arch_get_irn_n_outs(node);
+       const ir_node **targets   = XMALLOCNZ(const ir_node*, n_outs);
+       size_t          n_entries = ir_switch_table_get_n_entries(table);
+       unsigned long   length    = 0;
+       size_t          e;
+       unsigned        i;
+       const ir_node **labels;
 
        /* go over all proj's and collect their jump targets */
        foreach_out_edge(node, edge) {