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]

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


Patch to add support for Tilera TILE-Gx processor attached.

|         Developer's Certificate of Origin|
||
|         By making a contribution to this project, I certify that:|
||
|	(a) The contribution was created in whole or in part by me,|
|	and I have the right to submit the contribution under each|
|	license indicated in, or otherwise designated as being|
|	applicable to, the file.|
||
|         (b) The contribution was provided directly to me by some other|
|             person who certified (a), and I have not modified it.|
||
|         (c) I understand and agree that the project and the|
|             contribution are public and that a record of the|
|             contribution (including all personal information I submit|
|             with it, including my sign-off) is maintained indefinitely|
|             and may be redistributed.|
||

|
Signed-off-by: |jeff kenton <jkenton@tilera.com>


Patch to add support for Tilera TILE-Gx processor attached.

        Developer's Certificate of Origin

        By making a contribution to this project, I certify that:

	(a) The contribution was created in whole or in part by me,
	    and I have the right to submit the contribution under each
	    license indicated in, or otherwise designated as being
	    applicable to, the file.

        (b) The contribution was provided directly to me by some other
            person who certified (a), and I have not modified it.

        (c) I understand and agree that the project and the
            contribution are public and that a record of the
            contribution (including all personal information I submit
            with it, including my sign-off) is maintained indefinitely
            and may be redistributed.

Signed-off-by:
jeff kenton <jkenton@tilera.com>

>From ee35c85149bbb63cdbea1fce09750d1ec65ef28c Mon Sep 17 00:00:00 2001
From: Jeff Kenton <jkenton@tilera.com>
Date: Thu, 16 Aug 2012 13:09:14 -0400
Subject: [PATCH] Add support for Tilera TILE-Gx processor.

