X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=bc6a23306f0d08be77c87b5027fd1bf8067c0b97;hb=bf92df408b5fef01d5ee065b02c1deb7e4289a5b;hp=741f3c9d907d2edbf1a9afb57529c3e7458fd2c0;hpb=beee1fb6ac672c24b6bf12b60b6d4c7f0ac97ff6;p=cparser diff --git a/main.c b/main.c index 741f3c9..bc6a233 100644 --- a/main.c +++ b/main.c @@ -103,15 +103,15 @@ unsigned int machine_size = 32; bool byte_order_big_endian = false; bool char_is_signed = true; bool strict_mode = false; -bool use_builtins = false; atomic_type_kind_t wchar_atomic_kind = ATOMIC_TYPE_INT; -unsigned force_long_double_size = 0; +unsigned long_double_size = 0; bool enable_main_collect2_hack = false; bool freestanding = false; static machine_triple_t *target_machine; static const char *target_triple; static int verbose; +static bool use_builtins; static struct obstack cppflags_obst; static struct obstack ldflags_obst; static struct obstack asflags_obst; @@ -633,10 +633,10 @@ static void print_help_parser(void) static void print_help_warnings(void) { - put_help("-w", "disable all warnings"); - put_help("-W", "ignored (gcc compatibility)"); - put_help("-Wno-trigraphs", "warn if input contains trigraphs"); - put_help("-Wundef", "Warn if an undefined macro is used in an #if"); + put_help("-f[no-]diagnostics-show-option", "Show the switch, which controls a warning, after each warning"); + 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"); print_warning_opt_help(); } @@ -684,7 +684,7 @@ static void print_help_codegeneration(void) put_help("-ffast-math", "same as fp-fast (gcc compatibility)"); puts(""); puts("\tMost of these options can be used with a no- prefix to disable them"); - puts("\ti.e. -fno-signed-char"); + puts("\te.g. -fno-signed-char"); } static void print_help_linker(void) @@ -809,7 +809,6 @@ static bool init_os_support(void) { const char *os = target_machine->operating_system; wchar_atomic_kind = ATOMIC_TYPE_INT; - force_long_double_size = 0; enable_main_collect2_hack = false; define_intmax_types = false; @@ -817,7 +816,7 @@ static bool init_os_support(void) || streq(os, "solaris")) { set_create_ld_ident(create_name_linux_elf); } else if (streq(os, "darwin")) { - force_long_double_size = 16; + long_double_size = 16; set_create_ld_ident(create_name_macho); define_intmax_types = true; } else if (strstr(os, "mingw") != NULL || streq(os, "win32")) { @@ -846,6 +845,17 @@ static void setup_target_machine(void) { if (!setup_firm_for_machine(target_machine)) exit(1); + + const backend_params *be_params = be_get_backend_param(); + if (be_params->long_double_size % 8 != 0) { + fprintf(stderr, "firm-target long double size is not a multiple of 8, can't handle this\n"); + exit(1); + } + + byte_order_big_endian = be_params->byte_order_big_endian; + machine_size = be_params->machine_size; + long_double_size = be_params->long_double_size / 8; + init_os_support(); } @@ -881,21 +891,23 @@ int main(int argc, char **argv) obstack_init(&file_obst); #define GET_ARG_AFTER(def, args) \ + do { \ def = &arg[sizeof(args)-1]; \ - if (def[0] == '\0') { \ + if (def[0] == '\0') { \ ++i; \ - if (i >= argc) { \ + if (i >= argc) { \ fprintf(stderr, "error: expected argument after '" args "'\n"); \ argument_errors = true; \ break; \ } \ def = argv[i]; \ - if (def[0] == '-' && def[1] != '\0') { \ + if (def[0] == '-' && def[1] != '\0') { \ fprintf(stderr, "error: expected argument after '" args "'\n"); \ argument_errors = true; \ continue; \ } \ - } + } \ + } while (0) #define SINGLE_OPTION(ch) (option[0] == (ch) && option[1] == '\0') @@ -969,7 +981,7 @@ int main(int argc, char **argv) } else if (SINGLE_OPTION('v')) { verbose = 1; } else if (SINGLE_OPTION('w')) { - memset(&warning, 0, sizeof(warning)); + disable_all_warnings(); } else if (option[0] == 'x') { const char *opt; GET_ARG_AFTER(opt, "-x"); @@ -1034,12 +1046,12 @@ int main(int argc, char **argv) strstart(orig_opt, "align-functions=")) { fprintf(stderr, "ignoring gcc option '-f%s'\n", orig_opt); } else if (strstart(orig_opt, "visibility=")) { - const char *arg = strchr(orig_opt, '=')+1; + const char *val = strchr(orig_opt, '=')+1; elf_visibility_tag_t visibility - = get_elf_visibility_from_string(arg); + = get_elf_visibility_from_string(val); if (visibility == ELF_VISIBILITY_ERROR) { fprintf(stderr, "invalid visibility '%s' specified\n", - arg); + val); argument_errors = true; } else { set_default_visibility(visibility); @@ -1057,6 +1069,8 @@ int main(int argc, char **argv) if (streq(opt, "builtins")) { use_builtins = truth_value; + } else if (streq(opt, "diagnostics-show-option")) { + diagnostics_show_option = truth_value; } else if (streq(opt, "dollars-in-identifiers")) { allow_dollar_in_symbol = truth_value; } else if (streq(opt, "omit-frame-pointer")) { @@ -1106,7 +1120,7 @@ int main(int argc, char **argv) fprintf(stderr, "ignoring gcc option '-f%s'\n", orig_opt); } else if (streq(opt, "help")) { fprintf(stderr, "warning: -fhelp is deprecated\n"); - help |= HELP_OPTIMISATION; + help |= HELP_OPTIMIZATION; } else { int res = firm_option(orig_opt); if (res == 0) { @@ -1135,9 +1149,7 @@ int main(int argc, char **argv) } } } else if (option[0] == 'W') { - if (option[1] == '\0') { - /* ignore -W, our defaults are already quite verbose */ - } else if (strstart(option + 1, "p,")) { + if (strstart(option + 1, "p,")) { // pass options directly to the preprocessor const char *opt; GET_ARG_AFTER(opt, "-Wp,"); @@ -1179,14 +1191,12 @@ int main(int argc, char **argv) GET_ARG_AFTER(opt, "-march="); snprintf(arch_opt, sizeof(arch_opt), "%s-arch=%s", cpu_arch, opt); int res = be_parse_arg(arch_opt); + snprintf(arch_opt, sizeof(arch_opt), "%s-opt=%s", cpu_arch, opt); + res &= be_parse_arg(arch_opt); + if (res == 0) { fprintf(stderr, "Unknown architecture '%s'\n", arch_opt); argument_errors = true; - } else { - snprintf(arch_opt, sizeof(arch_opt), "%s-opt=%s", cpu_arch, opt); - int res = be_parse_arg(arch_opt); - if (res == 0) - argument_errors = true; } } else if (strstart(opt, "tune=")) { GET_ARG_AFTER(opt, "-mtune="); @@ -1239,10 +1249,10 @@ int main(int argc, char **argv) fprintf(stderr, "error: option -m supports only 16, 32 or 64\n"); argument_errors = true; } else { - machine_size = (unsigned int)value; add_flag(&cppflags_obst, "-m%u", machine_size); add_flag(&asflags_obst, "-m%u", machine_size); add_flag(&ldflags_obst, "-m%u", machine_size); + /* TODO: choose/change backend based on this */ } } } else if (streq(option, "pg")) { @@ -1446,7 +1456,6 @@ int main(int argc, char **argv) } gen_firm_init(); - byte_order_big_endian = be_get_backend_param()->byte_order_big_endian; init_symbol_table(); init_types(); init_typehash(); @@ -1564,13 +1573,13 @@ preprocess: preprocessed_in = preprocess(filename, filetype); if (mode == PreprocessOnly) { copy_file(out, preprocessed_in); - int result = pclose(preprocessed_in); + int pp_result = pclose(preprocessed_in); fclose(out); /* remove output file in case of error */ - if (out != stdout && result != EXIT_SUCCESS) { + if (out != stdout && pp_result != EXIT_SUCCESS) { unlink(outname); } - return result; + return pp_result; } in = preprocessed_in;