mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-26 22:07:58 +08:00
* read.c (read_a_source_file): In MRI mode, don't end the
statement inside a quotation. (s_space): Don't warn about a zero repeat count in MRI mode. * config/tc-m68k.c (crack_operand): In MRI mode, don't count parentheses inside quotes. (md_assemble): In MRI mode, anything after the operands field is a comment. (parse_mri_control_operand): Adjust start and stop to remove spaces. (s_mri_for): Likewise.
This commit is contained in:
@ -2534,25 +2534,31 @@ crack_operand (str, opP)
|
|||||||
register int parens;
|
register int parens;
|
||||||
register int c;
|
register int c;
|
||||||
register char *beg_str;
|
register char *beg_str;
|
||||||
|
int inquote = 0;
|
||||||
|
|
||||||
if (!str)
|
if (!str)
|
||||||
{
|
{
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
beg_str = str;
|
beg_str = str;
|
||||||
for (parens = 0; *str && (parens > 0 || notend (str)); str++)
|
for (parens = 0; *str && (parens > 0 || inquote || notend (str)); str++)
|
||||||
{
|
{
|
||||||
if (*str == '(')
|
if (! inquote)
|
||||||
parens++;
|
|
||||||
else if (*str == ')')
|
|
||||||
{
|
{
|
||||||
if (!parens)
|
if (*str == '(')
|
||||||
{ /* ERROR */
|
parens++;
|
||||||
opP->error = "Extra )";
|
else if (*str == ')')
|
||||||
return str;
|
{
|
||||||
|
if (!parens)
|
||||||
|
{ /* ERROR */
|
||||||
|
opP->error = "Extra )";
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
--parens;
|
||||||
}
|
}
|
||||||
--parens;
|
|
||||||
}
|
}
|
||||||
|
if (flag_mri && *str == '\'')
|
||||||
|
inquote = ! inquote;
|
||||||
}
|
}
|
||||||
if (!*str && parens)
|
if (!*str && parens)
|
||||||
{ /* ERROR */
|
{ /* ERROR */
|
||||||
@ -2781,6 +2787,41 @@ md_assemble (str)
|
|||||||
int shorts_this_frag;
|
int shorts_this_frag;
|
||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
|
|
||||||
|
/* In MRI mode, the instruction and operands are separated by a
|
||||||
|
space. Anything following the operands is a comment. The label
|
||||||
|
has already been removed. */
|
||||||
|
if (flag_mri)
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
int fields = 0;
|
||||||
|
int infield = 0;
|
||||||
|
int inquote = 0;
|
||||||
|
|
||||||
|
for (s = str; *s != '\0'; s++)
|
||||||
|
{
|
||||||
|
if ((*s == ' ' || *s == '\t') && ! inquote)
|
||||||
|
{
|
||||||
|
if (infield)
|
||||||
|
{
|
||||||
|
++fields;
|
||||||
|
if (fields >= 2)
|
||||||
|
{
|
||||||
|
*s = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
infield = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (! infield)
|
||||||
|
infield = 1;
|
||||||
|
if (*s == '\'')
|
||||||
|
inquote = ! inquote;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
memset ((char *) (&the_ins), '\0', sizeof (the_ins));
|
memset ((char *) (&the_ins), '\0', sizeof (the_ins));
|
||||||
m68k_ip (str);
|
m68k_ip (str);
|
||||||
er = the_ins.error;
|
er = the_ins.error;
|
||||||
@ -4778,6 +4819,9 @@ parse_mri_control_operand (pcc, leftstart, leftstop, rightstart, rightstop)
|
|||||||
|
|
||||||
*leftstart = input_line_pointer;
|
*leftstart = input_line_pointer;
|
||||||
*leftstop = s;
|
*leftstop = s;
|
||||||
|
if (*leftstop > *leftstart
|
||||||
|
&& ((*leftstop)[-1] == ' ' || (*leftstop)[-1] == '\t'))
|
||||||
|
--*leftstop;
|
||||||
|
|
||||||
input_line_pointer = s;
|
input_line_pointer = s;
|
||||||
if (! parse_mri_condition (pcc))
|
if (! parse_mri_condition (pcc))
|
||||||
@ -4795,6 +4839,9 @@ parse_mri_control_operand (pcc, leftstart, leftstop, rightstart, rightstop)
|
|||||||
|
|
||||||
*rightstart = input_line_pointer;
|
*rightstart = input_line_pointer;
|
||||||
*rightstop = s;
|
*rightstop = s;
|
||||||
|
if (*rightstop > *rightstart
|
||||||
|
&& ((*rightstop)[-1] == ' ' || (*rightstop)[-1] == '\t'))
|
||||||
|
--*rightstop;
|
||||||
|
|
||||||
input_line_pointer = s;
|
input_line_pointer = s;
|
||||||
|
|
||||||
@ -5283,6 +5330,7 @@ s_mri_for (qual)
|
|||||||
FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
|
FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
SKIP_WHITESPACE ();
|
||||||
varstart = input_line_pointer;
|
varstart = input_line_pointer;
|
||||||
|
|
||||||
/* Look for the '='. */
|
/* Look for the '='. */
|
||||||
@ -5297,6 +5345,9 @@ s_mri_for (qual)
|
|||||||
}
|
}
|
||||||
|
|
||||||
varstop = input_line_pointer;
|
varstop = input_line_pointer;
|
||||||
|
if (varstop > varstart
|
||||||
|
&& (varstop[-1] == ' ' || varstop[-1] == '\t'))
|
||||||
|
--varstop;
|
||||||
|
|
||||||
++input_line_pointer;
|
++input_line_pointer;
|
||||||
|
|
||||||
@ -5330,7 +5381,11 @@ s_mri_for (qual)
|
|||||||
ignore_rest_of_line ();
|
ignore_rest_of_line ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (initstop > initstart
|
||||||
|
&& (initstop[-1] == ' ' || initstop[-1] == '\t'))
|
||||||
|
--initstop;
|
||||||
|
|
||||||
|
SKIP_WHITESPACE ();
|
||||||
endstart = input_line_pointer;
|
endstart = input_line_pointer;
|
||||||
|
|
||||||
/* Look for BY or DO. */
|
/* Look for BY or DO. */
|
||||||
@ -5362,6 +5417,9 @@ s_mri_for (qual)
|
|||||||
ignore_rest_of_line ();
|
ignore_rest_of_line ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (endstop > endstart
|
||||||
|
&& (endstop[-1] == ' ' || endstop[-1] == '\t'))
|
||||||
|
--endstop;
|
||||||
|
|
||||||
if (! by)
|
if (! by)
|
||||||
{
|
{
|
||||||
@ -5370,6 +5428,7 @@ s_mri_for (qual)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
SKIP_WHITESPACE ();
|
||||||
bystart = input_line_pointer;
|
bystart = input_line_pointer;
|
||||||
|
|
||||||
/* Look for DO. */
|
/* Look for DO. */
|
||||||
@ -5392,6 +5451,9 @@ s_mri_for (qual)
|
|||||||
ignore_rest_of_line ();
|
ignore_rest_of_line ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (bystop > bystart
|
||||||
|
&& (bystop[-1] == ' ' || bystop[-1] == '\t'))
|
||||||
|
--bystop;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*input_line_pointer != '.')
|
if (*input_line_pointer != '.')
|
||||||
|
10
gas/read.c
10
gas/read.c
@ -683,6 +683,8 @@ read_a_source_file (name)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* machine instruction */
|
{ /* machine instruction */
|
||||||
|
int inquote = 0;
|
||||||
|
|
||||||
if (mri_pending_align)
|
if (mri_pending_align)
|
||||||
{
|
{
|
||||||
do_align (1, (char *) NULL);
|
do_align (1, (char *) NULL);
|
||||||
@ -693,11 +695,14 @@ read_a_source_file (name)
|
|||||||
/* Also: input_line_pointer->`\0` where c was. */
|
/* Also: input_line_pointer->`\0` where c was. */
|
||||||
*input_line_pointer = c;
|
*input_line_pointer = c;
|
||||||
while (!is_end_of_line[(unsigned char) *input_line_pointer]
|
while (!is_end_of_line[(unsigned char) *input_line_pointer]
|
||||||
|
|| inquote
|
||||||
#ifdef TC_EOL_IN_INSN
|
#ifdef TC_EOL_IN_INSN
|
||||||
|| TC_EOL_IN_INSN (input_line_pointer)
|
|| TC_EOL_IN_INSN (input_line_pointer)
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
if (flag_mri && *input_line_pointer == '\'')
|
||||||
|
inquote = ! inquote;
|
||||||
input_line_pointer++;
|
input_line_pointer++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2017,8 +2022,9 @@ s_space (mult)
|
|||||||
repeat *= mult;
|
repeat *= mult;
|
||||||
if (repeat <= 0)
|
if (repeat <= 0)
|
||||||
{
|
{
|
||||||
as_warn (".space repeat count is %s, ignored",
|
if (! flag_mri || repeat < 0)
|
||||||
repeat ? "negative" : "zero");
|
as_warn (".space repeat count is %s, ignored",
|
||||||
|
repeat ? "negative" : "zero");
|
||||||
ignore_rest_of_line ();
|
ignore_rest_of_line ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user