mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 02:24:17 +08:00
Allow xstormy-elf-gas to handle "@fptr() - @fptr()" expressions.
This commit is contained in:
@ -1,3 +1,11 @@
|
|||||||
|
2003-05-12 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* config/tc-xstormy16.c (skipping_fptr): New local variable.
|
||||||
|
(md_assemble): Reset skipping_fptr.
|
||||||
|
(md_operand): If @fptr() is followed by a minus sign, set
|
||||||
|
skipping_fptr and ignore the fptr. If skipping_fptr is set and an
|
||||||
|
@fptr is detected, ignore it and reset skipping_fptr.
|
||||||
|
|
||||||
2003-05-11 Jason Eckhardt <jle@rice.edu>
|
2003-05-11 Jason Eckhardt <jle@rice.edu>
|
||||||
|
|
||||||
* config/tc-i860.c (MAX_FIXUPS): Define.
|
* config/tc-i860.c (MAX_FIXUPS): Define.
|
||||||
|
@ -104,6 +104,8 @@ md_begin ()
|
|||||||
cgen_set_parse_operand_fn (gas_cgen_cpu_desc, gas_cgen_parse_operand);
|
cgen_set_parse_operand_fn (gas_cgen_cpu_desc, gas_cgen_parse_operand);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bfd_boolean skipping_fptr = FALSE;
|
||||||
|
|
||||||
void
|
void
|
||||||
md_assemble (str)
|
md_assemble (str)
|
||||||
char * str;
|
char * str;
|
||||||
@ -111,6 +113,10 @@ md_assemble (str)
|
|||||||
xstormy16_insn insn;
|
xstormy16_insn insn;
|
||||||
char * errmsg;
|
char * errmsg;
|
||||||
|
|
||||||
|
/* Make sure that if we had an erroneous input line which triggered
|
||||||
|
the skipping_fptr boolean that it does not affect following lines. */
|
||||||
|
skipping_fptr = FALSE;
|
||||||
|
|
||||||
/* Initialize GAS's cgen interface for a new instruction. */
|
/* Initialize GAS's cgen interface for a new instruction. */
|
||||||
gas_cgen_init_parse ();
|
gas_cgen_init_parse ();
|
||||||
|
|
||||||
@ -154,9 +160,28 @@ md_operand (e)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
input_line_pointer++;
|
input_line_pointer++;
|
||||||
|
SKIP_WHITESPACE ();
|
||||||
|
|
||||||
if (e->X_op != O_symbol)
|
if (e->X_op != O_symbol)
|
||||||
as_bad ("Not a symbolic expression");
|
as_bad ("Not a symbolic expression");
|
||||||
|
else if (* input_line_pointer == '-')
|
||||||
|
/* We are computing the difference of two function pointers
|
||||||
|
like this:
|
||||||
|
|
||||||
|
.hword @fptr (foo) - @fptr (bar)
|
||||||
|
|
||||||
|
In this situation we do not want to generate O_fptr_symbol
|
||||||
|
operands because the result is an absolute value, not a
|
||||||
|
function pointer.
|
||||||
|
|
||||||
|
We need to make the check here, rather than when the fixup
|
||||||
|
is generated as the function names (foo & bar in the above
|
||||||
|
example) might be local symbols and we want the expression
|
||||||
|
to be evaluated now. This kind of thing can happen when
|
||||||
|
gcc is generating computed gotos. */
|
||||||
|
skipping_fptr = TRUE;
|
||||||
|
else if (skipping_fptr)
|
||||||
|
skipping_fptr = FALSE;
|
||||||
else
|
else
|
||||||
e->X_op = O_fptr_symbol;
|
e->X_op = O_fptr_symbol;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user