X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=main.c;h=3aa815b1ae5380701d07c8d3b94bdc9c2731cba2;hb=c080804a9ae61e4ba0ec6fc7288c81c326fa9ddb;hp=b52afd89b7c14b9a507398434b3f0d6d977aada2;hpb=351bf3a339f32c5dba6ef10b21a28ea7b94ad004;p=cparser diff --git a/main.c b/main.c index b52afd8..3aa815b 100644 --- a/main.c +++ b/main.c @@ -635,7 +635,13 @@ static void print_help_warnings(void) put_help("-w", "Disable all warnings"); put_help("-Wno-trigraphs", "Warn if input contains trigraphs"); put_help("-Wundef", "Warn if an undefined macro is used in an #if"); + put_help("-Wmissing-include-dirs", "Warn about missing user-specified include directories"); + put_help("-Wendif-labels", "Warn about stray text after #elif and #endif"); put_help("-Winit-self", "Ignored (gcc compatibility)"); + put_help("-Wformat-y2k", "Ignored (gcc compatibility)"); + put_help("-Wformat-security", "Ignored (gcc compatibility)"); + put_help("-Wold-style-declaration", "Ignored (gcc compatibility)"); + put_help("-Wtype-limits", "Ignored (gcc compatibility)"); print_warning_opt_help(); } @@ -862,12 +868,46 @@ static unsigned decide_modulo_shift(unsigned type_size) return type_size; } -static void setup_target_machine(void) +static bool is_ia32_cpu(const char *architecture) +{ + return streq(architecture, "i386") + || streq(architecture, "i486") + || streq(architecture, "i586") + || streq(architecture, "i686") + || streq(architecture, "i786"); +} + +static const char *setup_isa_from_tripel(const machine_triple_t *machine) +{ + const char *cpu = machine->cpu_type; + + if (is_ia32_cpu(cpu)) { + return "ia32"; + } else if (streq(cpu, "x86_64")) { + return "amd64"; + } else if (streq(cpu, "sparc")) { + return "sparc"; + } else if (streq(cpu, "arm")) { + return "arm"; + } else { + fprintf(stderr, "Unknown cpu '%s' in target-triple\n", cpu); + return NULL; + } +} + +static const char *setup_target_machine(void) { if (!setup_firm_for_machine(target_machine)) exit(1); + const char *isa = setup_isa_from_tripel(target_machine); + + if (isa == NULL) + exit(1); + init_os_support(); + + return isa; } /** @@ -880,13 +920,16 @@ static void set_typeprops_type(atomic_type_properties_t* props, ir_type *type) props->struct_alignment = props->alignment; } -static bool is_ia32_cpu(const char *architecture) +/** + * Copy atomic type properties except the integer conversion rank + */ +static void copy_typeprops(atomic_type_properties_t *dest, + const atomic_type_properties_t *src) { - return streq(architecture, "i386") - || streq(architecture, "i486") - || streq(architecture, "i586") - || streq(architecture, "i686") - || streq(architecture, "i786"); + dest->size = src->size; + dest->alignment = src->alignment; + dest->struct_alignment = src->struct_alignment; + dest->flags = src->flags; } static void init_types_and_adjust(void) @@ -907,16 +950,19 @@ static void init_types_and_adjust(void) set_typeprops_type(&props[ATOMIC_TYPE_LONGLONG], type_long_long); ir_type *type_unsigned_long_long = be_params->type_unsigned_long_long; - if (type_long_long != NULL) + if (type_unsigned_long_long != NULL) set_typeprops_type(&props[ATOMIC_TYPE_ULONGLONG], type_unsigned_long_long); /* operating system ABI specifics */ const char *os = target_machine->operating_system; if (is_darwin_os(os)) { if (machine_size == 32) { - props[ATOMIC_TYPE_DOUBLE].struct_alignment = 4; - props[ATOMIC_TYPE_LONG_DOUBLE].size = 16; - props[ATOMIC_TYPE_LONG_DOUBLE].alignment = 16; + props[ATOMIC_TYPE_LONGLONG].struct_alignment = 4; + props[ATOMIC_TYPE_ULONGLONG].struct_alignment = 4; + props[ATOMIC_TYPE_DOUBLE].struct_alignment = 4; + props[ATOMIC_TYPE_LONG_DOUBLE].size = 16; + props[ATOMIC_TYPE_LONG_DOUBLE].alignment = 16; + props[ATOMIC_TYPE_LONG_DOUBLE].struct_alignment = 16; } } else if (is_windows_os(os)) { if (machine_size == 64) { @@ -940,22 +986,25 @@ static void init_types_and_adjust(void) /* stuff decided after processing operating system specifics and * commandline flags */ - props[ATOMIC_TYPE_WCHAR_T] = props[wchar_atomic_kind]; if (char_is_signed) { props[ATOMIC_TYPE_CHAR].flags |= ATOMIC_TYPE_FLAG_SIGNED; } else { props[ATOMIC_TYPE_CHAR].flags &= ~ATOMIC_TYPE_FLAG_SIGNED; } + /* copy over wchar_t properties (including rank) */ + props[ATOMIC_TYPE_WCHAR_T] = props[wchar_atomic_kind]; /* initialize defaults for unsupported types */ if (type_long_long == NULL) { - props[ATOMIC_TYPE_LONGLONG] = props[ATOMIC_TYPE_LONG]; - } - if (type_long_double == NULL) { - props[ATOMIC_TYPE_LONG_DOUBLE] = props[ATOMIC_TYPE_DOUBLE]; + copy_typeprops(&props[ATOMIC_TYPE_LONGLONG], &props[ATOMIC_TYPE_LONG]); } if (type_unsigned_long_long == NULL) { - props[ATOMIC_TYPE_ULONGLONG] = props[ATOMIC_TYPE_ULONG]; + copy_typeprops(&props[ATOMIC_TYPE_ULONGLONG], + &props[ATOMIC_TYPE_ULONG]); + } + if (type_long_double == NULL) { + copy_typeprops(&props[ATOMIC_TYPE_LONG_DOUBLE], + &props[ATOMIC_TYPE_DOUBLE]); } /* initialize firm pointer modes */ @@ -1254,7 +1303,9 @@ int main(int argc, char **argv) streq(opt, "align-loops") || streq(opt, "align-jumps") || streq(opt, "align-functions") || - streq(opt, "PIC")) { + streq(opt, "PIC") || + streq(opt, "stack-protector") || + streq(opt, "stack-protector-all")) { fprintf(stderr, "ignoring gcc option '-f%s'\n", orig_opt); } else { int res = firm_option(orig_opt); @@ -1295,10 +1346,17 @@ int main(int argc, char **argv) GET_ARG_AFTER(opt, "-Wl,"); add_flag(&ldflags_obst, "-Wl,%s", opt); } else if (streq(option + 1, "no-trigraphs") - || streq(option + 1, "undef")) { + || streq(option + 1, "undef") + || streq(option + 1, "missing-include-dirs") + || streq(option + 1, "endif-labels")) { add_flag(&cppflags_obst, "%s", arg); } else if (streq(option+1, "init-self")) { - /* ignored (gcc compatibility) */ + /* ignored (asme as gcc does) */ + } else if (streq(option+1, "format-y2k") + || streq(option+1, "format-security") + || streq(option+1, "old-style-declaration") + || streq(option+1, "type-limits")) { + /* ignore (gcc compatibility) */ } else { set_warning_opt(&option[1]); } @@ -1313,7 +1371,8 @@ int main(int argc, char **argv) if (!parse_target_triple(opt)) { argument_errors = true; } else { - setup_target_machine(); + const char *isa = setup_target_machine(); + strncpy(cpu_arch, isa, sizeof(cpu_arch)); target_triple = opt; } } else if (strstart(opt, "triple=")) { @@ -1321,7 +1380,8 @@ int main(int argc, char **argv) if (!parse_target_triple(opt)) { argument_errors = true; } else { - setup_target_machine(); + const char *isa = setup_target_machine(); + strncpy(cpu_arch, isa, sizeof(cpu_arch)); target_triple = opt; } } else if (strstart(opt, "arch=")) { @@ -1375,8 +1435,11 @@ int main(int argc, char **argv) fprintf(stderr, "error: regparm convention not supported yet\n"); argument_errors = true; } else if (streq(opt, "soft-float")) { - fprintf(stderr, "error: software floatingpoint not supported yet\n"); - argument_errors = true; + add_flag(&ldflags_obst, "-msoft-float"); + snprintf(arch_opt, sizeof(arch_opt), "%s-fpunit=softfloat", cpu_arch); + int res = be_parse_arg(arch_opt); + if (res == 0) + argument_errors = true; } else { long int value = strtol(opt, NULL, 10); if (value == 0) {