diff --git a/libtcc.c b/libtcc.c index de8b1f6..dbbc01f 100644 --- a/libtcc.c +++ b/libtcc.c @@ -964,8 +964,8 @@ static int tcc_compile(TCCState *s1) decl(VT_CONST); if (tok != TOK_EOF) expect("declaration"); + gen_inline_functions(); check_vstack(); - /* end of translation unit info */ if (s1->do_debug) { put_stabs_r(NULL, N_SO, 0, 0, @@ -974,16 +974,10 @@ static int tcc_compile(TCCState *s1) } s1->error_set_jmp_enabled = 0; - - /* reset define stack, but leave -Dsymbols (may be incorrect if - they are undefined) */ + /* reset define stack, but keep -D and built-ins */ free_defines(define_start); - - gen_inline_functions(); - sym_pop(&global_stack, NULL); sym_pop(&local_stack, NULL); - return s1->nb_errors != 0 ? -1 : 0; } diff --git a/tccpp.c b/tccpp.c index bd049c1..88f3b47 100644 --- a/tccpp.c +++ b/tccpp.c @@ -1282,22 +1282,24 @@ ST_INLN Sym *define_find(int v) /* free define stack until top reaches 'b' */ ST_FUNC void free_defines(Sym *b) { - Sym *top, *top1; - int v; - - top = define_stack; - while (top != b) { - top1 = top->prev; - /* do not free args or predefined defines */ - if (top->d) - tok_str_free(top->d); - v = top->v; - if (v >= TOK_IDENT && v < tok_ident) - table_ident[v - TOK_IDENT]->sym_define = NULL; + while (define_stack != b) { + Sym *top = define_stack; + define_stack = top->prev; + tok_str_free(top->d); + define_undef(top); sym_free(top); - top = top1; } - define_stack = b; + + /* restore remaining (-D or predefined) symbols */ + while (b) { + int v = b->v; + if (v >= TOK_IDENT && v < tok_ident) { + Sym **d = &table_ident[v - TOK_IDENT]->sym_define; + if (!*d) + *d = b; + } + b = b->prev; + } } /* label lookup */