This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Add support for Tilera TILE-Gx processor.


On 08/16/2012 01:49 PM, Roland McGrath wrote:
> We don't touch elf.h directly, we only copy it verbatim from glibc.
> I've done that update.
>
> Your changes need ChangeLog entries.
>
> You don't need to quote the contribution agreement in your commit message,
> just the -s (Signed-off-by line) is enough.
>
> Your new files have the wrong copyright terms.
> Please follow the model of the existing files in the git repository.
>
> Please cite 'make check' results on a native build.
> You also need to add tilegx cases to run-allregs.sh and perhaps others.
>
> In backends/*_regs.c note how we have mostly avoided tables of string
> pointers, because these necessitate dynamic relocs for the pointers.
> That's not a problem with string constants used directly in code.
>
>
> Thanks,
> Roland

1. Done.  New patch attached.

2. Changelog:

   backends/
     *Makefile.am: added tilegx processor.
     *tilegx_corenote.c: new file.
     *tilegx_regs.c: new file.
     *tilegx_reloc.def: new file.
     *tilegx_init.c: new file.
     *tilegx_retval.c: new file.
     *tilegx_symbol.c: new file.
   libebl/
     *eblopenbackend.c: added tilegx processor.
   src/
     *elflint.c: added tilegx processor.
   tests/
     *run-allregs.sh: added testfile60 for tilegx processor.
     *testfile60.bz2: new file.


3. make check results:

Several errors of this type:

I am discussing this problem in another email thread with Mark 
Wielaard.  Our tool chain is producing .so files with data that elflint 
doesn't expect:

3. elflint.c, at line 954, generates an error:
>
>  section [36] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol value 0x20c28
>  does not match .got.plt section address 0x20cb8
>
>  for many of the *.so files it checks. This is because the *.so
>  intentionally points to ".got" rather than ".got.plt". Our gcc guy
>  doesn't believe this is an error.


section [36] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol value 0x20c28 does 
not match .got.plt section address 0x20cb8
*** failure in ../src/elflint --quiet --gnu-ld ../backends/libebl_x86_64.so
FAIL: run-elflint-self.sh

=============================================
1 of 88 tests failed
Please report to https://bugzilla.redhat.com/
=============================================


--jeff kenton <jkenton@tilera.com>

On 08/16/2012 01:49 PM, Roland McGrath wrote:
We don't touch elf.h directly, we only copy it verbatim from glibc.
I've done that update.

Your changes need ChangeLog entries.

You don't need to quote the contribution agreement in your commit message,
just the -s (Signed-off-by line) is enough.

Your new files have the wrong copyright terms.
Please follow the model of the existing files in the git repository.

Please cite 'make check' results on a native build.
You also need to add tilegx cases to run-allregs.sh and perhaps others.

In backends/*_regs.c note how we have mostly avoided tables of string
pointers, because these necessitate dynamic relocs for the pointers.
That's not a problem with string constants used directly in code.


Thanks,
Roland

1. Done.  New patch attached.

2. Changelog:

  backends/
    *Makefile.am: added tilegx processor.
    *tilegx_corenote.c: new file.
    *tilegx_regs.c: new file.
    *tilegx_reloc.def: new file.
    *tilegx_init.c: new file.
    *tilegx_retval.c: new file.
    *tilegx_symbol.c: new file.
  libebl/
    *eblopenbackend.c: added tilegx processor.
  src/
    *elflint.c: added tilegx processor.
  tests/
    *run-allregs.sh: added testfile60 for tilegx processor.
    *testfile60.bz2: new file.


3. make check results:

Several errors of this type:

I am discussing this problem in another email thread with Mark Wielaard.  Our tool chain is producing .so files with data that elflint doesn't expect:

3. elflint.c, at line 954, generates an error:
>
> section [36] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol value 0x20c28
> does not match .got.plt section address 0x20cb8
>
> for many of the *.so files it checks. This is because the *.so
> intentionally points to ".got" rather than ".got.plt". Our gcc guy
> doesn't believe this is an error.

    
section [36] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol value 0x20c28 does not match .got.plt section address 0x20cb8
*** failure in ../src/elflint --quiet --gnu-ld ../backends/libebl_x86_64.so
FAIL: run-elflint-self.sh

=============================================
1 of 88 tests failed
Please report to https://bugzilla.redhat.com/
=============================================


--jeff kenton <jkenton@tilera.com>

>From c427d4da3fdbcfaa1e57a46822eb458710e2d6bb Mon Sep 17 00:00:00 2001
From: Jeff Kenton <jkenton@tilera.com>
Date: Mon, 20 Aug 2012 11:06:27 -0400
Subject: [PATCH] Signed-off-by: Jeff Kenton <jkenton@tilera.com>

Add support for TILE-Gx processor.
---
 backends/Makefile.am       |   11 ++-
 backends/tilegx_corenote.c |   64 ++++++++++++++++
 backends/tilegx_init.c     |   60 +++++++++++++++
 backends/tilegx_regs.c     |  171 ++++++++++++++++++++++++++++++++++++++++++++
 backends/tilegx_reloc.def  |  120 +++++++++++++++++++++++++++++++
 backends/tilegx_retval.c   |  165 ++++++++++++++++++++++++++++++++++++++++++
 backends/tilegx_symbol.c   |   57 +++++++++++++++
 libebl/eblopenbackend.c    |    1 +
 src/elflint.c              |    3 +-
 tests/run-allregs.sh       |   69 ++++++++++++++++++
 tests/testfile60.bz2       |  Bin 0 -> 2974 bytes
 11 files changed, 717 insertions(+), 4 deletions(-)
 create mode 100644 backends/tilegx_corenote.c
 create mode 100644 backends/tilegx_init.c
 create mode 100644 backends/tilegx_regs.c
 create mode 100644 backends/tilegx_reloc.def
 create mode 100644 backends/tilegx_retval.c
 create mode 100644 backends/tilegx_symbol.c
 create mode 100755 tests/testfile60.bz2

diff --git a/backends/Makefile.am b/backends/Makefile.am
index 3b34e88..1c866e7 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -1,6 +1,6 @@
 ## Process this file with automake to create Makefile.in
 ##
-## Copyright (C) 2000-2010 Red Hat, Inc.
+## Copyright (C) 2000-2012 Red Hat, Inc.
 ## This file is part of elfutils.
 ##
 ## This file is free software; you can redistribute it and/or modify
@@ -31,11 +31,11 @@ INCLUDES += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \
 	   -I$(top_srcdir)/libelf -I$(top_srcdir)/libdw
 
 
-modules = i386 sh x86_64 ia64 alpha arm sparc ppc ppc64 s390
+modules = i386 sh x86_64 ia64 alpha arm sparc ppc ppc64 s390 tilegx
 libebl_pic = libebl_i386_pic.a libebl_sh_pic.a libebl_x86_64_pic.a \
 	     libebl_ia64_pic.a libebl_alpha_pic.a libebl_arm_pic.a \
 	     libebl_sparc_pic.a libebl_ppc_pic.a libebl_ppc64_pic.a \
-	     libebl_s390_pic.a
+	     libebl_s390_pic.a libebl_tilegx_pic.a
 noinst_LIBRARIES = $(libebl_pic)
 noinst_DATA = $(libebl_pic:_pic.a=.so)
 
@@ -97,6 +97,11 @@ s390_SRCS = s390_init.c s390_symbol.c s390_regs.c s390_retval.c
 libebl_s390_pic_a_SOURCES = $(s390_SRCS)
 am_libebl_s390_pic_a_OBJECTS = $(s390_SRCS:.c=.os)
 
+tilegx_SRCS = tilegx_init.c tilegx_symbol.c tilegx_regs.c \
+              tilegx_retval.c tilegx_corenote.c
+libebl_tilegx_pic_a_SOURCES = $(tilegx_SRCS)
+am_libebl_tilegx_pic_a_OBJECTS = $(tilegx_SRCS:.c=.os)
+
 
 libebl_%.so libebl_%.map: libebl_%_pic.a $(libelf) $(libdw)
 	@rm -f $(@:.so=.map)
diff --git a/backends/tilegx_corenote.c b/backends/tilegx_corenote.c
new file mode 100644
index 0000000..08f4d1e
--- /dev/null
+++ b/backends/tilegx_corenote.c
@@ -0,0 +1,64 @@
+/* TILE-Gx specific core note handling.
+   Copyright (C) 2012 Red Hat, 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/>.  */
+
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <elf.h>
+#include <inttypes.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/time.h>
+
+#define BACKEND	tilegx_
+#include "libebl_CPU.h"
+
+static const Ebl_Register_Location prstatus_regs[] =
+  {
+    { .offset = 0, .regno = 0, .count = 56, .bits = 64 }, /* r0-r55 */
+    { .offset = 56 * 8, .regno = 64, .count = 1, .bits = 64 } /* pc */
+  };
+#define PRSTATUS_REGS_SIZE	(57 * 8)
+
+#define ULONG			uint64_t
+#define ALIGN_ULONG		8
+#define TYPE_ULONG		ELF_T_XWORD
+#define TYPE_LONG		ELF_T_SXWORD
+#define PID_T			int32_t
+#define	UID_T			uint32_t
+#define	GID_T			uint32_t
+#define ALIGN_PID_T		4
+#define ALIGN_UID_T		4
+#define ALIGN_GID_T		4
+#define TYPE_PID_T		ELF_T_SWORD
+#define TYPE_UID_T		ELF_T_WORD
+#define TYPE_GID_T		ELF_T_WORD
+
+#include "linux-core-note.c"
diff --git a/backends/tilegx_init.c b/backends/tilegx_init.c
new file mode 100644
index 0000000..7ce951d
--- /dev/null
+++ b/backends/tilegx_init.c
@@ -0,0 +1,60 @@
+/* Initialization of TILE-Gx specific backend library.
+   Copyright (C) 2012 Red Hat, 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/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define BACKEND		tilegx_
+#define RELOC_PREFIX	R_TILEGX_
+#include "libebl_CPU.h"
+
+/* This defines the common reloc hooks based on tilegx_reloc.def.  */
+#include "common-reloc.c"
+
+const char *
+tilegx_init (elf, machine, eh, ehlen)
+     Elf *elf __attribute__ ((unused));
+     GElf_Half machine __attribute__ ((unused));
+     Ebl *eh;
+     size_t ehlen;
+{
+  /* Check whether the Elf_BH object has a sufficent size.  */
+  if (ehlen < sizeof (Ebl))
+    return NULL;
+
+  /* We handle it.  */
+  eh->name = "TILE-Gx";
+  tilegx_init_reloc (eh);
+  HOOK (eh, reloc_simple_type);
+  HOOK (eh, return_value_location);
+  HOOK (eh, register_info);
+  HOOK (eh, core_note);
+
+  return MODVERSION;
+}
diff --git a/backends/tilegx_regs.c b/backends/tilegx_regs.c
new file mode 100644
index 0000000..3330d67
--- /dev/null
+++ b/backends/tilegx_regs.c
@@ -0,0 +1,171 @@
+/* Register names and numbers for TILE-Gx DWARF.
+   Copyright (C) 2012 Red Hat, 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/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <dwarf.h>
+
+#define BACKEND tilegx_
+#include "libebl_CPU.h"
+
+#if 0
+static const char *const register_names[65] =
+  {
+    "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
+    "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
+    "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
+    "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
+    "r32",  "r33",  "r34",  "r35",  "r36",  "r37",  "r38",  "r39",
+    "r40",  "r41",  "r42",  "r43",  "r44",  "r45",  "r46",  "r47",
+    "r48",  "r49",  "r50",  "r51",  "r52",  "tp",   "sp",   "lr",
+    "sn",   "idn0", "idn1", "udn0", "udn1", "udn2", "udn3", "zero",
+    "pc"
+  };
+#endif
+
+ssize_t
+tilegx_register_info (Ebl *ebl __attribute__ ((unused)),
+		    int regno, char *name, size_t namelen,
+		    const char **prefix, const char **setname,
+		    int *bits, int *type)
+{
+  if (name == NULL)
+    return 65;
+
+  if (regno < 0 || regno > 64 || namelen < 5)
+    return -1;
+
+  *prefix = "";
+  *setname = "integer";
+  *bits = 64;
+
+  switch (regno)
+    {
+    case 0 ... 9:
+        *type = DW_ATE_signed;
+        name[0] = 'r';
+        name[1] = regno + '0';
+        namelen = 2;
+        break;
+
+    case 10 ... 52:
+      *type = DW_ATE_signed;
+      name[0] = 'r';
+      name[1] = regno / 10 + '0';
+      name[2] = regno % 10 + '0';
+      namelen = 3;
+      break;
+
+    case 53:
+      *type = DW_ATE_address;
+      return stpcpy (name, "tp") + 1 - name;
+
+    case 54:
+      *type = DW_ATE_address;
+      return stpcpy (name, "sp") + 1 - name;
+
+    case 55:
+      *type = DW_ATE_address;
+      return stpcpy (name, "lr") + 1 - name;
+
+    case 56:
+      *type = DW_ATE_unsigned;
+      return stpcpy (name, "sn") + 1 - name;
+
+    case 57:
+      *type = DW_ATE_unsigned;
+      return stpcpy (name, "idn0") + 1 - name;
+
+    case 58:
+      *type = DW_ATE_unsigned;
+      return stpcpy (name, "idn1") + 1 - name;
+
+    case 59:
+      *type = DW_ATE_unsigned;
+      return stpcpy (name, "udn0") + 1 - name;
+
+    case 60:
+      *type = DW_ATE_unsigned;
+      return stpcpy (name, "udn1") + 1 - name;
+
+    case 61:
+      *type = DW_ATE_unsigned;
+      return stpcpy (name, "udn2") + 1 - name;
+
+    case 62:
+      *type = DW_ATE_unsigned;
+      return stpcpy (name, "udn3") + 1 - name;
+
+    case 63:
+      *type = DW_ATE_unsigned;
+      return stpcpy (name, "zero") + 1 - name;
+
+    case 64:
+      *type = DW_ATE_address;
+      return stpcpy (name, "pc") + 1 - name;
+
+    /* Can't happen */
+    default:
+        *setname = NULL;
+        return 0;
+    }
+
+  name[namelen++] = '\0';
+  return namelen;
+}
+
+#if 0
+ssize_t
+arm_register_info (Ebl *ebl __attribute__ ((unused)),
+		   int regno, char *name, size_t namelen,
+		   const char **prefix, const char **setname,
+		   int *bits, int *type)
+{
+  switch (regno)
+    {
+    case 13 ... 15:
+      *type = DW_ATE_address;
+      name[0] = "slp"[regno - 13];
+      name[1] = "prc"[regno - 13];
+      namelen = 2;
+      break;
+
+    case 128:
+      *type = DW_ATE_unsigned;
+      return stpcpy (name, "spsr") + 1 - name;
+    }
+
+  name[namelen++] = '\0';
+  return namelen;
+}
+#endif
+
diff --git a/backends/tilegx_reloc.def b/backends/tilegx_reloc.def
new file mode 100644
index 0000000..559d200
--- /dev/null
+++ b/backends/tilegx_reloc.def
@@ -0,0 +1,120 @@
+/* List the relocation types for tilegx.  -*- C -*-
+   Copyright (C) 2012 Red Hat, 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/>.  */
+
+/*	    NAME,			REL|EXEC|DYN	*/
+
+RELOC_TYPE (NONE,			0)
+RELOC_TYPE (64,				REL|EXEC|DYN)
+RELOC_TYPE (32,				REL|EXEC|DYN)
+RELOC_TYPE (16,				REL|EXEC|DYN)
+RELOC_TYPE (8,				REL|EXEC|DYN)
+RELOC_TYPE (64_PCREL,			REL)
+RELOC_TYPE (32_PCREL,			REL)
+RELOC_TYPE (16_PCREL,			REL)
+RELOC_TYPE (8_PCREL,			REL)
+RELOC_TYPE (HW0,			REL)
+RELOC_TYPE (HW1,			REL)
+RELOC_TYPE (HW2,			REL)
+RELOC_TYPE (HW3,			REL)
+RELOC_TYPE (HW0_LAST,			REL)
+RELOC_TYPE (HW1_LAST,			REL)
+RELOC_TYPE (HW2_LAST,			REL)
+RELOC_TYPE (COPY,			EXEC)
+RELOC_TYPE (GLOB_DAT,			EXEC|DYN)
+RELOC_TYPE (JMP_SLOT,			EXEC|DYN)
+RELOC_TYPE (RELATIVE,			EXEC|DYN)
+RELOC_TYPE (BROFF_X1,			REL)
+RELOC_TYPE (JUMPOFF_X1,			REL)
+RELOC_TYPE (JUMPOFF_X1_PLT,		REL)
+RELOC_TYPE (IMM8_X0,			REL)
+RELOC_TYPE (IMM8_Y0,			REL)
+RELOC_TYPE (IMM8_X1,			REL)
+RELOC_TYPE (IMM8_Y1,			REL)
+RELOC_TYPE (DEST_IMM8_X1,		REL)
+RELOC_TYPE (MT_IMM14_X1,		REL)
+RELOC_TYPE (MF_IMM14_X1,		REL)
+RELOC_TYPE (MMSTART_X0,			REL)
+RELOC_TYPE (MMEND_X0,			REL)
+RELOC_TYPE (SHAMT_X0,			REL)
+RELOC_TYPE (SHAMT_X1,			REL)
+RELOC_TYPE (SHAMT_Y0,			REL)
+RELOC_TYPE (SHAMT_Y1,			REL)
+RELOC_TYPE (IMM16_X0_HW0,		REL)
+RELOC_TYPE (IMM16_X1_HW0,		REL)
+RELOC_TYPE (IMM16_X0_HW1,		REL)
+RELOC_TYPE (IMM16_X1_HW1,		REL)
+RELOC_TYPE (IMM16_X0_HW2,		REL)
+RELOC_TYPE (IMM16_X1_HW2,		REL)
+RELOC_TYPE (IMM16_X0_HW3,		REL)
+RELOC_TYPE (IMM16_X1_HW3,		REL)
+RELOC_TYPE (IMM16_X0_HW0_LAST,		REL)
+RELOC_TYPE (IMM16_X1_HW0_LAST,		REL)
+RELOC_TYPE (IMM16_X0_HW1_LAST,		REL)
+RELOC_TYPE (IMM16_X1_HW1_LAST,		REL)
+RELOC_TYPE (IMM16_X0_HW2_LAST,		REL)
+RELOC_TYPE (IMM16_X1_HW2_LAST,		REL)
+RELOC_TYPE (IMM16_X0_HW0_PCREL,		REL)
+RELOC_TYPE (IMM16_X1_HW0_PCREL,		REL)
+RELOC_TYPE (IMM16_X0_HW1_PCREL,		REL)
+RELOC_TYPE (IMM16_X1_HW1_PCREL,		REL)
+RELOC_TYPE (IMM16_X0_HW2_PCREL,		REL)
+RELOC_TYPE (IMM16_X1_HW2_PCREL,		REL)
+RELOC_TYPE (IMM16_X0_HW3_PCREL,		REL)
+RELOC_TYPE (IMM16_X1_HW3_PCREL,		REL)
+RELOC_TYPE (IMM16_X0_HW0_LAST_PCREL,	REL)
+RELOC_TYPE (IMM16_X1_HW0_LAST_PCREL,	REL)
+RELOC_TYPE (IMM16_X0_HW1_LAST_PCREL,	REL)
+RELOC_TYPE (IMM16_X1_HW1_LAST_PCREL,	REL)
+RELOC_TYPE (IMM16_X0_HW2_LAST_PCREL,	REL)
+RELOC_TYPE (IMM16_X1_HW2_LAST_PCREL,	REL)
+RELOC_TYPE (IMM16_X0_HW0_GOT,		REL)
+RELOC_TYPE (IMM16_X1_HW0_GOT,		REL)
+RELOC_TYPE (IMM16_X0_HW0_LAST_GOT,	REL)
+RELOC_TYPE (IMM16_X1_HW0_LAST_GOT,	REL)
+RELOC_TYPE (IMM16_X0_HW1_LAST_GOT,	REL)
+RELOC_TYPE (IMM16_X1_HW1_LAST_GOT,	REL)
+RELOC_TYPE (IMM16_X0_HW0_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X1_HW0_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X0_HW0_LAST_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X1_HW0_LAST_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X0_HW1_LAST_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X1_HW1_LAST_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X0_HW0_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X1_HW0_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X0_HW0_LAST_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X1_HW0_LAST_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X0_HW1_LAST_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X1_HW1_LAST_TLS_IE,	REL)
+RELOC_TYPE (TLS_DTPMOD64,		EXEC|DYN)
+RELOC_TYPE (TLS_DTPOFF64,		EXEC|DYN)
+RELOC_TYPE (TLS_TPOFF64,		EXEC|DYN)
+RELOC_TYPE (TLS_DTPMOD32,		EXEC|DYN)
+RELOC_TYPE (TLS_DTPOFF32,		EXEC|DYN)
+RELOC_TYPE (TLS_TPOFF32,		EXEC|DYN)
+RELOC_TYPE (GNU_VTINHERIT,		REL)
+RELOC_TYPE (GNU_VTENTRY,		REL)
diff --git a/backends/tilegx_retval.c b/backends/tilegx_retval.c
new file mode 100644
index 0000000..a2b0647
--- /dev/null
+++ b/backends/tilegx_retval.c
@@ -0,0 +1,165 @@
+/* Function return value location for Linux/TILE-Gx ABI.
+   Copyright (C) 2012.
+   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 <dwarf.h>
+
+#define BACKEND tilegx_
+#include "libebl_CPU.h"
+
+
+/* r0.  */
+static const Dwarf_Op loc_intreg[] =
+  {
+    { .atom = DW_OP_reg0 }
+  };
+#define nloc_intreg	1
+
+/* The return value is a structure and is actually stored in stack space
+   passed in a hidden argument by the caller.  But, the compiler
+   helpfully returns the address of that space in r0.  */
+static const Dwarf_Op loc_aggregate[] =
+  {
+    { .atom = DW_OP_breg0, .number = 0 }
+  };
+#define nloc_aggregate 1
+
+int
+tilegx_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
+{
+  /* Start with the function's type, and get the DW_AT_type attribute,
+     which is the type of the return value.  */
+
+  Dwarf_Attribute attr_mem;
+  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
+						&attr_mem);
+  if (attr == NULL)
+    /* The function has no return value, like a `void' function in C.  */
+    return 0;
+
+  Dwarf_Die die_mem;
+  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
+  int tag = dwarf_tag (typedie);
+
+  /* Follow typedefs and qualifiers to get to the actual type.  */
+  while (tag == DW_TAG_typedef
+	 || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
+	 || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
+    {
+      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
+      typedie = dwarf_formref_die (attr, &die_mem);
+      tag = dwarf_tag (typedie);
+    }
+
+  Dwarf_Word size;
+  switch (tag)
+    {
+    case -1:
+      return -1;
+
+    case DW_TAG_subrange_type:
+      if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
+	{
+	  attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
+	  typedie = dwarf_formref_die (attr, &die_mem);
+	  tag = dwarf_tag (typedie);
+	}
+      /* Fall through.  */
+
+    case DW_TAG_base_type:
+    case DW_TAG_enumeration_type:
+    case DW_TAG_pointer_type:
+    case DW_TAG_ptr_to_member_type:
+      if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
+						 &attr_mem), &size) != 0)
+	{
+	  if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+	    size = 8;
+	  else
+	    return -1;
+	}
+      if (tag == DW_TAG_base_type)
+	{
+	  Dwarf_Word encoding;
+	  if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding,
+						     &attr_mem),
+			       &encoding) != 0)
+	    return -1;
+        }
+
+      /* Small enough structs are passed directly in registers R0 ... R7.  */
+      if (size <= 8)
+	{
+	intreg:
+	  *locp = loc_intreg;
+	  return nloc_intreg;
+	}
+
+      /* Else fall through.  */
+    case DW_TAG_structure_type:
+    case DW_TAG_class_type:
+    case DW_TAG_union_type:
+    aggregate:
+      *locp = loc_aggregate;
+      return nloc_aggregate;
+
+    case DW_TAG_array_type:
+    case DW_TAG_string_type:
+      if (dwarf_aggregate_size (typedie, &size) == 0 && size <= 8)
+	{
+	  if (tag == DW_TAG_array_type)
+	    {
+	      /* Check if it's a character array.  */
+	      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
+	      typedie = dwarf_formref_die (attr, &die_mem);
+	      tag = dwarf_tag (typedie);
+	      if (tag != DW_TAG_base_type)
+		goto aggregate;
+	      if (dwarf_formudata (dwarf_attr_integrate (typedie,
+							 DW_AT_byte_size,
+							 &attr_mem),
+				   &size) != 0)
+		return -1;
+	      if (size != 1)
+		goto aggregate;
+	    }
+	  goto intreg;
+	}
+      goto aggregate;
+    }
+
+  /* XXX We don't have a good way to return specific errors from ebl calls.
+     This value means we do not understand the type, but it is well-formed
+     DWARF and might be valid.  */
+  return -2;
+}
diff --git a/backends/tilegx_symbol.c b/backends/tilegx_symbol.c
new file mode 100644
index 0000000..3195660
--- /dev/null
+++ b/backends/tilegx_symbol.c
@@ -0,0 +1,57 @@
+/* TILEGX-specific symbolic name handling.
+   Copyright (C) 2012.
+   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 <elf.h>
+#include <stddef.h>
+
+#define BACKEND		tilegx_
+#include "libebl_CPU.h"
+
+/* Check for the simple reloc types.  */
+Elf_Type
+tilegx_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type)
+{
+  switch (type)
+    {
+    case R_TILEGX_64:
+      return ELF_T_SXWORD;
+    case R_TILEGX_32:
+      return ELF_T_SWORD;
+    case R_TILEGX_16:
+      return ELF_T_HALF;
+    case R_TILEGX_8:
+      return ELF_T_BYTE;
+    default:
+      return ELF_T_NUM;
+    }
+}
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index b39ab2e..89e5da5 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -63,6 +63,7 @@ static const struct
   { "x86_64", "elf_x86_64", "x86_64", 6, EM_X86_64, ELFCLASS64, ELFDATA2LSB },
   { "ppc", "elf_ppc", "ppc", 3, EM_PPC, ELFCLASS32, ELFDATA2MSB },
   { "ppc64", "elf_ppc64", "ppc64", 5, EM_PPC64, ELFCLASS64, ELFDATA2MSB },
