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>
This commit is contained in:
Dimitar Dimitrov 2016-12-30 12:39:49 +02:00 committed by Alan Modra
parent 93f11b16ec
commit 0220170b4d
56 changed files with 812 additions and 9 deletions

View File

@ -1,3 +1,63 @@
2016-12-31 Dimitar Dimitrov <dimitar@dinux.eu>
* 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.
* 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.
2016-12-31 Dimitar Dimitrov <dimitar@dinux.eu>
* testsuite/lib/ld-lib.exp (run_dump_test): Pass -- to send_log.

View File

@ -1714,6 +1714,12 @@ eppcnw.c: $(srcdir)/emulparams/ppcnw.sh \
eppcpe.c: $(srcdir)/emulparams/ppcpe.sh \
$(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/ppcpe.sc ${GEN_DEPENDS}
epruelf.c: $(srcdir)/emulparams/pruelf.sh \
$(srcdir)/emultempl/elf32.em \
$(ELF_DEPS) $(srcdir)/scripttempl/pru.sc \
$(srcdir)/emultempl/pruelf.em ${GEN_DEPENDS}
${GENSCRIPTS} pruelf "$(tdir_pruelf)"
eriscix.c: $(srcdir)/emulparams/riscix.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}

View File

@ -3307,6 +3307,12 @@ eppcnw.c: $(srcdir)/emulparams/ppcnw.sh \
eppcpe.c: $(srcdir)/emulparams/ppcpe.sh \
$(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/ppcpe.sc ${GEN_DEPENDS}
epruelf.c: $(srcdir)/emulparams/pruelf.sh \
$(srcdir)/emultempl/elf32.em \
$(ELF_DEPS) $(srcdir)/scripttempl/pru.sc \
$(srcdir)/emultempl/pruelf.em ${GEN_DEPENDS}
${GENSCRIPTS} pruelf "$(tdir_pruelf)"
eriscix.c: $(srcdir)/emulparams/riscix.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}

View File

@ -1,5 +1,7 @@
-*- text -*-
* Add support for the Texas Instruments PRU processor.
Changes in 2.28:
* The EXCLUDE_FILE linker script construct can now be applied outside of the

View File

@ -684,6 +684,7 @@ powerpc-*-aix*) targ_emul=aixppc ;;
powerpc-*-beos*) targ_emul=aixppc ;;
powerpc-*-windiss*) targ_emul=elf32ppcwindiss ;;
powerpc-*-lynxos*) targ_emul=ppclynx ;;
pru*-*-*) targ_emul=pruelf ;;
riscv32*-*-*) targ_emul=elf32lriscv
targ_extra_emuls="elf64lriscv"
targ_extra_libpath=$targ_extra_emuls ;;

19
ld/emulparams/pruelf.sh Normal file
View File

@ -0,0 +1,19 @@
SCRIPT_NAME=elf
TEMPLATE_NAME=elf32
OUTPUT_FORMAT="elf32-pru"
LITTLE_OUTPUT_FORMAT="elf32-pru"
SCRIPT_NAME=pru
ARCH=pru
MACHINE=
MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
EMBEDDED=yes
TEXT_ORIGIN=0x20000000
TEXT_LENGTH=8K
DATA_ORIGIN=0x0
DATA_LENGTH=8K
ENTRY=_start
EXTRA_EM_FILE=pruelf

50
ld/emultempl/pruelf.em Normal file
View File

@ -0,0 +1,50 @@
# This shell script emits a C file. -*- C -*-
# Copyright (C) 2016 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
#
# This file is sourced from elf32.em, and defines extra pru-elf
# specific routines.
#
fragment <<EOF
#include "ldctor.h"
/* This is called after the sections have been attached to output
sections, but before any sizes or addresses have been set. */
static void
pruelf_before_allocation (void)
{
/* Call the default first. */
gld${EMULATION_NAME}_before_allocation ();
/* Enable relaxation by default if the "--no-relax" option was not
specified. This is done here instead of in the before_parse hook
because there is a check in main() to prohibit use of --relax and
-r together. */
if (RELAXATION_DISABLED_BY_DEFAULT)
ENABLE_RELAXATION;
}
EOF
# Put these extra pru-elf routines in ld_${EMULATION_NAME}_emulation
#
LDEMUL_BEFORE_ALLOCATION=pruelf_before_allocation

