From 06e0753fce99d4b845c054ce343f49149522ff2c Mon Sep 17 00:00:00 2001 From: seyko Date: Tue, 12 May 2015 21:32:32 +0300 Subject: [PATCH] minor pp optimizations * remove free_defines() from tcc_preprocess() all cleanup will be done in tcc_delete * move a preprocessor file closing to tcc_delete too --- libtcc.c | 4 ++++ tcc.c | 26 +++++++++----------------- tccpp.c | 3 --- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/libtcc.c b/libtcc.c index d21beb4..1266baf 100644 --- a/libtcc.c +++ b/libtcc.c @@ -1217,6 +1217,10 @@ LIBTCCAPI void tcc_delete(TCCState *s1) tcc_cleanup(); + /* close a preprocessor output */ + if (s1->ppfp && s1->ppfp != stdout) + fclose(s1->ppfp); + /* free all sections */ for(i = 1; i < s1->nb_sections; i++) free_section(s1->sections[i]); diff --git a/tcc.c b/tcc.c index e499100..6e94f45 100644 --- a/tcc.c +++ b/tcc.c @@ -247,7 +247,6 @@ int main(int argc, char **argv) TCCState *s; int ret, optind, i, bench; int64_t start_time = 0; - const char *first_file = NULL; s = tcc_new(); @@ -286,7 +285,7 @@ int main(int argc, char **argv) tcc_error("cannot specify multiple files with -c and -o"); } } - + if (s->output_type == TCC_OUTPUT_PREPROCESS) { if (!s->outfile) { s->ppfp = stdout; @@ -315,17 +314,16 @@ int main(int argc, char **argv) } else { if (1 == s->verbose) printf("-> %s\n", filename); + if (!s->outfile) + s->outfile = default_outputfile(s, filename); if (tcc_add_file(s, filename, filetype) < 0) ret = 1; else if (s->output_type == TCC_OUTPUT_OBJ) { - if (!s->outfile) - s->outfile = default_outputfile(s, filename); ret = !!tcc_output_file(s, s->outfile); + if (s->gen_deps && !ret) + gen_makedeps(s, s->outfile, s->deps_outfile); if (!ret) { - /* dump collected dependencies */ - if (s->gen_deps) - gen_makedeps(s, s->outfile, s->deps_outfile); if ((i+1) < s->nb_files) { tcc_delete(s); s = tcc_new(); @@ -337,9 +335,6 @@ int main(int argc, char **argv) } } } - else - if (!first_file) - first_file = filename; } } @@ -354,14 +349,11 @@ int main(int argc, char **argv) tcc_error_noabort("-run is not available in a cross compiler"); ret = 1; #endif - } else if (s->output_type == TCC_OUTPUT_PREPROCESS) { - if (s->outfile) - fclose(s->ppfp); - } else if (s->output_type != TCC_OUTPUT_OBJ) { - if (!s->outfile) - s->outfile = default_outputfile(s, first_file); + } else + if (s->output_type == TCC_OUTPUT_EXE || + s->output_type == TCC_OUTPUT_DLL) + { ret = !!tcc_output_file(s, s->outfile); - /* dump collected dependencies */ if (s->gen_deps && !ret) gen_makedeps(s, s->outfile, s->deps_outfile); } diff --git a/tccpp.c b/tccpp.c index c71edf3..ac251c3 100644 --- a/tccpp.c +++ b/tccpp.c @@ -3332,12 +3332,10 @@ static void pp_line(TCCState *s1, BufferedFile *f, int level) /* Preprocess the current file */ ST_FUNC int tcc_preprocess(TCCState *s1) { - Sym *define_start; BufferedFile **iptr; int token_seen, spcs, level; preprocess_init(s1); - define_start = define_stack; ch = file->buf_ptr[0]; tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF; parse_flags = PARSE_FLAG_PREPROCESS @@ -3388,6 +3386,5 @@ ST_FUNC int tcc_preprocess(TCCState *s1) fputs(get_tok_str(tok, &tokc), s1->ppfp); } - free_defines(define_start); return 0; }