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/22/2012 02:50 PM, Roland McGrath wrote:
>> --- a/backends/ChangeLog
>> +++ b/backends/ChangeLog
>> @@ -1,3 +1,18 @@
>> +2012-08-21  Jeff Kenton<jkenton@tilera.com>
>> +
>> +	* Makefile.am (modules): Add tilegx.
>> +	(libebl_pic): Add libebl_tilegx_pic.a.
>> +	(tilegx_SRCS): New variable.
>> +	(libebl_tilegx_pic_a_SOURCES): Likewise.
>> +	(am_libebl_tilegx_pic_a_OBJECTS): Likewise.
>> +	* 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.
>> +
>> +
>>   2011-03-09  Mark Wielaard<mjw@redhat.com>
> This one still has an extra blank line.  Also, please update the dates in
> all your log entries to today's date before you push the commit.  (If
> you're using git commit --amend, add --reset-author to make it reset the
> date on the commit itself.)
>
>
> Thanks,
> Roland
> _______________________________________________
> elfutils-devel mailing list
> elfutils-devel@lists.fedorahosted.org
> https://lists.fedorahosted.org/mailman/listinfo/elfutils-devel

Attached.

--jeff kenton



On 08/22/2012 02:50 PM, Roland McGrath wrote:
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,18 @@
+2012-08-21  Jeff Kenton  <jkenton@tilera.com>
+
+	* Makefile.am (modules): Add tilegx.
+	(libebl_pic): Add libebl_tilegx_pic.a.
+	(tilegx_SRCS): New variable.
+	(libebl_tilegx_pic_a_SOURCES): Likewise.
+	(am_libebl_tilegx_pic_a_OBJECTS): Likewise.
+	* 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.
+
+
 2011-03-09  Mark Wielaard  <mjw@redhat.com>
This one still has an extra blank line.  Also, please update the dates in
all your log entries to today's date before you push the commit.  (If
you're using git commit --amend, add --reset-author to make it reset the
date on the commit itself.)


Thanks,
Roland
_______________________________________________
elfutils-devel mailing list
elfutils-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/elfutils-devel

Attached.

--jeff kenton



>From f8dbdcea571bd5ed64ae3d850958f45bc3293519 Mon Sep 17 00:00:00 2001
From: Jeff Kenton <jkenton@tilera.com>
Date: Wed, 22 Aug 2012 09:00:03 -0400
Subject: [PATCH] Add support for Tilera TILE-Gx processor.

Signed-off-by: Jeff Kenton <jkenton@tilera.com>
---
 backends/ChangeLog         |   15 ++++
 backends/Makefile.am       |   10 ++-
 backends/tilegx_corenote.c |   64 +++++++++++++++++
 backends/tilegx_init.c     |   60 ++++++++++++++++
 backends/tilegx_regs.c     |  129 ++++++++++++++++++++++++++++++++++
 backends/tilegx_reloc.def  |  120 ++++++++++++++++++++++++++++++++
 backends/tilegx_retval.c   |  165 ++++++++++++++++++++++++++++++++++++++++++++
 backends/tilegx_symbol.c   |   57 +++++++++++++++
 libebl/ChangeLog           |    5 ++
 libebl/eblopenbackend.c    |    1 +
 src/ChangeLog              |    5 ++
 src/elflint.c              |    3 +-
 tests/ChangeLog            |    5 ++
 tests/run-allregs.sh       |   69 ++++++++++++++++++
 tests/testfile60.bz2       |  Bin 0 -> 2974 bytes
 15 files changed, 705 insertions(+), 3 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/ChangeLog b/backends/ChangeLog
index 744d1d5..2610fed 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,17 @@
+2012-08-22  Jeff Kenton  <jkenton@tilera.com>
+
+	* Makefile.am (modules): Add tilegx.
+	(libebl_pic): Add libebl_tilegx_pic.a.
+	(tilegx_SRCS): New variable.
+	(libebl_tilegx_pic_a_SOURCES): Likewise.
+	(am_libebl_tilegx_pic_a_OBJECTS): Likewise.
+	* 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.
+
 2011-03-09  Mark Wielaard  <mjw@redhat.com>
 
 	* alpha_init.c (alpha_init): Initialize check_st_other_bits hook.
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 3b34e88..982ff2a 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -1,6 +1,7 @@
 ## Process this file with automake to create Makefile.in
 ##
 ## Copyright (C) 2000-2010 Red Hat, Inc.
+## Copyright (C) 2012 Tilera Corporation
 ## This file is part of elfutils.
 ##
 ## This file is free software; you can redistribute it and/or modify
@@ -31,11 +32,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 +98,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..be3e7db
--- /dev/null
+++ b/backends/tilegx_corenote.c
@@ -0,0 +1,64 @@
+/* TILE-Gx specific core note handling.
+   Copyright (C) 2012 Tilera Corporation
+   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..858798b
--- /dev/null
+++ b/backends/tilegx_init.c
@@ -0,0 +1,60 @@
+/* Initialization of TILE-Gx specific backend library.
+   Copyright (C) 2012 Tilera Corporation
+   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..c96132d
--- /dev/null
+++ b/backends/tilegx_regs.c
@@ -0,0 +1,129 @@
+/* Register names and numbers for TILE-Gx DWARF.
+   Copyright (C) 2012 Tilera Corporation
+   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"
+
+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;
+}
diff --git a/backends/tilegx_reloc.def b/backends/tilegx_reloc.def
new file mode 100644
index 0000000..9736286
--- /dev/null
+++ b/backends/tilegx_reloc.def
@@ -0,0 +1,120 @@
+/* List the relocation types for tilegx.  -*- C -*-
+   Copyright (C) 2012 Tilera Corporation
+   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..fd4feef
--- /dev/null
+++ b/backends/tilegx_retval.c
@@ -0,0 +1,165 @@
+/* Function return value location for Linux/TILE-Gx ABI.
+   Copyright (C) 2012 Tilera Corporation
+   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..b653326
--- /dev/null
+++ b/backends/tilegx_symbol.c
@@ -0,0 +1,57 @@
+/* TILEGX-specific symbolic name handling.
+   Copyright (C) 2012 Tilera Corporation
+   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/ChangeLog b/libebl/ChangeLog
index 941ed6f..7d32fe5 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,7 @@
+2012-08-22  Jeff Kenton  <jkenton@tilera.com>
+
+	* eblopenbackend.c (machines): Add tilegx.
+
 2011-06-26  Mark Wielaard  <mjw@redhat.com>
 
 	* eblopenbackend.c (default_debugscn_p): Add .debug_macro.
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/ChangeLog b/src/ChangeLog
index 725554d..909852e 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2012-08-22  Jeff Kenton  <jkenton@tilera.com>
+
+	* elflint.c (valid_e_machine): Add EM_TILEGX and EM_TILEPRO.
+
 2012-08-16  Mark Wielaard  <mjw@redhat.com>
 
 	* readelf.c (dwarf_tag_name): Renamed from dwarf_tag_string.
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/ChangeLog b/tests/ChangeLog
index f0c83e6..d308489 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2012-08-22  Jeff Kenton  <jkenton@tilera.com>
+
+	* testfile60.bz2: New testfile.
+	* run-allregs.sh: Run reg_test testfile60.
+
 2012-08-16  Mark Wielaard  <mjw@redhat.com>
 
 	* allregs.c (dwarf_encoding_string): Rewritten using known-dwarf
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.10.3


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