179
ld/scripttempl/pru.sc Normal file
View File

@ -0,0 +1,179 @@
cat <<EOF
OUTPUT_FORMAT("${OUTPUT_FORMAT}","${OUTPUT_FORMAT}","${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
MEMORY
{
imem (x) : ORIGIN = $TEXT_ORIGIN, LENGTH = $TEXT_LENGTH
dmem (rw!x) : ORIGIN = $DATA_ORIGIN, LENGTH = $DATA_LENGTH
}
__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : 32;
__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 512;
${RELOCATING+ PROVIDE (_stack_top = ORIGIN(dmem) + LENGTH(dmem)) ; }
${RELOCATING+ENTRY (_start)}
SECTIONS
{
/* Read-only sections, merged into text segment: */
${TEXT_DYNAMIC+${DYNAMIC}}
.hash ${RELOCATING-0} : { *(.hash) }
.dynsym ${RELOCATING-0} : { *(.dynsym) }
.dynstr ${RELOCATING-0} : { *(.dynstr) }
.gnu.version ${RELOCATING-0} : { *(.gnu.version) }
.gnu.version_d ${RELOCATING-0} : { *(.gnu.version_d) }
.gnu.version_r ${RELOCATING-0} : { *(.gnu.version_r) }
.rel.init ${RELOCATING-0} : { *(.rel.init) }
.rela.init ${RELOCATING-0} : { *(.rela.init) }
.rel.text ${RELOCATING-0} :
{
*(.rel.text)
${RELOCATING+*(.rel.text.*)}
${RELOCATING+*(.rel.gnu.linkonce.t*)}
}
.rela.text ${RELOCATING-0} :
{
*(.rela.text)
${RELOCATING+*(.rela.text.*)}
${RELOCATING+*(.rela.gnu.linkonce.t*)}
}
.rel.fini ${RELOCATING-0} : { *(.rel.fini) }
.rela.fini ${RELOCATING-0} : { *(.rela.fini) }
.rel.rodata ${RELOCATING-0} :
{
*(.rel.rodata)
${RELOCATING+*(.rel.rodata.*)}
${RELOCATING+*(.rel.gnu.linkonce.r*)}
}
.rela.rodata ${RELOCATING-0} :
{
*(.rela.rodata)
${RELOCATING+*(.rela.rodata.*)}
${RELOCATING+*(.rela.gnu.linkonce.r*)}
}
.rel.data ${RELOCATING-0} :
{
*(.rel.data)
${RELOCATING+*(.rel.data.*)}
${RELOCATING+*(.rel.gnu.linkonce.d*)}
}
.rela.data ${RELOCATING-0} :
{
*(.rela.data)
${RELOCATING+*(.rela.data.*)}
${RELOCATING+*(.rela.gnu.linkonce.d*)}
}
.rel.ctors ${RELOCATING-0} : { *(.rel.ctors) }
.rela.ctors ${RELOCATING-0} : { *(.rela.ctors) }
.rel.dtors ${RELOCATING-0} : { *(.rel.dtors) }
.rela.dtors ${RELOCATING-0} : { *(.rela.dtors) }
.rel.got ${RELOCATING-0} : { *(.rel.got) }
.rela.got ${RELOCATING-0} : { *(.rela.got) }
.rel.bss ${RELOCATING-0} : { *(.rel.bss) }
.rela.bss ${RELOCATING-0} : { *(.rela.bss) }
.rel.plt ${RELOCATING-0} : { *(.rel.plt) }
.rela.plt ${RELOCATING-0} : { *(.rela.plt) }
/* Internal text space. */
.text ${RELOCATING-0} :
{
${RELOCATING+ _text_start = . ; }
${RELOCATING+. = ALIGN(4);}
${RELOCATING+*(.init0) /* Start here after reset. */}
${RELOCATING+KEEP (*(.init0))}
${RELOCATING+. = ALIGN(4);}
*(.text)
${RELOCATING+. = ALIGN(4);}
${RELOCATING+*(.text.*)}
${RELOCATING+. = ALIGN(4);}
${RELOCATING+*(.gnu.linkonce.t*)}
${RELOCATING+. = ALIGN(4);}
${RELOCATING+ _text_end = . ; }
} ${RELOCATING+ > imem}
.data ${RELOCATING-0} :
{
/* Optional variable that user is prepared to have NULL address. */
${RELOCATING+ *(.data.atzero*)}
/* CRT is prepared for constructor/destructor table to have
a "valid" NULL address. */
${CONSTRUCTING+ _ctors_start = . ; }
${CONSTRUCTING+ KEEP (*(SORT_BY_INIT_PRIORITY(.ctors.*)))}
${CONSTRUCTING+ KEEP (*(.ctors))}
${CONSTRUCTING+ _ctors_end = . ; }
${CONSTRUCTING+ _dtors_start = . ; }
${CONSTRUCTING+ KEEP (*(SORT_BY_INIT_PRIORITY(.dtors.*)))}
${CONSTRUCTING+ KEEP (*(.dtors))}
${CONSTRUCTING+ _dtors_end = . ; }
/* DATA memory starts at address 0. So to avoid placing a valid static
variable at the invalid NULL address, we introduce the .data.atzero
section. If CRT can make some use of it - great. Otherwise skip a
word. In all cases .data/.bss sections must start at non-zero. */
. += (. == 0 ? 4 : 0);
${RELOCATING+ PROVIDE (_data_start = .) ; }
*(.data)
${RELOCATING+ *(.data*)}
${RELOCATING+ *(.rodata) /* We need to include .rodata here if gcc is used. */}
${RELOCATING+ *(.rodata.*) /* with -fdata-sections. */}
${RELOCATING+*(.gnu.linkonce.d*)}
${RELOCATING+*(.gnu.linkonce.r*)}
${RELOCATING+. = ALIGN(4);}
${RELOCATING+ PROVIDE (_data_end = .) ; }
} ${RELOCATING+ > dmem }
.resource_table ${RELOCATING-0} :
{
*(.resource_table)
KEEP (*(.resource_table))
} > dmem
.bss ${RELOCATING-0} :
{
${RELOCATING+ PROVIDE (_bss_start = .) ; }
*(.bss)
${RELOCATING+ *(.bss.*)}
${RELOCATING+*(.gnu.linkonce.b*)}
*(COMMON)
${RELOCATING+ PROVIDE (_bss_end = .) ; }
} ${RELOCATING+ > dmem}
/* Global data not cleared after reset. */
.noinit ${RELOCATING-0}:
{
${RELOCATING+ PROVIDE (_noinit_start = .) ; }
*(.noinit)
${RELOCATING+ PROVIDE (_noinit_end = .) ; }
${RELOCATING+ PROVIDE (_heap_start = .) ; }
${RELOCATING+ . += __HEAP_SIZE ; }
/* Stack is not here really. It will be put at the end of DMEM.
But we take into account its size here, in order to allow
for MEMORY overflow checking during link time. */
${RELOCATING+ . += __STACK_SIZE ; }
} ${RELOCATING+ > dmem}
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
EOF
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
}
EOF

View File

@ -2,7 +2,7 @@
#ld: -e _start --eh-frame-hdr
#objdump: -hw
#target: cfi
#xfail: avr*-*-* or1k*-*-elf or1k*-*-rtems* visium-*-*
#xfail: avr*-*-* or1k*-*-elf or1k*-*-rtems* pru-*-* visium-*-*
# These targets support CFI generation but not shared libraries.
#...
[0-9] .eh_frame_hdr 0*[12][048c] .*

View File

@ -4,6 +4,7 @@
#nm: -n
#notarget: hppa*-*-hpux*
#xfail: m68hc1*-* xgate-* cr16-*-* crx-*-* dlx-*-* nds32*-*-* visium-*-*
#xfail: pru-*-*
#...
.* end

View File

@ -1,7 +1,7 @@
#source: group8.s
#ld: -r --gc-sections --entry foo
#readelf: -g --wide
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-*
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-* pru-*-*
#notarget: hppa64-*-* i370-*-* i860-*-* ia64-*-* mep-*-* mn10200-*-*
#xfail: cr16-*-* crx-*-*
# generic linker targets don't support --gc-sections, nor do a bunch of others

View File

@ -1,7 +1,7 @@
#source: group8.s
#ld: -r --gc-sections --entry bar
#readelf: -g --wide
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-*
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-* pru-*-*
#notarget: hppa64-*-* i370-*-* i860-*-* ia64-*-* mep-*-* mn10200-*-*
#xfail: cr16-*-* crx-*-*
# generic linker targets don't support --gc-sections, nor do a bunch of others

View File

@ -1,7 +1,7 @@
#source: group9.s
#ld: -r --gc-sections --entry foo
#readelf: -g --wide
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-*
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-* pru-*-*
#notarget: alpha-*-* hppa64-*-* i370-*-* i860-*-* ia64-*-* mep-*-* mn10200-*-*
#xfail: cr16-*-* crx-*-*
# generic linker targets don't support --gc-sections, nor do a bunch of others

View File

@ -1,7 +1,7 @@
#source: group9.s
#ld: -r --gc-sections --entry bar
#readelf: -g --wide
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-*
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-* pru-*-*
#notarget: alpha-*-* hppa64-*-* i370-*-* i860-*-* ia64-*-* mep-*-* mn10200-*-*
#xfail: cr16-*-* crx-*-*
# generic linker targets don't support --gc-sections, nor do a bunch of others

View File

@ -6,7 +6,7 @@
#xfail: "i370-*-*" "i860-*-*" "i960-*-*" "ip2k-*-*" "iq2000-*-*" "lm32-*-*"
#xfail: "mcore-*-*" "mn102*-*-*" "ms1-*-*" "mep-*-*" "m68hc11-*-*"
#xfail: "or32-*-*" "pj-*-*" "sparc*-*-*" "tic6x-*-*" "vax-*-*" "xstormy16-*-*"
#xfail: "xtensa*-*-*" "metag-*-*" "ft32-*-*"
#xfail: "xtensa*-*-*" "metag-*-*" "ft32-*-*" "pru-*-*"
.*: file format .*elf.*

View File

@ -2,7 +2,7 @@
#source: start.s
#ld: --gc-sections
#readelf: -s --wide
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-*
#notarget: d30v-*-* dlx-*-* i960-*-* pj*-*-* pru-*-*
#notarget: hppa64-*-* i370-*-* i860-*-* ia64-*-* mep-*-* mn10200-*-*
# generic linker targets don't support --gc-sections, nor do a bunch of others

View File

@ -1,6 +1,6 @@
#ld: -Ttext=0x60
#readelf: -S --wide
#notarget: d10v-* m68hc1*-* msp*-* visium-* xgate-* xstormy*-*
#notarget: d10v-* m68hc1*-* msp*-* visium-* xgate-* xstormy*-* pru-*-*
# the above targets use memory regions that don't allow 0x60 for .text
#...

View File

@ -87,6 +87,7 @@ if { [istarget avr-*-*]
|| [istarget moxie-*-*]
|| [istarget msp430-*-*]
|| [istarget mt-*-*]
|| [istarget pru-*-*]
|| [istarget visium-*-*]
} {
set B_test_same_seg 0

View File

@ -170,7 +170,8 @@ if { ![istarget "d10v-*-*"]
&& ![istarget "avr-*-*"]
&& ![istarget "msp*-*-*"]
&& ![istarget "fr30-*-*"]
&& ![istarget "iq2000-*-*"] } {
&& ![istarget "iq2000-*-*"]
&& ![istarget "pru-*-*"] } {
foreach sfile $sfiles { puts $ofd "#source: $sfile" }
if { [istarget spu*-*-*] } {
puts $ofd "#ld: --local-store 0:0"

View File

@ -0,0 +1,37 @@
#name: Emit relocs 1
#source: emit-relocs-1a.s
#source: emit-relocs-1b.s
#ld: -q -T emit-relocs-1.ld
#objdump: -sr
.*: file format .*
RELOCATION RECORDS FOR \[\.data\]:
OFFSET TYPE VALUE *
00000000 R_PRU_BFD_RELOC32 \.data
00000004 R_PRU_BFD_RELOC32 \.data\+0x00001000
00000008 R_PRU_BFD_RELOC32 \.merge1\+0x00000002
0000000c R_PRU_BFD_RELOC32 \.merge2
00000010 R_PRU_BFD_RELOC32 \.merge3
00000014 R_PRU_BFD_RELOC32 \.merge3\+0x00000004
00000020 R_PRU_BFD_RELOC32 \.data\+0x00000020
00000024 R_PRU_BFD_RELOC32 \.data\+0x00001020
00000028 R_PRU_BFD_RELOC32 \.merge1
0000002c R_PRU_BFD_RELOC32 \.merge2\+0x00000002
00000030 R_PRU_BFD_RELOC32 \.merge3\+0x00000008
00000034 R_PRU_BFD_RELOC32 \.merge3\+0x00000004
Contents of section \.text:
80000 e0e0e012 00000000 00000000 00000000 .*
Contents of section \.merge1:
80400 666c7574 74657200 flutter.*
Contents of section \.merge2:
80800 74617374 696e6700 tasting.*
Contents of section \.merge3:
80c00 00010000 00020000 00030000 .*
Contents of section \.data:
81000 00100800 00200800 02040800 00080800 .*
81010 000c0800 040c0800 00000000 00000000 .*
81020 20100800 20200800 00040800 02080800 .*
81030 080c0800 040c0800 .*

View File

@ -0,0 +1,20 @@
ENTRY(_start)
SECTIONS
{
. = 0x80000;
.text : { *(.text) }
. = ALIGN (0x400);
.merge1 : { *(.merge1) }
. = ALIGN (0x400);
.merge2 : { *(.merge2) }
. = ALIGN (0x400);
.merge3 : { *(.merge3) }
. = ALIGN (0x400);
.data : { *(.data) }
/DISCARD/ : { *(*) }
}

View File

@ -0,0 +1,24 @@
.text
.align 4
.globl _start
_start:
nop
.section .merge1,"aMS",@progbits,1
A: .string "utter"
.section .merge2,"aMS",@progbits,1
B: .string "tasting"
.section .merge3,"aM",@progbits,4
C: .4byte 0x100
D: .4byte 0x200
.data
.align 4
E: .4byte E
.4byte E + 0x1000
.4byte A
.4byte B
.4byte C
.4byte D

View File

@ -0,0 +1,18 @@
.section .merge1,"aMS",@progbits,1
A: .string "flutter"
.section .merge2,"aMS",@progbits,1
B: .string "sting"
.section .merge3,"aM",@progbits,4
C: .4byte 0x300
D: .4byte 0x200
.data
.align 4
E: .4byte E
.4byte E + 0x1000
.4byte A
.4byte B
.4byte C
.4byte D

View File

@ -0,0 +1,12 @@
#name: PRU R_PRU_LDI32
#source: ldi32.s
#source: ldi32_symbol.s
#ld:
#objdump: -dr --prefix-addresses
# Test the ldi32 relocation
.*: +file format elf32-pru
Disassembly of section .text:
[0-9a-f]+ <[^>]*> ldi r16, 48879
[0-9a-f]+ <[^>]*> ldi r16.w2, 57005

View File

@ -0,0 +1,6 @@
# Test the ldi32 relocation
.text
.global _start
_start:
ldi32 r16, long_symbol

View File

@ -0,0 +1,2 @@
.global long_symbol
.set long_symbol, 0xDEADBEEF

View File

@ -0,0 +1,20 @@
#name: PRU LDI32 disabled-relaxation data
#source: relax_ldi32.s
#source: relax_ldi32_symbol.s
#as: --mlink-relax
#ld: --no-relax
#objdump: -s
# Note: default linker script should put a guard at DRAM address 0
.*: +file format elf32-pru
Contents of section .text:
[0-9a-f]+ f0efbe24 d0adde24 0f00f630 f0efbe24 .*
[0-9a-f]+ d0adde24 f0cace24 d0000024 e0cace24 .*
[0-9a-f]+ f0cace24 d0010024 f0efbe24 d0acde24 .*
[0-9a-f]+ f0785624 d0341224 f0785624 d0000024 .*
[0-9a-f]+ f0120024 f100007e .*
Contents of section .data:
0000 00000000 48000020 40000000 12004000 .*
0010 10000000 f0ffffff 100040aa .*

View File

@ -0,0 +1,29 @@
#name: PRU LDI32 disabled-relaxation
#source: relax_ldi32.s
#source: relax_ldi32_symbol.s
#as: --mlink-relax
#ld: --no-relax
#objdump: -dr --prefix-addresses
# Test the LDI32 relaxation
.*: +file format elf32-pru
Disassembly of section .text:
..000000 <[^>]*> ldi r16, 48879
..000004 <[^>]*> ldi r16.w2, 57005
..000008 <[^>]*> loop ..000044 <__end_loop>, r22
..00000c <[^>]*> ldi r16, 48879
..000010 <[^>]*> ldi r16.w2, 57005
..000014 <[^>]*> ldi r16, 52938
..000018 <[^>]*> ldi r16.w2, 0
..00001c <[^>]*> ldi r0, 52938
..000020 <[^>]*> ldi r16, 52938
..000024 <[^>]*> ldi r16.w2, 1
..000028 <[^>]*> ldi r16, 48879
..00002c <[^>]*> ldi r16.w2, 57004
..000030 <[^>]*> ldi r16, 22136
..000034 <[^>]*> ldi r16.w2, 4660
..000038 <[^>]*> ldi r16, 22136
..00003c <[^>]*> ldi r16.w2, 0
..000040 <[^>]*> ldi r16, 18
..000044 <[^>]*> qba ..000008 <__intermediate>

View File

@ -0,0 +1,18 @@
#name: PRU R_PRU_S10_PCREL
#source: pcrel_s10.s
#source: pcrel_s10_label.s
#ld:
#objdump: -dr --prefix-addresses
# Test the relative quick branch relocations.
.*: +file format elf32-pru
Disassembly of section .text:
[0-9a-f]+ <[^>]*> qba [0-9a-f]+ <ext_label>
[0-9a-f]+ <[^>]*> qba [0-9a-f]+ <ext_label\+0x10>
[0-9a-f]+ <[^>]*> nop
[0-9a-f]+ <[^>]*> nop
[0-9a-f]+ <[^>]*> nop
[0-9a-f]+ <[^>]*> nop
[0-9a-f]+ <[^>]*> nop
[0-9a-f]+ <[^>]*> nop

View File

@ -0,0 +1,7 @@
# Test for pc-relative relocations
.text
.section .init0, "x"
.global _start
_start:
qba ext_label
qba ext_label + 16

View File

@ -0,0 +1,9 @@
.text
ext_label:
nop
nop
nop
nop
nop
nop
.global ext_label

View File

@ -0,0 +1,7 @@
#name: PRU R_PRU_U8_PCREL illegal
#source: pcrel_u8-illegal.s
#source: pcrel_u8_label.s
#ld:
#error: [^\n]*: relocation truncated to fit: R_PRU_U8_PCREL against `.init0'
# Check that LOOP cannot reference "prior" labels.

View File

@ -0,0 +1,9 @@
# Test for illegal pc-relative relocations
.text
.section .init0, "x"
.global _start
_start:
foo:
# Negative loop termination point
nop
loop foo, r20

View File

@ -0,0 +1,7 @@
#name: PRU R_PRU_U8_PCREL illegal offset 0
#source: pcrel_u8-illegal2.s
#source: pcrel_u8_label.s
#ld:
#error: [^\n]*: relocation out of range
# Check that LOOP cannot reference "prior" labels.

View File

@ -0,0 +1,7 @@
# Test for illegal pc-relative relocations
.text
.section .init0, "x"
.global _start
_start:
L0:
loop L0, r0

View File

@ -0,0 +1,7 @@
#name: PRU R_PRU_U8_PCREL illegal offset 0
#source: pcrel_u8-illegal2.s
#source: pcrel_u8_label.s
#ld:
#error: [^\n]*: relocation out of range
# Check that LOOP cannot reference "prior" labels.

View File

@ -0,0 +1,7 @@
# Test for illegal pc-relative relocations
.text
.section .init0, "x"
.global _start
_start:
loop L1, r0
L1:

View File

@ -0,0 +1,15 @@
#name: PRU R_PRU_U8_PCREL
#source: pcrel_u8.s
#source: pcrel_u8_label.s
#ld:
#objdump: -dr --prefix-addresses
# Test the relative quick branch relocations.
.*: +file format elf32-pru
Disassembly of section .text:
[0-9a-f]+ <[^>]*> loop [0-9a-f]+ <end_loop>, 5
[0-9a-f]+ <[^>]*> nop
[0-9a-f]+ <[^>]*> nop
[0-9a-f]+ <[^>]*> nop
[0-9a-f]+ <[^>]*> nop

View File

@ -0,0 +1,9 @@
# Test for pc-relative relocations
.text
.section .init0, "x"
.global _start
_start:
loop end_loop, 5
nop
nop
nop

View File

@ -0,0 +1,4 @@
.text
end_loop:
nop
.global end_loop

View File

@ -0,0 +1,15 @@
#name: PRU R_PRU_BFD_*_PMEM
#source: pmem.s
#source: pmem_symbol.s
#ld:
#objdump: -s
# Note: default linker script should put a guard at DRAM address 0
.*: +file format elf32-pru
Contents of section .text:
[0-9a-f]+ e0050024 e0070024 05000000 05000600 .*
[0-9a-f]+ e0e0e012 e0e0e012 .*
Contents of section .data:
0000 00000000 .*

View File

@ -0,0 +1,15 @@
# Test for PRU pmem relocations
.global byte_sym
.global short_sym
.global long_sym
.set byte_sym, 0xFA
.set short_sym, 0xFACE
.set long_sym, 0xDEADBEEF
.text
.global _text_label
nop
_text_label:
nop

View File

@ -0,0 +1,13 @@
.text
.section .init0, "x"
.global _start
_start:
# U16_PMEMIMM
ldi r0, %pmem(_text_label)
ldi r0, %pmem(_text_label + 8)
# Try 32/16_PMEM
.4byte %pmem(_text_label)
.2byte %pmem(_text_label)
.2byte %pmem(_text_label + 4)

View File

@ -0,0 +1,8 @@
if { ! [istarget pru-*-*] } {
return
}
foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.d]] {
verbose [file rootname $test]
run_dump_test [file rootname $test]
}

View File

@ -0,0 +1,19 @@
#name: PRU LDI32 relaxation data
#source: relax_ldi32.s
#source: relax_ldi32_symbol.s
#as: --mlink-relax
#ld: --relax
#objdump: -s
# Note: default linker script should put a guard at DRAM address 0
.*: +file format elf32-pru
Contents of section .text:
[0-9a-f]+ f0efbe24 d0adde24 0d00f630 f0efbe24 .*
[0-9a-f]+ d0adde24 f0cace24 e0cace24 f0cace24 .*
[0-9a-f]+ d0010024 f0efbe24 d0acde24 f0785624 .*
[0-9a-f]+ d0341224 f0785624 f0100024 f300007e .*
Contents of section .data:
0000 00000000 40000020 38000000 10003800 .*
0010 0e000000 f2ffffff 0e0038aa .*

View File

@ -0,0 +1,27 @@
#name: PRU LDI32 relaxation
#source: relax_ldi32.s
#source: relax_ldi32_symbol.s
#as: --mlink-relax
#ld: --relax
#objdump: -dr --prefix-addresses
# Test the LDI32 relaxation
.*: +file format elf32-pru
Disassembly of section .text:
..000000 <[^>]*> ldi r16, 48879
..000004 <[^>]*> ldi r16.w2, 57005
..000008 <[^>]*> loop ..00003c <__end_loop>, r22
..00000c <[^>]*> ldi r16, 48879
..000010 <[^>]*> ldi r16.w2, 57005
..000014 <[^>]*> ldi r16, 52938
..000018 <[^>]*> ldi r0, 52938
..00001c <[^>]*> ldi r16, 52938
..000020 <[^>]*> ldi r16.w2, 1
..000024 <[^>]*> ldi r16, 48879
..000028 <[^>]*> ldi r16.w2, 57004
..00002c <[^>]*> ldi r16, 22136
..000030 <[^>]*> ldi r16.w2, 4660
..000034 <[^>]*> ldi r16, 22136
..000038 <[^>]*> ldi r16, 16
..00003c <[^>]*> qba ..000008 <__intermediate>

View File

@ -0,0 +1,30 @@
# Test LDI32 relaxation
.text
.global _start
_start:
ldi32 r16, long_symbol
__intermediate:
loop __end_loop, r22
ldi32 r16, long_symbol
ldi32 r16, short_symbol
ldi r0, short_symbol
ldi32 r16, short_symbol + 0x10000
ldi32 r16, long_symbol - 0x10000
ldi32 r16, 0x12345678
ldi32 r16, 0x5678
ldi r16, %pmem(__end)
__end_loop:
qba __intermediate
__end:
.data
.4byte __end
.4byte (__end - __intermediate)
.2byte %pmem(__end)
.2byte (__end - __intermediate)
.4byte %pmem(__end - __intermediate)
.4byte %pmem(__intermediate - __end)
.2byte %pmem(__end - __intermediate)
.byte (__end - __intermediate)
.byte 0xaa

View File

@ -0,0 +1,5 @@
.global long_symbol
.global short_symbol
.set long_symbol, 0xDEADBEEF
.set short_symbol, 0xceca

View File

@ -0,0 +1,14 @@
#name: PRU R_PRU_BFD_RELOC_XX
#source: reloc.s
#source: reloc_symbol.s
#ld:
#objdump: -s
# Note: default linker script should put a guard at DRAM address 0
.*: +file format elf32-pru
Contents of section .text:
[0-9a-f]+ fa00cefa efbeadde facefaef beadde00 .*
Contents of section .data:
0000 00000000 .*

View File

@ -0,0 +1,9 @@
# Test for PRU 32-bit, 16 and 8-bit relocations
.global byte_sym
.global short_sym
.global long_sym
.set byte_sym, 0xFA
.set short_sym, 0xFACE
.set long_sym, 0xDEADBEEF

View File

@ -0,0 +1,24 @@
.text
.section .init0, "x"
.global _start
_start:
# byte aligned
.align 0
.byte byte_sym
# short aligned
.align 1
.short short_sym
# word aligned
.align 2
.long long_sym
# now lets try some unaligned words and halfwords
.byte byte_sym
.2byte short_sym
.4byte long_sym
# .align 2
# nop

11
ld/testsuite/ld-pru/u16.d Normal file
View File

@ -0,0 +1,11 @@
#name: PRU R_PRU_U16
#source: u16.s
#source: u16_symbol.s
#ld:
#objdump: -dr --prefix-addresses
# Test the regulard LDI relocation
.*: +file format elf32-pru
Disassembly of section .text:
[0-9a-f]+ <[^>]*> ldi r16, 54321

View File

@ -0,0 +1,4 @@
.text
.global _start
_start:
ldi r16, short_symbol

View File

@ -0,0 +1,2 @@
.global short_symbol
.set short_symbol, 54321

View File

@ -300,6 +300,11 @@ proc run_srec_test { test objs } {
set flags "$flags -no-relax"
}
# PRU ELF target relaxes by default; S-Record linker does not
if [istarget pru*-*-*] {
set flags "$flags -no-relax"
}
if { ![ld_simple_link $ld tmpdir/sr1 "$flags $objs"] \
|| ![ld_simple_link $ld tmpdir/sr2.sr "$flags --oformat srec $objs"] } {
fail $test

View File

@ -1705,6 +1705,7 @@ proc check_gc_sections_available { } {
|| [istarget dlx-*-*]
|| [istarget i960-*-*]
|| [istarget pj*-*-*]
|| [istarget pru*-*-*]
|| [istarget alpha-*-*]
|| [istarget hppa*64-*-*]
|| [istarget i370-*-*]
@ -1777,6 +1778,7 @@ proc check_shared_lib_support { } {
&& ![istarget nds32*-*-*]
&& ![istarget or1k*-*-*]
&& ![istarget pj-*-*]
&& ![istarget pru-*-*]
&& ![istarget rl78-*-*]
&& ![istarget rx-*-*]
&& ![istarget spu-*-*]