[ARC] Add new linker emulation for nps

The arc700 nps variant uses some specific named sections to
facilitate its CMEM based instructions, which operate on memory
regions fixed at specific addresses.

This commit adds the arclinux_nps emulation, which is based on the
arclinux emulation. The new emulation uses the OTHER_SECTIONS
variable in the emulation parameters script to provide symbols
mapping to various locations in the CMEM space on nps.

The accompanying test ensures that all symbols are provided at the
correct address in the linker script.

ld/ChangeLog:

  * Makefile.am: Add earclinux_nps.c target and add to
  ALL_EMULATION_SOURCES.
  * Makefile.in: Likewise, regenerated.
  * configure.tgt: Add arclinux_nps as an extra emulation for
  arc*-*-elf* and arc*-*-linux*.
  * emulparams/arc-nps.sh: New file.
  * emulparams/arclinux_nps.sh: New file.
  * testsuite/ld-arc/arclinux-nps.d,
  * testsuite/ld-arc/arclinux-nps.s: New test.
This commit is contained in:
Graham Markall 2016-12-08 16:58:23 +00:00 committed by Andrew Burgess
parent 74def31dcd
commit 07ccf83cf5
8 changed files with 205 additions and 2 deletions

View File

@ -1,3 +1,16 @@
2016-12-09 Graham Markall <graham.markall@embecosm.com>
Andrew Burgess <andrew.burgess@embecosm.com>
* Makefile.am: Add earclinux_nps.c target and add to
ALL_EMULATION_SOURCES.
* Makefile.in: Likewise, regenerated.
* configure.tgt: Add arclinux_nps as an extra emulation for
arc*-*-elf* and arc*-*-linux*.
* emulparams/arc-nps.sh: New file.
* emulparams/arclinux_nps.sh: New file.
* testsuite/ld-arc/arclinux-nps.d,
* testsuite/ld-arc/arclinux-nps.s: New test.
2017-01-04 Dilan Palauzov <dilyan.palauzov@aegee.org>
PR 20958

View File

