]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Add support for Synopsys ARCv2 processors
authorShahab Vahedi <shahab@synopsys.email>
Wed, 21 Dec 2022 11:27:05 +0000 (12:27 +0100)
committerMark Wielaard <mark@klomp.org>
Wed, 21 Dec 2022 23:16:14 +0000 (00:16 +0100)
There is no regression in tests for an x86_64 build, while the new
hello_arc_hs4.ko is added as well.  This is the only meaningful
test that I could add at the moment, given the features supported
by this port.

$ cat tests/test-suite.log
  ==========================================
     elfutils 0.188: tests/test-suite.log
  ==========================================

  # TOTAL: 236
  # PASS:  235
  # SKIP:  1
  # XFAIL: 0
  # FAIL:  0
  # XPASS: 0
  # ERROR: 0

  .. contents:: :depth: 2

  SKIP: run-lfs-symbols.sh
  ========================

  LFS testing is irrelevant on this system
  SKIP run-lfs-symbols.sh (exit status: 77)

$ cat tests/run-strip-reloc.sh.log
  runtest hello_i386.ko
  runtest hello_x86_64.ko
  runtest hello_ppc64.ko
  runtest hello_s390.ko
  runtest hello_aarch64.ko
  runtest hello_m68k.ko
  runtest hello_riscv64.ko
  runtest hello_csky.ko
  runtest hello_arc_hs4.ko            <-- [ new ARC HS4 test ]
  runtest /home/shahab/pahole_pkg/elfutils-git/bld_arc/src/strip
  runtest /home/shahab/pahole_pkg/elfutils-git/bld_arc/src/strip.o
  runtest strip-uncompressed.o
  runtest strip-compressed.o
  runtest testfile-debug-rel-ppc64.o
  runtest testfile-debug-rel-ppc64-z.o
  runtest testfile-debug-rel-ppc64-g.o
  PASS run-strip-reloc.sh (exit status: 0)

Signed-off-by: Shahab Vahedi <shahab@synopsys.email>
13 files changed:
backends/ChangeLog
backends/Makefile.am
backends/arc_init.c [new file with mode: 0644]
backends/arc_reloc.def [new file with mode: 0644]
backends/arc_symbol.c [new file with mode: 0644]
libebl/ChangeLog
libebl/eblopenbackend.c
src/ChangeLog
src/elflint.c
tests/ChangeLog
tests/Makefile.am
tests/hello_arc_hs4.ko.bz2 [new file with mode: 0644]
tests/run-strip-reloc.sh

index 5813ddccc11c18162cfe8e0d0a32662eb2e6f085..f28ab89bcf880d3ff6899a986e28b66f1d458791 100644 (file)
@@ -1,3 +1,12 @@
+2022-12-21  Shahab Vahedi  <shahab@synopsys.email>
+
+       * Makefile.am (modules): Add arc.
+       (arc_SRCS): Added.
+       (libebl_backends_a_SOURCES): Append arc_SRCS.
+       * arc_init.c: New file.
+       * arc_reloc.def: New file.
+       * arc_symbol.c: New file.
+
 2022-12-02  Hengqi Chen  <hengqi.chen@gmail.com>
 
        * Makefile.am (modules): Add loongarch.
index 0824123dccc924992c7a54ef52caf68364758d31..f373e5fb03dafb7dee19eba07bf587b66bcc5440 100644 (file)
@@ -37,7 +37,7 @@ AM_CPPFLAGS += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \
 noinst_LIBRARIES = libebl_backends.a libebl_backends_pic.a
 
 modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \
-         m68k bpf riscv csky loongarch
+         m68k bpf riscv csky loongarch arc
 
 i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \
            i386_retval.c i386_regs.c i386_auxv.c \
@@ -98,12 +98,14 @@ csky_SRCS = csky_attrs.c csky_init.c csky_symbol.c csky_cfi.c \
 
 loongarch_SRCS = loongarch_init.c loongarch_symbol.c
 
+arc_SRCS = arc_init.c arc_symbol.c
+
 libebl_backends_a_SOURCES = $(i386_SRCS) $(sh_SRCS) $(x86_64_SRCS) \
                            $(ia64_SRCS) $(alpha_SRCS) $(arm_SRCS) \
                            $(aarch64_SRCS) $(sparc_SRCS) $(ppc_SRCS) \
                            $(ppc64_SRCS) $(s390_SRCS) \
                            $(m68k_SRCS) $(bpf_SRCS) $(riscv_SRCS) $(csky_SRCS) \
