From a7844384e8a2fc5db1a82c63ba6460e87f735a28 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 1 Apr 2004 08:22:47 +0000 Subject: [PATCH] Correctly emit lo16 relocs for elf-dlx target, fixing bogus range checking bug. --- gas/ChangeLog | 10 ++++++++++ gas/config/tc-dlx.c | 19 +++++++++++++++++-- gas/testsuite/ChangeLog | 11 +++++++++++ gas/testsuite/gas/dlx/alltests.exp | 1 + gas/testsuite/gas/dlx/itype.d | 2 +- gas/testsuite/gas/dlx/lhi.d | 6 +++--- gas/testsuite/gas/dlx/lohi.d | 18 ++++++++++++++++++ gas/testsuite/gas/dlx/lohi.s | 9 +++++++++ 8 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 gas/testsuite/gas/dlx/lohi.d create mode 100644 gas/testsuite/gas/dlx/lohi.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 444d9d6472b..01cc9b0a8fc 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2004-04-01 Dave Korn + + * config/tc-dlx.c (md_assemble): set fx_no_overflow flag for + hi16 and lo16 fixS structs. + (md_assemble): generate bit_fixS for RELOC_DLX_LO16 in + exactly the same way as for RELOC_DLX_REL16. + (machine_ip): properly respect LO flag in the_insn and + output RELOC_DLX_LO16 rather than RELOC_DLX_16. + (md_apply_fix3): apply RELOC_DLX_LO16. + 2004-03-30 Stan Shebs Remove long-obsolete MPW support. diff --git a/gas/config/tc-dlx.c b/gas/config/tc-dlx.c index 4b72b564de9..82b4aa249b0 100644 --- a/gas/config/tc-dlx.c +++ b/gas/config/tc-dlx.c @@ -1,5 +1,5 @@ /* tc-ldx.c -- Assemble for the DLX - Copyright 2002, 2003 Free Software Foundation, Inc. + Copyright 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -397,6 +397,18 @@ md_assemble (str) the_insn.size, & the_insn.exp, the_insn.pcrel, the_insn.reloc); + /* Turn off complaints that the addend is + too large for things like foo+100000@ha. */ + switch (the_insn.reloc) + { + case RELOC_DLX_HI16: + case RELOC_DLX_LO16: + fixP->fx_no_overflow = 1; + break; + default: + break; + } + switch (fixP->fx_r_type) { case RELOC_DLX_REL26: @@ -410,6 +422,7 @@ md_assemble (str) bitP->fx_bit_add = 0x03FFFFFF; fixP->fx_bit_fixP = bitP; break; + case RELOC_DLX_LO16: case RELOC_DLX_REL16: bitP = malloc (sizeof (bit_fixS)); bitP->fx_bit_size = 16; @@ -955,7 +968,8 @@ machine_ip (str) continue; } - the_insn.reloc = (the_insn.HI) ? RELOC_DLX_HI16 : RELOC_DLX_16; + the_insn.reloc = (the_insn.HI) ? RELOC_DLX_HI16 + : (the_insn.LO ? RELOC_DLX_LO16 : RELOC_DLX_16); the_insn.reloc_offset = 2; the_insn.size = 2; the_insn.pcrel = 0; @@ -1164,6 +1178,7 @@ md_apply_fix3 (fixP, valP, seg) switch (fixP->fx_r_type) { + case RELOC_DLX_LO16: case RELOC_DLX_REL16: if (fixP->fx_bit_fixP != (bit_fixS *) NULL) { diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index c11a82cab5d..907a2e86219 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2004-04-01 Dave Korn + + * gas/dlx/alltests.exp: Execute new lohi test. + * gas/dlx/lohi.s: New test for spurious lo16/hi16 + reloc overflow checking. + * gas/dlx/lohi.d: New file: expected output. + * gas/dlx/lhi.d: Updated to properly expect lo16 + relocations where asked for. + * gas/dlx/itype.d: Likewise. + * gas/dlx/lhi.d: Corrected cut+paste error in test name. + 2004-03-30 Stan Shebs * gas/macros/macros.exp: Remove mention of MPW config. diff --git a/gas/testsuite/gas/dlx/alltests.exp b/gas/testsuite/gas/dlx/alltests.exp index 003448bc689..cee7f350c8e 100644 --- a/gas/testsuite/gas/dlx/alltests.exp +++ b/gas/testsuite/gas/dlx/alltests.exp @@ -5,6 +5,7 @@ if [istarget dlx*-*-*] { run_dump_test "itype" run_dump_test "lhi" run_dump_test "load" + run_dump_test "lohi" run_dump_test "rtype" run_dump_test "store" } diff --git a/gas/testsuite/gas/dlx/itype.d b/gas/testsuite/gas/dlx/itype.d index 845ae4162e3..1b8e92ba712 100644 --- a/gas/testsuite/gas/dlx/itype.d +++ b/gas/testsuite/gas/dlx/itype.d @@ -16,7 +16,7 @@ Disassembly of section .text: 12: R_DLX_RELOC_16 .text 14: 35 4c 00 78 ori r12,r10,0x0078 18: 39 af 00 00 xori r15,r13,0x0000 - 1a: R_DLX_RELOC_16 .text + 1a: R_DLX_RELOC_16_LO .text 1c: da 30 00 1c slli r16,r17,0x001c 1e: R_DLX_RELOC_16 .text 20: e2 93 00 0f srai r19,r20,0x000f diff --git a/gas/testsuite/gas/dlx/lhi.d b/gas/testsuite/gas/dlx/lhi.d index db3b35d659e..e8551297408 100644 --- a/gas/testsuite/gas/dlx/lhi.d +++ b/gas/testsuite/gas/dlx/lhi.d @@ -1,6 +1,6 @@ #as: #objdump: -dr -#name: itype +#name: lhi .*: +file format .* @@ -11,7 +11,7 @@ Disassembly of section .text: 4: 3c 03 00 00 lhi r3,0x0000 6: R_DLX_RELOC_16_HI .text 8: 3c 04 00 00 lhi r4,0x0000 - a: R_DLX_RELOC_16 .text + a: R_DLX_RELOC_16_LO .text c: 3c 04 ff fb lhi r4,0xfffb e: R_DLX_RELOC_16 .text 10: 3c 04 00 0c lhi r4,0x000c @@ -19,5 +19,5 @@ Disassembly of section .text: 18: 20 04 00 00 addi r4,r0,0x0000 1a: R_DLX_RELOC_16_HI .text 1c: 34 84 00 18 ori r4,r4,0x0018 - 1e: R_DLX_RELOC_16 .text + 1e: R_DLX_RELOC_16_LO .text 20: 20 64 00 00 addi r4,r3,0x0000 diff --git a/gas/testsuite/gas/dlx/lohi.d b/gas/testsuite/gas/dlx/lohi.d new file mode 100644 index 00000000000..f97ef355d34 --- /dev/null +++ b/gas/testsuite/gas/dlx/lohi.d @@ -0,0 +1,18 @@ +#as: +#objdump: -dr +#name: lohi + +.*: +file format .* + +Disassembly of section .text: + +00000000 <.text>: + 0: 00 00 00 00 nop + 4: 3c 01 00 03 lhi r1,0x0003 + 6: R_DLX_RELOC_16_HI .text + 8: 34 01 0d 44 ori r1,r0,0x0d44 + a: R_DLX_RELOC_16_LO .text + c: 3c 01 0b eb lhi r1,0x0beb + e: R_DLX_RELOC_16_HI .text + 10: 34 01 c2 04 ori r1,r0,0xc204 + 12: R_DLX_RELOC_16_LO .text diff --git a/gas/testsuite/gas/dlx/lohi.s b/gas/testsuite/gas/dlx/lohi.s new file mode 100644 index 00000000000..f88ad44dfd9 --- /dev/null +++ b/gas/testsuite/gas/dlx/lohi.s @@ -0,0 +1,9 @@ + .text + .align 2 + nop +.L1: + lhi r1,%hi(.L1 + 200000) + ori r1,r0,%lo(.L1 + 200000) + lhi r1,%hi(.L1 + 200000000) + ori r1,r0,%lo(.L1 + 200000000) + .end -- 2.30.2