mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 18:44:20 +08:00
More checks for valid labels
This commit is contained in:
parent
3f7de0e75e
commit
204cd129d1
@ -1,3 +1,7 @@
|
||||
2003-04-23 H.J. Lu <hjl@gnu.org>
|
||||
|
||||
* app.c (do_scrub_chars): More checks for valid labels.
|
||||
|
||||
2003-04-22 H.J. Lu <hjl@gnu.org>
|
||||
|
||||
* app.c (do_scrub_chars): Check for valid label.
|
||||
|
82
gas/app.c
82
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
|
||||
# <number> <filename> <garbage> into a .line <number>\n.file <filename>
|
||||
@ -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 */
|
||||
|
@ -1,3 +1,8 @@
|
||||
2003-04-23 H.J. Lu <hjl@gnu.org>
|
||||
|
||||
* gas/ia64/opc-i.s: Add testcases for valid label.
|
||||
* gas/ia64/opc-i.d: Updated.
|
||||
|
||||
2003-04-10 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* gas/mips/elf-rel-got-n32.d, gas/mips/elf-rel-got-n32.s,
|
||||
|
@ -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;;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user