-                           $(loongarch_SRCS)
+                           $(loongarch_SRCS) $(arc_SRCS)
 
 libebl_backends_pic_a_SOURCES =
 am_libebl_backends_pic_a_OBJECTS = $(libebl_backends_a_SOURCES:.c=.os)
diff --git a/backends/arc_init.c b/backends/arc_init.c
new file mode 100644 (file)
index 0000000..a7ccece
--- /dev/null
@@ -0,0 +1,59 @@
+/* Initialization of ARC specific backend library.
+   Copyright (C) 2022 Synopsys Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils 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 copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+/* More details on an ARC elf can be found at:
+   https://github.com/foss-for-synopsys-dwc-arc-processors/ \
+          arc-ABI-manual/blob/master/arcv3-elf.md   */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define BACKEND                arc_
+#define RELOC_PREFIX   R_ARC_
+#include "libebl_CPU.h"
+
+/* This defines the common reloc hooks based on arc_reloc.def.  */
+#include "common-reloc.c"
+
+Ebl *
+arc_init (Elf *elf __attribute__ ((unused)),
+         GElf_Half machine __attribute__ ((unused)),
+         Ebl *eh)
+{
+  arc_init_reloc (eh);
+  HOOK (eh, machine_flag_check);
+  HOOK (eh, reloc_simple_type);
+  HOOK (eh, section_type_name);
+
+  /* /bld/gcc-stage2/arc-snps-linux-gnu/libgcc/libgcc.map.in
+     #define __LIBGCC_DWARF_FRAME_REGISTERS__.  */
+  eh->frame_nregs = 146;
+
+  return eh;
+}
diff --git a/backends/arc_reloc.def b/backends/arc_reloc.def
new file mode 100644 (file)
index 0000000..dfa3062
--- /dev/null
@@ -0,0 +1,87 @@
+/* List the relocation types for ARC.  -*- C -*-
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils 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 copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+/*         NAME,               REL|EXEC|DYN    */
+
+RELOC_TYPE (NONE,              EXEC|DYN)
+RELOC_TYPE (8,                 REL|EXEC|DYN)
+RELOC_TYPE (16,                        REL|EXEC|DYN)
+RELOC_TYPE (24,                        REL|EXEC|DYN)
+RELOC_TYPE (32,                        REL|EXEC|DYN)
+RELOC_TYPE (N8,                        REL|EXEC|DYN)
+RELOC_TYPE (N16,               REL|EXEC|DYN)
+RELOC_TYPE (N24,               REL|EXEC|DYN)
+RELOC_TYPE (N32,               REL|EXEC|DYN)
+RELOC_TYPE (SDA,               REL)
+RELOC_TYPE (SECTOFF,           REL)
+RELOC_TYPE (S21H_PCREL,                REL)
+RELOC_TYPE (S21W_PCREL,                REL)
+RELOC_TYPE (S25H_PCREL,                REL)
+RELOC_TYPE (S25W_PCREL,                REL)
+RELOC_TYPE (SDA32,             REL)
+RELOC_TYPE (SDA_LDST,          REL)
+RELOC_TYPE (SDA_LDST1,         REL)
+RELOC_TYPE (SDA_LDST2,         REL)
+RELOC_TYPE (SDA16_LD,          REL)
+RELOC_TYPE (SDA16_LD1,         REL)
+RELOC_TYPE (SDA16_LD2,         REL)
+RELOC_TYPE (S13_PCREL,         REL)
+RELOC_TYPE (W,                 REL)
+RELOC_TYPE (32_ME,             REL)
+RELOC_TYPE (N32_ME,            REL)
+RELOC_TYPE (SECTOFF_ME,                REL)
+RELOC_TYPE (SDA32_ME,          REL)
+RELOC_TYPE (W_ME,              REL)
+RELOC_TYPE (SDA_12,            REL)
+RELOC_TYPE (SDA16_ST2,         REL)
+RELOC_TYPE (32_PCREL,          REL)
+RELOC_TYPE (PC32,              REL)
+RELOC_TYPE (GOTPC32,           REL)
+RELOC_TYPE (PLT32,             REL)
+RELOC_TYPE (COPY,              EXEC|DYN)
+RELOC_TYPE (GLOB_DAT,          EXEC|DYN)
+RELOC_TYPE (JMP_SLOT,          EXEC|DYN)
+RELOC_TYPE (RELATIVE,          EXEC|DYN)
+RELOC_TYPE (GOTOFF,            REL)
+RELOC_TYPE (GOTPC,             REL)
+RELOC_TYPE (GOT32,             REL)
+RELOC_TYPE (S21W_PCREL_PLT,    REL)
+RELOC_TYPE (S25H_PCREL_PLT,    REL)
+RELOC_TYPE (JLI_SECTOFF,       REL)
+RELOC_TYPE (TLS_DTPMOD,                REL)
+RELOC_TYPE (TLS_DTPOFF,                REL)
+RELOC_TYPE (TLS_TPOFF,         REL)
+RELOC_TYPE (TLS_GD_GOT,                REL)
+RELOC_TYPE (TLS_GD_LD,         REL)
+RELOC_TYPE (TLS_GD_CALL,       REL)
+RELOC_TYPE (TLS_IE_GOT,                REL)
+RELOC_TYPE (TLS_DTPOFF_S9,     REL)
+RELOC_TYPE (TLS_LE_S9,         REL)
+RELOC_TYPE (TLS_LE_32,         REL)
+RELOC_TYPE (S25W_PCREL_PLT,    REL)
+RELOC_TYPE (S21H_PCREL_PLT,    REL)
+RELOC_TYPE (NPS_CMEM16,                REL)
diff --git a/backends/arc_symbol.c b/backends/arc_symbol.c
new file mode 100644 (file)
index 0000000..be69814
--- /dev/null
@@ -0,0 +1,81 @@
+/* ARC specific symbolic name handling.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils 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 copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <elf.h>
+#include <stddef.h>
+#include <string.h>
+
+#define BACKEND arc_
+#include "libebl_CPU.h"
+
+
+/* Check whether machine flags are valid.  */
+bool
+arc_machine_flag_check (GElf_Word flags)
+{
+  return ((flags & ~EF_ARC_ALL_MSK) == 0);
+}
+
+/* Check for the simple reloc types.  */
+Elf_Type
+arc_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type,
+                      int *addsub __attribute ((unused)))
+{
+  switch (type)
+    {
+    case R_ARC_32:
+      return ELF_T_WORD;
+    case R_ARC_16:
+      return ELF_T_HALF;
+    case R_ARC_8:
+      return ELF_T_BYTE;
+    default:
+      return ELF_T_NUM;
+    }
+}
+
+/* Return symbolic representation of section type.  */
+const char *
+arc_section_type_name (int type,
+                      char *buf __attribute__ ((unused)),
+                      size_t len __attribute__ ((unused)))
+{
+  switch (type)
+    {
+    case SHT_ARC_ATTRIBUTES:
+      return "ARC_ATTRIBUTES";
+    default:
+      break;
+    }
+
+  return NULL;
+}
index 5f9ea552cc7da7913f0b17ae5535433c7aa8c382..519087dc2b1334f50e52413718792d41017cfe41 100644 (file)
@@ -1,3 +1,8 @@
+2022-12-21  Shahab Vahedi  <shahab@synopsys.email>
+
+       * eblopenbackend.c (arc_init): New function declaration.
+       (machines): Add entry for arc.
+
 2022-12-02  Hengqi Chen  <hengqi.chen@gmail.com>
 
        * eblopenbackend.c (machines): Add entries for LoongArch.
