PR gas/12269
authorArnold Metselaar <arnold.metselaar@planet.nl>
Sun, 5 Dec 2010 21:44:08 +0000 (21:44 +0000)
committerArnold Metselaar <arnold.metselaar@planet.nl>
Sun, 5 Dec 2010 21:44:08 +0000 (21:44 +0000)
* 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/config/tc-z80.c
gas/testsuite/gas/z80/atend.d [new file with mode: 0644]
gas/testsuite/gas/z80/atend.s [new file with mode: 0644]
gas/testsuite/gas/z80/z80.exp

index e2ea462a52eb82bf2ecf20e78893249bcabe084b..7c13fa77886b158c004b654b149b55214e52eaa9 100644 (file)
@@ -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 (file)
index 0000000..e0427b1
--- /dev/null
@@ -0,0 +1,13 @@
+#objdump: -d
+#name: index intructions with label as offset
+
+.*: .*
+
+Disassembly of section .text:
+
+00000000 <begin>:
+[       ]+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 (file)
index 0000000..2fd6725
--- /dev/null
@@ -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
+
index 0cb844031ae3c04f3b82ff4221e278772ba6188e..43a3360ea603ad2458f95b394b442f3fa6656795 100644 (file)
@@ -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