mirror of
https://github.com/mirror/tinycc.git
synced 2024-12-28 04:00:06 +08:00
* 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.
This commit is contained in:
parent
5e8fb713c4
commit
0c8447db79
1
tcc.h
1
tcc.h
@ -326,6 +326,7 @@
|
||||
typedef struct TokenSym {
|
||||
struct TokenSym *hash_next;
|
||||
struct Sym *sym_define; /* direct pointer to define */
|
||||
struct Sym *sym_define_stack; /* direct pointer to a push_macro stack */
|
||||
struct Sym *sym_label; /* direct pointer to label */
|
||||
struct Sym *sym_struct; /* direct pointer to structure */
|
||||
struct Sym *sym_identifier; /* direct pointer to identifier */
|
||||
|
5
tccasm.c
5
tccasm.c
@ -292,7 +292,7 @@ static void asm_free_labels(TCCState *st)
|
||||
{
|
||||
Sym *s, *s1;
|
||||
Section *sec;
|
||||
|
||||
|
||||
for(s = st->asm_labels; s != NULL; s = s1) {
|
||||
s1 = s->prev;
|
||||
/* define symbol value in object file */
|
||||
@ -305,6 +305,9 @@ static void asm_free_labels(TCCState *st)
|
||||
}
|
||||
/* remove label */
|
||||
table_ident[s->v - TOK_IDENT]->sym_label = NULL;
|
||||
if (s->asm_label) {
|
||||
tcc_free(s->asm_label);
|
||||
}
|
||||
sym_free(s);
|
||||
}
|
||||
st->asm_labels = NULL;
|
||||
|
1
tccgen.c
1
tccgen.c
@ -152,7 +152,6 @@ static inline Sym *sym_malloc(void)
|
||||
ST_INLN void sym_free(Sym *sym)
|
||||
{
|
||||
sym->next = sym_free_first;
|
||||
tcc_free(sym->asm_label);
|
||||
sym_free_first = sym;
|
||||
}
|
||||
|
||||
|
34
tccpp.c
34
tccpp.c
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
2
tcctok.h
2
tcctok.h
@ -155,6 +155,8 @@
|
||||
#endif
|
||||
DEF(TOK_comment, "comment")
|
||||
DEF(TOK_lib, "lib")
|
||||
DEF(TOK_push_macro, "push_macro")
|
||||
DEF(TOK_pop_macro, "pop_macro")
|
||||
|
||||
/* builtin functions or variables */
|
||||
#ifndef TCC_ARM_EABI
|
||||
|
23
tests/tests2/77_push_pop_macro.c
Normal file
23
tests/tests2/77_push_pop_macro.c
Normal file
@ -0,0 +1,23 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
#define abort "111"
|
||||
printf("abort = %s\n", abort);
|
||||
|
||||
#pragma push_macro("abort")
|
||||
#undef abort
|
||||
#define abort "222"
|
||||
printf("abort = %s\n", abort);
|
||||
|
||||
#pragma push_macro("abort")
|
||||
#undef abort
|
||||
#define abort "333"
|
||||
printf("abort = %s\n", abort);
|
||||
|
||||
#pragma pop_macro("abort")
|
||||
printf("abort = %s\n", abort);
|
||||
|
||||
#pragma pop_macro("abort")
|
||||
printf("abort = %s\n", abort);
|
||||
}
|
5
tests/tests2/77_push_pop_macro.expect
Normal file
5
tests/tests2/77_push_pop_macro.expect
Normal file
@ -0,0 +1,5 @@
|
||||
abort = 111
|
||||
abort = 222
|
||||
abort = 333
|
||||
abort = 222
|
||||
abort = 111
|
@ -95,7 +95,8 @@ TESTS = \
|
||||
73_arm64.test \
|
||||
74_nocode_wanted.test \
|
||||
75_array_in_struct_init.test \
|
||||
76_dollars_in_identifiers.test
|
||||
76_dollars_in_identifiers.test \
|
||||
77_push_pop_macro.test
|
||||
|
||||
# 34_array_assignment.test -- array assignment is not in C standard
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user