From: Arnold Metselaar Date: Sun, 5 Dec 2010 21:44:08 +0000 (+0000) Subject: PR gas/12269 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=761025beb317a952383f080898386095c512c5ab;p=binutils-gdb.git 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. --- 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/atend.d b/gas/testsuite/gas/z80/atend.d new file mode 100644 index 00000000000..e0427b14ce4 --- /dev/null +++ b/gas/testsuite/gas/z80/atend.d @@ -0,0 +1,13 @@ +#objdump: -d +#name: index intructions with label as offset + +.*: .* + +Disassembly of section .text: + +00000000 : +[ ]+0:[ ]+3e 20[ ]+ld a,0x20 +[ ]+2:[ ]+dd 7e 20[ ]+ld a,\(ix\+32\) +[ ]+5:[ ]+3e 40[ ]+ld a,0x40 +[ ]+7:[ ]+dd 7e 40[ ]+ld a,\(ix\+64\) +[ ]+a:[ ]+c9[ ]+ret diff --git a/gas/testsuite/gas/z80/atend.s b/gas/testsuite/gas/z80/atend.s new file mode 100644 index 00000000000..2fd672556c9 --- /dev/null +++ b/gas/testsuite/gas/z80/atend.s @@ -0,0 +1,15 @@ +begin: + +offsetAtStart: equ 32 + + LD A, offsetAtStart + LD A, (IX + offsetAtStart) + + LD A, offsetAtEnd + LD A, (IX + offsetAtEnd) + + RET + +offsetAtEnd: equ 64 + END + 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