fixed mode suffix emitter
[libfirm] / ir / be / ia32 / ia32_gen_decls.c
index 9e6d3da..08608e7 100644 (file)
@@ -54,13 +54,18 @@ static unsigned highest_bit(unsigned v)
        return res;
 }
 
-static void ia32_dump_comm(struct obstack *obst, const char *name, int size, int align) {
+static void ia32_dump_comm(struct obstack *obst, const char *name, visibility vis, int size, int align) {
        switch (asm_flavour) {
        case ASM_LINUX_GAS:
+               if (vis == visibility_local)
+                       obstack_printf(obst, "\t.local\t%s\n", name);
                obstack_printf(obst, "\t.comm\t%s,%d,%d\n", name, size, align);
                break;
        case ASM_MINGW_GAS:
-               obstack_printf(obst, "\t.comm\t%s,%d\n", name, size);
+               if (vis == visibility_local)
+                       obstack_printf(obst, "\t.lcomm\t%s,%d\n", name, size);
+               else
+                       obstack_printf(obst, "\t.comm\t%s,%d\n", name, size);
                break;
        }
 }
@@ -136,7 +141,7 @@ static void do_dump_atomic_init(struct obstack *obst, ir_node *init)
                tv = get_Const_tarval(init);
 
                /* beware of old stuff */
-               assert(! mode_is_reference(mode));
+               //assert(! mode_is_reference(mode));
 
                /* it's a arithmetic value */
                dump_arith_tarval(obst, tv, bytes);
@@ -152,10 +157,14 @@ static void do_dump_atomic_init(struct obstack *obst, ir_node *init)
                        obstack_printf(obst, "%s", get_entity_ld_name(get_SymConst_entity(init)));
                        break;
 
-               case symconst_size:
+               case symconst_type_size:
                        obstack_printf(obst, "%d", get_type_size_bytes(get_SymConst_type(init)));
                        break;
 
+               case symconst_type_align:
+                       obstack_printf(obst, "%d", get_type_alignment_bytes(get_SymConst_type(init)));
+                       break;
+
                default:
                        assert(0 && "dump_atomic_init(): don't know how to init from this SymConst");
                }
@@ -303,6 +312,7 @@ static void dump_string_cst(struct obstack *obst, entity *ent)
                case '\n': obstack_printf(obst, "\\n"); break;
                case '\r': obstack_printf(obst, "\\r"); break;
                case '\t': obstack_printf(obst, "\\t"); break;
+               case '\\': obstack_printf(obst, "\\\\"); break;
                default  :
                        if (isprint(c))
                                obstack_printf(obst, "%c", c);
@@ -500,10 +510,6 @@ static void dump_global(struct obstack *rdata_obstack, struct obstack *data_obst
                        obstack_printf(obst, "\n");
                }
                else if (visibility != visibility_external_allocated) {
-                       if (visibility == visibility_local) {
-                               obstack_printf(comm_obstack, "\t.local\t%s\n", ld_name);
-                       }
-
                        /* calculate the alignment */
                        align = get_type_alignment_bytes(ty);
                        h = highest_bit(align);
@@ -515,7 +521,8 @@ static void dump_global(struct obstack *rdata_obstack, struct obstack *data_obst
                        if (align < 1)
                                align = 1;
 
-                       ia32_dump_comm(comm_obstack, ld_name, (get_type_size_bits(ty) + 7) >> 3, align);
+                       ia32_dump_comm(comm_obstack, ld_name, visibility,
+                               (get_type_size_bits(ty) + 7) >> 3, align);
                }
        }
 }