- Improved addressmode optimisation for conv nodes
[libfirm] / ir / be / ia32 / ia32_gen_decls.c
index 30cb53b..46f0e31 100644 (file)
@@ -66,7 +66,7 @@ static unsigned highest_bit(unsigned v)
        return res;
 }
 
-static void ia32_dump_comm(obstack_t *obst, const char *name, visibility vis, int size, int align) {
+static void ia32_dump_comm(obstack_t *obst, const char *name, ir_visibility vis, int size, int align) {
        switch (asm_flavour) {
        case ASM_LINUX_GAS:
                if (vis == visibility_local)
@@ -79,6 +79,8 @@ static void ia32_dump_comm(obstack_t *obst, const char *name, visibility vis, in
                else
                        obstack_printf(obst, "\t.comm\t%s,%d\n", name, size);
                break;
+       default:
+               break;
        }
 }
 
@@ -187,6 +189,10 @@ static void do_dump_atomic_init(obstack_t *obst, ir_node *init)
                        obstack_printf(obst, "%s", get_entity_ld_name(get_SymConst_entity(init)));
                        break;
 
+               case symconst_ofs_ent:
+                       obstack_printf(obst, "%d", get_entity_offset_bytes(get_SymConst_entity(init)));
+                       break;
+
                case symconst_type_size:
                        obstack_printf(obst, "%d", get_type_size_bytes(get_SymConst_type(init)));
                        break;
@@ -201,7 +207,7 @@ static void do_dump_atomic_init(obstack_t *obst, ir_node *init)
                        break;
 
                default:
-                       assert(0 && "dump_atomic_init(): don't know how to init from this SymConst");
+                       assert(!"dump_atomic_init(): don't know how to init from this SymConst");
                }
                return;
 
@@ -380,6 +386,8 @@ static void dump_object_size(obstack_t *obst, const char *name, int size) {
                obstack_printf(obst, "\t.type\t%s,@object\n", name);
                obstack_printf(obst, "\t.size\t%s,%d\n", name, size);
                break;
+       default:
+               break;
        }
 }
 
@@ -387,7 +395,7 @@ static void dump_object_size(obstack_t *obst, const char *name, int size) {
  * Dumps the initialization of global variables that are not
  * "uninitialized".
  */
-static void dump_global(const arch_env_t *arch_env,
+static void dump_global(const be_main_env_t *main_env,
                                                obstack_t *rdata_obstack, obstack_t *data_obstack,
                                                obstack_t *comm_obstack, obstack_t *ctor_obstack,
                                                entity *ent)
@@ -401,8 +409,8 @@ static void dump_global(const arch_env_t *arch_env,
         * FIXME: did NOT work for partly constant values
         */
        if (! is_Method_type(ty)) {
-               ent_variability variability = get_entity_variability(ent);
-               visibility visibility = get_entity_visibility(ent);
+               ir_variability variability = get_entity_variability(ent);
+               ir_visibility visibility = get_entity_visibility(ent);
 
                if (variability == variability_constant) {
                        /* a constant entity, put it on the rdata */
@@ -411,6 +419,8 @@ static void dump_global(const arch_env_t *arch_env,
 
                /* check, whether it is initialized, if yes create data */
                if (variability != variability_uninitialized) {
+                       be_dbg_variable(main_env->db_handle, obst, ent);
+
                        if (visibility == visibility_external_visible) {
                                obstack_printf(obst, ".globl\t%s\n", ld_name);
                        }
@@ -557,6 +567,8 @@ static void dump_global(const arch_env_t *arch_env,
                        obstack_printf(obst, "\n");
                }
                else if (visibility != visibility_external_allocated) {
+                       be_dbg_variable(main_env->db_handle, comm_obstack, ent);
+
                        /* uninitialized and NOT external */
                        if (get_entity_owner(ent) != get_tls_type()) {
                                /* calculate the alignment */
@@ -575,16 +587,16 @@ static void dump_global(const arch_env_t *arch_env,
                        } else {
                                /* TLS */
                                if (visibility == visibility_external_visible) {
-                                       obstack_printf(obst, ".globl\t%s\n", ld_name);
+                                       obstack_printf(comm_obstack, ".globl\t%s\n", ld_name);
                                }
                                dump_object_size(comm_obstack, ld_name, get_type_size_bytes(ty));
                                align = get_type_alignment_bytes(ty);
-                               ia32_dump_align(obst, align);
+                               ia32_dump_align(comm_obstack, align);
                                obstack_printf(comm_obstack, "%s:\n\t.zero %d\n", ld_name, get_type_size_bytes(ty));
                        }
                }
        } /* ! is method type */
-       else if (ctor_obstack && arch_ent_is_constructor(arch_env, ent)) {
+       else if (ctor_obstack && get_method_img_section(ent) == section_constructors) {
                ia32_dump_align(ctor_obstack, get_type_alignment_bytes(ty));
                dump_size_type(ctor_obstack, get_type_alignment_bytes(ty));
                obstack_printf(ctor_obstack, "%s\n", ld_name);
@@ -599,7 +611,7 @@ static void ia32_dump_globals(ir_type *gt, ia32_decl_env_t *env)
        int i, n = get_compound_n_members(gt);
 
        for (i = 0; i < n; i++)
-               dump_global(env->main_env->arch_env, env->rodata_obst, env->data_obst, env->comm_obst, env->ctor_obst,
+               dump_global(env->main_env, env->rodata_obst, env->data_obst, env->comm_obst, env->ctor_obst,
                        get_compound_member(gt, i));
 }