index b87aef19721bdc7a414d591184c4bac506dd778a..084a1544b286c207f2f4cb4db92e70bdd6d3d636 100644 (file)
@@ -56,6 +56,7 @@ Ebl *bpf_init (Elf *, GElf_Half, Ebl *);
 Ebl *riscv_init (Elf *, GElf_Half, Ebl *);
 Ebl *csky_init (Elf *, GElf_Half, Ebl *);
 Ebl *loongarch_init (Elf *, GElf_Half, Ebl *);
+Ebl *arc_init (Elf *, GElf_Half, Ebl *);
 
 /* This table should contain the complete list of architectures as far
    as the ELF specification is concerned.  */
@@ -152,6 +153,7 @@ static const struct
   { riscv_init, "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS32, ELFDATA2LSB },
   { csky_init, "elf_csky", "csky", 4, EM_CSKY, ELFCLASS32, ELFDATA2LSB },
   { loongarch_init, "elf_loongarch", "loongarch", 9, EM_LOONGARCH, ELFCLASS64, ELFDATA2LSB },
+  { arc_init, "elf_arc", "arc", 3, EM_ARCV2, ELFCLASS32, ELFDATA2LSB },
 };
 #define nmachines (sizeof (machines) / sizeof (machines[0]))
 
index b679f0923539890c4c7781a88c9d690fa08bb55b..db8a81eee17096fe9a367888f140d528b0747c22 100644 (file)
@@ -1,3 +1,7 @@
+2022-12-21  Shahab Vahedi  <shahab@synopsys.email>
+
+       * elflint.c (valid_e_machine): Add EM_ARCV2.
+
 2022-12-02  Hengqi Chen  <hengqi.chen@gmail.com>
 
        * elflint.c (valid_e_machine): Add EM_LOONGARCH.
