aboutsummaryrefslogtreecommitdiff
path: root/libtcc.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtcc.c')
-rw-r--r--libtcc.c63
1 files changed, 32 insertions, 31 deletions
diff --git a/libtcc.c b/libtcc.c
index 31961fa..bf4b1c6 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -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);
+}