PRU LD Port
authorDimitar Dimitrov <dimitar@dinux.eu>
Fri, 30 Dec 2016 10:39:49 +0000 (12:39 +0200)
committerAlan Modra <amodra@gmail.com>
Sat, 31 Dec 2016 01:34:11 +0000 (12:04 +1030)
* 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>
56 files changed:
ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/NEWS
ld/configure.tgt
ld/emulparams/pruelf.sh [new file with mode: 0644]
ld/emultempl/pruelf.em [new file with mode: 0644]
ld/scripttempl/pru.sc [new file with mode: 0644]
ld/testsuite/ld-elf/eh-frame-hdr.d
ld/testsuite/ld-elf/endsym.d
ld/testsuite/ld-elf/group8a.d
ld/testsuite/ld-elf/group8b.d
ld/testsuite/ld-elf/group9a.d
ld/testsuite/ld-elf/group9b.d
ld/testsuite/ld-elf/merge.d
ld/testsuite/ld-elf/pr12851.d
ld/testsuite/ld-elf/pr14926.d
ld/testsuite/ld-elf/sec-to-seg.exp
ld/testsuite/ld-elf/sec64k.exp
ld/testsuite/ld-pru/emit-relocs-1.d [new file with mode: 0644]
ld/testsuite/ld-pru/emit-relocs-1.ld [new file with mode: 0644]
ld/testsuite/ld-pru/emit-relocs-1a.s [new file with mode: 0644]
ld/testsuite/ld-pru/emit-relocs-1b.s [new file with mode: 0644]
ld/testsuite/ld-pru/ldi32.d [new file with mode: 0644]
ld/testsuite/ld-pru/ldi32.s [new file with mode: 0644]
ld/testsuite/ld-pru/ldi32_symbol.s [new file with mode: 0644]
ld/testsuite/ld-pru/norelax_ldi32-data.d [new file with mode: 0644]
ld/testsuite/ld-pru/norelax_ldi32-dis.d [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_s10.d [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_s10.s [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_s10_label.s [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_u8-illegal.d [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_u8-illegal.s [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_u8-illegal2.d [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_u8-illegal2.s [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_u8-illegal3.d [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_u8-illegal3.s [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_u8.d [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_u8.s [new file with mode: 0644]
ld/testsuite/ld-pru/pcrel_u8_label.s [new file with mode: 0644]
ld/testsuite/ld-pru/pmem.d [new file with mode: 0644]
ld/testsuite/ld-pru/pmem.s [new file with mode: 0644]
ld/testsuite/ld-pru/pmem_symbol.s [new file with mode: 0644]
ld/testsuite/ld-pru/pru.exp [new file with mode: 0644]
ld/testsuite/ld-pru/relax_ldi32-data.d [new file with mode: 0644]
ld/testsuite/ld-pru/relax_ldi32-dis.d [new file with mode: 0644]
ld/testsuite/ld-pru/relax_ldi32.s [new file with mode: 0644]
ld/testsuite/ld-pru/relax_ldi32_symbol.s [new file with mode: 0644]
ld/testsuite/ld-pru/reloc.d [new file with mode: 0644]
ld/testsuite/ld-pru/reloc.s [new file with mode: 0644]
ld/testsuite/ld-pru/reloc_symbol.s [new file with mode: 0644]
ld/testsuite/ld-pru/u16.d [new file with mode: 0644]
ld/testsuite/ld-pru/u16.s [new file with mode: 0644]
ld/testsuite/ld-pru/u16_symbol.s [new file with mode: 0644]
ld/testsuite/ld-srec/srec.exp
ld/testsuite/lib/ld-lib.exp

index 144672e68f5f8ed929990d8185f7eae6db542bae..f55272cafe365fadb912f254fad0270c5d85ade8 100644 (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.
index ac908bce859a9b0057d51b6be3ad2a8859b42d91..524be3e09790d1435dfa08c8e5560cc440ae6624 100644 (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}
 
index 46c0302df18263e5e5137e533435e04253e98921..b545eb71e2d481c3ecb8a7dbc9981ca28aaf97c0 100644 (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}
 
diff --git a/ld/NEWS b/ld/NEWS
index 583d50a3b2d8c6d1131edddda3633d3216017860..0a455505d19120e52a96a1941db536404c3d63ef 100644 (file)
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -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
index b9f4782b4d1f25aad1aa2cc33e18a8975f09b0e6..5e0447e6b16497714d0538764df8b812fbbac7f7 100644 (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 ;;
diff --git a/ld/emulparams/pruelf.sh b/ld/emulparams/pruelf.sh
new file mode 100644 (file)
index 0000000..02debba
--- /dev/null
@@ -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
diff --git a/ld/emultempl/pruelf.em b/ld/emultempl/pruelf.em
new file mode 100644 (file)
index 0000000..dd3ec76
--- /dev/null
@@ -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
diff --git a/ld/scripttempl/pru.sc b/ld/scripttempl/pru.sc
new file mode 100644 (file)
index 0000000..88fe06c
--- /dev/null
@@ -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
index f73d0e51e6cd8b9197088e2a3f9eeb757a7ee76b..a76ac738662287d59db6de19511b183dc200f78a 100644 (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] .*
index eefdd43912c042cecce77cb1b1e63071b766c1b6..3472154e1867369b5ed1ac7153974e27151230ba 100644 (file)
@@ -4,6 +4,7 @@
 #nm: -n
 #notarget: hppa*-*-hpux*
 #xfail: m68hc1*-* xgate-* cr16-*-* crx-*-* dlx-*-* nds32*-*-* visium-*-*
+#xfail: pru-*-*
 
 #...
 .* end
index 45955ba390aff3cb4cc2adf5765dfad0c970051a..52112e9208572e113f828d227a0ff6b5eeb19d46 100644 (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
index 0175c7fac9793dd8577fe2b23b4407f75faa6af6..879cd1305d81567e82b6270f0cd2a5cb5dd23f53 100644 (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
index 44fe606b360d29de7b2bfa94697e79cffba249fe..346254b13fc39d93c37fedc386ef2f6f245041b7 100644 (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
index 4ab2ba692264d47c4a52929ed6a9efe2b0a3745f..3005f8f4b7b478fc18ce68785250386ef709bd36 100644 (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
index 818959d1ee936b1c37f7516ccae30e10ab654322..d46acb667401259f4d614dc3359e0ea94590e652 100644 (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.*
 
index 48ecb090124b561e840d7cbb81242320ad253384..61c224d47d2004465c2bd88bb81521dc22086d5c 100644 (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
 
index 88c521ce87a8e45f7f4d014915b83277c3357d65..8fc8e6416c7edc3d7feaf2b69bbb215c65138bb4 100644 (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
 
 #...
index 8847318aa7d5e0f987dcca2811c19cf20f25f9ec..af3d604e18abd605f0f31900ad9aa2cea0df9bd5 100644 (file)
@@ -87,6 +87,7 @@ if {    [istarget avr-*-*]
      || [istarget moxie-*-*]
      || [istarget msp430-*-*]
      || [istarget mt-*-*]
+     || [istarget pru-*-*]
      || [istarget visium-*-*]
     } {
     set B_test_same_seg 0
index 7f7a9f35541948279a2281fe2d1d6ba75a983963..283d7798afa7abf6d8c15b51228a47813ad9dcc1 100644 (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"
diff --git a/ld/testsuite/ld-pru/emit-relocs-1.d b/ld/testsuite/ld-pru/emit-relocs-1.d
new file mode 100644 (file)
index 0000000..414234f
--- /dev/null
@@ -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 .*
diff --git a/ld/testsuite/ld-pru/emit-relocs-1.ld b/ld/testsuite/ld-pru/emit-relocs-1.ld
new file mode 100644 (file)
index 0000000..1879ef4
--- /dev/null
@@ -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/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-pru/emit-relocs-1a.s b/ld/testsuite/ld-pru/emit-relocs-1a.s
new file mode 100644 (file)
index 0000000..bf0a8a1
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/emit-relocs-1b.s b/ld/testsuite/ld-pru/emit-relocs-1b.s
new file mode 100644 (file)
index 0000000..82229c1
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/ldi32.d b/ld/testsuite/ld-pru/ldi32.d
new file mode 100644 (file)
index 0000000..123ead3
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/ldi32.s b/ld/testsuite/ld-pru/ldi32.s
new file mode 100644 (file)
index 0000000..1165fe6
--- /dev/null
@@ -0,0 +1,6 @@
+# Test the ldi32 relocation
+
+       .text
+       .global _start
+_start:
+       ldi32   r16, long_symbol
diff --git a/ld/testsuite/ld-pru/ldi32_symbol.s b/ld/testsuite/ld-pru/ldi32_symbol.s
new file mode 100644 (file)
index 0000000..2e16066
--- /dev/null
@@ -0,0 +1,2 @@
+       .global long_symbol
+       .set long_symbol, 0xDEADBEEF
diff --git a/ld/testsuite/ld-pru/norelax_ldi32-data.d b/ld/testsuite/ld-pru/norelax_ldi32-data.d
new file mode 100644 (file)
index 0000000..47fc2c1
--- /dev/null
@@ -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           .*
diff --git a/ld/testsuite/ld-pru/norelax_ldi32-dis.d b/ld/testsuite/ld-pru/norelax_ldi32-dis.d
new file mode 100644 (file)
index 0000000..072de5f
--- /dev/null
@@ -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>
diff --git a/ld/testsuite/ld-pru/pcrel_s10.d b/ld/testsuite/ld-pru/pcrel_s10.d
new file mode 100644 (file)
index 0000000..95602c5
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/pcrel_s10.s b/ld/testsuite/ld-pru/pcrel_s10.s
new file mode 100644 (file)
index 0000000..2a55773
--- /dev/null
@@ -0,0 +1,7 @@
+# Test for pc-relative relocations
+       .text
+       .section .init0, "x"
+       .global _start
+_start:
+       qba ext_label
+       qba ext_label + 16
diff --git a/ld/testsuite/ld-pru/pcrel_s10_label.s b/ld/testsuite/ld-pru/pcrel_s10_label.s
new file mode 100644 (file)
index 0000000..2dc424c
--- /dev/null
@@ -0,0 +1,9 @@
+       .text
+ext_label:
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       .global ext_label
diff --git a/ld/testsuite/ld-pru/pcrel_u8-illegal.d b/ld/testsuite/ld-pru/pcrel_u8-illegal.d
new file mode 100644 (file)
index 0000000..a885237
--- /dev/null
@@ -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.
diff --git a/ld/testsuite/ld-pru/pcrel_u8-illegal.s b/ld/testsuite/ld-pru/pcrel_u8-illegal.s
new file mode 100644 (file)
index 0000000..e33bd80
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/pcrel_u8-illegal2.d b/ld/testsuite/ld-pru/pcrel_u8-illegal2.d
new file mode 100644 (file)
index 0000000..604ea98
--- /dev/null
@@ -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.
diff --git a/ld/testsuite/ld-pru/pcrel_u8-illegal2.s b/ld/testsuite/ld-pru/pcrel_u8-illegal2.s
new file mode 100644 (file)
index 0000000..a4bcf97
--- /dev/null
@@ -0,0 +1,7 @@
+# Test for illegal pc-relative relocations
+       .text
+       .section .init0, "x"
+       .global _start
+_start:
+L0:
+       loop L0, r0
diff --git a/ld/testsuite/ld-pru/pcrel_u8-illegal3.d b/ld/testsuite/ld-pru/pcrel_u8-illegal3.d
new file mode 100644 (file)
index 0000000..604ea98
--- /dev/null
@@ -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.
diff --git a/ld/testsuite/ld-pru/pcrel_u8-illegal3.s b/ld/testsuite/ld-pru/pcrel_u8-illegal3.s
new file mode 100644 (file)
index 0000000..8eb71f5
--- /dev/null
@@ -0,0 +1,7 @@
+# Test for illegal pc-relative relocations
+       .text
+       .section .init0, "x"
+       .global _start
+_start:
+       loop L1, r0
+L1:
diff --git a/ld/testsuite/ld-pru/pcrel_u8.d b/ld/testsuite/ld-pru/pcrel_u8.d
new file mode 100644 (file)
index 0000000..60ff058
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/pcrel_u8.s b/ld/testsuite/ld-pru/pcrel_u8.s
new file mode 100644 (file)
index 0000000..948e5a5
--- /dev/null
@@ -0,0 +1,9 @@
+# Test for pc-relative relocations
+       .text
+       .section .init0, "x"
+       .global _start
+_start:
+       loop end_loop, 5
+       nop
+       nop
+       nop
diff --git a/ld/testsuite/ld-pru/pcrel_u8_label.s b/ld/testsuite/ld-pru/pcrel_u8_label.s
new file mode 100644 (file)
index 0000000..e4652fa
--- /dev/null
@@ -0,0 +1,4 @@
+       .text
+end_loop:
+       nop
+       .global end_loop
diff --git a/ld/testsuite/ld-pru/pmem.d b/ld/testsuite/ld-pru/pmem.d
new file mode 100644 (file)
index 0000000..b5747de
--- /dev/null
@@ -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                             .*
diff --git a/ld/testsuite/ld-pru/pmem.s b/ld/testsuite/ld-pru/pmem.s
new file mode 100644 (file)
index 0000000..4c67ae3
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/pmem_symbol.s b/ld/testsuite/ld-pru/pmem_symbol.s
new file mode 100644 (file)
index 0000000..d3eb386
--- /dev/null
@@ -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)
diff --git a/ld/testsuite/ld-pru/pru.exp b/ld/testsuite/ld-pru/pru.exp
new file mode 100644 (file)
index 0000000..ac01a3c
--- /dev/null
@@ -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]
+}
diff --git a/ld/testsuite/ld-pru/relax_ldi32-data.d b/ld/testsuite/ld-pru/relax_ldi32-data.d
new file mode 100644 (file)
index 0000000..2c24fe4
--- /dev/null
@@ -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           .*
diff --git a/ld/testsuite/ld-pru/relax_ldi32-dis.d b/ld/testsuite/ld-pru/relax_ldi32-dis.d
new file mode 100644 (file)
index 0000000..1371f1c
--- /dev/null
@@ -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>
diff --git a/ld/testsuite/ld-pru/relax_ldi32.s b/ld/testsuite/ld-pru/relax_ldi32.s
new file mode 100644 (file)
index 0000000..18fb57f
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/relax_ldi32_symbol.s b/ld/testsuite/ld-pru/relax_ldi32_symbol.s
new file mode 100644 (file)
index 0000000..c2cf554
--- /dev/null
@@ -0,0 +1,5 @@
+       .global long_symbol
+       .global short_symbol
+
+       .set long_symbol, 0xDEADBEEF
+       .set short_symbol, 0xceca
diff --git a/ld/testsuite/ld-pru/reloc.d b/ld/testsuite/ld-pru/reloc.d
new file mode 100644 (file)
index 0000000..8bd1cec
--- /dev/null
@@ -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                             .*
diff --git a/ld/testsuite/ld-pru/reloc.s b/ld/testsuite/ld-pru/reloc.s
new file mode 100644 (file)
index 0000000..3d40c2e
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/reloc_symbol.s b/ld/testsuite/ld-pru/reloc_symbol.s
new file mode 100644 (file)
index 0000000..160a824
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/u16.d b/ld/testsuite/ld-pru/u16.d
new file mode 100644 (file)
index 0000000..9cc6482
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-pru/u16.s b/ld/testsuite/ld-pru/u16.s
new file mode 100644 (file)
index 0000000..4527b8f
--- /dev/null
@@ -0,0 +1,4 @@
+       .text
+       .global _start
+_start:
+       ldi     r16, short_symbol
diff --git a/ld/testsuite/ld-pru/u16_symbol.s b/ld/testsuite/ld-pru/u16_symbol.s
new file mode 100644 (file)
index 0000000..5e4e79d
--- /dev/null
@@ -0,0 +1,2 @@
+       .global short_symbol
+       .set short_symbol, 54321
index 9fcf07ac58114e02a7e2803999fb5d2c196c69e9..10b0a5134796a9143d091f76af69009044ebed39 100644 (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
index de0848a36688c66f0e7d30ed724f958b0326c8ab..5049b1290376dfd9f403383489bc8657c143c76b 100644 (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-*-*]