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 <[email protected]>
>From ee35c85149bbb63cdbea1fce09750d1ec65ef28c Mon Sep 17 00:00:00 2001 From: Jeff Kenton <[email protected]> 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 <[email protected]>, 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
_______________________________________________ elfutils-devel mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/elfutils-devel
