From 4ef278be161e7934069442cf78ad0266464b8d91 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Mon, 12 Nov 2007 19:48:00 +0000 Subject: [PATCH] link output [r18374] --- main.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/main.c b/main.c index 6e2d636..a646523 100644 --- a/main.c +++ b/main.c @@ -15,6 +15,10 @@ #include "ast2firm.h" #include "adt/error.h" +#define LINKER "gcc" + +static int verbose; + static const ir_settings_if_conv_t *if_conv_info = NULL; static void initialize_firm(void) @@ -70,6 +74,11 @@ static void initialize_firm(void) dump_consts_local(1); } +static void dump(const char *suffix) +{ + dump_ir_block_graph(current_ir_graph, suffix); +} + static void get_output_name(char *buf, size_t buflen, const char *inputname, const char *newext) { @@ -143,17 +152,37 @@ static void backend(const char *inputname, const char *outname) fclose(out); } -static void emit(const char *input_name) +static void emit(const char *input_name, const char *out_name) { - char outfname[4096]; + backend(input_name, out_name); +} + +static void link(const char *in, const char *out) +{ + char buf[4096]; - get_output_name(outfname, sizeof(outfname), input_name, ".s"); - backend(input_name, outfname); + snprintf(buf, sizeof(buf), "%s %s -o %s", LINKER, in, out); + if(verbose) { + puts(buf); + } + int err = system(buf); + if(err != 0) { + fprintf(stderr, "linker reported an error\n"); + exit(1); + } } + + static void create_firm_prog(translation_unit_t *unit) { translation_unit_to_firm(unit); + + int n_irgs = get_irp_n_irgs(); + for(int i = 0; i < n_irgs; ++i) { + current_ir_graph = get_irp_irg(i); + dump("-start"); + } } void write_fluffy_decls(translation_unit_t *unit); @@ -191,9 +220,15 @@ int main(int argc, char **argv) } for(int i = 1; i < argc; ++i) { - translation_unit_t *unit = do_parsing(argv[i]); + const char *input = argv[i]; + char outfname[4096]; + + get_output_name(outfname, sizeof(outfname), input, ".s"); + + translation_unit_t *unit = do_parsing(input); create_firm_prog(unit); - emit(argv[i]); + emit(input, outfname); + link(outfname, "a.out"); } exit_ast2firm(); -- 2.20.1