mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-20 09:58:19 +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>
|
||||
|
||||
* 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);
|
||||
}
|
||||
|
||||
static bfd_boolean skipping_fptr = FALSE;
|
||||
|
||||
void
|
||||
md_assemble (str)
|
||||
char * str;
|
||||
@ -111,6 +113,10 @@ md_assemble (str)
|
||||
xstormy16_insn insn;
|
||||
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. */
|
||||
gas_cgen_init_parse ();
|
||||
|
||||
@ -154,9 +160,28 @@ md_operand (e)
|
||||
goto err;
|
||||
}
|
||||
input_line_pointer++;
|
||||
SKIP_WHITESPACE ();
|
||||
|
||||
if (e->X_op != O_symbol)
|
||||
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
|
||||
e->X_op = O_fptr_symbol;
|
||||
}
|
||||
|
Reference in New Issue
Block a user