[ARC] Add new linker emulation for nps
authorGraham Markall <graham.markall@embecosm.com>
Thu, 8 Dec 2016 16:58:23 +0000 (16:58 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 10 Jan 2017 10:55:13 +0000 (10:55 +0000)
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.

ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/configure.tgt
ld/emulparams/arc-nps.sh [new file with mode: 0644]
ld/emulparams/arclinux_nps.sh [new file with mode: 0644]
ld/testsuite/ld-arc/arclinux-nps.d [new file with mode: 0644]
ld/testsuite/ld-arc/arclinux-nps.s [new file with mode: 0644]

index 1ea2cb01402b35452acc92af2b51dde35fefe39e..b1c6993e8357c29fa1c0168d93eb5a83fd46adc3 100644 (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
index 5bd00168e82fc85a288ea39431cdd617270b328b..9dd31ffefe4aa6c109c08a8aaf86a7d0d496ae9b 100644 (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}
index 936440244235881132a0465d25e8c4168b3022f0..c4643021da7f37df55ef9549f70f1197cd428965 100644 (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}
index 8f01b51c2a3e13bbc4e04c3ef54fe20b8a0c21cd..7eb53ce5b2d6c4937ac38053117bec5495fe8eba 100644 (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"
diff --git a/ld/emulparams/arc-nps.sh b/ld/emulparams/arc-nps.sh
new file mode 100644 (file)
index 0000000..615e6d5
--- /dev/null
@@ -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}"
diff --git a/ld/emulparams/arclinux_nps.sh b/ld/emulparams/arclinux_nps.sh
new file mode 100644 (file)
index 0000000..b1c6a7d
--- /dev/null
@@ -0,0 +1,3 @@
+. ${srcdir}/emulparams/arclinux.sh
+# Extend the OTHER_SECTIONS for nps.
+. ${srcdir}/emulparams/arc-nps.sh
diff --git a/ld/testsuite/ld-arc/arclinux-nps.d b/ld/testsuite/ld-arc/arclinux-nps.d
new file mode 100644 (file)
index 0000000..5ccd7fc
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-arc/arclinux-nps.s b/ld/testsuite/ld-arc/arclinux-nps.s
new file mode 100644 (file)
index 0000000..38bf897
--- /dev/null
@@ -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