@@ -121,6 +121,7 @@
#include "elf/i960.h"
#include "elf/ia64.h"
#include "elf/ip2k.h"
+#include "elf/kvx.h"
#include "elf/lm32.h"
#include "elf/iq2000.h"
#include "elf/m32c.h"
@@ -1083,6 +1084,7 @@ guess_is_rela (unsigned int e_machine)
case EM_IP2K:
case EM_IP2K_OLD:
case EM_IQ2000:
+ case EM_KVX:
case EM_LATTICEMICO32:
case EM_M32C_OLD:
case EM_M32C:
@@ -1767,6 +1769,10 @@ dump_relocations (Filedata *filedata,
rtype = elf_ia64_reloc_type (type);
break;
+ case EM_KVX:
+ rtype = elf_kvx_reloc_type (type);
+ break;
+
case EM_CRIS:
rtype = elf_cris_reloc_type (type);
break;
@@ -4351,6 +4357,17 @@ get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
strcat (buf, ", relocatable module");
break;
+ case EM_KVX:
+ if ((e_flags & (ELF_KVX_CORE_MAJOR_MASK | ELF_KVX_CORE_MINOR_MASK)) == ELF_KVX_CORE_KV3_1)
+ strcat (buf, ", Kalray VLIW kv3-1");
+ else if ((e_flags & (ELF_KVX_CORE_MAJOR_MASK | ELF_KVX_CORE_MINOR_MASK)) == ELF_KVX_CORE_KV3_2)
+ strcat (buf, ", Kalray VLIW kv3-2");
+ else if ((e_flags & (ELF_KVX_CORE_MAJOR_MASK | ELF_KVX_CORE_MINOR_MASK)) == ELF_KVX_CORE_KV4_1)
+ strcat (buf, ", Kalray VLIW kv4-1");
+ else
+ strcat (buf, ", unknown KVX MPPA");
+ break;
+
case EM_MSP430:
strcat (buf, _(": architecture variant: "));
switch (e_flags & EF_MSP430_MACH)
@@ -14385,6 +14402,8 @@ is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
return reloc_type == 2; /* R_IP2K_32. */
case EM_IQ2000:
return reloc_type == 2; /* R_IQ2000_32. */
+ case EM_KVX:
+ return reloc_type == 2; /* R_KVX_32. */
case EM_LATTICEMICO32:
return reloc_type == 3; /* R_LM32_32. */
case EM_LOONGARCH:
@@ -14582,6 +14601,8 @@ is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
case EM_XTENSA_OLD:
case EM_XTENSA:
return reloc_type == 14; /* R_XTENSA_32_PCREL. */
+ case EM_KVX:
+ return reloc_type == 7; /* R_KVX_32_PCREL */
default:
/* Do not abort or issue an error message here. Not all targets use
pc-relative 32-bit relocs in their DWARF debug information and we
@@ -14633,6 +14654,8 @@ is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
return reloc_type == 1; /* R_TILEGX_64. */
case EM_MIPS:
return reloc_type == 18; /* R_MIPS_64. */
+ case EM_KVX:
+ return reloc_type == 3; /* R_KVX_64 */
default:
return false;
}
@@ -14736,6 +14759,8 @@ is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
case EM_CYGNUS_MN10300:
case EM_MN10300:
return reloc_type == 2; /* R_MN10300_16. */
+ case EM_KVX:
+ return reloc_type == 1; /* R_KVX_16 */
case EM_MSP430:
if (uses_msp430x_relocs (filedata))
return reloc_type == 2; /* R_MSP430_ABS16. */
@@ -14998,6 +15023,7 @@ is_none_reloc (Filedata * filedata, unsigned int reloc_type)
case EM_FT32: /* R_FT32_NONE. */
case EM_IA_64: /* R_IA64_NONE. */
case EM_K1OM: /* R_X86_64_NONE. */
+ case EM_KVX: /* R_KVX_NONE. */
case EM_L1OM: /* R_X86_64_NONE. */
case EM_M32R: /* R_M32R_NONE. */
case EM_MIPS: /* R_MIPS_NONE. */
new file mode 100644
@@ -0,0 +1,18 @@
+ .file "dw2-decodedline.c"
+ .file 1 "dw2-decodedline.c"
+ .file 2 "directory/file1.c"
+ .text
+ .globl f1
+ .type f1, %function
+f1:
+ .loc 2 1 0
+ nop
+ ;;
+ .size f1, .-f1
+ .globl main
+ .type main, %function
+main:
+ .loc 1 2 0
+ nop
+ ;;
+ .size main, .-main
new file mode 100644
@@ -0,0 +1,37 @@
+# Copyright (C) 2009-2023 Free Software Foundation, Inc.
+# Contributed by Kalray SA.
+
+# 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; see the file COPYING3. If not,
+# see <http://www.gnu.org/licenses/>. */
+
+if {!([istarget "kvx*-*-*"])
+ || ![is_elf_format]
+ || [is_remote host]} then {
+ return
+}
+
+global tempfile
+global copyfile
+set tempfile tmpdir/kvxtemp.o
+set copyfile tmpdir/kvxcopy
+
+## binutils test framework does not support the 'dump' EXTRA args to
+## simply share a single .s for 32 and 64bits test.
+# So we duplicate the source .s
+
+# 32bits test
+run_dump_test "pcrel_bundle32bits"
+
+# 64bits test
+run_dump_test "pcrel_bundle"
new file mode 100644
@@ -0,0 +1,33 @@
+#name: pcrel_bundle
+#source: pcrel_bundle.s
+#PROG: objcopy
+#as:
+#objdump: -dr
+#...
+
+Disassembly of section .text:
+
+0000000000000000 <foo>:
+ 0: 00 0e 00 f0 00 00 00 80 00 00 00 00 pcrel \$r0 = 56 \(0x38\);;
+
+ c: 0d 00 00 98 call 40 <bar>
+ 10: 00 0b 00 f0 00 00 00 80 00 00 00 00 pcrel \$r0 = 44 \(0x2c\);;
+
+ 1c: 09 00 00 98 call 40 <bar>
+ 20: 00 07 00 f0 00 00 00 b8 00 00 00 80 pcrel \$r0 = 28 \(0x1c\)
+ 2c: 00 00 00 00 ld \$r0 = 0 \(0x0\)\[\$r0\];;
+
+ 30: 00 f0 03 7f nop;;
+
+ 34: 00 f0 03 7f nop;;
+
+
+0000000000000038 <.table>:
+ 38: 00 f0 03 7f nop;;
+
+ 3c: 00 f0 03 7f nop;;
+
+
+0000000000000040 <bar>:
+ 40: 00 f0 03 7f nop;;
+
new file mode 100644
@@ -0,0 +1,25 @@
+foo:
+ pcrel $r0 = @pcrel(.table)
+ ;;
+ call bar
+ pcrel $r0 = @pcrel(.table)
+ ;;
+ call bar
+ ld $r0 = 0[$r0]
+ pcrel $r0 = @pcrel(.table)
+ ;;
+ nop
+ ;;
+ nop
+ ;;
+.table:
+ nop
+ ;;
+ nop
+ ;;
+bar:
+ nop
+ ;;
+
+
+
new file mode 100644
@@ -0,0 +1,33 @@
+#name: pcrel_bundle
+#source: pcrel_bundle.s
+#PROG: objcopy
+#as: -m32
+#objdump: -dr
+#...
+
+Disassembly of section .text:
+
+00000000 <foo>:
+ 0: 00 0b 00 f0 00 00 00 00 pcrel \$r0 = 44 \(0x2c\);;
+
+ 8: 0b 00 00 98 call 34 <bar>
+ c: 00 09 00 f0 00 00 00 00 pcrel \$r0 = 36 \(0x24\);;
+
+ 14: 08 00 00 98 call 34 <bar>
+ 18: 00 06 00 f0 00 00 00 b8 pcrel \$r0 = 24 \(0x18\)
+ 20: 00 00 00 00 ld \$r0 = 0 \(0x0\)\[\$r0\];;
+
+ 24: 00 f0 03 7f nop;;
+
+ 28: 00 f0 03 7f nop;;
+
+
+0000002c <.table>:
+ 2c: 00 f0 03 7f nop;;
+
+ 30: 00 f0 03 7f nop;;
+
+
+00000034 <bar>:
+ 34: 00 f0 03 7f nop;;
+
new file mode 100644
@@ -0,0 +1,25 @@
+foo:
+ pcrel $r0 = @pcrel(.table)
+ ;;
+ call bar
+ pcrel $r0 = @pcrel(.table)
+ ;;
+ call bar
+ ld $r0 = 0[$r0]
+ pcrel $r0 = @pcrel(.table)
+ ;;
+ nop
+ ;;
+ nop
+ ;;
+.table:
+ nop
+ ;;
+ nop
+ ;;
+bar:
+ nop
+ ;;
+
+
+
@@ -693,6 +693,7 @@ proc copy_setup { } {
}
if { [istarget *-*-linux*]
+ || [istarget kvx-*-*]
|| [istarget *-*-gnu*] } {
foreach i $gcc_gas_flag {
set flags "additional_flags=$i $flags"
@@ -482,6 +482,8 @@ if { ![is_elf_format]
} else {
if { [istarget "or1k*-*-*"] } then {
set decodedline_testsrc $srcdir/$subdir/dw2-decodedline-1.S
+ } elseif { [istarget "kvx*-*-*"] } {
+ set decodedline_testsrc $srcdir/$subdir/dw2-decodedline-2.S
} else {
set decodedline_testsrc $srcdir/$subdir/dw2-decodedline.S
}
@@ -41,6 +41,7 @@ proc is_elf_format {} {
&& ![istarget *-*-irix5*]
&& ![istarget *-*-irix6*]
&& ![istarget *-*-kaos*]
+ && ![istarget kvx-*-*]
&& ![istarget *-*-*linux*]
&& ![istarget *-*-lynxos*]
&& ![istarget *-*-nacl*]
@@ -371,6 +372,11 @@ proc check_pie_support { } {
global pie_available_saved
global ld
+ ## kvx-*-cos does support -shared but not PIE.
+ if { [istarget "kvx-*-cos"] } {
+ set pie_available_saved 0
+ }
+
if {![info exists pie_available_saved]} {
set ld_output [remote_exec host $ld "-pie"]
if { [ string first "not supported" $ld_output ] >= 0 } {