diff options
| author | seyko <seyko2@gmail.com> | 2015-04-21 06:34:35 +0300 |
|---|---|---|
| committer | seyko <seyko2@gmail.com> | 2015-04-21 06:34:35 +0300 |
| commit | 0c8447db7970813292a8be74ee50e49091be5d15 (patch) | |
| tree | f1db257725c3ac9ddec1632473835a0e44d2d240 /tccpp.c | |
| parent | 5e8fb713c49cfad17d5fb78fb353d88b1ab86eb8 (diff) | |
| download | tinycc-0c8447db7970813292a8be74ee50e49091be5d15.tar.gz tinycc-0c8447db7970813292a8be74ee50e49091be5d15.tar.bz2 | |
* and #pragma pop_macro("macro_name")
* give warning if pragma is unknown for tcc
* don't free asm_label in sym_free(),
it's a job of the asm_free_labels().
The above pragmas are used in the mingw headers.
Thise pragmas are implemented in gcc-4.5+ and current
clang.
Diffstat (limited to 'tccpp.c')
| -rw-r--r-- | tccpp.c | 34 |
1 files changed, 34 insertions, 0 deletions
@@ -222,6 +222,7 @@ static TokenSym *tok_alloc_new(TokenSym **pts, const char *str, int len) table_ident[i] = ts; ts->tok = tok_ident++; ts->sym_define = NULL; + ts->sym_define_stack = NULL; ts->sym_label = NULL; ts->sym_struct = NULL; ts->sym_identifier = NULL; @@ -1446,6 +1447,39 @@ static void pragma_parse(TCCState *s1) } else { tcc_warning("#pragma comment(lib) is ignored"); } + } else if ((tok == TOK_push_macro) || (tok == TOK_pop_macro)) { + int push_macro = (tok == TOK_push_macro); + next(); + skip('('); + if (tok != TOK_STR) { + expect("\""); + } else { + int len = strlen((char *)tokc.cstr->data); + tcc_open_bf(s1, "<push_pop_macro>", len); + memcpy(file->buffer, tokc.cstr->data, len); + ch = file->buf_ptr[0]; + next_nomacro(); + if (tok >= TOK_IDENT) { + Sym *s = table_ident[tok - TOK_IDENT]->sym_define; + Sym *ss = table_ident[tok - TOK_IDENT]->sym_define_stack; + if (push_macro) { + if (s) { + s->prev_tok = ss; + table_ident[tok - TOK_IDENT]->sym_define_stack = s; + } + } else { + if (ss) { + table_ident[tok - TOK_IDENT]->sym_define = ss; + table_ident[tok - TOK_IDENT]->sym_define_stack = ss->prev_tok; + } + } + } + tcc_close(); + } + next(); + skip(')'); + } else { + tcc_warning("unknown #pragma %s", get_tok_str(tok, &tokc)); } } |
