From 6f1fe4264eb0712c1d85a0a521660708606e27f6 Mon Sep 17 00:00:00 2001 From: Arnold Metselaar Date: Mon, 6 Dec 2010 23:05:57 +0000 Subject: [PATCH] Backport from trunk for PR gas/12269 * config/tc-z80.c (emit_mx, emit_ldxhl): Do not use symbol_get_value_expression on a symbol that may not yet have a value. * testsuite/gas/z80/atend.s: New file, test case for bug 12269, provided by Chris Smith. * testsuite/gas/z80/atend.d: New file, expected results for atend.s. * testsuite/gas/z80/z80.exp: Run new test case. --- gas/ChangeLog | 11 +++++++++++ gas/config/tc-z80.c | 17 +++++++++++++---- gas/testsuite/gas/z80/z80.exp | 2 ++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 8038f762fd3..8cf8c147b14 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2010-12-07 Arnold Metselaar + + Backport from trunk for PR gas/12269 + * config/tc-z80.c (emit_mx, emit_ldxhl): Do not use + symbol_get_value_expression on a symbol that may not yet have + a value. + * testsuite/gas/z80/atend.s: New file, test case for bug 12269, + provided by Chris Smith. + * testsuite/gas/z80/atend.d: New file, expected results for atend.s. + * testsuite/gas/z80/z80.exp: Run new test case. + 2010-11-30 Joel Sherrill * configure.tgt: Add sparc64-rtems. diff --git a/gas/config/tc-z80.c b/gas/config/tc-z80.c index e2ea462a52e..7c13fa77886 100644 --- a/gas/config/tc-z80.c +++ b/gas/config/tc-z80.c @@ -769,8 +769,12 @@ emit_mx (char prefix, char opcode, int shift, expressionS * arg) q = frag_more (2); *q++ = (rnum & R_IX) ? 0xDD : 0xFD; *q = (prefix) ? prefix : (opcode + (6 << shift)); - emit_byte (symbol_get_value_expression (arg->X_add_symbol), - BFD_RELOC_Z80_DISP8); + { + expressionS offset = *arg; + offset.X_op = O_symbol; + offset.X_add_number = 0; + emit_byte (&offset, BFD_RELOC_Z80_DISP8); + } if (prefix) { q = frag_more (1); @@ -1598,8 +1602,13 @@ emit_ld (char prefix_in ATTRIBUTE_UNUSED, char opcode_in ATTRIBUTE_UNUSED, switch (dst.X_op) { case O_md1: - emit_ldxhl ((dst.X_add_number & R_IX) ? 0xDD : 0xFD, 0x70, - &src, symbol_get_value_expression (dst.X_add_symbol)); + { + expressionS dst_offset = dst; + dst_offset.X_op = O_symbol; + dst_offset.X_add_number = 0; + emit_ldxhl ((dst.X_add_number & R_IX) ? 0xDD : 0xFD, 0x70, + &src, &dst_offset); + } break; case O_register: diff --git a/gas/testsuite/gas/z80/z80.exp b/gas/testsuite/gas/z80/z80.exp index 0cb844031ae..43a3360ea60 100644 --- a/gas/testsuite/gas/z80/z80.exp +++ b/gas/testsuite/gas/z80/z80.exp @@ -11,6 +11,8 @@ if [istarget z80-*-*] then { run_dump_test "suffix" # test assembling and disassembling instructions involving offsets run_dump_test "offset" +# test assembling instruction with offset that is a label defined later + run_dump_test "atend" # test for data transfer instructions run_dump_test "ld-group" # test for block instructions -- 2.47.3