[PATCH] Correctly emit lo16 relocs for elf-dlx target, fixing bogus range checking bug.
Dave Korn
dk@artimi.com
Sat Mar 6 20:27:00 GMT 2004
Hi everyone. I came across this while fixing a gcc testsuite regression
on this same target. Basically, lo/hi16 relocs were being bogusly checked
to see if the entire addend would fit into 16 bits, when after all it can be
a full 32 bits. Lines of code like this:
lhi r1,%hi(.L1 + 200000)
ori r1,r0,%lo(.L1 + 200000)
produced incorrect error messages like this:
/gnu/src/gas/testsuite/gas/dlx/lohi.s:5: Error: value of 200004 too large
for field of 2 bytes at 6
/gnu/src/gas/testsuite/gas/dlx/lohi.s:6: Error: value of 200004 too large
for field of 2 bytes at 10
Looking at it slightly closer, it turns out that the DLX assembler wasn't
ever generating lo16 relocs, but was emitting standard 16-bit relocs
instead.
The attached patch fixes this problem. With this patch, range checking is
turned off for hi/lo16 relocs; and a %lo operator generates a lo16 reloc,
while referring to a label directly as an operand generates an ordinary
16bit reloc as before. There's also a testcase for the bug and necessary
updates to the other testcases that use %lo. Passes make check with no
regressions. It should be a small enough fix for assignment not to be an
issue.
2004-03-06 Dave Korn <dk@artimi.com>
gas/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.
gas/testsuite/gas/
* alltests.exp: execute new lohi test.
* lohi.d, lohi.s: new test for spurious lo16/hi16
reloc overflow checking.
* itype.d, lhi.d: updated to properly expect lo16
relocations where asked for.
* lhi.d: corrected cut+paste error in test name.
cheers,
DaveK
--
Can't think of a witty .sigline today....
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: gas-diff.txt
URL: <https://sourceware.org/pipermail/binutils/attachments/20040306/125eb814/attachment.txt>
More information about the Binutils
mailing list