+  { "tilegx", "elf_tilegx", "tilegx", 6, EM_TILEGX, ELFCLASS64, ELFDATA2LSB },
   // XXX class and machine fields need to be filled in for all archs.
   { "sh", "elf_sh", "sh", 2, EM_SH, 0, 0 },
   { "arm", "ebl_arm", "arm", 3, EM_ARM, 0, 0 },
diff --git a/src/elflint.c b/src/elflint.c
index 1ff2809..4084987 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -330,7 +330,8 @@ static const int valid_e_machine[] =
     EM_68HC16, EM_68HC11, EM_68HC08, EM_68HC05, EM_SVX, EM_ST19, EM_VAX,
     EM_CRIS, EM_JAVELIN, EM_FIREPATH, EM_ZSP, EM_MMIX, EM_HUANY, EM_PRISM,
     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_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA, EM_ALPHA,
+    EM_TILEGX, EM_TILEPRO
   };
 #define nvalid_e_machine \
   (sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))
diff --git a/tests/run-allregs.sh b/tests/run-allregs.sh
index cc48342..0965715 100755
--- a/tests/run-allregs.sh
+++ b/tests/run-allregs.sh
@@ -2584,4 +2584,73 @@ FPU registers:
 	 63: $fpcr (fpcr), unsigned 64 bits
 EOF
 
