X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=afb0b8470e11f672fb695d5f24858322b82e07e3;hb=e628f683385763274b551d468107872a058b31d7;hp=6a4cf716530e5b107beb80e9e11d68f924ea2ed2;hpb=f073d133c36c0f6dda8d11e5b343bd90f383b2a2;p=cparser diff --git a/main.c b/main.c index 6a4cf71..afb0b84 100644 --- a/main.c +++ b/main.c @@ -70,7 +70,6 @@ #include "diagnostic.h" #include "lang_features.h" #include "driver/firm_opt.h" -#include "driver/firm_cmdline.h" #include "driver/firm_timing.h" #include "driver/firm_machine.h" #include "adt/error.h" @@ -104,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; @@ -563,6 +562,7 @@ static void print_help_basic(const char *argv0) put_help("--help-parser", "Display information about parser options"); put_help("--help-warnings", "Display information about warning options"); put_help("--help-codegen", "Display information about code-generation options"); + put_help("--help-optimization", "Display information about optimization options"); put_help("--help-linker", "Display information about linker options"); put_help("--help-language-tools", "Display information about language tools options"); put_help("--help-debug", "Display information about compiler debugging options"); @@ -633,16 +633,17 @@ 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(); } -static void print_help_optimisation(void) +static void print_help_optimization(void) { - put_help("-O LEVEL", "select optimisation level (0-4)"); + put_help("-O LEVEL", "select optimization level (0-4)"); + firm_option_help(put_help); put_help("-fexpensive-optimizations","ignored (gcc compatibility)"); } @@ -683,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) @@ -729,7 +730,7 @@ typedef enum { HELP_PREPROCESSOR = 1u << 1, HELP_PARSER = 1u << 2, HELP_WARNINGS = 1u << 3, - HELP_OPTIMISATION = 1u << 4, + HELP_OPTIMIZATION = 1u << 4, HELP_CODEGEN = 1u << 5, HELP_LINKER = 1u << 6, HELP_LANGUAGETOOLS = 1u << 7, @@ -745,7 +746,7 @@ static void print_help(const char *argv0, help_sections_t sections) if (sections & HELP_PREPROCESSOR) print_help_preprocessor(); if (sections & HELP_PARSER) print_help_parser(); if (sections & HELP_WARNINGS) print_help_warnings(); - if (sections & HELP_OPTIMISATION) print_help_optimisation(); + if (sections & HELP_OPTIMIZATION) print_help_optimization(); if (sections & HELP_CODEGEN) print_help_codegeneration(); if (sections & HELP_LINKER) print_help_linker(); if (sections & HELP_LANGUAGETOOLS) print_help_language_tools(); @@ -808,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; @@ -816,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")) { @@ -845,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(); } @@ -880,25 +891,27 @@ 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') - /* early options parsing (find out optimisation level and OS) */ + /* early options parsing (find out optimization level and OS) */ for (int i = 1; i < argc; ++i) { const char *arg = argv[i]; if (arg[0] != '-') @@ -968,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"); @@ -1033,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); @@ -1056,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")) { @@ -1068,7 +1083,8 @@ int main(int argc, char **argv) } else if (streq(opt, "signed-char")) { char_is_signed = truth_value; } else if (streq(opt, "strength-reduce")) { - firm_option(truth_value ? "strength-red" : "no-strength-red"); + /* does nothing, for gcc compatibility (even gcc does + * nothing for this switch anymore) */ } else if (streq(opt, "syntax-only")) { mode = truth_value ? ParseOnly : CompileAssembleLink; } else if (streq(opt, "unsigned-char")) { @@ -1104,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_FIRM; + help |= HELP_OPTIMIZATION; } else { int res = firm_option(orig_opt); if (res == 0) { @@ -1133,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,"); @@ -1177,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="); @@ -1205,7 +1217,7 @@ int main(int argc, char **argv) else if (streq(opt, "sse")) opt = "sse2"; else { - fprintf(stderr, "error: option -mfpumath supports only 387 or sse\n"); + fprintf(stderr, "error: option -mfpmath supports only 387 or sse\n"); argument_errors = true; } if (!argument_errors) { @@ -1237,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")) { @@ -1334,6 +1346,8 @@ int main(int argc, char **argv) help |= HELP_CODEGEN; } else if (streq(option, "help-linker")) { help |= HELP_LINKER; + } else if (streq(option, "help-optimization")) { + help |= HELP_OPTIMIZATION; } else if (streq(option, "help-language-tools")) { help |= HELP_LANGUAGETOOLS; } else if (streq(option, "help-debug")) { @@ -1442,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(); @@ -1560,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;