diff options
author | Nick Clifton <nickc@redhat.com> | 2003-05-12 09:09:11 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2003-05-12 09:09:11 +0000 |
commit | e66c629e094cbd3923e2cd2962e07baa96ad7ee7 (patch) | |
tree | 91448349bc3f321c2f38d30c9e391923b2c29b36 /gas/config/tc-xstormy16.c | |
parent | 9d29900bf7bbe2b1dead4ebec2352e8ccdc3fcb3 (diff) | |
download | gdb-e66c629e094cbd3923e2cd2962e07baa96ad7ee7.zip gdb-e66c629e094cbd3923e2cd2962e07baa96ad7ee7.tar.gz gdb-e66c629e094cbd3923e2cd2962e07baa96ad7ee7.tar.bz2 |
Allow xstormy-elf-gas to handle "@fptr() - @fptr()" expressions.
Diffstat (limited to 'gas/config/tc-xstormy16.c')
-rw-r--r-- | gas/config/tc-xstormy16.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/gas/config/tc-xstormy16.c b/gas/config/tc-xstormy16.c index 2c80b1a..0125856 100644 --- a/gas/config/tc-xstormy16.c +++ b/gas/config/tc-xstormy16.c @@ -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; } |