X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=04a6eac0855a56ac34ff183182e43a20d0005b1d;hb=cb69923e40a94f9b611874437f00d7d31abf3dd7;hp=3aa815b1ae5380701d07c8d3b94bdc9c2731cba2;hpb=4917cb7471c6af7ef8069dae976b1e972020c6a2;p=cparser diff --git a/main.c b/main.c index 3aa815b..04a6eac 100644 --- a/main.c +++ b/main.c @@ -323,8 +323,8 @@ static FILE *preprocess(const char *fname, filetype_t filetype) add_flag(&cppflags_obst, "-MF"); add_flag(&cppflags_obst, dep_target); if (outname != NULL) { - add_flag(&cppflags_obst, "-MQ"); - add_flag(&cppflags_obst, outname); + add_flag(&cppflags_obst, "-MQ"); + add_flag(&cppflags_obst, outname); } } add_flag(&cppflags_obst, fname); @@ -536,7 +536,7 @@ static void print_cparser_version(void) const char *revision = ir_get_version_revision(); if (revision[0] != 0) { - putchar(' '); + putchar('-'); fputs(revision, stdout); } @@ -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); @@ -695,6 +700,7 @@ static void print_help_linker(void) { put_help("-l LIBRARY", ""); put_help("-L PATH", ""); + put_help("-s", "Do not produce symbol table and relocation information"); put_help("-shared", "Produce a shared library"); put_help("-static", "Produce statically linked binary"); put_help("-Wl,OPTION", "Pass option directly to linker"); @@ -730,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) @@ -942,8 +948,10 @@ static void init_types_and_adjust(void) /* adjust types as requested by target architecture */ ir_type *type_long_double = be_params->type_long_double; - if (type_long_double != NULL) + if (type_long_double != NULL) { set_typeprops_type(&props[ATOMIC_TYPE_LONG_DOUBLE], type_long_double); + atomic_modes[ATOMIC_TYPE_LONG_DOUBLE] = get_type_mode(type_long_double); + } ir_type *type_long_long = be_params->type_long_long; if (type_long_long != NULL) @@ -1009,15 +1017,11 @@ static void init_types_and_adjust(void) /* initialize firm pointer modes */ char name[64]; - ir_mode_sort sort = irms_reference; unsigned bit_size = machine_size; - bool is_signed = 0; - ir_mode_arithmetic arithmetic = irma_twos_complement; unsigned modulo_shift = decide_modulo_shift(bit_size); snprintf(name, sizeof(name), "p%u", machine_size); - ir_mode *ptr_mode = new_ir_mode(name, sort, bit_size, is_signed, arithmetic, - modulo_shift); + ir_mode *ptr_mode = new_reference_mode(name, irma_twos_complement, bit_size, modulo_shift); if (machine_size == 16) { set_reference_mode_signed_eq(ptr_mode, mode_Hs); @@ -1046,8 +1050,6 @@ static void init_types_and_adjust(void) int main(int argc, char **argv) { - firm_early_init(); - const char *dumpfunction = NULL; const char *print_file_name_file = NULL; compile_mode_t mode = CompileAssembleLink; @@ -1096,6 +1098,9 @@ int main(int argc, char **argv) #define SINGLE_OPTION(ch) (option[0] == (ch) && option[1] == '\0') + /* initialize this early because it has to parse options */ + gen_firm_init(); + /* early options parsing (find out optimization level and OS) */ for (int i = 1; i < argc; ++i) { const char *arg = argv[i]; @@ -1108,9 +1113,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(); } @@ -1139,6 +1141,8 @@ int main(int argc, char **argv) mode = CompileAssemble; } else if (SINGLE_OPTION('E')) { mode = PreprocessOnly; + } else if (SINGLE_OPTION('s')) { + add_flag(&ldflags_obst, "-s"); } else if (SINGLE_OPTION('S')) { mode = Compile; } else if (option[0] == 'O') { @@ -1166,6 +1170,7 @@ int main(int argc, char **argv) } else if (SINGLE_OPTION('v')) { verbose = 1; } else if (SINGLE_OPTION('w')) { + add_flag(&cppflags_obst, "-w"); disable_all_warnings(); } else if (option[0] == 'x') { const char *opt; @@ -1303,6 +1308,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")) { @@ -1351,7 +1357,7 @@ int main(int argc, char **argv) || streq(option + 1, "endif-labels")) { add_flag(&cppflags_obst, "%s", arg); } else if (streq(option+1, "init-self")) { - /* ignored (asme as gcc does) */ + /* ignored (same as gcc does) */ } else if (streq(option+1, "format-y2k") || streq(option+1, "format-security") || streq(option+1, "old-style-declaration") @@ -1459,8 +1465,9 @@ int main(int argc, char **argv) } else if (streq(option, "pg")) { set_be_option("gprof"); add_flag(&ldflags_obst, "-pg"); - } else if (streq(option, "pedantic") || - streq(option, "ansi")) { + } else if (streq(option, "ansi")) { + add_flag(&cppflags_obst, "-ansi"); + } else if (streq(option, "pedantic")) { fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg); } else if (strstart(option, "std=")) { const char *const o = &option[4]; @@ -1481,6 +1488,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] == '-') { @@ -1569,6 +1581,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; @@ -1656,14 +1670,13 @@ int main(int argc, char **argv) set_be_option("profileuse"); } - gen_firm_init(); init_symbol_table(); init_types_and_adjust(); init_typehash(); init_basic_types(); if (wchar_atomic_kind == ATOMIC_TYPE_INT) init_wchar_types(type_int); - else if (wchar_atomic_kind == ATOMIC_TYPE_SHORT) + else if (wchar_atomic_kind == ATOMIC_TYPE_USHORT) init_wchar_types(type_short); else panic("unexpected wchar type"); @@ -1940,18 +1953,25 @@ graph_built: } if (mode == CompileExportIR) { - fclose(out); - ir_export(outname); + ir_export_file(out); + if (ferror(out) != 0) { + fprintf(stderr, "Error while writing to output\n"); + return EXIT_FAILURE; + } return EXIT_SUCCESS; } - gen_firm_finish(asm_out, filename); + generate_code(asm_out, filename); if (asm_out != out) { fclose(asm_out); } } else if (filetype == FILETYPE_IR) { fclose(in); - ir_import(filename); + int res = ir_import(filename); + if (res != 0) { + fprintf(stderr, "Firm-Program import failed\n"); + return EXIT_FAILURE; + } goto graph_built; } else if (filetype == FILETYPE_PREPROCESSED_ASSEMBLER) { copy_file(asm_out, in); @@ -2055,6 +2075,7 @@ graph_built: obstack_free(&asflags_obst, NULL); obstack_free(&file_obst, NULL); + gen_firm_finish(); exit_mangle(); exit_ast2firm(); exit_parser();