X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=d00d6d190e0e25160491716cacdfe451bddb0d6d;hb=c080950de05aa3e3e2adf8835387b5d0112bb868;hp=1de0dba2915764dbc324b11cd0c7ee744602e57c;hpb=80bccee8d428d09cb812f42be44bb1864a5e476f;p=cparser diff --git a/main.c b/main.c index 1de0dba..d00d6d1 100644 --- a/main.c +++ b/main.c @@ -550,6 +550,11 @@ static void print_cparser_version(void) "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); } +static void print_cparser_version_short(void) +{ + puts(cparser_REVISION); +} + static void print_help_basic(const char *argv0) { usage(argv0); @@ -731,18 +736,18 @@ static void print_help_firm(void) typedef enum { HELP_NONE = 0, - HELP_BASIC = 1u << 0, - HELP_PREPROCESSOR = 1u << 1, - HELP_PARSER = 1u << 2, - HELP_WARNINGS = 1u << 3, - HELP_OPTIMIZATION = 1u << 4, - HELP_CODEGEN = 1u << 5, - HELP_LINKER = 1u << 6, - HELP_LANGUAGETOOLS = 1u << 7, - HELP_DEBUG = 1u << 8, - HELP_FIRM = 1u << 9, - - HELP_ALL = (unsigned)-1 + HELP_BASIC = 1 << 0, + HELP_PREPROCESSOR = 1 << 1, + HELP_PARSER = 1 << 2, + HELP_WARNINGS = 1 << 3, + HELP_OPTIMIZATION = 1 << 4, + HELP_CODEGEN = 1 << 5, + HELP_LINKER = 1 << 6, + HELP_LANGUAGETOOLS = 1 << 7, + HELP_DEBUG = 1 << 8, + HELP_FIRM = 1 << 9, + + HELP_ALL = -1 } help_sections_t; static void print_help(const char *argv0, help_sections_t sections) @@ -810,35 +815,18 @@ static filetype_t get_filetype_from_string(const char *string) return FILETYPE_UNKNOWN; } -static bool is_windows_os(const char *os) -{ - return strstr(os, "mingw") != NULL || streq(os, "win32"); -} - -static bool is_unixish_os(const char *os) -{ - return strstr(os, "linux") != NULL || strstr(os, "bsd") != NULL - || streq(os, "solaris"); -} - -static bool is_darwin_os(const char *os) -{ - return streq(os, "darwin"); -} - static bool init_os_support(void) { - const char *os = target_machine->operating_system; wchar_atomic_kind = ATOMIC_TYPE_INT; enable_main_collect2_hack = false; define_intmax_types = false; - if (is_unixish_os(os)) { + if (firm_is_unixish_os(target_machine)) { set_create_ld_ident(create_name_linux_elf); - } else if (is_darwin_os(os)) { + } else if (firm_is_darwin_os(target_machine)) { set_create_ld_ident(create_name_macho); define_intmax_types = true; - } else if (is_windows_os(os)) { + } else if (firm_is_windows_os(target_machine)) { wchar_atomic_kind = ATOMIC_TYPE_USHORT; enable_main_collect2_hack = true; set_create_ld_ident(create_name_win32); @@ -957,8 +945,7 @@ static void init_types_and_adjust(void) 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 (firm_is_darwin_os(target_machine)) { if (machine_size == 32) { props[ATOMIC_TYPE_LONGLONG].struct_alignment = 4; props[ATOMIC_TYPE_ULONGLONG].struct_alignment = 4; @@ -967,7 +954,7 @@ static void init_types_and_adjust(void) props[ATOMIC_TYPE_LONG_DOUBLE].alignment = 16; props[ATOMIC_TYPE_LONG_DOUBLE].struct_alignment = 16; } - } else if (is_windows_os(os)) { + } else if (firm_is_windows_os(target_machine)) { if (machine_size == 64) { /* to ease porting of old c-code microsoft decided to use 32bits * even for long */ @@ -977,7 +964,7 @@ static void init_types_and_adjust(void) /* on windows long double is not supported */ props[ATOMIC_TYPE_LONG_DOUBLE] = props[ATOMIC_TYPE_DOUBLE]; - } else if (is_unixish_os(os)) { + } else if (firm_is_unixish_os(target_machine)) { if (is_ia32_cpu(target_machine->cpu_type)) { /* System V has a broken alignment for double so we have to add * a hack here */ @@ -1108,9 +1095,6 @@ int main(int argc, char **argv) } } - const char *target = getenv("TARGET"); - if (target != NULL) - parse_target_triple(target); if (target_machine == NULL) { target_machine = firm_get_host_machine(); } @@ -1132,8 +1116,8 @@ int main(int argc, char **argv) if (option[0] == 'o') { GET_ARG_AFTER(outname, "-o"); } else if (option[0] == 'g') { - set_be_option("debuginfo=stabs"); - set_be_option("omitfp=no"); + /* TODO: parse -gX with 0<=x<=3... */ + set_be_option("debug=frameinfo"); set_be_option("ia32-nooptcc=yes"); } else if (SINGLE_OPTION('c')) { mode = CompileAssemble; @@ -1306,6 +1290,7 @@ int main(int argc, char **argv) streq(opt, "align-loops") || streq(opt, "align-jumps") || streq(opt, "align-functions") || + streq(opt, "unroll-loops") || streq(opt, "PIC") || streq(opt, "stack-protector") || streq(opt, "stack-protector-all")) { @@ -1443,6 +1428,9 @@ int main(int argc, char **argv) int res = be_parse_arg(arch_opt); if (res == 0) argument_errors = true; + } else if (streq(opt, "sse2")) { + /* ignore for now, our x86 backend always uses sse when + * sse is requested */ } else { long int value = strtol(opt, NULL, 10); if (value == 0) { @@ -1485,6 +1473,11 @@ int main(int argc, char **argv) (fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg), standard); } else if (streq(option, "version")) { print_cparser_version(); + return EXIT_SUCCESS; + } else if (streq(option, "dumpversion")) { + /* gcc compatibility option */ + print_cparser_version_short(); + return EXIT_SUCCESS; } else if (strstart(option, "print-file-name=")) { GET_ARG_AFTER(print_file_name_file, "-print-file-name="); } else if (option[0] == '-') { @@ -1573,6 +1566,8 @@ int main(int argc, char **argv) mode = CompileDump; } else if (streq(option, "export-ir")) { mode = CompileExportIR; + } else if (streq(option, "unroll-loops")) { + /* ignore (gcc compatibility) */ } else { fprintf(stderr, "error: unknown argument '%s'\n", arg); argument_errors = true; @@ -1908,6 +1903,7 @@ do_parsing: if (already_constructed_firm) { panic("compiling multiple files/translation units not possible"); } + init_implicit_optimizations(); translation_unit_to_firm(unit); already_constructed_firm = true; timer_pop(t_construct);