".section\t.rodata",
".section\t.bss",
".section\t.tbss,\"awT\",@nobits",
- ".section\t.ctors,\"aw\",@progbits"
+ ".section\t.ctors,\"aw\",@progbits",
+ NULL,
},
{ /* GAS_FLAVOUR_MINGW */
".section\t.text",
".section .rdata,\"dr\"",
".section\t.bss",
".section\t.tbss,\"awT\",@nobits",
- ".section\t.ctors,\"aw\",@progbits"
+ ".section\t.ctors,\"aw\",@progbits",
+ NULL,
},
{ /* GAS_FLAVOUR_YASM */
".section\t.text",
".section\t.rodata",
".section\t.bss",
".section\t.tbss,\"awT\",@nobits",
- ".section\t.ctors,\"aw\",@progbits"
+ ".section\t.ctors,\"aw\",@progbits",
+ NULL
},
{ /* GAS_FLAVOUR_MACH_O */
".text",
".data",
".const",
".data",
- NULL, /* TLS is not supported on Mach-O */
- NULL /* constructors aren't marked with sections in Mach-O */
+ NULL, /* TLS is not supported on Mach-O */
+ ".mod_init_func",
+ ".cstring"
}
};
static int initializer_is_string_const(const ir_initializer_t *initializer)
{
size_t i, len;
+ int found_printable = 0;
if(initializer->kind != IR_INITIALIZER_COMPOUND)
return 0;
return 0;
c = get_tarval_long(tv);
- if (i < len - 1) {
- if (!isgraph(c) && !isspace(c))
- return 0;
- } else {
- if (c != 0)
- return 0;
- }
+ if (isgraph(c) || isspace(c))
+ found_printable = 1;
+ else if(c != 0)
+ return 0;
+
+ if (i == len - 1 && c != '\0')
+ return 0;
}
- return 1;
+ return found_printable;
}
/**
ir_type *type, *element_type;
ir_mode *mode;
int i, c, n;
+ int found_printable = 0;
type = get_entity_type(ent);
c = (int) get_tarval_long(get_Const_tarval(irn));
- if((i < n - 1 && !(isgraph(c) || isspace(c)))
- || (i == n - 1 && c != '\0'))
+ if (isgraph(c) || isspace(c))
+ found_printable = 1;
+ else if(c != 0)
+ return 0;
+
+ if (i == n - 1 && c != '\0')
return 0;
}
}
/* then we can emit it as a string constant */
- return 1;
+ return found_printable;
}
/**
int type_size;
int remaining_space;
- be_gas_section_t last_section = current_section;
len = get_compound_ent_n_values(ent);
if (be_gas_flavour == GAS_FLAVOUR_MACH_O) {
- if (get_entity_variability(ent) == variability_constant) {
- be_gas_emit_switch_section(GAS_SECTION_CSTRING);
- }
be_emit_cstring("\t.ascii \"");
} else {
be_emit_cstring("\t.string \"");
if(remaining_space > 0) {
be_emit_irprintf("\t.skip\t%d\n", remaining_space);
}
- if(be_gas_flavour == GAS_FLAVOUR_MACH_O) {
- be_gas_emit_switch_section(last_section);
- }
}
static void dump_string_initializer(const ir_initializer_t *initializer)
len = initializer->compound.n_initializers;
if(be_gas_flavour == GAS_FLAVOUR_MACH_O) {
+ be_emit_cstring("\t.ascii \"");
+ } else {
be_emit_cstring("\t.string \"");
len -= 1;
- } else {
- be_emit_cstring("\t.ascii \"");
}
for(i = 0; i < len; ++i) {
} else if (variability == variability_constant) {
/* a constant entity, put it on the rdata */
section = GAS_SECTION_RODATA;
+ if (be_gas_flavour == GAS_FLAVOUR_MACH_O
+ && ent_is_string_const(ent)) {
+ section = GAS_SECTION_CSTRING;
+ }
} else if (variability == variability_uninitialized) {
/* uninitialized entity put it in bss segment */
section = GAS_SECTION_COMMON;
break;
}
} else {
- be_emit_irprintf("\t.zero %u\n", get_type_size_bytes(type));
+ be_emit_irprintf("\t.space %u\n", get_type_size_bytes(type));
be_emit_write_line();
}
} else {