---
 backends/Makefile.am       |   11 ++-
 backends/tilegx_corenote.c |   60 +++++++++++++
 backends/tilegx_init.c     |   58 ++++++++++++
 backends/tilegx_regs.c     |   89 +++++++++++++++++++
 backends/tilegx_reloc.def  |  141 +++++++++++++++++++++++++++++
 backends/tilegx_retval.c   |  161 +++++++++++++++++++++++++++++++++
 backends/tilegx_symbol.c   |   53 +++++++++++
 libebl/eblopenbackend.c    |    1 +
 libelf/elf.h               |  210 +++++++++++++++++++++++++++++++++++++++++++-
 src/elflint.c              |    3 +-
 10 files changed, 782 insertions(+), 5 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

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..bf5b3a1
--- /dev/null
+++ b/backends/tilegx_corenote.c
@@ -0,0 +1,60 @@
+/* TILE-Gx specific core note handling.
+   Copyright (C) 2012 Red Hat, Inc.
+   This file is part of Red Hat elfutils.
+
+   Red Hat elfutils 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; version 2 of the License.
+
+   Red Hat 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 a copy of the GNU General Public License along
+   with Red Hat elfutils; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+   Red Hat elfutils is an included package of the Open Invention Network.
+   An included package of the Open Invention Network is a package for which
+   Open Invention Network licensees cross-license their patents.  No patent
+   license is granted, either expressly or impliedly, by designation as an
+   included package.  Should you wish to participate in the Open Invention
+   Network licensing program, please visit www.openinventionnetwork.com
+   <http://www.openinventionnetwork.com>.  */
+
+#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..778e270
--- /dev/null
+++ b/backends/tilegx_init.c
@@ -0,0 +1,58 @@
+/* Initialization of TILE-Gx specific backend library.
+   Copyright (C) 2012 Red Hat, Inc.
+   This file is part of Red Hat elfutils.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+   Red Hat elfutils 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; version 2 of the License.
+
+   Red Hat 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 a copy of the GNU General Public License along
+   with Red Hat elfutils; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+   Red Hat elfutils is an included package of the Open Invention Network.
+   An included package of the Open Invention Network is a package for which
+   Open Invention Network licensees cross-license their patents.  No patent
+   license is granted, either expressly or impliedly, by designation as an
+   included package.  Should you wish to participate in the Open Invention
+   Network licensing program, please visit www.openinventionnetwork.com
+   <http://www.openinventionnetwork.com>.  */
+
+#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..4513d4c
--- /dev/null
+++ b/backends/tilegx_regs.c
@@ -0,0 +1,89 @@
+/* Register names and numbers for TILE-Gx DWARF.
+   Copyright (C) 2012 Red Hat, Inc.
+   This file is part of Red Hat elfutils.
+
+   Red Hat elfutils 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; version 2 of the License.
+
+   Red Hat 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 a copy of the GNU General Public License along
+   with Red Hat elfutils; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+   Red Hat elfutils is an included package of the Open Invention Network.
+   An included package of the Open Invention Network is a package for which
+   Open Invention Network licensees cross-license their patents.  No patent
+   license is granted, either expressly or impliedly, by designation as an
+   included package.  Should you wish to participate in the Open Invention
+   Network licensing program, please visit www.openinventionnetwork.com
+   <http://www.openinventionnetwork.com>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <dwarf.h>
+
+#define BACKEND tilegx_
+#include "libebl_CPU.h"
+
+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"
+  };
+
+
+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 ... 52:
+        *type = DW_ATE_signed;
+        break;
+
+      case 53 ... 55:
+      case 64:
+        *type = DW_ATE_address;
+        break;
+
+      case 56 ... 63:
+        *type = DW_ATE_unsigned;
+        break;
+
+      /* Can't happen */
+      default:
+        *setname = NULL;
+        return 0;
+    }
+
+  return stpcpy (name, register_names[regno]) + 1 - name;
+}
diff --git a/backends/tilegx_reloc.def b/backends/tilegx_reloc.def
new file mode 100644
index 0000000..bc63a07
--- /dev/null
+++ b/backends/tilegx_reloc.def
@@ -0,0 +1,141 @@
+/* List the relocation types for tilegx.  -*- C -*-
+   Copyright (C) 2012 Red Hat, Inc.
+   This file is part of Red Hat elfutils.
+
+   Red Hat elfutils 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; version 2 of the License.
+
+   Red Hat 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 a copy of the GNU General Public License along
+   with Red Hat elfutils; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+   Red Hat elfutils is an included package of the Open Invention Network.
+   An included package of the Open Invention Network is a package for which
+   Open Invention Network licensees cross-license their patents.  No patent
+   license is granted, either expressly or impliedly, by designation as an
+   included package.  Should you wish to participate in the Open Invention
+   Network licensing program, please visit www.openinventionnetwork.com
+   <http://www.openinventionnetwork.com>.  */
+
+/*	    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_HW1_GOT,		REL)
+RELOC_TYPE (IMM16_X1_HW1_GOT,		REL)
+RELOC_TYPE (IMM16_X0_HW2_GOT,		REL)
+RELOC_TYPE (IMM16_X1_HW2_GOT,		REL)
+RELOC_TYPE (IMM16_X0_HW3_GOT,		REL)
+RELOC_TYPE (IMM16_X1_HW3_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_HW2_LAST_GOT,	REL)
+RELOC_TYPE (IMM16_X1_HW2_LAST_GOT,	REL)
+RELOC_TYPE (IMM16_X0_HW0_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X1_HW0_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X0_HW1_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X1_HW1_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X0_HW2_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X1_HW2_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X0_HW3_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X1_HW3_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_HW2_LAST_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X1_HW2_LAST_TLS_GD,	REL)
+RELOC_TYPE (IMM16_X0_HW0_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X1_HW0_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X0_HW1_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X1_HW1_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X0_HW2_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X1_HW2_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X0_HW3_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X1_HW3_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 (IMM16_X0_HW2_LAST_TLS_IE,	REL)
+RELOC_TYPE (IMM16_X1_HW2_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..e717dbf
--- /dev/null
+++ b/backends/tilegx_retval.c
@@ -0,0 +1,161 @@
+/* Function return value location for Linux/TILE-Gx ABI.
+   Copyright (C) 2012 Red Hat, Inc.
+   This file is part of Red Hat elfutils.
+
+   Red Hat elfutils 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; version 2 of the License.
+
+   Red Hat 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 a copy of the GNU General Public License along
+   with Red Hat elfutils; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+   Red Hat elfutils is an included package of the Open Invention Network.
+   An included package of the Open Invention Network is a package for which
+   Open Invention Network licensees cross-license their patents.  No patent
+   license is granted, either expressly or impliedly, by designation as an
+   included package.  Should you wish to participate in the Open Invention
+   Network licensing program, please visit www.openinventionnetwork.com
+   <http://www.openinventionnetwork.com>.  */
+
+#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..7c904f8
--- /dev/null
+++ b/backends/tilegx_symbol.c
@@ -0,0 +1,53 @@
+/* TILEGX-specific symbolic name handling.
+   Copyright (C) 2012 Red Hat, Inc.
+   This file is part of Red Hat elfutils.
+
+   Red Hat elfutils 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; version 2 of the License.
+
+   Red Hat 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 a copy of the GNU General Public License along
+   with Red Hat elfutils; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+   Red Hat elfutils is an included package of the Open Invention Network.
+   An included package of the Open Invention Network is a package for which
+   Open Invention Network licensees cross-license their patents.  No patent
+   license is granted, either expressly or impliedly, by designation as an
+   included package.  Should you wish to participate in the Open Invention
+   Network licensing program, please visit www.openinventionnetwork.com
+   <http://www.openinventionnetwork.com>.  */
+
+#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/libelf/elf.h b/libelf/elf.h
index a9558a3..30705da 100644
--- a/libelf/elf.h
+++ b/libelf/elf.h
@@ -250,7 +250,10 @@ typedef struct
 #define EM_OPENRISC	92		/* OpenRISC 32-bit embedded processor */
 #define EM_ARC_A5	93		/* ARC Cores Tangent-A5 */
 #define EM_XTENSA	94		/* Tensilica Xtensa Architecture */
