X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=1ba09182c82ef4658e05ee1818d0a28314405b1b;hb=fbbecedc55bd51ce80aded58b552c0b7d9defec0;hp=afa3b91e2de42d254103b66b04b2b44f423bb5ae;hpb=46ad84922f06042f0690fac8e6786116de10e580;p=cparser diff --git a/main.c b/main.c index afa3b91..1ba0918 100644 --- a/main.c +++ b/main.c @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -21,9 +22,10 @@ #include "parser.h" #include "ast2firm.h" #include "adt/error.h" +#include "write_fluffy.h" #ifndef PREPROCESSOR -#define PREPROCESSOR "cpp" +#define PREPROCESSOR "cpp -std=c99" #endif #ifndef LINKER @@ -36,16 +38,17 @@ #define pclose(file) _pclose(file) #endif /* _WIN32 */ -static int verbose; +static int verbose; +static bool do_dump; static const ir_settings_if_conv_t *if_conv_info = NULL; +static const backend_params *be_params = NULL; static void initialize_firm(void) { be_opt_register(); firm_init_options(NULL, 0, NULL); - const backend_params *be_params; firm_parameter_t params; memset(¶ms, 0, sizeof(params)); @@ -57,10 +60,12 @@ static void initialize_firm(void) /* initialize backend */ be_params = be_init(); - be_set_debug_retrieve(retrieve_dbg); + ir_set_debug_retrieve(retrieve_dbg); params.arch_op_settings = be_params->arch_op_settings; if_conv_info = be_params->if_conv_info; + (void) if_conv_info; /* avoid unused warning */ + /* intialize firm itself */ init_firm(¶ms); dbg_init(NULL, NULL, dbg_snprint); @@ -88,11 +93,9 @@ static void initialize_firm(void) static void dump(ir_graph *irg, const char *suffix) { -#if 0 - dump_ir_block_graph(irg, suffix); -#else - (void)irg, (void)suffix; -#endif + if(do_dump) { + dump_ir_block_graph(irg, suffix); + } } static void get_output_name(char *buf, size_t buflen, const char *inputname, @@ -167,11 +170,7 @@ static FILE* preprocess(const char *in) { char buf[4096]; -#ifdef _WIN32 - snprintf(buf, sizeof(buf), PREPROCESSOR " %s",in); -#else - snprintf(buf, sizeof(buf), PREPROCESSOR " %s -o -",in); -#endif + snprintf(buf, sizeof(buf), PREPROCESSOR " %s", in); if(verbose) { puts(buf); @@ -226,7 +225,17 @@ static void create_firm_prog(translation_unit_t *unit) dump(irg, "-start"); } + lower_params_t params; + + params.def_ptr_alignment = 4; + params.flags = LF_COMPOUND_RETURN | LF_RETURN_HIDDEN; + params.hidden_params = ADD_HIDDEN_ALWAYS_IN_FRONT; + params.find_pointer_type = NULL; + params.ret_compound_in_regs = NULL; + lower_calls_with_compounds(¶ms); + lower_highlevel(); + for(int i = 0; i < n_irgs; ++i) { ir_graph *const irg = get_irp_irg(i); dump(irg, "-lower"); @@ -244,9 +253,6 @@ static void optimize(void) optimize_funccalls(0); - const backend_params *const be_params = be_init(); - create_intrinsic_fkt *const arch_create_intrinsic = be_params->arch_create_intrinsic_fkt; - void *const create_intrinsic_ctx = be_params->create_intrinsic_ctx; lwrdw_param_t lwrdw_param = { 1, 1, @@ -255,9 +261,9 @@ static void optimize(void) def_create_intrinsic_fkt, NULL }; - if (arch_create_intrinsic) { - lwrdw_param.create_intrinsic = arch_create_intrinsic; - lwrdw_param.ctx = create_intrinsic_ctx; + if (be_params->arch_create_intrinsic_fkt) { + lwrdw_param.create_intrinsic = be_params->arch_create_intrinsic_fkt; + lwrdw_param.ctx = be_params->create_intrinsic_ctx; } for(int i = 0; i < get_irp_n_irgs(); ++i) { @@ -278,8 +284,6 @@ static void optimize(void) } } -void write_fluffy_decls(translation_unit_t *unit); - typedef enum compile_mode_t { Compile, CompileAssemble, @@ -300,9 +304,9 @@ int main(int argc, char **argv) init_symbol_table(); init_tokens(); - init_lexer(); init_types(); init_typehash(); + init_lexer(); init_ast(); init_parser(); init_ast2firm(); @@ -330,12 +334,45 @@ int main(int argc, char **argv) mode = PrintAst; } else if(strcmp(arg, "--print-fluffy") == 0) { mode = PrintFluffy; + } else if(strcmp(arg, "--dump") == 0) { + do_dump = true; } else if(strcmp(arg, "-v") == 0) { verbose = 1; + } else if(arg[0] == '-' && arg[1] == 'f') { + const char *opt = &arg[2]; + if(opt[0] == 0) { + ++i; + if(i >= argc) { + usage(argv[0]); + return 1; + } + opt = argv[i]; + if(opt[0] == '-') { + usage(argv[0]); + return 1; + } + } + //firm_option(opt); + } else if(arg[0] == '-' && arg[1] == 'b') { + const char *opt = &arg[2]; + if(opt[0] == 0) { + ++i; + if(i >= argc) { + usage(argv[0]); + return 1; + } + opt = argv[i]; + if(opt[0] == '-') { + usage(argv[0]); + return 1; + } + } + //firm_be_option(opt); } else if(arg[0] == '-') { if (arg[1] == 'D' || arg[1] == 'O' || - arg[1] == 'f') { + arg[1] == 'f' || + strncmp(arg + 1, "std=", 4) == 0) { fprintf(stderr, "Warning: Ignoring option '%s'\n", arg); } else { usage(argv[0]); @@ -411,9 +448,9 @@ int main(int argc, char **argv) exit_ast2firm(); exit_parser(); exit_ast(); + exit_lexer(); exit_typehash(); exit_types(); - exit_lexer(); exit_tokens(); exit_symbol_table(); return 0;