mirror of
https://github.com/frida/tinycc
synced 2024-11-24 08:39:37 +03:00
enable multiple states and fix minor memory leaks
This commit is contained in:
parent
f22e961f80
commit
23594b6980
64
tcc.c
64
tcc.c
@ -390,6 +390,8 @@ static Sym *global_label_stack, *local_label_stack;
|
|||||||
/* symbol allocator */
|
/* symbol allocator */
|
||||||
#define SYM_POOL_NB (8192 / sizeof(Sym))
|
#define SYM_POOL_NB (8192 / sizeof(Sym))
|
||||||
static Sym *sym_free_first;
|
static Sym *sym_free_first;
|
||||||
|
static void **sym_pools;
|
||||||
|
static int nb_sym_pools;
|
||||||
|
|
||||||
static SValue vstack[VSTACK_SIZE], *vtop;
|
static SValue vstack[VSTACK_SIZE], *vtop;
|
||||||
/* some predefined types */
|
/* some predefined types */
|
||||||
@ -1118,6 +1120,7 @@ void set_pages_executable(void *ptr, unsigned long length)
|
|||||||
#ifdef MEM_DEBUG
|
#ifdef MEM_DEBUG
|
||||||
int mem_cur_size;
|
int mem_cur_size;
|
||||||
int mem_max_size;
|
int mem_max_size;
|
||||||
|
unsigned malloc_usable_size(void*);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void tcc_free(void *ptr)
|
static inline void tcc_free(void *ptr)
|
||||||
@ -1217,6 +1220,7 @@ static Sym *__sym_malloc(void)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
sym_pool = tcc_malloc(SYM_POOL_NB * sizeof(Sym));
|
sym_pool = tcc_malloc(SYM_POOL_NB * sizeof(Sym));
|
||||||
|
dynarray_add(&sym_pools, &nb_sym_pools, sym_pool);
|
||||||
|
|
||||||
last_sym = sym_free_first;
|
last_sym = sym_free_first;
|
||||||
sym = sym_pool;
|
sym = sym_pool;
|
||||||
@ -1279,6 +1283,10 @@ Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags)
|
|||||||
|
|
||||||
static void free_section(Section *s)
|
static void free_section(Section *s)
|
||||||
{
|
{
|
||||||
|
if (s->link && 0 == s->link->sh_num)
|
||||||
|
free_section(s->link);
|
||||||
|
if (s->hash && 0 == s->hash->sh_num)
|
||||||
|
s->hash->link = NULL, free_section(s->hash);
|
||||||
tcc_free(s->data);
|
tcc_free(s->data);
|
||||||
tcc_free(s);
|
tcc_free(s);
|
||||||
}
|
}
|
||||||
@ -9476,6 +9484,8 @@ static void preprocess_init(TCCState *s1)
|
|||||||
vtop = vstack - 1;
|
vtop = vstack - 1;
|
||||||
s1->pack_stack[0] = 0;
|
s1->pack_stack[0] = 0;
|
||||||
s1->pack_stack_ptr = s1->pack_stack;
|
s1->pack_stack_ptr = s1->pack_stack;
|
||||||
|
|
||||||
|
macro_ptr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* compile the C file opened in 'file'. Return non zero if errors. */
|
/* compile the C file opened in 'file'. Return non zero if errors. */
|
||||||
@ -9578,6 +9588,7 @@ static int tcc_compile(TCCState *s1)
|
|||||||
gen_inline_functions();
|
gen_inline_functions();
|
||||||
|
|
||||||
sym_pop(&global_stack, NULL);
|
sym_pop(&global_stack, NULL);
|
||||||
|
sym_pop(&local_stack, NULL);
|
||||||
|
|
||||||
return s1->nb_errors != 0 ? -1 : 0;
|
return s1->nb_errors != 0 ? -1 : 0;
|
||||||
}
|
}
|
||||||
@ -9637,9 +9648,8 @@ int tcc_compile_string(TCCState *s, const char *str)
|
|||||||
pstrcpy(bf->filename, sizeof(bf->filename), "<string>");
|
pstrcpy(bf->filename, sizeof(bf->filename), "<string>");
|
||||||
bf->line_num = 1;
|
bf->line_num = 1;
|
||||||
file = bf;
|
file = bf;
|
||||||
|
|
||||||
ret = tcc_compile(s);
|
ret = tcc_compile(s);
|
||||||
|
file = NULL;
|
||||||
tcc_free(buf);
|
tcc_free(buf);
|
||||||
|
|
||||||
/* currently, no need to close */
|
/* currently, no need to close */
|
||||||
@ -10053,6 +10063,38 @@ int tcc_run(TCCState *s1, int argc, char **argv)
|
|||||||
return (*prog_main)(argc, argv);
|
return (*prog_main)(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tcc_memstats(void)
|
||||||
|
{
|
||||||
|
#ifdef MEM_DEBUG
|
||||||
|
printf("memory in use: %d\n", mem_cur_size);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tcc_cleanup(void)
|
||||||
|
{
|
||||||
|
int i, n;
|
||||||
|
|
||||||
|
if (NULL == tcc_state)
|
||||||
|
return;
|
||||||
|
tcc_state = NULL;
|
||||||
|
|
||||||
|
/* free -D defines */
|
||||||
|
free_defines(NULL);
|
||||||
|
|
||||||
|
/* free tokens */
|
||||||
|
n = tok_ident - TOK_IDENT;
|
||||||
|
for(i = 0; i < n; i++)
|
||||||
|
tcc_free(table_ident[i]);
|
||||||
|
tcc_free(table_ident);
|
||||||
|
|
||||||
|
/* free sym_pools */
|
||||||
|
dynarray_reset(&sym_pools, &nb_sym_pools);
|
||||||
|
/* string buffer */
|
||||||
|
cstr_free(&tokcstr);
|
||||||
|
/* reset symbol stack */
|
||||||
|
sym_free_first = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
TCCState *tcc_new(void)
|
TCCState *tcc_new(void)
|
||||||
{
|
{
|
||||||
const char *p, *r;
|
const char *p, *r;
|
||||||
@ -10060,6 +10102,8 @@ TCCState *tcc_new(void)
|
|||||||
TokenSym *ts;
|
TokenSym *ts;
|
||||||
int i, c;
|
int i, c;
|
||||||
|
|
||||||
|
tcc_cleanup();
|
||||||
|
|
||||||
s = tcc_mallocz(sizeof(TCCState));
|
s = tcc_mallocz(sizeof(TCCState));
|
||||||
if (!s)
|
if (!s)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -10171,23 +10215,11 @@ TCCState *tcc_new(void)
|
|||||||
|
|
||||||
void tcc_delete(TCCState *s1)
|
void tcc_delete(TCCState *s1)
|
||||||
{
|
{
|
||||||
int i, n;
|
int i;
|
||||||
|
|
||||||
/* free -D defines */
|
tcc_cleanup();
|
||||||
free_defines(NULL);
|
|
||||||
|
|
||||||
/* free tokens */
|
|
||||||
n = tok_ident - TOK_IDENT;
|
|
||||||
for(i = 0; i < n; i++)
|
|
||||||
tcc_free(table_ident[i]);
|
|
||||||
tcc_free(table_ident);
|
|
||||||
|
|
||||||
/* free all sections */
|
/* free all sections */
|
||||||
|
|
||||||
free_section(symtab_section->hash);
|
|
||||||
|
|
||||||
free_section(s1->dynsymtab_section->hash);
|
|
||||||
free_section(s1->dynsymtab_section->link);
|
|
||||||
free_section(s1->dynsymtab_section);
|
free_section(s1->dynsymtab_section);
|
||||||
|
|
||||||
for(i = 1; i < s1->nb_sections; i++)
|
for(i = 1; i < s1->nb_sections; i++)
|
||||||
|
Loading…
Reference in New Issue
Block a user