aboutsummaryrefslogtreecommitdiff
path: root/tccpp.c
diff options
context:
space:
mode:
authorgrischka <grischka>2016-10-01 19:58:13 +0200
committergrischka <grischka>2016-10-01 19:58:13 +0200
commit07e47b3dd68d264a6223c1b74aa64d61a14ac240 (patch)
treef24ad396dc6f740fba335e28f82682fb8bf0d61b /tccpp.c
parentcf32bb8812583583f526ee0faf8c8f7d7799210c (diff)
downloadtinycc-07e47b3dd68d264a6223c1b74aa64d61a14ac240.tar.gz
tinycc-07e47b3dd68d264a6223c1b74aa64d61a14ac240.tar.bz2
tccpp: restore -D symbols for multiple sources
... also for built-in defines The case: $ tcc -D FOO a.c b.c with // a.c #undef FOO // b.c #ifndef FOO # error -D FOO has been lost #endif
Diffstat (limited to 'tccpp.c')
-rw-r--r--tccpp.c30
1 files changed, 16 insertions, 14 deletions
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 */