mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-23 03:29:47 +08:00
Add code to support FR30 instrucitons which contain a colon in their mnemonic
This commit is contained in:
@ -1,3 +1,10 @@
|
|||||||
|
Thu Nov 12 10:54:16 1998 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
|
* config/tc-fr30.c (fr30_is_label_start): New function: Handle
|
||||||
|
FR30 instructions which contain a colon in the mnemonic.
|
||||||
|
|
||||||
|
* config/tc-fr30.h (TC_START_LABEL): Define this macro.
|
||||||
|
|
||||||
start-sanitize-fr30
|
start-sanitize-fr30
|
||||||
Wed Nov 11 09:58:21 1998 Nick Clifton <nickc@cygnus.com>
|
Wed Nov 11 09:58:21 1998 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
|
@ -557,3 +557,65 @@ md_atof (type, litP, sizeP)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Determines if the symbol starting at START and ending in
|
||||||
|
a colon that was at the location pointed to by INPUT_LINE_POINTER
|
||||||
|
(but which has now been replaced bu a NUL) is in fact an
|
||||||
|
LDI:8, LDI:20 or LDI:32 instruction. If it is, then it
|
||||||
|
restores the colon, adbvances INPUT_LINE_POINTER to the real end
|
||||||
|
of the instruction/symbol, and returns the character that really
|
||||||
|
terminated the symbol. Otherwise it returns 0. */
|
||||||
|
char
|
||||||
|
fr30_is_label_start (start)
|
||||||
|
char * start;
|
||||||
|
{
|
||||||
|
char * i_l_p = input_line_pointer;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
/* Check to see if the symbol parsed so far is 'ldi' */
|
||||||
|
if ( (start[0] != 'l' && start[0] != 'L')
|
||||||
|
|| (start[1] != 'd' && start[1] != 'D')
|
||||||
|
|| (start[2] != 'i' && start[2] != 'I')
|
||||||
|
|| start[3] != 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Check to see if the text following the colon is '8' */
|
||||||
|
if (i_l_p[1] == '8' && (i_l_p[2] == ' ' || i_l_p[2] == '\t'))
|
||||||
|
{
|
||||||
|
/* Restore the colon, and advance input_line_pointer to
|
||||||
|
the end of the new symbol. */
|
||||||
|
* i_l_p = ':';
|
||||||
|
input_line_pointer += 2;
|
||||||
|
c = * input_line_pointer;
|
||||||
|
* input_line_pointer = 0;
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check to see if the text following the colon is '20' */
|
||||||
|
if (i_l_p[1] == '2' && i_l_p[2] =='0' && (i_l_p[3] == ' ' || i_l_p[3] == '\t'))
|
||||||
|
{
|
||||||
|
/* Restore the colon, and advance input_line_pointer to
|
||||||
|
the end of the new symbol. */
|
||||||
|
* i_l_p = ':';
|
||||||
|
input_line_pointer += 3;
|
||||||
|
c = * input_line_pointer;
|
||||||
|
* input_line_pointer = 0;
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check to see if the text following the colon is '32' */
|
||||||
|
if (i_l_p[1] == '3' && i_l_p[2] =='2' && (i_l_p[3] == ' ' || i_l_p[3] == '\t'))
|
||||||
|
{
|
||||||
|
/* Restore the colon, and advance input_line_pointer to
|
||||||
|
the end of the new symbol. */
|
||||||
|
* i_l_p = ':';
|
||||||
|
input_line_pointer += 3;
|
||||||
|
c = * input_line_pointer;
|
||||||
|
* input_line_pointer = 0;
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -73,3 +73,14 @@ extern long md_pcrel_from_section PARAMS ((struct fix *, segT));
|
|||||||
#define TC_GENERIC_RELAX_TABLE md_relax_table
|
#define TC_GENERIC_RELAX_TABLE md_relax_table
|
||||||
extern const struct relax_type md_relax_table[];
|
extern const struct relax_type md_relax_table[];
|
||||||
|
|
||||||
|
/* We need a special version of the TC_START_LABEL macro so that we
|
||||||
|
allow the LDI:8, LDI:20 and LDI:32 instructions to be parsed as
|
||||||
|
such. Note - in a HORRIBLE HACK, we make use of the knowledge that
|
||||||
|
this marco is only ever evaluated in one place (read_a_source_file
|
||||||
|
in read.c) where we can access the local variable 's' - the start
|
||||||
|
of the symbol that was terminated by 'character'. Also we need to
|
||||||
|
be able to change the contents of the local variable 'c' which is
|
||||||
|
passed to this macro as 'character'. */
|
||||||
|
#define TC_START_LABEL(character, i_l_p) \
|
||||||
|
((character) != ':' ? 0 : (character = fr30_is_label_start (s)) ? 0 : ((character = ':'), 1))
|
||||||
|
extern char fr30_is_label_start PARAMS ((char *));
|
||||||
|
Reference in New Issue
Block a user