+regs_test testfile60 <<\EOF
+integer registers:
+	  0: r0 (r0), signed 64 bits
+	  1: r1 (r1), signed 64 bits
+	  2: r2 (r2), signed 64 bits
+	  3: r3 (r3), signed 64 bits
+	  4: r4 (r4), signed 64 bits
+	  5: r5 (r5), signed 64 bits
+	  6: r6 (r6), signed 64 bits
+	  7: r7 (r7), signed 64 bits
+	  8: r8 (r8), signed 64 bits
+	  9: r9 (r9), signed 64 bits
+	 10: r10 (r10), signed 64 bits
+	 11: r11 (r11), signed 64 bits
+	 12: r12 (r12), signed 64 bits
+	 13: r13 (r13), signed 64 bits
+	 14: r14 (r14), signed 64 bits
+	 15: r15 (r15), signed 64 bits
+	 16: r16 (r16), signed 64 bits
+	 17: r17 (r17), signed 64 bits
+	 18: r18 (r18), signed 64 bits
+	 19: r19 (r19), signed 64 bits
+	 20: r20 (r20), signed 64 bits
+	 21: r21 (r21), signed 64 bits
+	 22: r22 (r22), signed 64 bits
+	 23: r23 (r23), signed 64 bits
+	 24: r24 (r24), signed 64 bits
+	 25: r25 (r25), signed 64 bits
+	 26: r26 (r26), signed 64 bits
+	 27: r27 (r27), signed 64 bits
+	 28: r28 (r28), signed 64 bits
+	 29: r29 (r29), signed 64 bits
+	 30: r30 (r30), signed 64 bits
+	 31: r31 (r31), signed 64 bits
+	 32: r32 (r32), signed 64 bits
+	 33: r33 (r33), signed 64 bits
+	 34: r34 (r34), signed 64 bits
+	 35: r35 (r35), signed 64 bits
+	 36: r36 (r36), signed 64 bits
+	 37: r37 (r37), signed 64 bits
+	 38: r38 (r38), signed 64 bits
+	 39: r39 (r39), signed 64 bits
+	 40: r40 (r40), signed 64 bits
+	 41: r41 (r41), signed 64 bits
+	 42: r42 (r42), signed 64 bits
+	 43: r43 (r43), signed 64 bits
+	 44: r44 (r44), signed 64 bits
+	 45: r45 (r45), signed 64 bits
+	 46: r46 (r46), signed 64 bits
+	 47: r47 (r47), signed 64 bits
+	 48: r48 (r48), signed 64 bits
+	 49: r49 (r49), signed 64 bits
+	 50: r50 (r50), signed 64 bits
+	 51: r51 (r51), signed 64 bits
+	 52: r52 (r52), signed 64 bits
+	 53: tp (tp), address 64 bits
+	 54: sp (sp), address 64 bits
+	 55: lr (lr), address 64 bits
+	 56: sn (sn), unsigned 64 bits
+	 57: idn0 (idn0), unsigned 64 bits
+	 58: idn1 (idn1), unsigned 64 bits
+	 59: udn0 (udn0), unsigned 64 bits
+	 60: udn1 (udn1), unsigned 64 bits
+	 61: udn2 (udn2), unsigned 64 bits
+	 62: udn3 (udn3), unsigned 64 bits
+	 63: zero (zero), unsigned 64 bits
+	 64: pc (pc), address 64 bits
+EOF
+
 exit 0
diff --git a/tests/testfile60.bz2 b/tests/testfile60.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..6a0cd7bcddd7a62d61f51d72adaf95a3fb7ff5bc
GIT binary patch
literal 2974
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
UDYXXga{u_dk}1N3g9w8?$p0ux(EtDd

literal 0
HcmV?d00001

-- 
1.7.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]