Commit Graph

2 Commits

Author SHA1 Message Date
Dimitar Dimitrov 493ffac5aa Fix binary compatibility between GCC and the TI compiler for the PRU target.
My original implementation for LDI32 pseudo does not conform to
the TI ABI.  I wrongly documented my TI PRU ELF object files inspection,
which got propagated into my binutils implementation.

Issue was exposed when running the GCC ABI testsuite against TI toolchain.
According to TI ABI, LDI32 must use first LDI instruction to load
the MSB 16bits, and second LDI instruction for the LSB 16bits.

This patch will break binary compatibility with previously released
binutils versions for PRU. Still, I think it is better to fix
binutils to conform to the chip vendor ABI.

bfd	* elf32-pru.c (pru_elf32_do_ldi32_relocate): Make LDI32 relocation
	conformant to TI ABI.
	(pru_elf32_relax_section): Likewise.
	(pru_elf_relax_delete_bytes): Fix offsets for new LDI32 code.
	* elf32-pru.c (pru_elf32_do_ldi32_relocate): Ignore addend.
	(pru_elf32_pmem_relocate): Trap - should not get here.
	(pru_elf32_relocate_section): Add support for REL relocations.
	(elf_info_to_howto_rel): Enable REL.
	(elf_backend_may_use_rel_p): Likewise.
	(elf_backend_may_use_rela_p): Likewise.
	(elf_backend_default_use_rela_p): Likewise.

gas	* config/tc-pru.c (md_apply_fix): Make LDI32 relocation conformant
	to TI ABI.
	(pru_assemble_arg_i): Likewise.
	(output_insn_ldi32): Likewise.
	* testsuite/gas/pru/ldi.d: Update test for the now fixed LDI32.
	* gas/config/tc-pru.c (pru_assemble_arg_b): Check imm8 operand range.
	* gas/testsuite/gas/pru/illegal2.l: New test.
	* gas/testsuite/gas/pru/illegal2.s: New test.
	* gas/testsuite/gas/pru/pru.exp: Register new illegal2 test.

ld	* scripttempl/pru.sc: Add LD sections to allow linking TI
	toolchain object files.
	* scripttempl/pru.sc: Switch to init_array.
	* testsuite/ld-pru/ldi32.d: Update LDI32 test to conform to TI ABI.
	* testsuite/ld-pru/norelax_ldi32-data.d: Likewise.
	* testsuite/ld-pru/norelax_ldi32-dis.d: Likewise.
	* testsuite/ld-pru/relax_ldi32-data.d: Likewise.
	* testsuite/ld-pru/relax_ldi32-dis.d: Likewise.
2018-05-09 11:39:32 +01:00
Dimitar Dimitrov 0220170b4d PRU LD Port
* NEWS: Mention new PRU target.
	* Makefile.am: Add PRU target.
	* configure.tgt: Ditto.
	* emulparams/pruelf.sh: New file.
	* emultempl/pruelf.em: New file.
	* scripttempl/pru.sc: New file.
	* Makefile.in: Regenerate.
	* testsuite/ld-pru/emit-relocs-1.d: New PRU testcase file.
	* testsuite/ld-pru/emit-relocs-1.ld: Ditto.
	* testsuite/ld-pru/emit-relocs-1a.s: Ditto.
	* testsuite/ld-pru/emit-relocs-1b.s
	* testsuite/ld-pru/ldi32.d: Ditto.
	* testsuite/ld-pru/ldi32.s: Ditto.
	* testsuite/ld-pru/ldi32_symbol.s: Ditto.
	* testsuite/ld-pru/norelax_ldi32-data.d: Ditto.
	* testsuite/ld-pru/norelax_ldi32-dis.d: Ditto.
	* testsuite/ld-pru/pcrel_s10.d: Ditto.
	* testsuite/ld-pru/pcrel_s10.s: Ditto.
	* testsuite/ld-pru/pcrel_s10_label.s: Ditto.
	* testsuite/ld-pru/pcrel_u8-illegal.d: Ditto.
	* testsuite/ld-pru/pcrel_u8-illegal.s: Ditto.
	* testsuite/ld-pru/pcrel_u8-illegal2.d: Ditto.
	* testsuite/ld-pru/pcrel_u8-illegal2.s: Ditto.
	* testsuite/ld-pru/pcrel_u8-illegal3.d: Ditto.
	* testsuite/ld-pru/pcrel_u8-illegal3.s: Ditto.
	* testsuite/ld-pru/pcrel_u8.d: Ditto.
	* testsuite/ld-pru/pcrel_u8.s: Ditto.
	* testsuite/ld-pru/pcrel_u8_label.s: Ditto.
	* testsuite/ld-pru/pmem.d: Ditto.
	* testsuite/ld-pru/pmem.s: Ditto.
	* testsuite/ld-pru/pmem_symbol.s: Ditto.
	* testsuite/ld-pru/pru.exp: Ditto.
	* testsuite/ld-pru/relax_ldi32-data.d: Ditto.
	* testsuite/ld-pru/relax_ldi32-dis.d: Ditto.
	* testsuite/ld-pru/relax_ldi32.s: Ditto.
	* testsuite/ld-pru/relax_ldi32_symbol.s: Ditto.
	* testsuite/ld-pru/reloc.d: Ditto.
	* testsuite/ld-pru/reloc.s: Ditto.
	* testsuite/ld-pru/reloc_symbol.s: Ditto.
	* testsuite/ld-pru/u16.d: Ditto.
	* testsuite/ld-pru/u16.s: Ditto.
	* testsuite/ld-pru/u16_symbol.s: Ditto.

PRU does not export __end symbol because it is ambiguous for it.
Users are expected to use instead the section markers __text_end,
__data_end, __bss_end or __noinit_end.

	* testsuite/lib/ld-lib.exp (check_shared_lib_support): No shared
	libraries are supported for PRU.
	(check_gc_sections_available): Mark PRU as not supported.
	* testsuite/ld-elf/eh-frame-hdr.d: Disable for PRU.
	* testsuite/ld-elf/endsym.d: Likewise.
	* testsuite/ld-elf/group8a.d: Likewise.
	* testsuite/ld-elf/group8b.d: Likewise.
	* testsuite/ld-elf/group9a.d: Likewise.
	* testsuite/ld-elf/group9b.d: Likewise.
	* testsuite/ld-elf/merge.d: Likewise.
	* testsuite/ld-elf/pr12851.d: Likewise.
	* testsuite/ld-elf/pr14926.d: Likewise.
	* testsuite/ld-elf/sec-to-seg.exp: Likewise.
	* testsuite/ld-elf/sec64k.exp: Mark sec64k case as too big for PRU.
	* testsuite/ld-srec/srec.exp (run_srec_test): Add setup for PRU.

Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
2016-12-31 12:04:11 +10:30