-#define EM_NUM		95
+#define EM_TILE64	187		/* Tilera TILE64 */
+#define EM_TILEPRO	188		/* Tilera TILEPro */
+#define EM_TILEGX	191		/* Tilera TILE-Gx */
+#define EM_NUM		192
 
 /* If it is necessary to assign new unofficial EM_* values, please
    pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
@@ -2794,6 +2797,211 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_M32R_NUM		256	/* Keep this the last entry. */
 
 
+/* TILEPro relocations. */
+#define R_TILEPRO_NONE               0
+#define R_TILEPRO_32                 1
+#define R_TILEPRO_16                 2
+#define R_TILEPRO_8                  3
+#define R_TILEPRO_32_PCREL           4
+#define R_TILEPRO_16_PCREL           5
+#define R_TILEPRO_8_PCREL            6
+#define R_TILEPRO_LO16               7
+#define R_TILEPRO_HI16               8
+#define R_TILEPRO_HA16               9
+#define R_TILEPRO_COPY               10
+#define R_TILEPRO_GLOB_DAT           11
+#define R_TILEPRO_JMP_SLOT           12
+#define R_TILEPRO_RELATIVE           13
+#define R_TILEPRO_BROFF_X1           14
+#define R_TILEPRO_JOFFLONG_X1        15
+#define R_TILEPRO_JOFFLONG_X1_PLT    16
+#define R_TILEPRO_IMM8_X0            17
+#define R_TILEPRO_IMM8_Y0            18
+#define R_TILEPRO_IMM8_X1            19
+#define R_TILEPRO_IMM8_Y1            20
+#define R_TILEPRO_MT_IMM15_X1        21
+#define R_TILEPRO_MF_IMM15_X1        22
+#define R_TILEPRO_IMM16_X0           23
+#define R_TILEPRO_IMM16_X1           24
+#define R_TILEPRO_IMM16_X0_LO        25
+#define R_TILEPRO_IMM16_X1_LO        26
+#define R_TILEPRO_IMM16_X0_HI        27
+#define R_TILEPRO_IMM16_X1_HI        28
+#define R_TILEPRO_IMM16_X0_HA        29
+#define R_TILEPRO_IMM16_X1_HA        30
+#define R_TILEPRO_IMM16_X0_PCREL     31
+#define R_TILEPRO_IMM16_X1_PCREL     32
+#define R_TILEPRO_IMM16_X0_LO_PCREL  33
+#define R_TILEPRO_IMM16_X1_LO_PCREL  34
+#define R_TILEPRO_IMM16_X0_HI_PCREL  35
+#define R_TILEPRO_IMM16_X1_HI_PCREL  36
+#define R_TILEPRO_IMM16_X0_HA_PCREL  37
+#define R_TILEPRO_IMM16_X1_HA_PCREL  38
+#define R_TILEPRO_IMM16_X0_GOT       39
+#define R_TILEPRO_IMM16_X1_GOT       40
+#define R_TILEPRO_IMM16_X0_GOT_LO    41
+#define R_TILEPRO_IMM16_X1_GOT_LO    42
+#define R_TILEPRO_IMM16_X0_GOT_HI    43
+#define R_TILEPRO_IMM16_X1_GOT_HI    44
+#define R_TILEPRO_IMM16_X0_GOT_HA    45
+#define R_TILEPRO_IMM16_X1_GOT_HA    46
+#define R_TILEPRO_MMSTART_X0         47
+#define R_TILEPRO_MMEND_X0           48
+#define R_TILEPRO_MMSTART_X1         49
+#define R_TILEPRO_MMEND_X1           50
+#define R_TILEPRO_SHAMT_X0           51
+#define R_TILEPRO_SHAMT_X1           52
+#define R_TILEPRO_SHAMT_Y0           53
+#define R_TILEPRO_SHAMT_Y1           54
+#define R_TILEPRO_DEST_IMM8_X1       55
+/* Relocs 56-65 are currently not defined.  */
+#define R_TILEPRO_IMM16_X0_TLS_GD    66
+#define R_TILEPRO_IMM16_X1_TLS_GD    67
+#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68
+#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69
+#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70
+#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71
+#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72
+#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73
+#define R_TILEPRO_IMM16_X0_TLS_IE    74
+#define R_TILEPRO_IMM16_X1_TLS_IE    75
+#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76
+#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77
+#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78
+#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79
+#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80
+#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81
+#define R_TILEPRO_TLS_DTPMOD32       82
+#define R_TILEPRO_TLS_DTPOFF32       83
+#define R_TILEPRO_TLS_TPOFF32        84
+
+
+#define R_TILEPRO_GNU_VTINHERIT      128
+#define R_TILEPRO_GNU_VTENTRY        129
+
+#define R_TILEPRO_NUM                130
+
+
+/* TILE-Gx relocations. */
+#define R_TILEGX_NONE                      0
+#define R_TILEGX_64                        1
+#define R_TILEGX_32                        2
+#define R_TILEGX_16                        3
+#define R_TILEGX_8                         4
+#define R_TILEGX_64_PCREL                  5
+#define R_TILEGX_32_PCREL                  6
+#define R_TILEGX_16_PCREL                  7
+#define R_TILEGX_8_PCREL                   8
+#define R_TILEGX_HW0                       9
+#define R_TILEGX_HW1                       10
+#define R_TILEGX_HW2                       11
+#define R_TILEGX_HW3                       12
+#define R_TILEGX_HW0_LAST                  13
+#define R_TILEGX_HW1_LAST                  14
+#define R_TILEGX_HW2_LAST                  15
+#define R_TILEGX_COPY                      16
+#define R_TILEGX_GLOB_DAT                  17
+#define R_TILEGX_JMP_SLOT                  18
+#define R_TILEGX_RELATIVE                  19
+#define R_TILEGX_BROFF_X1                  20
+#define R_TILEGX_JUMPOFF_X1                21
+#define R_TILEGX_JUMPOFF_X1_PLT            22
+#define R_TILEGX_IMM8_X0                   23
+#define R_TILEGX_IMM8_Y0                   24
+#define R_TILEGX_IMM8_X1                   25
+#define R_TILEGX_IMM8_Y1                   26
+#define R_TILEGX_DEST_IMM8_X1              27
+#define R_TILEGX_MT_IMM14_X1               28
+#define R_TILEGX_MF_IMM14_X1               29
+#define R_TILEGX_MMSTART_X0                30
+#define R_TILEGX_MMEND_X0                  31
+#define R_TILEGX_SHAMT_X0                  32
+#define R_TILEGX_SHAMT_X1                  33
+#define R_TILEGX_SHAMT_Y0                  34
+#define R_TILEGX_SHAMT_Y1                  35
+#define R_TILEGX_IMM16_X0_HW0              36
+#define R_TILEGX_IMM16_X1_HW0              37
+#define R_TILEGX_IMM16_X0_HW1              38
+#define R_TILEGX_IMM16_X1_HW1              39
+#define R_TILEGX_IMM16_X0_HW2              40
+#define R_TILEGX_IMM16_X1_HW2              41
+#define R_TILEGX_IMM16_X0_HW3              42
+#define R_TILEGX_IMM16_X1_HW3              43
+#define R_TILEGX_IMM16_X0_HW0_LAST         44
+#define R_TILEGX_IMM16_X1_HW0_LAST         45
+#define R_TILEGX_IMM16_X0_HW1_LAST         46
+#define R_TILEGX_IMM16_X1_HW1_LAST         47
+#define R_TILEGX_IMM16_X0_HW2_LAST         48
+#define R_TILEGX_IMM16_X1_HW2_LAST         49
+#define R_TILEGX_IMM16_X0_HW0_PCREL        50
+#define R_TILEGX_IMM16_X1_HW0_PCREL        51
+#define R_TILEGX_IMM16_X0_HW1_PCREL        52
+#define R_TILEGX_IMM16_X1_HW1_PCREL        53
+#define R_TILEGX_IMM16_X0_HW2_PCREL        54
+#define R_TILEGX_IMM16_X1_HW2_PCREL        55
+#define R_TILEGX_IMM16_X0_HW3_PCREL        56
+#define R_TILEGX_IMM16_X1_HW3_PCREL        57
+#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL   58
+#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL   59
+#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL   60
+#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL   61
+#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL   62
+#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL   63
+#define R_TILEGX_IMM16_X0_HW0_GOT          64
+#define R_TILEGX_IMM16_X1_HW0_GOT          65
+#define R_TILEGX_IMM16_X0_HW1_GOT          66
+#define R_TILEGX_IMM16_X1_HW1_GOT          67
+#define R_TILEGX_IMM16_X0_HW2_GOT          68
+#define R_TILEGX_IMM16_X1_HW2_GOT          69
+#define R_TILEGX_IMM16_X0_HW3_GOT          70
+#define R_TILEGX_IMM16_X1_HW3_GOT          71
+#define R_TILEGX_IMM16_X0_HW0_LAST_GOT     72
+#define R_TILEGX_IMM16_X1_HW0_LAST_GOT     73
+#define R_TILEGX_IMM16_X0_HW1_LAST_GOT     74
+#define R_TILEGX_IMM16_X1_HW1_LAST_GOT     75
+#define R_TILEGX_IMM16_X0_HW2_LAST_GOT     76
+#define R_TILEGX_IMM16_X1_HW2_LAST_GOT     77
+#define R_TILEGX_IMM16_X0_HW0_TLS_GD       78
+#define R_TILEGX_IMM16_X1_HW0_TLS_GD       79
+#define R_TILEGX_IMM16_X0_HW1_TLS_GD       80
+#define R_TILEGX_IMM16_X1_HW1_TLS_GD       81
+#define R_TILEGX_IMM16_X0_HW2_TLS_GD       82
+#define R_TILEGX_IMM16_X1_HW2_TLS_GD       83
+#define R_TILEGX_IMM16_X0_HW3_TLS_GD       84
+#define R_TILEGX_IMM16_X1_HW3_TLS_GD       85
+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD  86
+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD  87
+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD  88
+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD  89
+#define R_TILEGX_IMM16_X0_HW2_LAST_TLS_GD  90
+#define R_TILEGX_IMM16_X1_HW2_LAST_TLS_GD  91
+#define R_TILEGX_IMM16_X0_HW0_TLS_IE       92
+#define R_TILEGX_IMM16_X1_HW0_TLS_IE       93
+#define R_TILEGX_IMM16_X0_HW1_TLS_IE       94
+#define R_TILEGX_IMM16_X1_HW1_TLS_IE       95
+#define R_TILEGX_IMM16_X0_HW2_TLS_IE       96
+#define R_TILEGX_IMM16_X1_HW2_TLS_IE       97
+#define R_TILEGX_IMM16_X0_HW3_TLS_IE       98
+#define R_TILEGX_IMM16_X1_HW3_TLS_IE       99
+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE  100
+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE  101
+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE  102
+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE  103
+#define R_TILEGX_IMM16_X0_HW2_LAST_TLS_IE  104
+#define R_TILEGX_IMM16_X1_HW2_LAST_TLS_IE  105
+#define R_TILEGX_TLS_DTPMOD64              106
+#define R_TILEGX_TLS_DTPOFF64              107
+#define R_TILEGX_TLS_TPOFF64               108
+#define R_TILEGX_TLS_DTPMOD32              109
+#define R_TILEGX_TLS_DTPOFF32              110
+#define R_TILEGX_TLS_TPOFF32               111
+
+#define R_TILEGX_GNU_VTINHERIT             128
+#define R_TILEGX_GNU_VTENTRY               129
+
+#define R_TILEGX_NUM                       130
+
+
 __END_DECLS
 
 #endif	/* elf.h */
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]))
-- 
1.7.10.3


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