Add PIC and TLS support to the ARC target.
bfd/ChangeLog: * arc-plt.def: New file. * arc-plt.h: Likewise. * elf32-arc.c (elf_arc_abs_plt0_entry, elf_arc_abs_pltn_entry, elf_arcV2_abs_plt0_entry, elf_arcV2_abs_pltn_entry, elf_arc_pic_plt0_entry, elf_arc_pic_pltn_entry, elf_arcV2_pic_plt0_entry, elf_arcV2_pic_pltn_entry): Remove. (name_for_global_symbol): Added. (ADD_RELA): Helper to create dynamic relocs. (new_got_entry_to_list): Create a new got entry in linked list. (symbol_has_entry_of_type): Search for specific type of entry in list. (is_reloc_for_GOT): return FALSE for any TLS related relocs. (is_reloc_for_TLS, arc_elf_set_private_flags) (arc_elf_print_private_bfd_data, arc_elf_copy_private_bfd_data) (arc_elf_merge_private_bfd_data): New functions. (debug_arc_reloc): Cleaned debug info printing. (PDATA reloc): Changed not to perform address alignment. (reverse_me): Added. Fix for ARC_32 relocs. (arc_do_relocation): Return bfd_reloc_of when no relocation should occur. (arc_get_local_got_ents): Renamed from arc_get_local_got_offsets. Changed function to access an array of list of GOT entries instead of just an array of offsets. (elf_arc_relocate_section): Added support for PIC and TLS related relocations. (elf_arc_check_relocs): Likewise. (elf_arc_adjust_dynamic_symbol, elf_arc_finish_dynamic_symbol, (elf_arc_finish_dynamic_sections): Likewise (arc_create_dynamic_sections): Modified conditions to create dynamic sections. (ADD_SYMBOL_REF_SEC_AND_RELOC): New macro. (plt_do_relocs_for_symbol, relocate_plt_for_symbol) (relocate_plt_for_entry): Changed to support new way to define PLT related code. (add_symbol_to_plt): Likewise. (arc_elf_link_hash_table_create): New function. include/ChangeLog: * elf/arc-reloc.def (ARC_32, ARC_GOTPC, ARC_TLS_GD_GOT) (ARC_TLS_IE_GOT, ARC_TLS_DTPOFF, ARC_TLS_DTPOFF_S9, ARC_TLS_LE_S9) (ARC_TLS_LE_32): Fixed formula. (ARC_TLS_GD_LD): Use new special function. * opcode/arc-func.h: Changed all the replacement functions to clear the patching bits before doing an or it with the value argument.
This commit is contained in:
parent
c2f4122d5c
commit
34e967a5f3
9 changed files with 1962 additions and 619 deletions
|
@ -1,3 +1,42 @@
|
|||
2016-01-18 Miranda Cupertino <Cupertino.Miranda@synopsys.com>
|
||||
Zissulescu Claudiu <Claudiu.Zissulescu@synopsys.com>
|
||||
|
||||
* arc-plt.def: New file.
|
||||
* arc-plt.h: Likewise.
|
||||
* elf32-arc.c (elf_arc_abs_plt0_entry, elf_arc_abs_pltn_entry,
|
||||
elf_arcV2_abs_plt0_entry, elf_arcV2_abs_pltn_entry,
|
||||
elf_arc_pic_plt0_entry, elf_arc_pic_pltn_entry,
|
||||
elf_arcV2_pic_plt0_entry, elf_arcV2_pic_pltn_entry): Remove.
|
||||
(name_for_global_symbol): Added.
|
||||
(ADD_RELA): Helper to create dynamic relocs.
|
||||
(new_got_entry_to_list): Create a new got entry in linked list.
|
||||
(symbol_has_entry_of_type): Search for specific type of entry in
|
||||
list.
|
||||
(is_reloc_for_GOT): return FALSE for any TLS related relocs.
|
||||
(is_reloc_for_TLS, arc_elf_set_private_flags)
|
||||
(arc_elf_print_private_bfd_data, arc_elf_copy_private_bfd_data)
|
||||
(arc_elf_merge_private_bfd_data): New functions.
|
||||
(debug_arc_reloc): Cleaned debug info printing.
|
||||
(PDATA reloc): Changed not to perform address alignment.
|
||||
(reverse_me): Added. Fix for ARC_32 relocs.
|
||||
(arc_do_relocation): Return bfd_reloc_of when no relocation should
|
||||
occur.
|
||||
(arc_get_local_got_ents): Renamed from arc_get_local_got_offsets.
|
||||
Changed function to access an array of list of GOT entries instead
|
||||
of just an array of offsets.
|
||||
(elf_arc_relocate_section): Added support for PIC and TLS related relocations.
|
||||
(elf_arc_check_relocs): Likewise.
|
||||
(elf_arc_adjust_dynamic_symbol, elf_arc_finish_dynamic_symbol,
|
||||
(elf_arc_finish_dynamic_sections): Likewise
|
||||
(arc_create_dynamic_sections): Modified conditions to create
|
||||
dynamic sections.
|
||||
(ADD_SYMBOL_REF_SEC_AND_RELOC): New macro.
|
||||
(plt_do_relocs_for_symbol, relocate_plt_for_symbol)
|
||||
(relocate_plt_for_entry): Changed to support new way to define PLT
|
||||
related code.
|
||||
(add_symbol_to_plt): Likewise.
|
||||
(arc_elf_link_hash_table_create): New function.
|
||||
|
||||
2016-01-18 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR ld/19440
|
||||
|
|
94
bfd/arc-plt.def
Normal file
94
bfd/arc-plt.def
Normal file
|
@ -0,0 +1,94 @@
|
|||
/* Arc V2 Related PLT entries.
|
||||
Copyright (C) 2016 Free Software Foundation, Inc.
|
||||
Contributed by Cupertino Miranda (cmiranda@synopsys.com).
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
|
||||
This program 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; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
PLT_TYPE_START (ELF_ARCV2_PIC)
|
||||
PLT_ENTRY (0x2730, 0x7f8b, 0x0000, 0x0000) /* ld %r11, [pcl,0] : 0 to be replaced by _DYNAMIC@GOTPC+4 */
|
||||
PLT_ENTRY (0x2730, 0x7f8a, 0x0000, 0x0000) /* ld %r10, [pcl,0] : 0 to be replaced by _DYNAMIC@GOTPC+8 */
|
||||
PLT_ENTRY (0x2020, 0x0280) /* j [%r10] */
|
||||
PLT_ENTRY (0x0,0x0,0x0,0x0,0x0,0x0) /* padding */
|
||||
|
||||
PLT_ELEM (0x2730, 0x7f8c, 0x0000, 0x0000) /* ld %r12, [%pc,func@got] */
|
||||
PLT_ELEM (0x2021, 0x0300) /* j.d [%r12] */
|
||||
PLT_ELEM (0x240a, 0x1fc0) /* mov %r12, %pcl */
|
||||
|
||||
ENTRY_RELOC (4, 32, 0xFFFFFFFF, SGOT | RELATIVE_INSN_32 | MIDDLE_ENDIAN, 4)
|
||||
ENTRY_RELOC (12, 32, 0xFFFFFFFF, SGOT | RELATIVE_INSN_32 | MIDDLE_ENDIAN, 8)
|
||||
ENTRY_RELOC (20, 32, 0xFFFFFFFF, SGOT, 0)
|
||||
|
||||
ELEM_RELOC (4, 32, 0xFFFFFFFF, SGOT | RELATIVE_INSN_32 | MIDDLE_ENDIAN, 0)
|
||||
|
||||
PLT_TYPE_END (ELF_ARCV2_PIC)
|
||||
|
||||
PLT_TYPE_START (ELF_ARCV2_ABS)
|
||||
PLT_ENTRY (0x1600,0x700b,0x0000,0x0000) /* ld %r11, [0] */
|
||||
PLT_ENTRY (0x1600,0x700a,0x0000,0x0000) /* ld %r10, [0] */
|
||||
PLT_ENTRY (0x2020,0x0280) /* j [%r10] */
|
||||
PLT_ENTRY (0x0,0x0,0x0,0x0,0x0,0x0) /* padding */
|
||||
|
||||
PLT_ELEM (0x2730, 0x7f8c, 0x0000, 0x0000) /* ld %r12, [%pcl,func@gotpc] */
|
||||
PLT_ELEM (0x2021,0x0300) /* j.d [%r12] */
|
||||
PLT_ELEM (0x240a,0x1fc0) /* mov %r12, %pcl */
|
||||
|
||||
ENTRY_RELOC (4, 32, 0xFFFFFFFF, SGOT | MIDDLE_ENDIAN, 4)
|
||||
ENTRY_RELOC (12, 32, 0xFFFFFFFF, SGOT | MIDDLE_ENDIAN, 8)
|
||||
ENTRY_RELOC (20, 32, 0xFFFFFFFF, SGOT, 0)
|
||||
|
||||
ELEM_RELOC (4, 32, 0xFFFFFFFF, SGOT | RELATIVE_INSN_32 | MIDDLE_ENDIAN, 0)
|
||||
|
||||
PLT_TYPE_END (ELF_ARCV2_ABS)
|
||||
|
||||
|
||||
/* Non Arc V2 Related PLT entries. */
|
||||
|
||||
PLT_TYPE_START (ELF_ARC_PIC)
|
||||
PLT_ENTRY (0x2730,0x7f8b,0x0000,0x0000) /* ld %r11, [pcl,0] : 0 to be replaced by _DYNAMIC@GOTPC+4 */
|
||||
PLT_ENTRY (0x2730,0x7f8a,0x0000,0x0000) /* ld %r10, [pcl,0] : 0 to be replaced by -DYNAMIC@GOTPC+8 */
|
||||
PLT_ENTRY (0x2020,0x0280) /* j [%r10] */
|
||||
PLT_ENTRY (0x0,0x0) /* padding */
|
||||
|
||||
PLT_ELEM (0x2730,0x7f8c,0x0000,0x0000) /* ld %r12, [%pc,func@got] */
|
||||
PLT_ELEM (0x7c20) /* j_s.d [%r12] */
|
||||
PLT_ELEM (0x74ef) /* mov_s %r12, %pcl */
|
||||
|
||||
ENTRY_RELOC (4, 32, 0xFFFFFFFF, SGOT | RELATIVE_INSN_32 | MIDDLE_ENDIAN, 4)
|
||||
ENTRY_RELOC (12, 32, 0xFFFFFFFF, SGOT | RELATIVE_INSN_32 | MIDDLE_ENDIAN, 8)
|
||||
ENTRY_RELOC (20, 32, 0xFFFFFFFF, SGOT, 0)
|
||||
|
||||
ELEM_RELOC (4, 32, 0xFFFFFFFF, SGOT | RELATIVE_INSN_32 | MIDDLE_ENDIAN, 0)
|
||||
|
||||
PLT_TYPE_END (ELF_ARC_PIC)
|
||||
|
||||
PLT_TYPE_START (ELF_ARC_ABS)
|
||||
PLT_ENTRY (0x1600,0x700b,0x0000,0x0000) /* ld %r11, [0] */
|
||||
PLT_ENTRY (0x1600,0x700a,0x0000,0x0000) /* ld %r10, [0] */
|
||||
PLT_ENTRY (0x2020,0x0280) /* j [%r10] */
|
||||
PLT_ENTRY (0x0,0x0) /* padding */
|
||||
|
||||
PLT_ELEM (0x2730,0x7f8c,0x0000,0x0000) /* ld %r12, [%pc,func@gotpc] */
|
||||
PLT_ELEM (0x7c20,0x74ef) /* mov_s %r12, %pcl */
|
||||
|
||||
ENTRY_RELOC (4, 32, 0xFFFFFFFF, SGOT | MIDDLE_ENDIAN, 4)
|
||||
ENTRY_RELOC (12, 32, 0xFFFFFFFF, SGOT | MIDDLE_ENDIAN, 8)
|
||||
ENTRY_RELOC (20, 32, 0xFFFFFFFF, SGOT, 0)
|
||||
|
||||
ELEM_RELOC (4, 32, 0xFFFFFFFF, SGOT | RELATIVE_INSN_32 | MIDDLE_ENDIAN, 0)
|
||||
|
||||
PLT_TYPE_END (ELF_ARC_ABS)
|
196
bfd/arc-plt.h
Normal file
196
bfd/arc-plt.h
Normal file
|
@ -0,0 +1,196 @@
|
|||
/* ARC-specific header file for PLT support.
|
||||
Copyright (C) 2016 Free Software Foundation, Inc.
|
||||
Contributed by Cupertino Miranda (cmiranda@synopsys.com).
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
|
||||
This program 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; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
#ifndef ARC_PLT_H
|
||||
#define ARC_PLT_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* Instructions appear in memory as a sequence of half-words (16 bit);
|
||||
individual half-words are represented on the target in target byte order.
|
||||
We use 'unsigned short' on the host to represent the PLT templates,
|
||||
and translate to target byte order as we copy to the target. */
|
||||
typedef uint16_t insn_hword;
|
||||
|
||||
enum plt_reloc_symbol
|
||||
{
|
||||
LAST_RELOC = 0,
|
||||
|
||||
SGOT = 1,
|
||||
|
||||
RELATIVE = (1 << 8),
|
||||
RELATIVE_INSN_32 = (1 << 9),
|
||||
RELATIVE_INSN_24 = (1 << 10),
|
||||
|
||||
MIDDLE_ENDIAN = (1 << 11)
|
||||
};
|
||||
|
||||
#define IS_RELATIVE(S) ((S & (RELATIVE | RELATIVE_INSN_24 | RELATIVE_INSN_32)) != 0)
|
||||
#define IS_INSN_32(S) ((S & RELATIVE_INSN_32) != 0)
|
||||
#define IS_INSN_24(S) ((S & RELATIVE_INSN_24) != 0)
|
||||
#define IS_MIDDLE_ENDIAN(S) ((S & MIDDLE_ENDIAN) != 0)
|
||||
#define SYM_ONLY(S) (S & 0xFF)
|
||||
|
||||
struct plt_reloc
|
||||
{
|
||||
bfd_vma offset;
|
||||
bfd_vma size;
|
||||
bfd_vma mask;
|
||||
enum plt_reloc_symbol symbol;
|
||||
bfd_vma addend;
|
||||
};
|
||||
|
||||
|
||||
#define PLT_TYPE_START(NAME) NAME,
|
||||
#define PLT_TYPE_END(NAME)
|
||||
#define PLT_ENTRY(...)
|
||||
#define PLT_ELEM(...)
|
||||
#define ENTRY_RELOC(...)
|
||||
#define ELEM_RELOC(...)
|
||||
|
||||
enum plt_types_enum
|
||||
{
|
||||
PLT_START = -1,
|
||||
#include "arc-plt.def"
|
||||
PLT_MAX
|
||||
};
|
||||
|
||||
#undef PLT_TYPE_START
|
||||
#undef PLT_TYPE_END
|
||||
#undef PLT_ENTRY
|
||||
#undef PLT_ELEM
|
||||
#undef ENTRY_RELOC
|
||||
#undef ELEM_RELOC
|
||||
|
||||
typedef insn_hword insn_hword_array[];
|
||||
|
||||
struct plt_version_t
|
||||
{
|
||||
const insn_hword_array *entry;
|
||||
const bfd_vma entry_size;
|
||||
const insn_hword_array *elem;
|
||||
const bfd_vma elem_size;
|
||||
|
||||
const struct plt_reloc *entry_relocs;
|
||||
const struct plt_reloc *elem_relocs;
|
||||
};
|
||||
|
||||
#define PLT_TYPE_START(NAME) \
|
||||
const insn_hword NAME##_plt_entry[] = {
|
||||
#define PLT_TYPE_END(NAME) };
|
||||
#define PLT_ENTRY(...) __VA_ARGS__,
|
||||
#define PLT_ELEM(...)
|
||||
#define ENTRY_RELOC(...)
|
||||
#define ELEM_RELOC(...)
|
||||
|
||||
#include "arc-plt.def"
|
||||
|
||||
#undef PLT_TYPE_START
|
||||
#undef PLT_TYPE_END
|
||||
#undef PLT_ENTRY
|
||||
#undef PLT_ELEM
|
||||
#undef ENTRY_RELOC
|
||||
#undef ELEM_RELOC
|
||||
|
||||
#define PLT_TYPE_START(NAME) \
|
||||
const struct plt_reloc NAME##_plt_entry_relocs[] = {
|
||||
#define PLT_TYPE_END(NAME) \
|
||||
{0, 0, 0, LAST_RELOC, 0} \
|
||||
};
|
||||
#define PLT_ENTRY(...)
|
||||
#define PLT_ELEM(...)
|
||||
#define ENTRY_RELOC(...) { __VA_ARGS__ },
|
||||
#define ELEM_RELOC(...)
|
||||
|
||||
#include "arc-plt.def"
|
||||
|
||||
#undef PLT_TYPE_START
|
||||
#undef PLT_TYPE_END
|
||||
#undef PLT_ENTRY
|
||||
#undef PLT_ELEM
|
||||
#undef ENTRY_RELOC
|
||||
#undef ELEM_RELOC
|
||||
|
||||
|
||||
#define PLT_TYPE_START(NAME) \
|
||||
const insn_hword NAME##_plt_elem[] = {
|
||||
#define PLT_TYPE_END(NAME) };
|
||||
#define PLT_ENTRY(...)
|
||||
#define PLT_ELEM(...) __VA_ARGS__,
|
||||
#define ENTRY_RELOC(...)
|
||||
#define ELEM_RELOC(...)
|
||||
|
||||
#include "arc-plt.def"
|
||||
|
||||
#undef PLT_TYPE_START
|
||||
#undef PLT_TYPE_END
|
||||
#undef PLT_ENTRY
|
||||
#undef PLT_ELEM
|
||||
#undef ENTRY_RELOC
|
||||
#undef ELEM_RELOC
|
||||
|
||||
#define PLT_TYPE_START(NAME) \
|
||||
const struct plt_reloc NAME##_plt_elem_relocs[] = {
|
||||
#define PLT_TYPE_END(NAME) \
|
||||
{0, 0, 0, LAST_RELOC, 0} \
|
||||
};
|
||||
#define PLT_ENTRY(...)
|
||||
#define PLT_ELEM(...)
|
||||
#define ENTRY_RELOC(...)
|
||||
#define ELEM_RELOC(...) { __VA_ARGS__ },
|
||||
|
||||
#include "arc-plt.def"
|
||||
|
||||
#undef PLT_TYPE_START
|
||||
#undef PLT_TYPE_END
|
||||
#undef PLT_ENTRY
|
||||
#undef PLT_ELEM
|
||||
#undef ENTRY_RELOC
|
||||
#undef ELEM_RELOC
|
||||
|
||||
|
||||
#define PLT_TYPE_START(NAME) \
|
||||
{ \
|
||||
.entry = &NAME##_plt_entry, \
|
||||
.entry_size = sizeof (NAME##_plt_entry), \
|
||||
.elem = &NAME##_plt_elem, \
|
||||
.elem_size = sizeof (NAME##_plt_elem), \
|
||||
.entry_relocs = NAME##_plt_entry_relocs, \
|
||||
.elem_relocs = NAME##_plt_elem_relocs
|
||||
#define PLT_TYPE_END(NAME) },
|
||||
#define PLT_ENTRY(...)
|
||||
#define PLT_ELEM(...)
|
||||
#define ENTRY_RELOC(...)
|
||||
#define ELEM_RELOC(...)
|
||||
struct plt_version_t plt_versions[PLT_MAX] = {
|
||||
|
||||
#include "arc-plt.def"
|
||||
|
||||
};
|
||||
#undef PLT_TYPE_START
|
||||
#undef PLT_TYPE_END
|
||||
#undef PLT_ENTRY
|
||||
#undef PLT_ELEM
|
||||
#undef ENTRY_RELOC
|
||||
#undef ELEM_RELOC
|
||||
|
||||
|
||||
#endif /* ARC_PLT_H */
|
2173
bfd/elf32-arc.c
2173
bfd/elf32-arc.c
File diff suppressed because it is too large
Load diff
|
@ -1,3 +1,9 @@
|
|||
2016-01-18 Miranda Cupertino <Cupertino.Miranda@synopsys.com>
|
||||
Zissulescu Claudiu <Claudiu.Zissulescu@synopsys.com>
|
||||
|
||||
* readelf.c (get_machine_flags): Add support for newer ARC ELF
|
||||
header flags.
|
||||
|
||||
2016-01-18 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* configure: Regenerate.
|
||||
|
|
|
@ -2776,17 +2776,37 @@ get_machine_flags (unsigned e_flags, unsigned e_machine)
|
|||
case EF_ARC_CPU_ARCV2HS:
|
||||
strcat (buf, ", ARC HS");
|
||||
break;
|
||||
case EF_ARC_CPU_GENERIC:
|
||||
strcat (buf, ", ARC generic");
|
||||
break;
|
||||
case E_ARC_MACH_ARC600:
|
||||
strcat (buf, ", ARC600");
|
||||
break;
|
||||
case E_ARC_MACH_ARC601:
|
||||
strcat (buf, ", ARC601");
|
||||
break;
|
||||
case E_ARC_MACH_ARC700:
|
||||
strcat (buf, ", ARC700");
|
||||
break;
|
||||
default:
|
||||
strcat (buf, ", unrecognized flag for ARCv2");
|
||||
strcat (buf, ", unrecognized cpu flag for ARCv2");
|
||||
break;
|
||||
}
|
||||
switch (e_flags & EF_ARC_OSABI_MSK)
|
||||
{
|
||||
/* Only upstream 3.9+ kernels will support ARCv2
|
||||
ISA. */
|
||||
case E_ARC_OSABI_ORIG:
|
||||
strcat (buf, ", (ABI:legacy)");
|
||||
break;
|
||||
case E_ARC_OSABI_V2:
|
||||
strcat (buf, ", (ABI:v2)");
|
||||
break;
|
||||
/* Only upstream 3.9+ kernels will support ARCv2 ISA. */
|
||||
case E_ARC_OSABI_V3:
|
||||
strcat (buf, ", v3 no-legacy-syscalls ABI");
|
||||
break;
|
||||
default:
|
||||
strcat (buf, ", unrecognised ARC OSABI flag");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -1,3 +1,14 @@
|
|||
2016-01-18 Miranda Cupertino <Cupertino.Miranda@synopsys.com>
|
||||
Zissulescu Claudiu <Claudiu.Zissulescu@synopsys.com>
|
||||
|
||||
* elf/arc-reloc.def (ARC_32, ARC_GOTPC, ARC_TLS_GD_GOT)
|
||||
(ARC_TLS_IE_GOT, ARC_TLS_DTPOFF, ARC_TLS_DTPOFF_S9, ARC_TLS_LE_S9)
|
||||
(ARC_TLS_LE_32): Fixed formula.
|
||||
(ARC_TLS_GD_LD): Use new special function.
|
||||
* opcode/arc-func.h: Changed all the replacement
|
||||
functions to clear the patching bits before doing an or it with the value
|
||||
argument.
|
||||
|
||||
2016-01-18 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR ld/19440
|
||||
|
|
|
@ -31,7 +31,7 @@ ARC_RELOC_HOWTO(ARC_32, 4, \
|
|||
32, \
|
||||
replace_word32, \
|
||||
bitfield, \
|
||||
( S + A ))
|
||||
(NON_ME ( S + A ) ))
|
||||
|
||||
ARC_RELOC_HOWTO(ARC_N8, 8, \
|
||||
0, \
|
||||
|
@ -360,7 +360,7 @@ ARC_RELOC_HOWTO(ARC_GOTPC, 58, \
|
|||
32, \
|
||||
replace_word32, \
|
||||
signed, \
|
||||
( ( GOT + A ) - P ))
|
||||
( GOT_BEGIN - P ))
|
||||
|
||||
ARC_RELOC_HOWTO(ARC_S21W_PCREL_PLT, 60, \
|
||||
2, \
|
||||
|
@ -395,12 +395,12 @@ ARC_RELOC_HOWTO(ARC_TLS_GD_GOT, 69, \
|
|||
32, \
|
||||
replace_word32, \
|
||||
dont, \
|
||||
0)
|
||||
( G + GOT - P))
|
||||
|
||||
ARC_RELOC_HOWTO(ARC_TLS_GD_LD, 70, \
|
||||
2, \
|
||||
32, \
|
||||
replace_word32, \
|
||||
0, \
|
||||
replace_none, \
|
||||
dont, \
|
||||
0)
|
||||
|
||||
|
@ -416,35 +416,35 @@ ARC_RELOC_HOWTO(ARC_TLS_IE_GOT, 72, \
|
|||
32, \
|
||||
replace_word32, \
|
||||
dont, \
|
||||
0)
|
||||
( G + GOT - P))
|
||||
|
||||
ARC_RELOC_HOWTO(ARC_TLS_DTPOFF, 67, \
|
||||
2, \
|
||||
32, \
|
||||
replace_word32, \
|
||||
dont, \
|
||||
0)
|
||||
( S - TLS_REL ))
|
||||
|
||||
ARC_RELOC_HOWTO(ARC_TLS_DTPOFF_S9, 73, \
|
||||
2, \
|
||||
32, \
|
||||
replace_word32, \
|
||||
dont, \
|
||||
0)
|
||||
( S - TLS_REL ))
|
||||
|
||||
ARC_RELOC_HOWTO(ARC_TLS_LE_S9, 74, \
|
||||
2, \
|
||||
32, \
|
||||
replace_word32, \
|
||||
dont, \
|
||||
0)
|
||||
( ( S + TCB_SIZE ) - TLS_REL ))
|
||||
|
||||
ARC_RELOC_HOWTO(ARC_TLS_LE_32, 75, \
|
||||
2, \
|
||||
32, \
|
||||
replace_word32, \
|
||||
dont, \
|
||||
0)
|
||||
( ( S + A + TCB_SIZE ) - TLS_REL ))
|
||||
|
||||
ARC_RELOC_HOWTO(ARC_S25W_PCREL_PLT, 76, \
|
||||
2, \
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_none (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0x00;
|
||||
|
||||
return insn;
|
||||
}
|
||||
|
@ -37,6 +38,7 @@ replace_none (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_bits8 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0xff;
|
||||
insn |= ((value >> 0) & 0x00ff) << 0;
|
||||
|
||||
return insn;
|
||||
|
@ -50,6 +52,7 @@ replace_bits8 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_bits16 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0xffff;
|
||||
insn |= ((value >> 0) & 0xffff) << 0;
|
||||
|
||||
return insn;
|
||||
|
@ -63,6 +66,7 @@ replace_bits16 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_bits24 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0xffffff;
|
||||
insn |= ((value >> 0) & 0xffffff) << 0;
|
||||
|
||||
return insn;
|
||||
|
@ -76,6 +80,7 @@ replace_bits24 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_word32 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0xffffffff;
|
||||
insn |= ((value >> 0) & 0xffffffff) << 0;
|
||||
|
||||
return insn;
|
||||
|
@ -89,6 +94,7 @@ replace_word32 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_limm (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0xffffffff;
|
||||
insn |= ((value >> 0) & 0xffffffff) << 0;
|
||||
|
||||
return insn;
|
||||
|
@ -102,6 +108,7 @@ replace_limm (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_limms (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0xffffffff;
|
||||
insn |= ((value >> 0) & 0xffffffff) << 0;
|
||||
|
||||
return insn;
|
||||
|
@ -115,6 +122,7 @@ replace_limms (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_disp21h (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0x7feffc0;
|
||||
insn |= ((value >> 0) & 0x03ff) << 17;
|
||||
insn |= ((value >> 10) & 0x03ff) << 6;
|
||||
|
||||
|
@ -129,6 +137,7 @@ replace_disp21h (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_disp21w (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0x7fcffc0;
|
||||
insn |= ((value >> 0) & 0x01ff) << 18;
|
||||
insn |= ((value >> 9) & 0x03ff) << 6;
|
||||
|
||||
|
@ -143,6 +152,7 @@ replace_disp21w (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_disp25h (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0x7feffcf;
|
||||
insn |= ((value >> 0) & 0x03ff) << 17;
|
||||
insn |= ((value >> 10) & 0x03ff) << 6;
|
||||
insn |= ((value >> 20) & 0x000f) << 0;
|
||||
|
@ -158,6 +168,7 @@ replace_disp25h (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_disp25w (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0x7fcffcf;
|
||||
insn |= ((value >> 0) & 0x01ff) << 18;
|
||||
insn |= ((value >> 9) & 0x03ff) << 6;
|
||||
insn |= ((value >> 19) & 0x000f) << 0;
|
||||
|
@ -173,6 +184,7 @@ replace_disp25w (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_disp9 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0x1ff;
|
||||
insn |= ((value >> 0) & 0x01ff) << 0;
|
||||
|
||||
return insn;
|
||||
|
@ -186,6 +198,7 @@ replace_disp9 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_disp9ls (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0xff8000;
|
||||
insn |= ((value >> 0) & 0x00ff) << 16;
|
||||
insn |= ((value >> 8) & 0x0001) << 15;
|
||||
|
||||
|
@ -200,6 +213,7 @@ replace_disp9ls (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_disp9s (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0x1ff;
|
||||
insn |= ((value >> 0) & 0x01ff) << 0;
|
||||
|
||||
return insn;
|
||||
|
@ -213,6 +227,7 @@ replace_disp9s (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_disp13s (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0x7ff;
|
||||
insn |= ((value >> 0) & 0x07ff) << 0;
|
||||
|
||||
return insn;
|
||||
|
@ -226,6 +241,7 @@ replace_disp13s (unsigned insn, int value ATTRIBUTE_UNUSED)
|
|||
ATTRIBUTE_UNUSED static unsigned
|
||||
replace_disp9s1 (unsigned insn, int value ATTRIBUTE_UNUSED)
|
||||
{
|
||||
insn = insn & ~0x7e7;
|
||||
insn |= ((value >> 0) & 0x0007) << 0;
|
||||
insn |= ((value >> 3) & 0x003f) << 5;
|
||||
|
||||
|
|
Loading…
Reference in a new issue