From 204cd129d1c24b926d8194422b8621ca48134b46 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 23 Apr 2003 17:51:42 +0000 Subject: [PATCH] More checks for valid labels --- gas/ChangeLog | 4 ++ gas/app.c | 82 +++++++++++++++------------------- gas/testsuite/ChangeLog | 5 +++ gas/testsuite/gas/ia64/opc-i.d | 18 ++++++-- gas/testsuite/gas/ia64/opc-i.s | 8 ++++ 5 files changed, 69 insertions(+), 48 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index f65f9508b6..efa436250c 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,7 @@ +2003-04-23 H.J. Lu + + * app.c (do_scrub_chars): More checks for valid labels. + 2003-04-22 H.J. Lu * app.c (do_scrub_chars): Check for valid label. diff --git a/gas/app.c b/gas/app.c index cbde88b8a6..57bc8083ee 100644 --- a/gas/app.c +++ b/gas/app.c @@ -20,7 +20,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* Modified by Allen Wirfs-Brock, Instantiations Inc 2/90 */ +/* Modified by Allen Wirfs-Brock, Instantiations Inc 2/90. */ /* App, the assembler pre-processor. This pre-processor strips out excess spaces, turns single-quoted characters into a decimal constant, and turns # into a .line \n.file @@ -115,7 +115,7 @@ do_scrub_begin (m68k_mri) lex['"'] = LEX_IS_STRINGQUOTE; #if ! defined (TC_HPPA) && ! defined (TC_I370) - /* I370 uses single-quotes to delimit integer, float constants */ + /* I370 uses single-quotes to delimit integer, float constants. */ lex['\''] = LEX_IS_ONECHAR_QUOTE; #endif @@ -130,9 +130,7 @@ do_scrub_begin (m68k_mri) /* Note that these override the previous defaults, e.g. if ';' is a comment char, then it isn't a line separator. */ for (p = symbol_chars; *p; ++p) - { - lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT; - } /* declare symbol characters */ + lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT; for (c = 128; c < 256; ++c) lex[c] = LEX_IS_SYMBOL_COMPONENT; @@ -152,35 +150,25 @@ do_scrub_begin (m68k_mri) #define tc_comment_chars comment_chars #endif for (p = tc_comment_chars; *p; p++) - { - lex[(unsigned char) *p] = LEX_IS_COMMENT_START; - } /* declare comment chars */ + lex[(unsigned char) *p] = LEX_IS_COMMENT_START; for (p = line_comment_chars; *p; p++) - { - lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START; - } /* declare line comment chars */ + lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START; for (p = line_separator_chars; *p; p++) - { - lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR; - } /* declare line separators */ + lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR; #ifdef tc_parallel_separator_chars /* This macro permits the processor to specify all characters which separate parallel insns on the same line. */ for (p = tc_parallel_separator_chars; *p; p++) - { - lex[(unsigned char) *p] = LEX_IS_PARALLEL_SEPARATOR; - } /* declare parallel separators */ + lex[(unsigned char) *p] = LEX_IS_PARALLEL_SEPARATOR; #endif /* Only allow slash-star comments if slash is not in use. FIXME: This isn't right. We should always permit them. */ if (lex['/'] == 0) - { - lex['/'] = LEX_IS_TWOCHAR_COMMENT_1ST; - } + lex['/'] = LEX_IS_TWOCHAR_COMMENT_1ST; #ifdef TC_M68K if (m68k_mri) @@ -201,12 +189,12 @@ do_scrub_begin (m68k_mri) lex['|'] = LEX_IS_DOUBLEBAR_1ST; #endif #ifdef TC_D30V - /* must do this is we want VLIW instruction with "->" or "<-" */ + /* Must do this is we want VLIW instruction with "->" or "<-". */ lex['-'] = LEX_IS_SYMBOL_COMPONENT; #endif -} /* do_scrub_begin() */ +} -/* Saved state of the scrubber */ +/* Saved state of the scrubber. */ static int state; static int old_state; static char *out_string; @@ -223,7 +211,8 @@ static char mri_last_ch; state at the time .include is interpreted is completely unrelated. That's why we have to save it all. */ -struct app_save { +struct app_save +{ int state; int old_state; char * out_string; @@ -309,10 +298,11 @@ app_pop (arg) #endif free (arg); -} /* app_pop() */ +} /* @@ This assumes that \n &c are the same on host and target. This is not necessarily true. */ + static int process_escape (ch) int ch; @@ -588,8 +578,7 @@ do_scrub_chars (get, tostart, tolen) else if (scrub_m68k_mri && ch == '\n') { /* Just quietly terminate the string. This permits lines like - bne label loop if we haven't reach end yet - */ + bne label loop if we haven't reach end yet. */ state = old_state; UNGET (ch); PUT ('\''); @@ -680,7 +669,7 @@ do_scrub_chars (get, tostart, tolen) #endif } - /* OK, we are somewhere in states 0 through 4 or 9 through 11 */ + /* OK, we are somewhere in states 0 through 4 or 9 through 11. */ /* flushchar: */ ch = GET (); @@ -965,7 +954,7 @@ do_scrub_chars (get, tostart, tolen) case LEX_IS_STRINGQUOTE: if (state == 10) { - /* Preserve the whitespace in foo "bar" */ + /* Preserve the whitespace in foo "bar". */ UNGET (ch); state = 3; PUT (' '); @@ -987,7 +976,7 @@ do_scrub_chars (get, tostart, tolen) case LEX_IS_ONECHAR_QUOTE: if (state == 10) { - /* Preserve the whitespace in foo 'b' */ + /* Preserve the whitespace in foo 'b'. */ UNGET (ch); state = 3; PUT (' '); @@ -1082,10 +1071,10 @@ do_scrub_chars (get, tostart, tolen) ch = GET (); } while (ch != EOF && ch != '\n'); + if (ch == EOF) - { - as_warn (_("end of file in comment; newline inserted")); - } + as_warn (_("end of file in comment; newline inserted")); + state = 0; PUT ('\n'); break; @@ -1095,9 +1084,8 @@ do_scrub_chars (get, tostart, tolen) ch2 = GET (); UNGET (ch2); if (ch2 != '|') - { - goto de_fault; - } + goto de_fault; + /* Handle '||' in two states as invoking PUT twice might result in the first one jumping out of this loop. We'd then lose track of the state and one '|' char. */ @@ -1123,7 +1111,7 @@ do_scrub_chars (get, tostart, tolen) { UNGET (ch2); } - } /* bad hack */ + } if (state == 0 || state == 1) /* Only comment at start of line. */ { @@ -1136,12 +1124,14 @@ do_scrub_chars (get, tostart, tolen) ch = GET (); } while (ch != EOF && IS_WHITESPACE (ch)); + if (ch == EOF) { as_warn (_("end of file in comment; newline inserted")); PUT ('\n'); break; } + if (ch < '0' || ch > '9' || state != 0 || startch != '#') { /* Not a cpp line. */ @@ -1255,15 +1245,17 @@ do_scrub_chars (get, tostart, tolen) && type != LEX_IS_SYMBOL_COMPONENT) break; } + if (s > from) - { - /* Handle the last character normally, for - simplicity. */ - --s; - } + /* Handle the last character normally, for + simplicity. */ + --s; + len = s - from; + if (len > (toend - to) - 1) len = (toend - to) - 1; + if (len > 0) { PUT (ch); @@ -1298,11 +1290,12 @@ do_scrub_chars (get, tostart, tolen) if (state == 0) { if (IS_SYMBOL_COMPONENT (ch)) - state = 11; /* Now seeing label definition */ + state = 11; /* Now seeing label definition. */ } else if (state == 1) { - state = 2; /* Ditto */ + if (IS_SYMBOL_COMPONENT (ch)) + state = 2; /* Ditto. */ } else if (state == 9) { @@ -1355,4 +1348,3 @@ do_scrub_chars (get, tostart, tolen) return to - tostart; } -/* end of app.c */ diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 1459bd39cc..04f98451a7 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-04-23 H.J. Lu + + * gas/ia64/opc-i.s: Add testcases for valid label. + * gas/ia64/opc-i.d: Updated. + 2003-04-10 Alexandre Oliva * gas/mips/elf-rel-got-n32.d, gas/mips/elf-rel-got-n32.s, diff --git a/gas/testsuite/gas/ia64/opc-i.d b/gas/testsuite/gas/ia64/opc-i.d index 9c3d92167d..cdbfab8d89 100644 --- a/gas/testsuite/gas/ia64/opc-i.d +++ b/gas/testsuite/gas/ia64/opc-i.d @@ -246,6 +246,18 @@ Disassembly of section \.text: a70: 00 00 00 80 01 00 \[MII\] hint\.m 0x0 a76: 00 00 00 03 00 00 hint\.i 0x0 a7c: 00 00 06 00 hint\.i 0x0 - a80: 0d 00 00 00 01 00 \[MFI\] nop\.m 0x0 - a86: 00 00 00 02 00 e0 nop\.f 0x0 - a8c: ff ff 07 08 hint\.i 0x1fffff;; + a80: 00 00 00 00 01 00 \[MII\] nop\.m 0x0 + a86: f0 ff ff 03 84 03 hint\.i 0x1fffff + a8c: 00 00 06 00 \(p07\) hint\.i 0x0 + a90: 00 00 00 00 01 c0 \[MII\] nop\.m 0x0 + a96: 01 00 00 03 80 03 \(p07\) hint\.i 0x0 + a9c: 00 00 06 00 \(p07\) hint\.i 0x0 + aa0: 00 00 00 00 01 c0 \[MII\] nop\.m 0x0 + aa6: f1 ff ff 03 84 03 \(p07\) hint\.i 0x1fffff + aac: 00 00 06 00 \(p07\) hint\.i 0x0 + ab0: 00 00 00 00 01 c0 \[MII\] nop\.m 0x0 + ab6: 01 00 00 03 80 03 \(p07\) hint\.i 0x0 + abc: 00 00 06 00 \(p07\) hint\.i 0x0 + ac0: 0d 00 00 00 01 00 \[MFI\] nop\.m 0x0 + ac6: 00 00 00 02 80 e3 nop\.f 0x0 + acc: ff ff 07 08 \(p07\) hint\.i 0x1fffff;; diff --git a/gas/testsuite/gas/ia64/opc-i.s b/gas/testsuite/gas/ia64/opc-i.s index d06c2c0a13..09b820e92b 100644 --- a/gas/testsuite/gas/ia64/opc-i.s +++ b/gas/testsuite/gas/ia64/opc-i.s @@ -212,3 +212,11 @@ _start: hint.i 0 hint.i @pause hint.i 0x1fffff +(p7) hint @pause +(p7) hint.i 0 +(p7) hint.i @pause +(p7) hint.i 0x1fffff + (p7) hint @pause + (p7) hint.i 0 + (p7) hint.i @pause + (p7) hint.i 0x1fffff