summaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-pru
diff options
context:
space:
mode:
authorDimitar Dimitrov <dimitar@dinux.eu>2016-12-30 12:39:49 +0200
committerAlan Modra <amodra@gmail.com>2016-12-31 12:04:11 +1030
commit0220170b4d87ce940d40ac98387ff2d7fbed3ab2 (patch)
tree7b2208add3316c08c6e087b37f648690861c1f68 /ld/testsuite/ld-pru
parent93f11b16ec1f5775c7f6c32b4a39d6dd0fb0c92a (diff)
downloadbinutils-gdb-0220170b4d87ce940d40ac98387ff2d7fbed3ab2.tar.gz
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>
Diffstat (limited to 'ld/testsuite/ld-pru')
-rw-r--r--ld/testsuite/ld-pru/emit-relocs-1.d37
-rw-r--r--ld/testsuite/ld-pru/emit-relocs-1.ld20
-rw-r--r--ld/testsuite/ld-pru/emit-relocs-1a.s24
-rw-r--r--ld/testsuite/ld-pru/emit-relocs-1b.s18
-rw-r--r--ld/testsuite/ld-pru/ldi32.d12
-rw-r--r--ld/testsuite/ld-pru/ldi32.s6
-rw-r--r--ld/testsuite/ld-pru/ldi32_symbol.s2
-rw-r--r--ld/testsuite/ld-pru/norelax_ldi32-data.d20
-rw-r--r--ld/testsuite/ld-pru/norelax_ldi32-dis.d29
-rw-r--r--ld/testsuite/ld-pru/pcrel_s10.d18
-rw-r--r--ld/testsuite/ld-pru/pcrel_s10.s7
-rw-r--r--ld/testsuite/ld-pru/pcrel_s10_label.s9
-rw-r--r--ld/testsuite/ld-pru/pcrel_u8-illegal.d7
-rw-r--r--ld/testsuite/ld-pru/pcrel_u8-illegal.s9
-rw-r--r--ld/testsuite/ld-pru/pcrel_u8-illegal2.d7
-rw-r--r--ld/testsuite/ld-pru/pcrel_u8-illegal2.s7
-rw-r--r--ld/testsuite/ld-pru/pcrel_u8-illegal3.d7
-rw-r--r--ld/testsuite/ld-pru/pcrel_u8-illegal3.s7
-rw-r--r--ld/testsuite/ld-pru/pcrel_u8.d15
-rw-r--r--ld/testsuite/ld-pru/pcrel_u8.s9
-rw-r--r--ld/testsuite/ld-pru/pcrel_u8_label.s4
-rw-r--r--ld/testsuite/ld-pru/pmem.d15
-rw-r--r--ld/testsuite/ld-pru/pmem.s15
-rw-r--r--ld/testsuite/ld-pru/pmem_symbol.s13
-rw-r--r--ld/testsuite/ld-pru/pru.exp8
-rw-r--r--ld/testsuite/ld-pru/relax_ldi32-data.d19
-rw-r--r--ld/testsuite/ld-pru/relax_ldi32-dis.d27
-rw-r--r--ld/testsuite/ld-pru/relax_ldi32.s30
-rw-r--r--ld/testsuite/ld-pru/relax_ldi32_symbol.s5
-rw-r--r--ld/testsuite/ld-pru/reloc.d14
-rw-r--r--ld/testsuite/ld-pru/reloc.s9
-rw-r--r--ld/testsuite/ld-pru/reloc_symbol.s24
-rw-r--r--ld/testsuite/ld-pru/u16.d11
-rw-r--r--ld/testsuite/ld-pru/u16.s4
-rw-r--r--ld/testsuite/ld-pru/u16_symbol.s2
35 files changed, 470 insertions, 0 deletions
diff --git a/ld/testsuite/ld-pru/emit-relocs-1.d b/ld/testsuite/ld-pru/emit-relocs-1.d
new file mode 100644
index 00000000000..414234f94db
--- /dev/null
+++ b/ld/testsuite/ld-pru/emit-relocs-1.d
@@ -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
index 00000000000..1879ef4cbe7
--- /dev/null
+++ b/ld/testsuite/ld-pru/emit-relocs-1.ld
@@ -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
index 00000000000..bf0a8a1689e
--- /dev/null
+++ b/ld/testsuite/ld-pru/emit-relocs-1a.s
@@ -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
index 00000000000..82229c1495b
--- /dev/null
+++ b/ld/testsuite/ld-pru/emit-relocs-1b.s
@@ -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
index 00000000000..123ead310ff
--- /dev/null
+++ b/ld/testsuite/ld-pru/ldi32.d
@@ -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
index 00000000000..1165fe60f70
--- /dev/null
+++ b/ld/testsuite/ld-pru/ldi32.s
@@ -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
index 00000000000..2e160667d4e
--- /dev/null
+++ b/ld/testsuite/ld-pru/ldi32_symbol.s
@@ -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
index 00000000000..47fc2c12f4e
--- /dev/null
+++ b/ld/testsuite/ld-pru/norelax_ldi32-data.d
@@ -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
index 00000000000..072de5fbd49
--- /dev/null
+++ b/ld/testsuite/ld-pru/norelax_ldi32-dis.d
@@ -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
index 00000000000..95602c586bc
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_s10.d
@@ -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
index 00000000000..2a55773c4a9
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_s10.s
@@ -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
index 00000000000..2dc424c5469
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_s10_label.s
@@ -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
index 00000000000..a88523747fc
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_u8-illegal.d
@@ -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
index 00000000000..e33bd800e1f
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_u8-illegal.s
@@ -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
index 00000000000..604ea9838d9
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_u8-illegal2.d
@@ -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
index 00000000000..a4bcf9747ed
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_u8-illegal2.s
@@ -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
index 00000000000..604ea9838d9
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_u8-illegal3.d
@@ -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
index 00000000000..8eb71f56a30
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_u8-illegal3.s
@@ -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
index 00000000000..60ff05883cc
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_u8.d
@@ -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
index 00000000000..948e5a5d6e9
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_u8.s
@@ -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
index 00000000000..e4652fa1f02
--- /dev/null
+++ b/ld/testsuite/ld-pru/pcrel_u8_label.s
@@ -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
index 00000000000..b5747ded4f3
--- /dev/null
+++ b/ld/testsuite/ld-pru/pmem.d
@@ -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
index 00000000000..4c67ae328ac
--- /dev/null
+++ b/ld/testsuite/ld-pru/pmem.s
@@ -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
index 00000000000..d3eb386b18a
--- /dev/null
+++ b/ld/testsuite/ld-pru/pmem_symbol.s
@@ -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
index 00000000000..ac01a3cf559
--- /dev/null
+++ b/ld/testsuite/ld-pru/pru.exp
@@ -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
index 00000000000..2c24fe422e4
--- /dev/null
+++ b/ld/testsuite/ld-pru/relax_ldi32-data.d
@@ -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
index 00000000000..1371f1c6448
--- /dev/null
+++ b/ld/testsuite/ld-pru/relax_ldi32-dis.d
@@ -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
index 00000000000..18fb57fdbe5
--- /dev/null
+++ b/ld/testsuite/ld-pru/relax_ldi32.s
@@ -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
index 00000000000..c2cf554b1e7
--- /dev/null
+++ b/ld/testsuite/ld-pru/relax_ldi32_symbol.s
@@ -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
index 00000000000..8bd1ceca59f
--- /dev/null
+++ b/ld/testsuite/ld-pru/reloc.d
@@ -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
index 00000000000..3d40c2ecc37
--- /dev/null
+++ b/ld/testsuite/ld-pru/reloc.s
@@ -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
index 00000000000..160a824b3e4
--- /dev/null
+++ b/ld/testsuite/ld-pru/reloc_symbol.s
@@ -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
index 00000000000..9cc6482f9ae
--- /dev/null
+++ b/ld/testsuite/ld-pru/u16.d
@@ -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
index 00000000000..4527b8fd312
--- /dev/null
+++ b/ld/testsuite/ld-pru/u16.s
@@ -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
index 00000000000..5e4e79d3925
--- /dev/null
+++ b/ld/testsuite/ld-pru/u16_symbol.s
@@ -0,0 +1,2 @@
+ .global short_symbol
+ .set short_symbol, 54321