add support for stabs debug info
[libfirm] / ir / be / ia32 / ia32_gen_decls.c
index 8decc1f..2b79f31 100644 (file)
@@ -16,7 +16,7 @@
 #include "entity.h"
 #include "irprog.h"
 
-#include "../bearch.h"
+#include "../be.h"
 
 #include "ia32_emitter.h"
 #include "ia32_gen_decls.h"
 typedef struct obstack obstack_t;
 
 typedef struct _ia32_decl_env {
-       obstack_t       *rodata_obst;
-       obstack_t       *data_obst;
-       obstack_t       *comm_obst;
-       obstack_t       *ctor_obst;
-       ia32_code_gen_t *cg;
+       obstack_t *rodata_obst;
+       obstack_t *data_obst;
+       obstack_t *comm_obst;
+       obstack_t *ctor_obst;
+       const be_main_env_t *main_env;
 } ia32_decl_env_t;
 
 /************************************************************************/
@@ -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;
        }
 }
 
@@ -380,6 +382,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 +391,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)
@@ -396,6 +400,7 @@ static void dump_global(const arch_env_t *arch_env,
        const char *ld_name = get_entity_ld_name(ent);
        obstack_t *obst     = data_obstack;
        int align, h;
+       const arch_env_t *arch_env = main_env->arch_env;
 
        /*
         * FIXME: did NOT work for partly constant values
@@ -411,6 +416,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_global(main_env->db_handle, obst, ent);
+
                        if (visibility == visibility_external_visible) {
                                obstack_printf(obst, ".globl\t%s\n", ld_name);
                        }
@@ -557,6 +564,8 @@ static void dump_global(const arch_env_t *arch_env,
                        obstack_printf(obst, "\n");
                }
                else if (visibility != visibility_external_allocated) {
+                       be_dbg_global(main_env->db_handle, comm_obstack, ent);
+
                        /* uninitialized and NOT external */
                        if (get_entity_owner(ent) != get_tls_type()) {
                                /* calculate the alignment */
@@ -575,16 +584,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,13 +608,13 @@ 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->cg->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));
 }
 
 /************************************************************************/
 
-void ia32_gen_decls(FILE *out, ia32_code_gen_t *cg) {
+void ia32_gen_decls(FILE *out, const be_main_env_t *main_env) {
        ia32_decl_env_t env;
        obstack_t rodata, data, comm, ctor;
        int    size;
@@ -616,13 +625,14 @@ void ia32_gen_decls(FILE *out, ia32_code_gen_t *cg) {
        obstack_init(&data);
        obstack_init(&comm);
 
-       if (cg->birg->main_env->options->opt_profile)
+       if (main_env->options->opt_profile)
                obstack_init(&ctor);
 
        env.rodata_obst = &rodata;
        env.data_obst   = &data;
        env.comm_obst   = &comm;
-       env.ctor_obst   = cg->birg->main_env->options->opt_profile ? &ctor : NULL;
+       env.ctor_obst   = main_env->options->opt_profile ? &ctor : NULL;
+       env.main_env    = main_env;
 
        ia32_dump_globals(get_glob_type(), &env);
 
@@ -647,7 +657,7 @@ void ia32_gen_decls(FILE *out, ia32_code_gen_t *cg) {
                fwrite(cp, 1, size, out);
        }
 
-       if (cg->birg->main_env->options->opt_profile) {
+       if (main_env->options->opt_profile) {
                size = obstack_object_size(&ctor);
                cp   = obstack_finish(&ctor);
                if (size > 0) {