- obstack_t rodata;
- obstack_t data;
- obstack_t bss;
- obstack_t ctor;
- int size;
- char *cp;
-
- /* dump the global type */
- obstack_init(&rodata);
- obstack_init(&data);
- obstack_init(&bss);
- obstack_init(&ctor);
-
- env.rodata_obst = &rodata;
- env.data_obst = &data;
- env.bss_obst = &bss;
- env.ctor_obst = &ctor;
- env.main_env = main_env;
-
- be_gas_dump_globals(get_glob_type(), &env, 1, only_emit_marked_entities);
-
- size = obstack_object_size(&data);
- cp = obstack_finish(&data);
- if (size > 0) {
- be_gas_emit_switch_section(GAS_SECTION_DATA);
- be_emit_string_len(cp, size);
- be_emit_write_line();
- }
-
- size = obstack_object_size(&rodata);
- cp = obstack_finish(&rodata);
- if (size > 0) {
- be_gas_emit_switch_section(GAS_SECTION_RODATA);
- be_emit_string_len(cp, size);
- be_emit_write_line();
- }
-
- size = obstack_object_size(&bss);
- cp = obstack_finish(&bss);
- if (size > 0) {
- be_gas_emit_switch_section(GAS_SECTION_COMMON);
- be_emit_string_len(cp, size);
- be_emit_write_line();
- }
-
- size = obstack_object_size(&ctor);
- cp = obstack_finish(&ctor);
- if (size > 0) {
- be_gas_emit_switch_section(GAS_SECTION_CTOR);
- be_emit_string_len(cp, size);
- be_emit_write_line();
- }
-
- obstack_free(&rodata, NULL);
- obstack_free(&data, NULL);
- obstack_free(&bss, NULL);
- obstack_free(&ctor, NULL);
-
- /* dump the Thread Local Storage */
- obstack_init(&data);
-
- env.rodata_obst = &data;
- env.data_obst = &data;
- env.bss_obst = &data;
- env.ctor_obst = NULL;
-
- be_gas_dump_globals(get_tls_type(), &env, 0, only_emit_marked_entities);
-
- size = obstack_object_size(&data);
- cp = obstack_finish(&data);
- if (size > 0) {
- be_gas_emit_switch_section(GAS_SECTION_TLS);
- be_emit_cstring(".balign\t32\n");
- be_emit_write_line();
- be_emit_string_len(cp, size);
- be_emit_write_line();
+ memset(&env, 0, sizeof(env));
+
+ env.main_env = main_env;
+
+ /* dump global type */
+ env.section = (be_gas_section_t) -1;
+ be_gas_dump_globals(get_glob_type(), &env, only_emit_marked_entities);
+ env.section = GAS_SECTION_TLS;
+ be_gas_dump_globals(get_tls_type(), &env, only_emit_marked_entities);
+ env.section = GAS_SECTION_CONSTRUCTORS;
+ be_gas_dump_globals(get_segment_type(IR_SEGMENT_CONSTRUCTORS), &env,
+ only_emit_marked_entities);
+ env.section = GAS_SECTION_DESTRUCTORS;
+ be_gas_dump_globals(get_segment_type(IR_SEGMENT_DESTRUCTORS), &env,
+ only_emit_marked_entities);
+
+ env.section = GAS_SECTION_PIC_SYMBOLS;
+ be_gas_dump_globals(main_env->pic_symbols_type, &env,
+ only_emit_marked_entities);
+
+ if (get_compound_n_members(main_env->pic_trampolines_type) > 0) {
+ env.section = GAS_SECTION_PIC_TRAMPOLINES;
+ be_gas_dump_globals(main_env->pic_trampolines_type, &env,
+ only_emit_marked_entities);
+ if (be_gas_flavour == GAS_FLAVOUR_MACH_O) {
+ be_emit_cstring("\t.subsections_via_symbols\n");
+ be_emit_write_line();
+ }