aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2014-12-06 16:45:22 +0100
committerEric Botcazou <ebotcazou@gcc.gnu.org>2014-12-06 16:45:22 +0100
commitc18392d87d22191584d76f7b4a850eb9508a8f04 (patch)
treea31b29449dd6f68dd41d55932f4ec1c3d8c51a1c /ld
parentb6605dddac58805d735211f0d38805bf87b6db04 (diff)
downloadgdb-c18392d87d22191584d76f7b4a850eb9508a8f04.zip
gdb-c18392d87d22191584d76f7b4a850eb9508a8f04.tar.gz
gdb-c18392d87d22191584d76f7b4a850eb9508a8f04.tar.bz2
Add Visium support to ld
ld/ * configure.tgt: Add Visium support. * Makefile.am (ALL_EMULATION_SOURCES): Add eelf32visium.c. (eelf32visium.c): New rule. * Makefile.in: Regenerate. * emulparams/elf32visium.sh: New file. * scripttempl/visium.sc: Likewise. ld/testsuite/ * lib/ld-lib.exp (check_shared_lib_support): Return 0 for Visium. * ld-visium/: New directory.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/Makefile.am4
-rw-r--r--ld/Makefile.in5
-rw-r--r--ld/configure.tgt2
-rw-r--r--ld/emulparams/elf32visium.sh9
-rw-r--r--ld/scripttempl/visium.sc181
-rw-r--r--ld/testsuite/ChangeLog5
-rw-r--r--ld/testsuite/ld-elf/eh-frame-hdr.d2
-rw-r--r--ld/testsuite/ld-elf/eh5.d2
-rw-r--r--ld/testsuite/ld-elf/flags1.d4
-rw-r--r--ld/testsuite/ld-elf/pr14926.d2
-rw-r--r--ld/testsuite/ld-elf/sec-to-seg.exp1
-rw-r--r--ld/testsuite/ld-visium/brr_x_backward.d4
-rw-r--r--ld/testsuite/ld-visium/brr_x_backward1.s6
-rw-r--r--ld/testsuite/ld-visium/brr_x_backward2.s7
-rw-r--r--ld/testsuite/ld-visium/brr_x_forward.d4
-rw-r--r--ld/testsuite/ld-visium/brr_x_forward1.s7
-rw-r--r--ld/testsuite/ld-visium/brr_x_forward2.s6
-rw-r--r--ld/testsuite/ld-visium/brr_x_seg.s9
-rw-r--r--ld/testsuite/ld-visium/brr_x_seg1.d3
-rw-r--r--ld/testsuite/ld-visium/brr_x_seg2.d3
-rw-r--r--ld/testsuite/ld-visium/imm_x_seg.d3
-rw-r--r--ld/testsuite/ld-visium/imm_x_seg.s8
-rw-r--r--ld/testsuite/ld-visium/ld1.ld9
-rw-r--r--ld/testsuite/ld-visium/ld2.ld9
-rw-r--r--ld/testsuite/ld-visium/ld3.ld9
-rw-r--r--ld/testsuite/ld-visium/reloc.d14
-rw-r--r--ld/testsuite/ld-visium/reloc1.s24
-rw-r--r--ld/testsuite/ld-visium/reloc2.s12
-rw-r--r--ld/testsuite/ld-visium/visium.exp30
-rw-r--r--ld/testsuite/lib/ld-lib.exp1
31 files changed, 389 insertions, 5 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 9ec721f..7607418 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,12 @@
+2014-12-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ * configure.tgt: Add Visium support.
+ * Makefile.am (ALL_EMULATION_SOURCES): Add eelf32visium.c.
+ (eelf32visium.c): New rule.
+ * Makefile.in: Regenerate.
+ * emulparams/elf32visium.sh: New file.
+ * scripttempl/visium.sc: Likewise.
+
2014-11-25 H.J. Lu <hongjiu.lu@intel.com>
* emulparams/elf_i386.sh (TINY_READONLY_SECTION): New.
diff --git a/ld/Makefile.am b/ld/Makefile.am
index 9575f1f..3639d50 100644
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -264,6 +264,7 @@ ALL_EMULATION_SOURCES = \
eelf32tilegx_be.c \
eelf32tilepro.c \
eelf32vax.c \
+ eelf32visium.c \
eelf32xc16x.c \
eelf32xc16xl.c \
eelf32xc16xs.c \
@@ -1231,6 +1232,9 @@ eelf32tilepro.c: $(srcdir)/emulparams/elf32tilepro.sh \
eelf32vax.c: $(srcdir)/emulparams/elf32vax.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+eelf32visium.c: $(srcdir)/emulparams/elf32visium.sh \
+ $(ELF_DEPS) $(srcdir)/scripttempl/visium.sc ${GEN_DEPENDS}
+
eelf32xc16x.c: $(srcdir)/emulparams/elf32xc16x.sh \
$(ELF_DEPS) $(srcdir)/emultempl/needrelax.em \
$(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
diff --git a/ld/Makefile.in b/ld/Makefile.in
index 9f56ca1..20d10a1 100644
--- a/ld/Makefile.in
+++ b/ld/Makefile.in
@@ -572,6 +572,7 @@ ALL_EMULATION_SOURCES = \
eelf32tilegx_be.c \
eelf32tilepro.c \
eelf32vax.c \
+ eelf32visium.c \
eelf32xc16x.c \
eelf32xc16xl.c \
eelf32xc16xs.c \
@@ -1190,6 +1191,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32tilegx_be.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32tilepro.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32vax.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32visium.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32xc16x.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32xc16xl.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32xc16xs.Po@am__quote@
@@ -2672,6 +2674,9 @@ eelf32tilepro.c: $(srcdir)/emulparams/elf32tilepro.sh \
eelf32vax.c: $(srcdir)/emulparams/elf32vax.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+eelf32visium.c: $(srcdir)/emulparams/elf32visium.sh \
+ $(ELF_DEPS) $(srcdir)/scripttempl/visium.sc ${GEN_DEPENDS}
+
eelf32xc16x.c: $(srcdir)/emulparams/elf32xc16x.sh \
$(ELF_DEPS) $(srcdir)/emultempl/needrelax.em \
$(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
diff --git a/ld/configure.tgt b/ld/configure.tgt
index 24e36d1..2f7744a 100644
--- a/ld/configure.tgt
+++ b/ld/configure.tgt
@@ -755,6 +755,8 @@ vax-*-netbsdaout* | vax-*-netbsd*)
targ_extra_emuls=elf32vax ;;
vax-*-linux-*) targ_emul=elf32vax
;;
+visium-*-elf) targ_emul=elf32visium
+ ;;
w65-*-*) targ_emul=w65
;;
xc16x-*-elf) targ_emul=elf32xc16x
diff --git a/ld/emulparams/elf32visium.sh b/ld/emulparams/elf32visium.sh
new file mode 100644
index 0000000..17cf4b9
--- /dev/null
+++ b/ld/emulparams/elf32visium.sh
@@ -0,0 +1,9 @@
+SCRIPT_NAME=visium
+OUTPUT_FORMAT="elf32-visium"
+TEXT_START_ADDR=0x00000000
+MAXPAGESIZE=0x10000
+NONPAGED_TEXT_START_ADDR=0x10000
+ARCH=visium
+MACHINE=
+TEMPLATE_NAME=elf32
+DYNAMIC_LINK=FALSE
diff --git a/ld/scripttempl/visium.sc b/ld/scripttempl/visium.sc
new file mode 100644
index 0000000..60338b1
--- /dev/null
+++ b/ld/scripttempl/visium.sc
@@ -0,0 +1,181 @@
+# Copyright (C) 2014 Free Software Foundation, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.
+
+# Many sections come in three flavours. There is the 'real' section,
+# like ".data". Then there are the per-procedure or per-variable
+# sections, generated by -ffunction-sections and -fdata-sections in GCC,
+# and useful for --gc-sections, which for a variable "foo" might be
+# ".data.foo". Then there are the linkonce sections, for which the linker
+# eliminates duplicates, which are named like ".gnu.linkonce.d.foo".
+# The exact correspondences are:
+#
+# Section Linkonce section
+# .text .gnu.linkonce.t.foo
+# .rodata .gnu.linkonce.r.foo
+# .data .gnu.linkonce.d.foo
+# .bss .gnu.linkonce.b.foo
+# .sdata .gnu.linkonce.s.foo
+# .sbss .gnu.linkonce.sb.foo
+# .sdata2 .gnu.linkonce.s2.foo
+# .sbss2 .gnu.linkonce.sb2.foo
+# .debug_info .gnu.linkonce.wi.foo
+# .tdata .gnu.linkonce.td.foo
+# .tbss .gnu.linkonce.tb.foo
+# .lrodata .gnu.linkonce.lr.foo
+# .ldata .gnu.linkonce.l.foo
+# .lbss .gnu.linkonce.lb.foo
+#
+# Each of these can also have corresponding .rel.* and .rela.* sections.
+
+test -z "$ENTRY" && ENTRY=__start
+cat <<EOF
+OUTPUT_FORMAT("${OUTPUT_FORMAT}")
+
+ENTRY(${ENTRY})
+
+/* Start and end of main stack. Assumes 256K of RAM. */
+${RELOCATING+ _estack = 0xe0040000 - 4;}
+${RELOCATING+ _sstack = 0xe0040000 - 64K;}
+
+/* End of heap. */
+${RELOCATING+ _eheap = _sstack - 4;}
+
+
+MEMORY
+{
+ init : ORIGIN = 0x00000000, LENGTH = 0x0003fffc
+ scr : ORIGIN = 0x0003fffc, LENGTH = 0x00000004
+ rom : ORIGIN = 0x00044000, LENGTH = 0x1ffbc000
+ ram : ORIGIN = 0xe0000000, LENGTH = 0x10000000
+ saferam : ORIGIN = 0xf0000000, LENGTH = 0x10000000
+}
+
+
+SECTIONS
+{
+ .init ${RELOCATING-0} : {
+ KEEP (*(.init))
+ KEEP (*(.fini))
+ ${RELOCATING+ _einit = .;}
+ } ${RELOCATING+ > init}
+
+ .text ${RELOCATING-0} : {
+ ${RELOCATING+ _ftext = .;}
+ *(.text)
+ ${RELOCATING+*(.text.*)}
+ ${RELOCATING+*(.gnu.linkonce.t.*)}
+ ${RELOCATING+ _etext = .;}
+ } ${RELOCATING+ > rom}
+
+ .ctors ${RELOCATING-0} : {
+ ${CONSTRUCTING+ . = ALIGN(4);}
+ ${CONSTRUCTING+ __CTOR_LIST__ = .;}
+ /* gcc uses crtbegin.o to find the start of
+ the constructors, so we make sure it is
+ first. Because this is a wildcard, it
+ doesn't matter if the user does not
+ actually link against crtbegin.o; the
+ linker won't look for a file to match a
+ wildcard. The wildcard also means that it
+ doesn't matter which directory crtbegin.o
+ is in. */
+
+ KEEP (*crtbegin*.o(.ctors))
+
+ /* We don't want to include the .ctor section from
+ from the crtend.o file until after the sorted ctors.
+ The .ctor section from the crtend file contains the
+ end of ctors marker and it must be last. */
+
+ KEEP (*(EXCLUDE_FILE (*crtend*.o) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ ${CONSTRUCTING+ __CTOR_END__ = .;}
+ } ${RELOCATING+ > rom}
+
+ .dtors ${RELOCATING-0} : {
+ ${CONSTRUCTING+ __DTOR_LIST__ = .;}
+ KEEP (*crtbegin*.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend*.o) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ ${CONSTRUCTING+ __DTOR_END__ = .;}
+ } ${RELOCATING+ > rom}
+ .rodata ${RELOCATING-0} : {
+ ${RELOCATING+ . = ALIGN(4);}
+ ${RELOCATING+ _srdata = .;}
+ *(.rdata)
+ *(.rodata)
+ ${RELOCATING+*(.rodata.*)}
+ ${RELOCATING+*(.gnu.linkonce.r.*)}
+ ${RELOCATING+ . = ALIGN(4);}
+ ${RELOCATING+ _erdata = .;}
+ } ${RELOCATING+ > rom}
+
+ .eh_frame ${RELOCATING-0} :
+ {
+ ${RELOCATING+PROVIDE (__eh_frame_begin = .);}
+ *(.eh_frame)
+ ${RELOCATING+ LONG (0);}
+ ${RELOCATING+PROVIDE (__eh_frame_end = .);}
+ } ${RELOCATING+ > rom}
+ .gcc_except_table ${RELOCATING-0} : { *(.gcc_except_table) } ${RELOCATING+ > rom}
+ .jcr ${RELOCATING-0} : { *(.jcr) } ${RELOCATING+ > rom}
+
+ .data ${RELOCATING-0} : {
+ ${RELOCATING+ . = ALIGN(4);}
+ ${RELOCATING+ _sdata = .;}
+ *(.data)
+ ${RELOCATING+*(.data.*)}
+ ${RELOCATING+*(.gnu.linkonce.d.*)}
+ ${RELOCATING+ . = ALIGN(4);}
+ ${RELOCATING+ _edata = .;}
+ } ${RELOCATING+ > ram}
+ .bss ${RELOCATING-0} : {
+ ${RELOCATING+ . = ALIGN(4);}
+ ${RELOCATING+ __bss_start = .;}
+ *(.bss)
+ ${RELOCATING+*(.bss.*)}
+ ${RELOCATING+*(.gnu.linkonce.b.*)}
+ *(COMMON)
+ ${RELOCATING+ . = ALIGN(4);}
+ ${RELOCATING+ __bss_end = .;}
+ ${RELOCATING+ _sheap = .;}
+ } ${RELOCATING+ > ram}
+
+ saferam ${RELOCATING-0} : {
+ *(saferam)
+ ${RELOCATING+ . = ALIGN(4);}
+ ${RELOCATING+ unitidentry = .;}
+ } ${RELOCATING+ > saferam}
+
+ /* 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) }
+
+EOF
+
+. $srcdir/scripttempl/DWARF.sc
+
+cat <<EOF
+}
+
+/* Provide a default address for the simulated file-I/O device. */
+PROVIDE (_sim_fileio_register = 0x2fff0000);
+
+/* Provide a default address for the simulated command line device. */
+PROVIDE (_sim_cmdline_header = 0x2ffe0000);
+
+/* Provide a default address for the simulated 1 MHz clock. */
+PROVIDE (_sim_clock = 0x20002100);
+
+EOF
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 8ebe2fb..b27177e 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-12-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ * lib/ld-lib.exp (check_shared_lib_support): Return 0 for Visium.
+ * ld-visium/: New directory.
+
2014-12-04 Alan Modra <amodra@gmail.com>
* ld-powerpc/vxworks-relax.rd: Update for reloc sorting.
diff --git a/ld/testsuite/ld-elf/eh-frame-hdr.d b/ld/testsuite/ld-elf/eh-frame-hdr.d
index 45a890d..4214ed5 100644
--- a/ld/testsuite/ld-elf/eh-frame-hdr.d
+++ b/ld/testsuite/ld-elf/eh-frame-hdr.d
@@ -2,7 +2,7 @@
#ld: -e _start --eh-frame-hdr
#objdump: -hw
#target: cfi
-#xfail: avr*-*-* or1k-*-*
+#xfail: avr*-*-* or1k-*-* visium-*-*
# avr doesn't support shared libraries.
#...
[0-9] .eh_frame_hdr 0*[12][048c] .*
diff --git a/ld/testsuite/ld-elf/eh5.d b/ld/testsuite/ld-elf/eh5.d
index 29dcdf9..1a5148c 100644
--- a/ld/testsuite/ld-elf/eh5.d
+++ b/ld/testsuite/ld-elf/eh5.d
@@ -4,7 +4,7 @@
#ld:
#readelf: -wf
#target: cfi
-#notarget: alpha* hppa64* tile*
+#notarget: alpha* hppa64* tile* visium*
Contents of the .eh_frame section:
diff --git a/ld/testsuite/ld-elf/flags1.d b/ld/testsuite/ld-elf/flags1.d
index 63c2e3a..e7c6b4f 100644
--- a/ld/testsuite/ld-elf/flags1.d
+++ b/ld/testsuite/ld-elf/flags1.d
@@ -3,9 +3,9 @@
#objcopy_linked_file: --set-section-flags .post_text_reserve=contents,alloc,load,readonly,code
#readelf: -l --wide
#xfail: "avr-*-*" "dlx-*-*" "h8300-*-*" "i960-*-*" "ip2k-*-*" "m32r-*-*"
-#xfail: "moxie-*-*" "mt-*-*" "*-*-nacl*"
+#xfail: "moxie-*-*" "mt-*-*" "visium-*-*" "*-*-nacl*"
#xfail: "*-*-hpux*" "hppa*64*-*-*"
-# Fails on the AVR, DLX, H8300, I960, IP2K, M32R, MOXIE, MT,
+# Fails on the AVR, DLX, H8300, I960, IP2K, M32R, MOXIE, MT, VISIUM
# and all NaCl targets,
# because the two sections are not merged into one segment.
# (There is no good reason why they have to be).
diff --git a/ld/testsuite/ld-elf/pr14926.d b/ld/testsuite/ld-elf/pr14926.d
index 148c8b4..4f7fef4 100644
--- a/ld/testsuite/ld-elf/pr14926.d
+++ b/ld/testsuite/ld-elf/pr14926.d
@@ -1,6 +1,6 @@
#ld: -Ttext=0x60
#readelf: -S --wide
-#notarget: d10v-*-* msp*-*-* xstormy*-*-*
+#notarget: d10v-*-* msp*-*-* visium-*-* xstormy*-*-*
# the above targets use memory regions that don't allow 0x60 for .text
#...
diff --git a/ld/testsuite/ld-elf/sec-to-seg.exp b/ld/testsuite/ld-elf/sec-to-seg.exp
index 612dd0c..30bf756 100644
--- a/ld/testsuite/ld-elf/sec-to-seg.exp
+++ b/ld/testsuite/ld-elf/sec-to-seg.exp
@@ -86,6 +86,7 @@ if { [istarget avr-*-*]
|| [istarget moxie-*-*]
|| [istarget msp430-*-*]
|| [istarget mt-*-*]
+ || [istarget visium-*-*]
} {
set B_test_same_seg 0
} else {
diff --git a/ld/testsuite/ld-visium/brr_x_backward.d b/ld/testsuite/ld-visium/brr_x_backward.d
new file mode 100644
index 0000000..543e912
--- /dev/null
+++ b/ld/testsuite/ld-visium/brr_x_backward.d
@@ -0,0 +1,4 @@
+#source: brr_x_backward1.s
+#source: brr_x_backward2.s
+#ld:
+#error: relocation truncated to fit: R_VISIUM_PC16
diff --git a/ld/testsuite/ld-visium/brr_x_backward1.s b/ld/testsuite/ld-visium/brr_x_backward1.s
new file mode 100644
index 0000000..03542f2
--- /dev/null
+++ b/ld/testsuite/ld-visium/brr_x_backward1.s
@@ -0,0 +1,6 @@
+ .text
+ .global start
+start:
+ .global L1,L2
+L1: nop
+L2:
diff --git a/ld/testsuite/ld-visium/brr_x_backward2.s b/ld/testsuite/ld-visium/brr_x_backward2.s
new file mode 100644
index 0000000..ef15268bf
--- /dev/null
+++ b/ld/testsuite/ld-visium/brr_x_backward2.s
@@ -0,0 +1,7 @@
+ .text
+ .rept 32767
+ nop
+ .endr
+ brr tr,L1
+ nop
+ brr tr,L2
diff --git a/ld/testsuite/ld-visium/brr_x_forward.d b/ld/testsuite/ld-visium/brr_x_forward.d
new file mode 100644
index 0000000..29adf74
--- /dev/null
+++ b/ld/testsuite/ld-visium/brr_x_forward.d
@@ -0,0 +1,4 @@
+#source: brr_x_forward1.s
+#source: brr_x_forward2.s
+#ld:
+#error: relocation truncated to fit: R_VISIUM_PC16
diff --git a/ld/testsuite/ld-visium/brr_x_forward1.s b/ld/testsuite/ld-visium/brr_x_forward1.s
new file mode 100644
index 0000000..34fddf8
--- /dev/null
+++ b/ld/testsuite/ld-visium/brr_x_forward1.s
@@ -0,0 +1,7 @@
+ .text
+ brr tr,L1
+ nop
+ brr tr,L2
+ .rept 32765
+ nop
+ .endr
diff --git a/ld/testsuite/ld-visium/brr_x_forward2.s b/ld/testsuite/ld-visium/brr_x_forward2.s
new file mode 100644
index 0000000..65e3dae
--- /dev/null
+++ b/ld/testsuite/ld-visium/brr_x_forward2.s
@@ -0,0 +1,6 @@
+ .global start
+ .global L1,L2
+ .text
+start:
+L1: nop
+L2:
diff --git a/ld/testsuite/ld-visium/brr_x_seg.s b/ld/testsuite/ld-visium/brr_x_seg.s
new file mode 100644
index 0000000..8a55711
--- /dev/null
+++ b/ld/testsuite/ld-visium/brr_x_seg.s
@@ -0,0 +1,9 @@
+ .text
+ nop
+ brr tr,L1
+ nop
+ .data
+ .global start
+start:
+ .long 0
+L1:
diff --git a/ld/testsuite/ld-visium/brr_x_seg1.d b/ld/testsuite/ld-visium/brr_x_seg1.d
new file mode 100644
index 0000000..ace1028
--- /dev/null
+++ b/ld/testsuite/ld-visium/brr_x_seg1.d
@@ -0,0 +1,3 @@
+#source: brr_x_seg.s
+#ld: -T ld1.ld
+#error: relocation truncated to fit: R_VISIUM_PC16
diff --git a/ld/testsuite/ld-visium/brr_x_seg2.d b/ld/testsuite/ld-visium/brr_x_seg2.d
new file mode 100644
index 0000000..9441d86
--- /dev/null
+++ b/ld/testsuite/ld-visium/brr_x_seg2.d
@@ -0,0 +1,3 @@
+#source: brr_x_seg.s
+#ld: -T ld2.ld
+#error: relocation truncated to fit: R_VISIUM_PC16
diff --git a/ld/testsuite/ld-visium/imm_x_seg.d b/ld/testsuite/ld-visium/imm_x_seg.d
new file mode 100644
index 0000000..d52fb7e
--- /dev/null
+++ b/ld/testsuite/ld-visium/imm_x_seg.d
@@ -0,0 +1,3 @@
+#source: imm_x_seg.s
+#ld: -T ld3.ld
+#error: relocation truncated to fit: R_VISIUM_IM16_PCREL
diff --git a/ld/testsuite/ld-visium/imm_x_seg.s b/ld/testsuite/ld-visium/imm_x_seg.s
new file mode 100644
index 0000000..d490b6f
--- /dev/null
+++ b/ld/testsuite/ld-visium/imm_x_seg.s
@@ -0,0 +1,8 @@
+ .section seg1
+foo:
+ nop
+ moviq r6,bar-foo
+
+ .section seg2
+bar:
+ .end
diff --git a/ld/testsuite/ld-visium/ld1.ld b/ld/testsuite/ld-visium/ld1.ld
new file mode 100644
index 0000000..fc33cf8
--- /dev/null
+++ b/ld/testsuite/ld-visium/ld1.ld
@@ -0,0 +1,9 @@
+SECTIONS
+{
+ .text 0x10000 : {
+ *(.text)
+ }
+ .data 0x30000 : {
+ *(.data)
+ }
+}
diff --git a/ld/testsuite/ld-visium/ld2.ld b/ld/testsuite/ld-visium/ld2.ld
new file mode 100644
index 0000000..74f399a
--- /dev/null
+++ b/ld/testsuite/ld-visium/ld2.ld
@@ -0,0 +1,9 @@
+SECTIONS
+{
+ .text 0x30004 : {
+ *(.text)
+ }
+ .data 0x10000 : {
+ *(.data)
+ }
+}
diff --git a/ld/testsuite/ld-visium/ld3.ld b/ld/testsuite/ld-visium/ld3.ld
new file mode 100644
index 0000000..e3934cd
--- /dev/null
+++ b/ld/testsuite/ld-visium/ld3.ld
@@ -0,0 +1,9 @@
+SECTIONS
+{
+ seg1 0x10000 : {
+ *(seg1)
+ }
+ seg2 0x20000 : {
+ *(seg2)
+ }
+}
diff --git a/ld/testsuite/ld-visium/reloc.d b/ld/testsuite/ld-visium/reloc.d
new file mode 100644
index 0000000..bca5817
--- /dev/null
+++ b/ld/testsuite/ld-visium/reloc.d
@@ -0,0 +1,14 @@
+#source: reloc1.s
+#source: reloc2.s
+#ld: -T ld1.ld
+#objdump: -s
+
+.*: +file format .*
+
+Contents of section .text:
+ 10000 00000000 7800000a 84c20034 8482003c ....x......4...<
+ 10010 84a20001 84c20002 0442002c 84020002 .........B.,....
+ 10020 0482002c 84a20002 84c21000 ...,........
+Contents of section .data:
+ 30000 00140014 00000014 0001002c 0002002c ...........,...,
+ 30010 10001010 ....
diff --git a/ld/testsuite/ld-visium/reloc1.s b/ld/testsuite/ld-visium/reloc1.s
new file mode 100644
index 0000000..41be3de
--- /dev/null
+++ b/ld/testsuite/ld-visium/reloc1.s
@@ -0,0 +1,24 @@
+ .data
+foo:
+ .byte 0
+ .byte data1-foo
+ .word data1-foo
+ .long data1-foo
+ .long text1
+ .long text2
+ .word abs1
+ .word abs1+0x10
+ .text
+bar:
+ nop
+ brr tr,text1
+ moviq r2,text1-bar+8
+ movil r2,%l text2-bar+16
+ moviu r2,%u text2-bar+16
+ moviq r2,%u text2
+ subi r2,%l text2
+ addi r2,%u text2
+ movil r2, text2 ; with movil, the %l may be omitted
+ moviu r2,%u text2
+ moviq r2,abs1
+ .end
diff --git a/ld/testsuite/ld-visium/reloc2.s b/ld/testsuite/ld-visium/reloc2.s
new file mode 100644
index 0000000..517d977
--- /dev/null
+++ b/ld/testsuite/ld-visium/reloc2.s
@@ -0,0 +1,12 @@
+ .global abs1
+abs1 = 0x1000
+
+ .data
+ .global data1
+data1:
+ .text
+ .global text1
+text1:
+ .global text2
+text2 = . + 65536
+ .end
diff --git a/ld/testsuite/ld-visium/visium.exp b/ld/testsuite/ld-visium/visium.exp
new file mode 100644
index 0000000..c61467c
--- /dev/null
+++ b/ld/testsuite/ld-visium/visium.exp
@@ -0,0 +1,30 @@
+# Expect script for Visium tests.
+# Copyright (C) 2014 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.
+
+# Visium linker testsuite.
+
+if [istarget visium-*-*] {
+ run_dump_test "brr_x_backward"
+ run_dump_test "brr_x_forward"
+ run_dump_test "brr_x_seg1"
+ run_dump_test "brr_x_seg2"
+ run_dump_test "imm_x_seg"
+ run_dump_test "reloc"
+}
diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp
index 870cd12..1d112d6 100644
--- a/ld/testsuite/lib/ld-lib.exp
+++ b/ld/testsuite/lib/ld-lib.exp
@@ -1652,6 +1652,7 @@ proc check_shared_lib_support { } {
&& ![istarget rx-*-*]
&& ![istarget spu-*-*]
&& ![istarget v850*-*-*]
+ && ![istarget visium-*-*]
&& ![istarget xstormy16-*-*]
&& ![istarget *-*-irix*]
&& ![istarget *-*-rtems] } {