Identifiers can start and/or contain '.' in *.S
modified version of the old one which don't allow '.'
in #define Identifiers. This allow correctly preprocess
the following code in *.S
#define SRC(y...) \
9999: y; \
.section __ex_table, "a"; \
.long 9999b, 6001f ; \
// .previous
SRC(1: movw (%esi), %bx)
6001:
A test included.
This commit is contained in:
12
tccpp.c
12
tccpp.c
@ -1328,6 +1328,8 @@ ST_FUNC void parse_define(void)
|
||||
parse_flags |= PARSE_FLAG_SPACES;
|
||||
next_nomacro_spc();
|
||||
if (tok == '(') {
|
||||
/* must be able to parse TOK_DOTS (in asm mode '.' can be part of identifier) */
|
||||
parse_flags &= ~PARSE_FLAG_ASM_FILE;
|
||||
next_nomacro();
|
||||
ps = &first;
|
||||
if (tok != ')') for (;;) {
|
||||
@ -1355,6 +1357,7 @@ ST_FUNC void parse_define(void)
|
||||
}
|
||||
next_nomacro_spc();
|
||||
t = MACRO_FUNC;
|
||||
parse_flags |= (saved_parse_flags & PARSE_FLAG_ASM_FILE);
|
||||
}
|
||||
tok_str_new(&str);
|
||||
spc = 2;
|
||||
@ -2460,7 +2463,8 @@ maybe_newline:
|
||||
p1 = p;
|
||||
h = TOK_HASH_INIT;
|
||||
h = TOK_HASH_FUNC(h, c);
|
||||
while (c = *++p, isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM))
|
||||
while (c = *++p, (isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM))
|
||||
|| (c == '.' && (parse_flags & PARSE_FLAG_ASM_FILE)))
|
||||
h = TOK_HASH_FUNC(h, c);
|
||||
if (c != '\\') {
|
||||
TokenSym **pts;
|
||||
@ -2492,7 +2496,9 @@ maybe_newline:
|
||||
p--;
|
||||
PEEKC(c, p);
|
||||
parse_ident_slow:
|
||||
while (isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM)) {
|
||||
while ((isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM))
|
||||
|| (c == '.' && (parse_flags & PARSE_FLAG_ASM_FILE)))
|
||||
{
|
||||
cstr_ccat(&tokcstr, c);
|
||||
PEEKC(c, p);
|
||||
}
|
||||
@ -2551,7 +2557,7 @@ maybe_newline:
|
||||
cstr_reset(&tokcstr);
|
||||
cstr_ccat(&tokcstr, '.');
|
||||
goto parse_num;
|
||||
} else if ((isidnum_table['.' - CH_EOF] & IS_ID) != 0) { /* asm mode */
|
||||
} else if (parse_flags & PARSE_FLAG_ASM_FILE) {
|
||||
*--p = c = '.';
|
||||
goto parse_ident_fast;
|
||||
} else if (c == '.') {
|
||||
|
||||
Reference in New Issue
Block a user