X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=afb0b8470e11f672fb695d5f24858322b82e07e3;hb=e628f683385763274b551d468107872a058b31d7;hp=a00e969302c0b7c51b5767383d3aa27e35c1ead8;hpb=327acad4c5abb6d3f76de0269286036e4ae3f3c3;p=cparser diff --git a/main.c b/main.c index a00e969..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,21 +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; -/* to switch on printing of implicit casts */ -extern bool print_implicit_casts; - -/* to switch on printing of parenthesis to indicate operator precedence */ -extern bool print_parenthesis; - 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; @@ -569,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"); @@ -639,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)"); } @@ -661,16 +656,11 @@ static void print_help_codegeneration(void) put_help("-fhosted", "compile in hosted (not freestanding) mode"); put_help("-fprofile-generate", "Generate instrumented code to collect profile information"); put_help("-fprofile-use", "Use profile information generated by instrumented binaries"); + put_help("-ffp-precise", "precise floating point model"); + put_help("-ffp-fast", "imprecise floating point model"); + put_help("-ffp-strict", "strict floating point model"); + put_help("-ffp-precise", "precise floating point model"); put_help("-pthread", "Use pthread threading library"); - put_help("-fverbose-asm", "ignored (gcc compatibility)"); - put_help("-ffast-math", "ignored (gcc compatibility)"); - put_help("-fjump-tables", "ignored (gcc compatibility)"); - put_help("-fcommon", "ignored (gcc compatibility)"); - put_help("-foptimize-sibling-calls", "ignored (gcc compatibility)"); - put_help("-falign-loops", "ignored (gcc compatibility)"); - put_help("-falign-jumps", "ignored (gcc compatibility)"); - put_help("-falign-functions", "ignored (gcc compatibility)"); - put_help("-fPIC", "ignored (gcc compatibility)"); put_help("-mtarget=TARGET", "Specify target architecture as CPU-manufacturer-OS triple"); put_help("-mtriple=TARGET", "alias for -mtarget (clang compatibility)"); put_help("-march=ARCH", ""); @@ -683,9 +673,18 @@ static void print_help_codegeneration(void) put_help("-msoft-float", "not supported yet"); put_help("-m32", "generate 32bit code"); put_help("-m64", "generate 64bit code"); + put_help("-fverbose-asm", "ignored (gcc compatibility)"); + put_help("-fjump-tables", "ignored (gcc compatibility)"); + put_help("-fcommon", "ignored (gcc compatibility)"); + put_help("-foptimize-sibling-calls", "ignored (gcc compatibility)"); + put_help("-falign-loops", "ignored (gcc compatibility)"); + put_help("-falign-jumps", "ignored (gcc compatibility)"); + put_help("-falign-functions", "ignored (gcc compatibility)"); + put_help("-fPIC", "ignored (gcc compatibility)"); + 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) @@ -731,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, @@ -747,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(); @@ -810,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; @@ -818,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")) { @@ -847,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(); } @@ -882,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] != '-') @@ -970,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"); @@ -1032,9 +1043,19 @@ int main(int argc, char **argv) select_input_encoding(encoding); } else if (strstart(orig_opt, "align-loops=") || strstart(orig_opt, "align-jumps=") || - strstart(orig_opt, "visibility=") || strstart(orig_opt, "align-functions=")) { fprintf(stderr, "ignoring gcc option '-f%s'\n", orig_opt); + } else if (strstart(orig_opt, "visibility=")) { + const char *val = strchr(orig_opt, '=')+1; + elf_visibility_tag_t visibility + = get_elf_visibility_from_string(val); + if (visibility == ELF_VISIBILITY_ERROR) { + fprintf(stderr, "invalid visibility '%s' specified\n", + val); + argument_errors = true; + } else { + set_default_visibility(visibility); + } } else if (strstart(orig_opt, "message-length=")) { /* ignore: would only affect error message format */ } else { @@ -1048,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")) { @@ -1060,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")) { @@ -1077,10 +1101,15 @@ int main(int argc, char **argv) streq(opt, "asynchronous-unwind-tables")) { /* nothing todo, a gcc feature which we don't support * anyway was deactivated */ - } else if (streq(orig_opt, "verbose-asm")) { + } else if (streq(opt, "verbose-asm")) { /* ignore: we always print verbose assembler */ - } else if (streq(opt, "fast-math") || - streq(opt, "jump-tables") || + } else if (streq(opt, "fast-math") || streq(opt, "fp-fast")) { + firm_fp_model = fp_model_fast; + } else if (streq(opt, "fp-precise")) { + firm_fp_model = fp_model_precise; + } else if (streq(opt, "fp-strict")) { + firm_fp_model = fp_model_strict; + } else if (streq(opt, "jump-tables") || streq(opt, "expensive-optimizations") || streq(opt, "common") || streq(opt, "optimize-sibling-calls") || @@ -1091,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) { @@ -1120,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,"); @@ -1164,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="); @@ -1192,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) { @@ -1224,9 +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")) { @@ -1320,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")) { @@ -1428,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(); @@ -1546,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;