[PATCH 0/3][BFD][MSP430] Fix relocation overflows for -mcpu=msp430
Jozef Lawrynowicz
jozef.l@mittosystems.com
Tue Jan 21 20:21:00 GMT 2020
The GCC testsuite has a number of failures for -mcpu=msp430 (the 430 ISA),
caused by the linker error:
> relocation truncated to fit: R_MSP430_10_PCREL against symbol
The failures are somewhat transient; changes to code generation can cause
them to appear/disappear for certain tests.
The relocation truncations occur because msp430_elf_relax_section knows how to
relax unconditional branches into jumps but not how to relax jumps back to
unconditional branches, which is required if that jump is later put out of
range.
This bug is not fundamentally specific to the 430 ISA, however it only appears
to manifest for it because it requires branch instructions to addresses >~1KB
away to be generated. This only really happens when generating code for the 430
ISA, which makes use of branches to library helper routines to pop the required
number of registers off the stack on exit from a function
(__mspabi_func_epilog_X).
The errors were caused by the enabling of the relaxation of unconditional
branches for the 430 ISA back in 133193b8ae/cfe7b9bd58.
Reverting these changes fixes the relocation overflows and some execution
failures, so I have regtested my patches against that reverted state, to ensure
no fallout is missed.
Successfully regtested GCC/G++/Binutils testsuites for -mcpu=msp430,
-mcpu=msp430x, -mlarge and
-mlarge/-mdata-region=either/-mcode-region=either.
Ok to apply?
Jozef Lawrynowicz (3):
MSP430: Add printf statements to assist with debugging during
relaxation
MSP430: Enable relaxation of relocs in unconditional branch insns
MSP430: Enable relaxation of jump instructions to hard-coded prcrel
offsets
bfd/elf32-msp430.c | 255 +++++++++++++++++++++++++++++++++++++--------
1 file changed, 212 insertions(+), 43 deletions(-)
--
2.17.1
More information about the Binutils
mailing list