@ -164,6 +164,7 @@ ALL_EMULATION_SOURCES = \
earcelf.c \
earcelf_prof.c \
earclinux.c \
earclinux_nps.c \
earclinux_prof.c \
earm_epoc_pe.c \
earm_wince_pe.c \
@ -731,6 +732,11 @@ earclinux.c: $(srcdir)/emulparams/arclinux.sh \
$(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
$(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
earclinux_nps.c: $(srcdir)/emulparams/arclinux_nps.sh \
$(srcdir)/emulparams/arc-nps.sh \
$(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
$(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
earclinux_prof.c: $(srcdir)/emulparams/arclinux_prof.sh \
$(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
$(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}

View File

@ -533,6 +533,7 @@ ALL_EMULATION_SOURCES = \
earcelf.c \
earcelf_prof.c \
earclinux.c \
earclinux_nps.c \
earclinux_prof.c \
earm_epoc_pe.c \
earm_wince_pe.c \
@ -1142,6 +1143,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earcelf.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earcelf_prof.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earclinux.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earclinux_nps.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earclinux_prof.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earcv2elf.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earcv2elfx.Po@am__quote@
@ -2294,6 +2296,11 @@ earclinux.c: $(srcdir)/emulparams/arclinux.sh \
$(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
$(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
earclinux_nps.c: $(srcdir)/emulparams/arclinux_nps.sh \
$(srcdir)/emulparams/arc-nps.sh \
$(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
$(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}
earclinux_prof.c: $(srcdir)/emulparams/arclinux_prof.sh \
$(ELF_DEPS) $(srcdir)/emultempl/arclinux.em \
$(srcdir)/scripttempl/arclinux.sc ${GEN_DEPENDS}

View File

@ -78,10 +78,10 @@ alpha*-*-openbsd*) targ_emul=elf64alpha ;;
alpha*-*-*vms*) targ_emul=alphavms
;;
arc*-*-elf*) targ_emul=arcelf
targ_extra_emuls="arcelf_prof arclinux arclinux_prof arcv2elf arcv2elfx"
targ_extra_emuls="arcelf_prof arclinux arclinux_nps arclinux_prof arcv2elf arcv2elfx"
;;
arc*-*-linux*) targ_emul=arclinux
targ_extra_emuls="arclinux_prof arcelf arcelf_prof arcv2elf arcv2elfx"
targ_extra_emuls="arclinux_nps arclinux_prof arcelf arcelf_prof arcv2elf arcv2elfx"
;;
arm-epoc-pe) targ_emul=arm_epoc_pe ; targ_extra_ofiles="deffilep.o pe-dll.o" ;;
arm*-*-cegcc*) targ_emul=arm_wince_pe ; targ_extra_ofiles="deffilep.o pe-dll.o"

78
ld/emulparams/arc-nps.sh Normal file
View File

@ -0,0 +1,78 @@
OTHER_SECTIONS="
/* Start of symbols and sections required to support CMEM instructions
on NPS targets. */
PROVIDE (_cmem_start = ADDR (.cmem) );
PROVIDE (_cmem_alter_start = ADDR (.cmem_alter) );
PROVIDE (_cmem_shared_start = ADDR (.cmem_shared) );
PROVIDE (_cmem_shared_alter_start = ADDR (.cmem_shared_alter) );
PROVIDE (_fmt_slot0_start = ADDR (.fmt_slot0) );
PROVIDE (_fmt_slot1_start = ADDR (.fmt_slot1) );
PROVIDE (_fmt_slot2_start = ADDR (.fmt_slot2) );
PROVIDE (_fmt_slot3_start = ADDR (.fmt_slot3) );
PROVIDE (_fmt_slot4_start = ADDR (.fmt_slot4) );
PROVIDE (_fmt_slot5_start = ADDR (.fmt_slot5) );
PROVIDE (_fmt_slot6_start = ADDR (.fmt_slot6) );
PROVIDE (_fmt_slot7_start = ADDR (.fmt_slot7) );
PROVIDE (_fmt_slot8_start = ADDR (.fmt_slot8) );
PROVIDE (_fmt_slot9_start = ADDR (.fmt_slot9) );
PROVIDE (_fmt_slot10_start = ADDR (.fmt_slot10) );
PROVIDE (_fmt_slot11_start = ADDR (.fmt_slot11) );
PROVIDE (_fmt_slot12_start = ADDR (.fmt_slot12) );
PROVIDE (_fmt_slot13_start = ADDR (.fmt_slot13) );
PROVIDE (_fmt_slot14_start = ADDR (.fmt_slot14) );
PROVIDE (_fmt_slot15_start = ADDR (.fmt_slot15) );
PROVIDE (_cmem_end = ADDR (.cmem) + SIZEOF (.cmem) );
PROVIDE (_cmem_alter_end = ADDR (.cmem_alter) + SIZEOF (.cmem_alter) );
PROVIDE (_cmem_shared_end = ADDR (.cmem_shared) + SIZEOF (.cmem_shared) );
PROVIDE (_cmem_shared_alter_end = ADDR (.cmem_shared_alter) + SIZEOF (.cmem_shared_alter) );
PROVIDE (_fmt_slot0_end = ADDR (.fmt_slot0) + SIZEOF (.fmt_slot0) );
PROVIDE (_fmt_slot1_end = ADDR (.fmt_slot1) + SIZEOF (.fmt_slot1) );
PROVIDE (_fmt_slot2_end = ADDR (.fmt_slot2) + SIZEOF (.fmt_slot2) );
PROVIDE (_fmt_slot3_end = ADDR (.fmt_slot3) + SIZEOF (.fmt_slot3) );
PROVIDE (_fmt_slot4_end = ADDR (.fmt_slot4) + SIZEOF (.fmt_slot4) );
PROVIDE (_fmt_slot5_end = ADDR (.fmt_slot5) + SIZEOF (.fmt_slot5) );
PROVIDE (_fmt_slot6_end = ADDR (.fmt_slot6) + SIZEOF (.fmt_slot6) );
PROVIDE (_fmt_slot7_end = ADDR (.fmt_slot7) + SIZEOF (.fmt_slot7) );
PROVIDE (_fmt_slot8_end = ADDR (.fmt_slot8) + SIZEOF (.fmt_slot8) );
PROVIDE (_fmt_slot9_end = ADDR (.fmt_slot9) + SIZEOF (.fmt_slot9) );
PROVIDE (_fmt_slot10_end = ADDR (.fmt_slot10) + SIZEOF (.fmt_slot10) );
PROVIDE (_fmt_slot11_end = ADDR (.fmt_slot11) + SIZEOF (.fmt_slot11) );
PROVIDE (_fmt_slot12_end = ADDR (.fmt_slot12) + SIZEOF (.fmt_slot12) );
PROVIDE (_fmt_slot13_end = ADDR (.fmt_slot13) + SIZEOF (.fmt_slot13) );
PROVIDE (_fmt_slot14_end = ADDR (.fmt_slot14) + SIZEOF (.fmt_slot14) );
PROVIDE (_fmt_slot15_end = ADDR (.fmt_slot15) + SIZEOF (.fmt_slot15) );
OVERLAY 0x57f00000 :
{
.cmem { *(.cmem) }
.cmem_alter { *(.cmem_alter) }
}
OVERLAY 0x57f08000 :
{
.cmem_shared { *(.cmem_shared) }
.cmem_shared_alter { *(.cmem_shared_alter) }
}
.fmt_slot0 0x58000000 : { *(.fmt_slot0) }
.fmt_slot1 0x58800000 : { *(.fmt_slot1) }
.fmt_slot2 0x59000000 : { *(.fmt_slot2) }
.fmt_slot3 0x59800000 : { *(.fmt_slot3) }
.fmt_slot4 0x5a000000 : { *(.fmt_slot4) }
.fmt_slot5 0x5a800000 : { *(.fmt_slot5) }
.fmt_slot6 0x5b000000 : { *(.fmt_slot6) }
.fmt_slot7 0x5b800000 : { *(.fmt_slot7) }
.fmt_slot8 0x5c000000 : { *(.fmt_slot8) }
.fmt_slot9 0x5c800000 : { *(.fmt_slot9) }
.fmt_slot10 0x5d000000 : { *(.fmt_slot10) }
.fmt_slot11 0x5d800000 : { *(.fmt_slot11) }
.fmt_slot12 0x5e000000 : { *(.fmt_slot12) }
.fmt_slot13 0x5e800000 : { *(.fmt_slot13) }
.fmt_slot14 0x5f000000 : { *(.fmt_slot14) }
.fmt_slot15 0x5f800000 : { *(.fmt_slot15) }
/* End of nps specific sections and symbols. */
${OTHER_SECTIONS}"

View File

@ -0,0 +1,3 @@
. ${srcdir}/emulparams/arclinux.sh
# Extend the OTHER_SECTIONS for nps.
. ${srcdir}/emulparams/arc-nps.sh

View File

@ -0,0 +1,50 @@
#source: arclinux-nps.s
#as: -mnps400
#ld: -marclinux_nps
#objdump: -dr
.*: +file format .*arc.*
Disassembly of section .text:
[0-9a-f]+ <.*>:
[0-9a-f]+: 200a 0f80 57f0 0000 mov r0,0x57f00000
[0-9a-f]+: 200a 0f80 57f0 0000 mov r0,0x57f00000
[0-9a-f]+: 200a 0f80 57f0 8000 mov r0,0x57f08000
[0-9a-f]+: 200a 0f80 57f0 8000 mov r0,0x57f08000
[0-9a-f]+: 200a 0f80 5800 0000 mov r0,0x58000000
[0-9a-f]+: 200a 0f80 5880 0000 mov r0,0x58800000
[0-9a-f]+: 200a 0f80 5900 0000 mov r0,0x59000000
[0-9a-f]+: 200a 0f80 5980 0000 mov r0,0x59800000
[0-9a-f]+: 200a 0f80 5a00 0000 mov r0,0x5a000000
[0-9a-f]+: 200a 0f80 5a80 0000 mov r0,0x5a800000
[0-9a-f]+: 200a 0f80 5b00 0000 mov r0,0x5b000000
[0-9a-f]+: 200a 0f80 5b80 0000 mov r0,0x5b800000
[0-9a-f]+: 200a 0f80 5c00 0000 mov r0,0x5c000000
[0-9a-f]+: 200a 0f80 5c80 0000 mov r0,0x5c800000
[0-9a-f]+: 200a 0f80 5d00 0000 mov r0,0x5d000000
[0-9a-f]+: 200a 0f80 5d80 0000 mov r0,0x5d800000
[0-9a-f]+: 200a 0f80 5e00 0000 mov r0,0x5e000000
[0-9a-f]+: 200a 0f80 5e80 0000 mov r0,0x5e800000
[0-9a-f]+: 200a 0f80 5f00 0000 mov r0,0x5f000000
[0-9a-f]+: 200a 0f80 5f80 0000 mov r0,0x5f800000
[0-9a-f]+: 200a 0f80 57f0 0000 mov r0,0x57f00000
[0-9a-f]+: 200a 0f80 57f0 0000 mov r0,0x57f00000
[0-9a-f]+: 200a 0f80 57f0 8000 mov r0,0x57f08000
[0-9a-f]+: 200a 0f80 57f0 8000 mov r0,0x57f08000
[0-9a-f]+: 200a 0f80 5800 0000 mov r0,0x58000000
[0-9a-f]+: 200a 0f80 5880 0000 mov r0,0x58800000
[0-9a-f]+: 200a 0f80 5900 0000 mov r0,0x59000000
[0-9a-f]+: 200a 0f80 5980 0000 mov r0,0x59800000
[0-9a-f]+: 200a 0f80 5a00 0000 mov r0,0x5a000000
[0-9a-f]+: 200a 0f80 5a80 0000 mov r0,0x5a800000
[0-9a-f]+: 200a 0f80 5b00 0000 mov r0,0x5b000000
[0-9a-f]+: 200a 0f80 5b80 0000 mov r0,0x5b800000
[0-9a-f]+: 200a 0f80 5c00 0000 mov r0,0x5c000000
[0-9a-f]+: 200a 0f80 5c80 0000 mov r0,0x5c800000
[0-9a-f]+: 200a 0f80 5d00 0000 mov r0,0x5d000000
[0-9a-f]+: 200a 0f80 5d80 0000 mov r0,0x5d800000
[0-9a-f]+: 200a 0f80 5e00 0000 mov r0,0x5e000000
[0-9a-f]+: 200a 0f80 5e80 0000 mov r0,0x5e800000
[0-9a-f]+: 200a 0f80 5f00 0000 mov r0,0x5f000000
[0-9a-f]+: 200a 0f80 5f80 0000 mov r0,0x5f800000

View File

@ -0,0 +1,46 @@
.text
.global __start
__start:
mov r0, _cmem_start
mov r0, _cmem_alter_start
mov r0, _cmem_shared_start
mov r0, _cmem_shared_alter_start
mov r0, _fmt_slot0_start
mov r0, _fmt_slot1_start
mov r0, _fmt_slot2_start
mov r0, _fmt_slot3_start
mov r0, _fmt_slot4_start
mov r0, _fmt_slot5_start
mov r0, _fmt_slot6_start
mov r0, _fmt_slot7_start
mov r0, _fmt_slot8_start
mov r0, _fmt_slot9_start
mov r0, _fmt_slot10_start
mov r0, _fmt_slot11_start
mov r0, _fmt_slot12_start
mov r0, _fmt_slot13_start
mov r0, _fmt_slot14_start
mov r0, _fmt_slot15_start
mov r0, _cmem_end
mov r0, _cmem_alter_end
mov r0, _cmem_shared_end
mov r0, _cmem_shared_alter_end
mov r0, _fmt_slot0_end
mov r0, _fmt_slot1_end
mov r0, _fmt_slot2_end
mov r0, _fmt_slot3_end
mov r0, _fmt_slot4_end
mov r0, _fmt_slot5_end
mov r0, _fmt_slot6_end
mov r0, _fmt_slot7_end
mov r0, _fmt_slot8_end
mov r0, _fmt_slot9_end
mov r0, _fmt_slot10_end
mov r0, _fmt_slot11_end
mov r0, _fmt_slot12_end
mov r0, _fmt_slot13_end
mov r0, _fmt_slot14_end
mov r0, _fmt_slot15_end