From 5ce2154c74d770b4e4c1fb0868f744418a90df80 Mon Sep 17 00:00:00 2001 From: seyko Date: Mon, 20 Apr 2015 03:44:08 +0300 Subject: [PATCH] -fdollar-in-identifiers addon * disable a -fdollar-in-identifiers option in assembler files * a test is added This is a patch addon from Daniel Holden. --- tccasm.c | 2 +- tccpp.c | 18 +++++++++++------- tests/Makefile | 2 +- tests/tests2/Makefile | 12 ++++++++---- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/tccasm.c b/tccasm.c index d9c929c..3fa6f07 100644 --- a/tccasm.c +++ b/tccasm.c @@ -747,7 +747,7 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess) ch = file->buf_ptr[0]; tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF; - parse_flags = PARSE_FLAG_ASM_COMMENTS; + parse_flags = PARSE_FLAG_ASM_COMMENTS | PARSE_FLAG_ASM_FILE; if (do_preprocess) parse_flags |= PARSE_FLAG_PREPROCESS; next(); diff --git a/tccpp.c b/tccpp.c index b0f4102..42ebf48 100644 --- a/tccpp.c +++ b/tccpp.c @@ -2313,9 +2313,11 @@ maybe_newline: } break; - /* treat $ as allowed char in indentifier */ - case '$': if (!tcc_state->dollars_in_identifiers) goto parse_simple; - + /* dollar is allowed to start identifiers when not parsing asm */ + case '$': + if (!tcc_state->dollars_in_identifiers + || (parse_flags & PARSE_FLAG_ASM_FILE)) goto parse_simple; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': @@ -2338,7 +2340,8 @@ maybe_newline: p++; for(;;) { c = *p; - if (!isidnum_table[c-CH_EOF]) + if (!isidnum_table[c-CH_EOF] + && (tcc_state->dollars_in_identifiers ? (c != '$') : 1)) break; h = TOK_HASH_FUNC(h, c); p++; @@ -2373,7 +2376,8 @@ maybe_newline: p--; PEEKC(c, p); parse_ident_slow: - while (isidnum_table[c-CH_EOF]) { + while (isidnum_table[c-CH_EOF] + || (tcc_state->dollars_in_identifiers ? (c == '$') : 0)) { cstr_ccat(&tokcstr, c); PEEKC(c, p); } @@ -3202,9 +3206,9 @@ ST_FUNC void preprocess_new(void) const char *p, *r; /* init isid table */ + for(i=CH_EOF;i<256;i++) - isidnum_table[i-CH_EOF] = (isid(i) || isnum(i) || - (tcc_state->dollars_in_identifiers ? i == '$' : 0)); + isidnum_table[i-CH_EOF] = isid(i) || isnum(i); /* add all tokens */ if (table_ident) { diff --git a/tests/Makefile b/tests/Makefile index bc68de0..98ccb1e 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -199,7 +199,7 @@ ex%: $(top_srcdir)/examples/ex%.c # tiny assembler testing asmtest.ref: asmtest.S - $(CC) -Wa,-W -o asmtest.ref.o -c asmtest.S + $(CC) -m32 -Wa,-W -o asmtest.ref.o -c asmtest.S objdump -D asmtest.ref.o > asmtest.ref asmtest: asmtest.ref diff --git a/tests/tests2/Makefile b/tests/tests2/Makefile index 35ab3c1..a5a18fb 100644 --- a/tests/tests2/Makefile +++ b/tests/tests2/Makefile @@ -94,8 +94,8 @@ TESTS = \ 72_long_long_constant.test \ 73_arm64.test \ 74_nocode_wanted.test \ - 75_array_in_struct_init.test - + 75_array_in_struct_init.test \ + 76_dollars_in_identifiers.test # 34_array_assignment.test -- array assignment is not in C standard @@ -121,15 +121,19 @@ ARGS = 31_args.test : ARGS = arg1 arg2 arg3 arg4 arg5 46_grep.test : ARGS = '[^* ]*[:a:d: ]+\:\*-/: $$' 46_grep.c +# Some tests might need different flags +FLAGS = +76_dollars_in_identifiers.test : FLAGS = -fdollars-in-identifiers + all test: $(filter-out $(SKIP),$(TESTS)) %.test: %.c @echo Test: $*... - @$(TCC) -run $< $(ARGS) 2>&1 | grep -v 'warning: soft float ABI currently not supported: default to softfp' >$*.output || true + @$(TCC) -run $(FLAGS) $< $(ARGS) 2>&1 | grep -v 'warning: soft float ABI currently not supported: default to softfp' >$*.output || true @diff -Nbu $*.expect $*.output && rm -f $*.output - @($(TCC) $< -o $*.exe && ./$*.exe $(ARGS)) 2>&1 | grep -v 'warning: soft float ABI currently not supported: default to softfp' >$*.output2 || true + @($(TCC) $(FLAGS) $< -o $*.exe && ./$*.exe $(ARGS)) 2>&1 | grep -v 'warning: soft float ABI currently not supported: default to softfp' >$*.output2 || true @diff -Nbu $*.expect $*.output2 && rm -f $*.output2 $*.exe clean: