projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Update thread_control_state::trap_expected comments
[deliverable/binutils-gdb.git]
/
gas
/
app.c
diff --git
a/gas/app.c
b/gas/app.c
index 637662f81861a0aeb5012b5e6574456c037cb8a0..00c31bbf3906fe5ca85a191b9350cedf8a9072d9 100644
(file)
--- a/
gas/app.c
+++ b/
gas/app.c
@@
-1,7
+1,5
@@
/* This is the Assembler Pre-Processor
/* This is the Assembler Pre-Processor
- Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003, 2006, 2007
- Free Software Foundation, Inc.
+ Copyright (C) 1987-2020 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
This file is part of GAS, the GNU Assembler.
@@
-34,6
+32,10
@@
#endif
#endif
#endif
#endif
+#ifdef H_TICK_HEX
+int enable_h_tick_hex = 0;
+#endif
+
#ifdef TC_M68K
/* Whether we are scrubbing in m68k MRI mode. This is different from
flag_m68k_mri, because the two flags will be affected by the .mri
#ifdef TC_M68K
/* Whether we are scrubbing in m68k MRI mode. This is different from
flag_m68k_mri, because the two flags will be affected by the .mri
@@
-53,6
+55,9
@@
static const char mri_pseudo[] = ".mri 0";
static const char symver_pseudo[] = ".symver";
static const char * symver_state;
#endif
static const char symver_pseudo[] = ".symver";
static const char * symver_state;
#endif
+#ifdef TC_ARM
+static char last_char;
+#endif
static char lex[256];
static const char symbol_chars[] =
static char lex[256];
static const char symbol_chars[] =
@@
-78,6
+83,9
@@
static const char symbol_chars[] =
#define LEX_IS_DOUBLEBAR_1ST 13
#endif
#define LEX_IS_PARALLEL_SEPARATOR 14
#define LEX_IS_DOUBLEBAR_1ST 13
#endif
#define LEX_IS_PARALLEL_SEPARATOR 14
+#ifdef H_TICK_HEX
+#define LEX_IS_H 15
+#endif
#define IS_SYMBOL_COMPONENT(c) (lex[c] == LEX_IS_SYMBOL_COMPONENT)
#define IS_WHITESPACE(c) (lex[c] == LEX_IS_WHITESPACE)
#define IS_LINE_SEPARATOR(c) (lex[c] == LEX_IS_LINE_SEPARATOR)
#define IS_SYMBOL_COMPONENT(c) (lex[c] == LEX_IS_SYMBOL_COMPONENT)
#define IS_WHITESPACE(c) (lex[c] == LEX_IS_WHITESPACE)
#define IS_LINE_SEPARATOR(c) (lex[c] == LEX_IS_LINE_SEPARATOR)
@@
-112,8
+120,7
@@
do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
{
lex['"'] = LEX_IS_STRINGQUOTE;
{
lex['"'] = LEX_IS_STRINGQUOTE;
-#if ! defined (TC_HPPA) && ! defined (TC_I370)
- /* I370 uses single-quotes to delimit integer, float constants. */
+#if ! defined (TC_HPPA)
lex['\''] = LEX_IS_ONECHAR_QUOTE;
#endif
lex['\''] = LEX_IS_ONECHAR_QUOTE;
#endif
@@
-153,7
+160,10
@@
do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
for (p = line_comment_chars; *p; p++)
lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START;
for (p = line_comment_chars; *p; p++)
lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START;
- for (p = line_separator_chars; *p; p++)
+#ifndef tc_line_separator_chars
+#define tc_line_separator_chars line_separator_chars
+#endif
+ for (p = tc_line_separator_chars; *p; p++)
lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR;
#ifdef tc_parallel_separator_chars
lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR;
#ifdef tc_parallel_separator_chars
@@
-190,16
+200,24
@@
do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
/* Must do this is we want VLIW instruction with "->" or "<-". */
lex['-'] = LEX_IS_SYMBOL_COMPONENT;
#endif
/* Must do this is we want VLIW instruction with "->" or "<-". */
lex['-'] = LEX_IS_SYMBOL_COMPONENT;
#endif
+
+#ifdef H_TICK_HEX
+ if (enable_h_tick_hex)
+ {
+ lex['h'] = LEX_IS_H;
+ lex['H'] = LEX_IS_H;
+ }
+#endif
}
/* Saved state of the scrubber. */
static int state;
static int old_state;
}
/* Saved state of the scrubber. */
static int state;
static int old_state;
-static char *out_string;
+static c
onst c
har *out_string;
static char out_buf[20];
static int add_newlines;
static char *saved_input;
static char out_buf[20];
static int add_newlines;
static char *saved_input;
-static
in
t saved_input_len;
+static
size_
t saved_input_len;
static char input_buffer[32 * 1024];
static const char *mri_state;
static char mri_last_ch;
static char input_buffer[32 * 1024];
static const char *mri_state;
static char mri_last_ch;
@@
-213,11
+231,11
@@
struct app_save
{
int state;
int old_state;
{
int state;
int old_state;
- c
har *
out_string;
+ c
onst char *
out_string;
char out_buf[sizeof (out_buf)];
int add_newlines;
char * saved_input;
char out_buf[sizeof (out_buf)];
int add_newlines;
char * saved_input;
-
int
saved_input_len;
+
size_t
saved_input_len;
#ifdef TC_M68K
int scrub_m68k_mri;
#endif
#ifdef TC_M68K
int scrub_m68k_mri;
#endif
@@
-226,14
+244,17
@@
struct app_save
#if defined TC_ARM && defined OBJ_ELF
const char * symver_state;
#endif
#if defined TC_ARM && defined OBJ_ELF
const char * symver_state;
#endif
+#ifdef TC_ARM
+ char last_char;
+#endif
};
char *
app_push (void)
{
};
char *
app_push (void)
{
-
register
struct app_save *saved;
+ struct app_save *saved;
- saved =
(struct app_save *) xmalloc (sizeof (*saved)
);
+ saved =
XNEW (struct app_save
);
saved->state = state;
saved->old_state = old_state;
saved->out_string = out_string;
saved->state = state;
saved->old_state = old_state;
saved->out_string = out_string;
@@
-243,7
+264,7
@@
app_push (void)
saved->saved_input = NULL;
else
{
saved->saved_input = NULL;
else
{
- saved->saved_input =
xmalloc (
saved_input_len);
+ saved->saved_input =
XNEWVEC (char,
saved_input_len);
memcpy (saved->saved_input, saved_input, saved_input_len);
saved->saved_input_len = saved_input_len;
}
memcpy (saved->saved_input, saved_input, saved_input_len);
saved->saved_input_len = saved_input_len;
}
@@
-255,11
+276,15
@@
app_push (void)
#if defined TC_ARM && defined OBJ_ELF
saved->symver_state = symver_state;
#endif
#if defined TC_ARM && defined OBJ_ELF
saved->symver_state = symver_state;
#endif
+#ifdef TC_ARM
+ saved->last_char = last_char;
+#endif
/* do_scrub_begin() is not useful, just wastes time. */
state = 0;
saved_input = NULL;
/* do_scrub_begin() is not useful, just wastes time. */
state = 0;
saved_input = NULL;
+ add_newlines = 0;
return (char *) saved;
}
return (char *) saved;
}
@@
-267,7
+292,7
@@
app_push (void)
void
app_pop (char *arg)
{
void
app_pop (char *arg)
{
-
register
struct app_save *saved = (struct app_save *) arg;
+ struct app_save *saved = (struct app_save *) arg;
/* There is no do_scrub_end (). */
state = saved->state;
/* There is no do_scrub_end (). */
state = saved->state;
@@
-279,7
+304,7
@@
app_pop (char *arg)
saved_input = NULL;
else
{
saved_input = NULL;
else
{
-
assert (saved->saved_input_len <= (int) (sizeof
input_buffer));
+
gas_assert (saved->saved_input_len <= sizeof (
input_buffer));
memcpy (input_buffer, saved->saved_input, saved->saved_input_len);
saved_input = input_buffer;
saved_input_len = saved->saved_input_len;
memcpy (input_buffer, saved->saved_input, saved->saved_input_len);
saved_input = input_buffer;
saved_input_len = saved->saved_input_len;
@@
-293,6
+318,9
@@
app_pop (char *arg)
#if defined TC_ARM && defined OBJ_ELF
symver_state = saved->symver_state;
#endif
#if defined TC_ARM && defined OBJ_ELF
symver_state = saved->symver_state;
#endif
+#ifdef TC_ARM
+ last_char = saved->last_char;
+#endif
free (arg);
}
free (arg);
}
@@
-335,15
+363,15
@@
process_escape (int ch)
machine, and saves its state so that it may return at any point.
This is the way the old code used to work. */
machine, and saves its state so that it may return at any point.
This is the way the old code used to work. */
-
in
t
-do_scrub_chars (
int (*get) (char *, int), char *tostart, in
t tolen)
+
size_
t
+do_scrub_chars (
size_t (*get) (char *, size_t), char *tostart, size_
t tolen)
{
char *to = tostart;
char *toend = tostart + tolen;
char *from;
char *fromend;
{
char *to = tostart;
char *toend = tostart + tolen;
char *from;
char *fromend;
-
in
t fromlen;
-
register
int ch, ch2 = 0;
+
size_
t fromlen;
+ int ch, ch2 = 0;
/* Character that started the string we're working on. */
static char quotechar;
/* Character that started the string we're working on. */
static char quotechar;
@@
-369,11
+397,11
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
13: After seeing a vertical bar, looking for a second
vertical bar as a parallel expression separator.
#endif
13: After seeing a vertical bar, looking for a second
vertical bar as a parallel expression separator.
#endif
-#ifdef TC_
IA64
- 14: After seeing a
`(' at state 0, looking for a `)' as
- predicate.
- 15: After seeing a
`(' at state 1, looking for a `)' as
- predicate.
+#ifdef TC_
PREDICATE_START_CHAR
+ 14: After seeing a
predicate start character at state 0, looking
+
for a predicate end character as
predicate.
+ 15: After seeing a
predicate start character at state 1, looking
+
for a predicate end character as
predicate.
#endif
#ifdef TC_Z80
16: After seeing an 'a' or an 'A' at the start of a symbol
#endif
#ifdef TC_Z80
16: After seeing an 'a' or an 'A' at the start of a symbol
@@
-532,7
+560,7
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
GET and PUT macros. */
{
char *s;
GET and PUT macros. */
{
char *s;
-
in
t len;
+
ptrdiff_
t len;
for (s = from; s < fromend; s++)
{
for (s = from; s < fromend; s++)
{
@@
-558,8
+586,14
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
ch = GET ();
if (ch == EOF)
{
ch = GET ();
if (ch == EOF)
{
+ /* This buffer is here specifically so
+ that the UNGET below will work. */
+ static char one_char_buf[1];
+
as_warn (_("end of file in string; '%c' inserted"), quotechar);
state = old_state;
as_warn (_("end of file in string; '%c' inserted"), quotechar);
state = old_state;
+ from = fromend = one_char_buf + 1;
+ fromlen = 1;
UNGET ('\n');
PUT (quotechar);
}
UNGET ('\n');
PUT (quotechar);
}
@@
-568,13
+602,11
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
state = old_state;
PUT (ch);
}
state = old_state;
PUT (ch);
}
-#ifndef NO_STRING_ESCAPES
- else if (ch == '\\')
+ else if (TC_STRING_ESCAPES && ch == '\\')
{
state = 6;
PUT (ch);
}
{
state = 6;
PUT (ch);
}
-#endif
else if (scrub_m68k_mri && ch == '\n')
{
/* Just quietly terminate the string. This permits lines like
else if (scrub_m68k_mri && ch == '\n')
{
/* Just quietly terminate the string. This permits lines like
@@
-646,13
+678,23
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
line from just after the first white space. */
state = 1;
PUT ('|');
line from just after the first white space. */
state = 1;
PUT ('|');
+#ifdef TC_TIC6X
+ /* "||^" is used for SPMASKed instructions. */
+ ch = GET ();
+ if (ch == EOF)
+ goto fromeof;
+ else if (ch == '^')
+ PUT ('^');
+ else
+ UNGET (ch);
+#endif
continue;
#endif
#ifdef TC_Z80
case 16:
/* We have seen an 'a' at the start of a symbol, look for an 'f'. */
ch = GET ();
continue;
#endif
#ifdef TC_Z80
case 16:
/* We have seen an 'a' at the start of a symbol, look for an 'f'. */
ch = GET ();
- if (ch == 'f' || ch == 'F')
+ if (ch == 'f' || ch == 'F')
{
state = 17;
PUT (ch);
{
state = 17;
PUT (ch);
@@
-662,6
+704,7
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
state = 9;
break;
}
state = 9;
break;
}
+ /* Fall through. */
case 17:
/* We have seen "af" at the start of a symbol,
a ' here is a part of that symbol. */
case 17:
/* We have seen "af" at the start of a symbol,
a ' here is a part of that symbol. */
@@
-670,7
+713,7
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
if (ch == '\'')
/* Change to avoid warning about unclosed string. */
PUT ('`');
if (ch == '\'')
/* Change to avoid warning about unclosed string. */
PUT ('`');
- else
+ else
if (ch != EOF)
UNGET (ch);
break;
#endif
UNGET (ch);
break;
#endif
@@
-681,8
+724,8
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
/* flushchar: */
ch = GET ();
/* flushchar: */
ch = GET ();
-#ifdef TC_
IA64
- if (ch ==
'('
&& (state == 0 || state == 1))
+#ifdef TC_
PREDICATE_START_CHAR
+ if (ch ==
TC_PREDICATE_START_CHAR
&& (state == 0 || state == 1))
{
state += 14;
PUT (ch);
{
state += 14;
PUT (ch);
@@
-690,7
+733,7
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
}
else if (state == 14 || state == 15)
{
}
else if (state == 14 || state == 15)
{
- if (ch ==
')'
)
+ if (ch ==
TC_PREDICATE_END_CHAR
)
{
state -= 14;
PUT (ch);
{
state -= 14;
PUT (ch);
@@
-826,7
+869,8
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
/* Only keep this white if there's no white *after* the
colon. */
ch2 = GET ();
/* Only keep this white if there's no white *after* the
colon. */
ch2 = GET ();
- UNGET (ch2);
+ if (ch2 != EOF)
+ UNGET (ch2);
if (!IS_WHITESPACE (ch2))
{
state = 9;
if (!IS_WHITESPACE (ch2))
{
state = 9;
@@
-883,7
+927,11
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
PUT (' ');
break;
case 3:
PUT (' ');
break;
case 3:
+#ifndef TC_KEEP_OPERAND_SPACES
+ /* For TI C6X, we keep these spaces as they may separate
+ functional unit specifiers from operands. */
if (scrub_m68k_mri)
if (scrub_m68k_mri)
+#endif
{
/* In MRI mode, we keep these spaces. */
UNGET (ch);
{
/* In MRI mode, we keep these spaces. */
UNGET (ch);
@@
-893,7
+941,9
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
goto recycle; /* Sp in operands */
case 9:
case 10:
goto recycle; /* Sp in operands */
case 9:
case 10:
+#ifndef TC_KEEP_OPERAND_SPACES
if (scrub_m68k_mri)
if (scrub_m68k_mri)
+#endif
{
/* In MRI mode, we keep these spaces. */
state = 3;
{
/* In MRI mode, we keep these spaces. */
state = 3;
@@
-1000,8
+1050,17
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
PUT (ch);
break;
PUT (ch);
break;
-#ifndef IEEE_STYLE
case LEX_IS_ONECHAR_QUOTE:
case LEX_IS_ONECHAR_QUOTE:
+#ifdef H_TICK_HEX
+ if (state == 9 && enable_h_tick_hex)
+ {
+ char c;
+
+ c = GET ();
+ as_warn ("'%c found after symbol", c);
+ UNGET (c);
+ }
+#endif
if (state == 10)
{
/* Preserve the whitespace in foo 'b'. */
if (state == 10)
{
/* Preserve the whitespace in foo 'b'. */
@@
-1052,7
+1111,6
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
out_string = out_buf;
PUT (*out_string++);
break;
out_string = out_buf;
PUT (*out_string++);
break;
-#endif
case LEX_IS_COLON:
#ifdef KEEP_WHITE_AROUND_COLON
case LEX_IS_COLON:
#ifdef KEEP_WHITE_AROUND_COLON
@@
-1090,7
+1148,8
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
ch2 = GET ();
if (ch2 != '-')
{
ch2 = GET ();
if (ch2 != '-')
{
- UNGET (ch2);
+ if (ch2 != EOF)
+ UNGET (ch2);
goto de_fault;
}
/* Read and skip to end of line. */
goto de_fault;
}
/* Read and skip to end of line. */
@@
-1110,7
+1169,8
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
#ifdef DOUBLEBAR_PARALLEL
case LEX_IS_DOUBLEBAR_1ST:
ch2 = GET ();
#ifdef DOUBLEBAR_PARALLEL
case LEX_IS_DOUBLEBAR_1ST:
ch2 = GET ();
- UNGET (ch2);
+ if (ch2 != EOF)
+ UNGET (ch2);
if (ch2 != '|')
goto de_fault;
if (ch2 != '|')
goto de_fault;
@@
-1135,7
+1195,7
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
state = -2;
break;
}
state = -2;
break;
}
- else
+ else
if (ch2 != EOF)
{
UNGET (ch2);
}
{
UNGET (ch2);
}
@@
-1166,9
+1226,16
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
while (ch != EOF && !IS_NEWLINE (ch))
ch = GET ();
if (ch == EOF)
while (ch != EOF && !IS_NEWLINE (ch))
ch = GET ();
if (ch == EOF)
- as_warn (_("end of file in comment; newline inserted"));
+ {
+ as_warn (_("end of file in comment; newline inserted"));
+ PUT ('\n');
+ }
+ else /* IS_NEWLINE (ch) */
+ {
+ /* To process non-zero add_newlines. */
+ UNGET (ch);
+ }
state = 0;
state = 0;
- PUT ('\n');
break;
}
/* Looks like `# 123 "filename"' from cpp. */
break;
}
/* Looks like `# 123 "filename"' from cpp. */
@@
-1225,14
+1292,14
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
#ifdef TC_ARM
/* For the ARM, care is needed not to damage occurrences of \@
by stripping the @ onwards. Yuck. */
#ifdef TC_ARM
/* For the ARM, care is needed not to damage occurrences of \@
by stripping the @ onwards. Yuck. */
- if (
to > tostart && *(to - 1
) == '\\')
+ if (
(to > tostart ? to[-1] : last_char
) == '\\')
/* Do not treat the @ as a start-of-comment. */
goto de_fault;
#endif
#ifdef WARN_COMMENTS
if (!found_comment)
/* Do not treat the @ as a start-of-comment. */
goto de_fault;
#endif
#ifdef WARN_COMMENTS
if (!found_comment)
-
as_where (&found_comment_file,
&found_comment);
+
found_comment_file = as_where (
&found_comment);
#endif
do
{
#endif
do
{
@@
-1245,6
+1312,26
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
PUT ('\n');
break;
PUT ('\n');
break;
+#ifdef H_TICK_HEX
+ case LEX_IS_H:
+ /* Look for strings like H'[0-9A-Fa-f] and if found, replace
+ the H' with 0x to make them gas-style hex characters. */
+ if (enable_h_tick_hex)
+ {
+ char quot;
+
+ quot = GET ();
+ if (quot == '\'')
+ {
+ UNGET ('x');
+ ch = '0';
+ }
+ else
+ UNGET (quot);
+ }
+#endif
+ /* Fall through. */
+
case LEX_IS_SYMBOL_COMPONENT:
if (state == 10)
{
case LEX_IS_SYMBOL_COMPONENT:
if (state == 10)
{
@@
-1259,12
+1346,12
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
#ifdef TC_Z80
/* "af'" is a symbol containing '\''. */
#ifdef TC_Z80
/* "af'" is a symbol containing '\''. */
- if (state == 3 && (ch == 'a' || ch == 'A'))
+ if (state == 3 && (ch == 'a' || ch == 'A'))
{
state = 16;
PUT (ch);
ch = GET ();
{
state = 16;
PUT (ch);
ch = GET ();
- if (ch == 'f' || ch == 'F')
+ if (ch == 'f' || ch == 'F')
{
state = 17;
PUT (ch);
{
state = 17;
PUT (ch);
@@
-1273,9
+1360,10
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
else
{
state = 9;
else
{
state = 9;
- if (
!IS_SYMBOL_COMPONENT (ch))
+ if (
ch == EOF || !IS_SYMBOL_COMPONENT (ch))
{
{
- UNGET (ch);
+ if (ch != EOF)
+ UNGET (ch);
break;
}
}
break;
}
}
@@
-1294,7
+1382,7
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
)
{
char *s;
)
{
char *s;
-
in
t len;
+
ptrdiff_
t len;
for (s = from; s < fromend; s++)
{
for (s = from; s < fromend; s++)
{
@@
-1384,6
+1472,10
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
fromeof:
/* We have reached the end of the input. */
fromeof:
/* We have reached the end of the input. */
+#ifdef TC_ARM
+ if (to > tostart)
+ last_char = to[-1];
+#endif
return to - tostart;
tofull:
return to - tostart;
tofull:
@@
-1397,6
+1489,9
@@
do_scrub_chars (int (*get) (char *, int), char *tostart, int tolen)
else
saved_input = NULL;
else
saved_input = NULL;
+#ifdef TC_ARM
+ if (to > tostart)
+ last_char = to[-1];
+#endif
return to - tostart;
}
return to - tostart;
}
-
This page took
0.030281 seconds
and
4
git commands to generate.