diff options
Diffstat (limited to 'libtcc.c')
| -rw-r--r-- | libtcc.c | 63 |
1 files changed, 32 insertions, 31 deletions
@@ -20,6 +20,10 @@ #include "tcc.h" +/* display benchmark infos */ +int total_lines; +int total_bytes; + /* parser */ static struct BufferedFile *file; static int ch, tok; @@ -93,19 +97,6 @@ static SValue vstack[VSTACK_SIZE], *vtop; /* some predefined types */ static CType char_pointer_type, func_old_type, int_type; -/* display some information during compilation */ -static int verbose = 0; - -/* compile with debug symbol (and use them if error during execution) */ -static int do_debug = 0; - -/* compile with built-in memory and bounds checker */ -static int do_bounds_check = 0; - -/* display benchmark infos */ -static int total_lines; -static int total_bytes; - /* use GNU C extensions */ static int gnu_ext = 1; @@ -114,17 +105,13 @@ static int tcc_ext = 1; /* max number of callers shown if error */ #ifdef CONFIG_TCC_BACKTRACE -static int num_callers = 6; -static const char **rt_bound_error_msg; +int num_callers = 6; +const char **rt_bound_error_msg; #endif /* XXX: get rid of this ASAP */ static struct TCCState *tcc_state; -/* give the path of the tcc libraries */ -static const char *tcc_lib_path = CONFIG_TCCDIR; - - #ifdef TCC_TARGET_I386 #include "i386-gen.c" #endif @@ -564,7 +551,7 @@ static void put_extern_sym2(Sym *sym, Section *section, if (!sym->c) { name = get_tok_str(sym->v, NULL); #ifdef CONFIG_TCC_BCHECK - if (do_bounds_check) { + if (tcc_state->do_bounds_check) { char buf[32]; /* XXX: avoid doing that for statics ? */ @@ -989,7 +976,7 @@ BufferedFile *tcc_open(TCCState *s1, const char *filename) fd = 0, filename = "stdin"; else fd = open(filename, O_RDONLY | O_BINARY); - if ((verbose == 2 && fd >= 0) || verbose == 3) + if ((s1->verbose == 2 && fd >= 0) || s1->verbose == 3) printf("%s %*s%s\n", fd < 0 ? "nf":"->", (s1->include_stack_ptr - s1->include_stack), "", filename); if (fd < 0) @@ -1039,7 +1026,7 @@ static int tcc_compile(TCCState *s1) /* file info: full path + filename */ section_sym = 0; /* avoid warning */ - if (do_debug) { + if (s1->do_debug) { section_sym = put_elf_sym(symtab_section, 0, 0, ELFW(ST_INFO)(STB_LOCAL, STT_SECTION), 0, text_section->sh_num, NULL); @@ -1108,7 +1095,7 @@ static int tcc_compile(TCCState *s1) expect("declaration"); /* end of translation unit info */ - if (do_debug) { + if (s1->do_debug) { put_stabs_r(NULL, N_SO, 0, 0, text_section->data_offset, text_section, section_sym); } @@ -1579,7 +1566,7 @@ int tcc_run(TCCState *s1, int argc, char **argv) prog_main = tcc_get_symbol_err(s1, "main"); - if (do_debug) { + if (s1->do_debug) { #ifdef CONFIG_TCC_BACKTRACE struct sigaction sigact; /* install TCC signal handlers to print debug info on fatal @@ -1598,7 +1585,7 @@ int tcc_run(TCCState *s1, int argc, char **argv) } #ifdef CONFIG_TCC_BCHECK - if (do_bounds_check) { + if (s1->do_bounds_check) { void (*bound_init)(void); /* set error function */ @@ -1659,6 +1646,7 @@ TCCState *tcc_new(void) return NULL; tcc_state = s; s->output_type = TCC_OUTPUT_MEMORY; + s->tcc_lib_path = CONFIG_TCCDIR; preprocess_new(); @@ -1995,17 +1983,17 @@ int tcc_set_output_type(TCCState *s, int output_type) tcc_add_sysinclude_path(s, CONFIG_SYSROOT "/usr/local/include"); tcc_add_sysinclude_path(s, CONFIG_SYSROOT "/usr/include"); #endif - snprintf(buf, sizeof(buf), "%s/include", tcc_lib_path); + snprintf(buf, sizeof(buf), "%s/include", s->tcc_lib_path); tcc_add_sysinclude_path(s, buf); #ifdef TCC_TARGET_PE - snprintf(buf, sizeof(buf), "%s/include/winapi", tcc_lib_path); + snprintf(buf, sizeof(buf), "%s/include/winapi", s->tcc_lib_path); tcc_add_sysinclude_path(s, buf); #endif } /* if bound checking, then add corresponding sections */ #ifdef CONFIG_TCC_BCHECK - if (do_bounds_check) { + if (s->do_bounds_check) { /* define symbol */ tcc_define_symbol(s, "__BOUNDS_CHECKING_ON", NULL); /* create bounds sections */ @@ -2021,7 +2009,7 @@ int tcc_set_output_type(TCCState *s, int output_type) } /* add debug sections */ - if (do_debug) { + if (s->do_debug) { /* stab symbols */ stab_section = new_section(s, ".stab", SHT_PROGBITS, 0); stab_section->sh_entsize = sizeof(Stab_Sym); @@ -2043,7 +2031,7 @@ int tcc_set_output_type(TCCState *s, int output_type) #endif #ifdef TCC_TARGET_PE - snprintf(buf, sizeof(buf), "%s/lib", tcc_lib_path); + snprintf(buf, sizeof(buf), "%s/lib", s->tcc_lib_path); tcc_add_library_path(s, buf); #endif @@ -2127,6 +2115,19 @@ int tcc_set_flag(TCCState *s, const char *flag_name, int value) /* set CONFIG_TCCDIR at runtime */ void tcc_set_lib_path(TCCState *s, const char *path) { - tcc_lib_path = tcc_strdup(path); + s->tcc_lib_path = tcc_strdup(path); } +LIBTCCAPI void print_stats(TCCState *s, int64_t total_time) +{ + double tt; + tt = (double)total_time / 1000000.0; + if (tt < 0.001) + tt = 0.001; + if (total_bytes < 1) + total_bytes = 1; + printf("%d idents, %d lines, %d bytes, %0.3f s, %d lines/s, %0.1f MB/s\n", + tok_ident - TOK_IDENT, total_lines, total_bytes, + tt, (int)(total_lines / tt), + total_bytes / tt / 1000000.0); +} |