index b9548862c69addd9809ed71c2f3a9edfa1d07287..b4eac32f5e774092d59b4f88c8ea17e58f898c96 100644 (file)
@@ -330,6 +330,7 @@ static const int valid_e_machine[] =
     EM_AVR, EM_FR30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300,
     EM_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA, EM_ALPHA,
     EM_TILEGX, EM_TILEPRO, EM_AARCH64, EM_BPF, EM_RISCV, EM_CSKY, EM_LOONGARCH,
+    EM_ARCV2
   };
 #define nvalid_e_machine \
   (sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))
index b656029fe21e273de6610400b1177f37f961e46a..8c841fa1037d80a50325a631f598888bc7e239ce 100644 (file)
@@ -1,3 +1,9 @@
+2022-12-21  Shahab Vahedi  <shahab@synopsys.email>
+
+       * hello_arc_hs4.ko.bz2: New testfile.
+       * run-strip-reloc.sh: Add ARC HS4 test.
+       * Makefile.am (EXTRA_DIST): Add hello_arc_hs4.ko.bz2.
+
 2022-11-01  Aaron Merey  <amerey@redhat.com>
 
        * run-debuginfod-section.sh (RPM_BUILDID): Use buildid from non-zstd
index 356b3fbfedec4c0becd711a197e5ccaa9aa0b2ec..c35a7c3330c634921e4d9b2031963a0b33e82803 100644 (file)
@@ -285,6 +285,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
             run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \
             hello_ppc64.ko.bz2 hello_s390.ko.bz2 hello_aarch64.ko.bz2 \
             hello_m68k.ko.bz2 hello_riscv64.ko.bz2 hello_csky.ko.bz2 \
+            hello_arc_hs4.ko.bz2 \
             run-unstrip-test.sh run-unstrip-test2.sh \
             testfile-info-link.bz2 testfile-info-link.debuginfo.bz2 \
             testfile-info-link.stripped.bz2 run-unstrip-test3.sh \
diff --git a/tests/hello_arc_hs4.ko.bz2 b/tests/hello_arc_hs4.ko.bz2
new file mode 100644 (file)
index 0000000..56ccb3c
Binary files /dev/null and b/tests/hello_arc_hs4.ko.bz2 differ
index b7ec1420328cdea0fd84f01328c5d47dd671d7b3..033ed2785a1b0413ad89eb3e5a799ea3c351119d 100755 (executable)
@@ -18,7 +18,8 @@
 . $srcdir/test-subr.sh
 
 testfiles hello_i386.ko hello_x86_64.ko hello_ppc64.ko hello_s390.ko \
-       hello_aarch64.ko hello_m68k.ko hello_riscv64.ko hello_csky.ko
+       hello_aarch64.ko hello_m68k.ko hello_riscv64.ko hello_csky.ko \
+       hello_arc_hs4.ko
 
 tempfiles readelf.out readelf.out1 readelf.out2
 tempfiles out.stripped1 out.debug1 out.stripped2 out.debug2
@@ -120,6 +121,7 @@ runtest hello_aarch64.ko 1
 runtest hello_m68k.ko 1
 runtest hello_riscv64.ko 1
 runtest hello_csky.ko 1
+runtest hello_arc_hs4.ko 1
 
 # self test, shouldn't impact non-ET_REL files at all.
 runtest ${abs_top_builddir}/src/strip 0