From a87aa054a67e23faeead400bdf902a1eddb242a4 Mon Sep 17 00:00:00 2001 From: Cupertino Miranda Date: Tue, 7 Jun 2016 10:24:37 +0200 Subject: [PATCH] Fixes to legacy ARC relocations. Added support for ARC_SDA_12 reloc. Fixed ARC_N32_ME. Added ME (middle-endian) to ARC_SDA_12 reloc. bfd/ChangeLog: Cupertino Miranda * reloc.c: Fixed type in ARC_SECTOFF relocations. Added ARC_SDA_12 relocation. * bfd-in2.h: Regenerated from the previous changes. * libbfd.h: Regenerated from the previous changes. include/ChangeLog: Cupertino Miranda * elf/arc-reloc.def: Fixed relocation formula for N*, SDA, SDA_12, SDA_16_LD*, S13_PCREL, N32_ME, SECTOFF_* relocations. * opcode/arc-func.h (replace_disp12s): Added. Used for SDA_12 relocation. --- bfd/ChangeLog | 7 +++++++ bfd/bfd-in2.h | 7 ++++--- bfd/libbfd.h | 7 ++++--- bfd/reloc.c | 8 +++++--- include/ChangeLog | 6 ++++++ include/elf/arc-reloc.def | 45 ++++++++++++++++++++++++++------------------- include/opcode/arc-func.h | 15 +++++++++++++++ 7 files changed, 67 insertions(+), 28 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5cb2fc1..b7206ae 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2016-08-26 Cupertino Miranda + + * reloc.c: Fixed type in ARC_SECTOFF relocations. Added ARC_SDA_12 + relocation. + * bfd-in2.h: Regenerated from the previous changes. + * libbfd.h: Regenerated from the previous changes. + 2016-08-26 Thomas Preud'homme * bfd-in.h (bfd_elf32_arm_set_target_relocs): Add a new parameter for diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index ffa6c57..3e74662 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -3713,13 +3713,14 @@ pc-relative or some form of GOT-indirect relocation. */ BFD_RELOC_AC_SECTOFF_U8, BFD_RELOC_AC_SECTOFF_U8_1, BFD_RELOC_AC_SECTOFF_U8_2, - BFD_RELOC_AC_SECTFOFF_S9, - BFD_RELOC_AC_SECTFOFF_S9_1, - BFD_RELOC_AC_SECTFOFF_S9_2, + BFD_RELOC_AC_SECTOFF_S9, + BFD_RELOC_AC_SECTOFF_S9_1, + BFD_RELOC_AC_SECTOFF_S9_2, BFD_RELOC_ARC_SECTOFF_ME_1, BFD_RELOC_ARC_SECTOFF_ME_2, BFD_RELOC_ARC_SECTOFF_1, BFD_RELOC_ARC_SECTOFF_2, + BFD_RELOC_ARC_SDA_12, BFD_RELOC_ARC_SDA16_ST2, BFD_RELOC_ARC_32_PCREL, BFD_RELOC_ARC_PC32, diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 9d751ee..1eb988f 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -1722,13 +1722,14 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_AC_SECTOFF_U8", "BFD_RELOC_AC_SECTOFF_U8_1", "BFD_RELOC_AC_SECTOFF_U8_2", - "BFD_RELOC_AC_SECTFOFF_S9", - "BFD_RELOC_AC_SECTFOFF_S9_1", - "BFD_RELOC_AC_SECTFOFF_S9_2", + "BFD_RELOC_AC_SECTOFF_S9", + "BFD_RELOC_AC_SECTOFF_S9_1", + "BFD_RELOC_AC_SECTOFF_S9_2", "BFD_RELOC_ARC_SECTOFF_ME_1", "BFD_RELOC_ARC_SECTOFF_ME_2", "BFD_RELOC_ARC_SECTOFF_1", "BFD_RELOC_ARC_SECTOFF_2", + "BFD_RELOC_ARC_SDA_12", "BFD_RELOC_ARC_SDA16_ST2", "BFD_RELOC_ARC_32_PCREL", "BFD_RELOC_ARC_PC32", diff --git a/bfd/reloc.c b/bfd/reloc.c index 0e5fde2..a2bfe2b 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -3613,11 +3613,11 @@ ENUMX ENUMX BFD_RELOC_AC_SECTOFF_U8_2 ENUMX - BFD_RELOC_AC_SECTFOFF_S9 + BFD_RELOC_AC_SECTOFF_S9 ENUMX - BFD_RELOC_AC_SECTFOFF_S9_1 + BFD_RELOC_AC_SECTOFF_S9_1 ENUMX - BFD_RELOC_AC_SECTFOFF_S9_2 + BFD_RELOC_AC_SECTOFF_S9_2 ENUMX BFD_RELOC_ARC_SECTOFF_ME_1 ENUMX @@ -3627,6 +3627,8 @@ ENUMX ENUMX BFD_RELOC_ARC_SECTOFF_2 ENUMX + BFD_RELOC_ARC_SDA_12 +ENUMX BFD_RELOC_ARC_SDA16_ST2 ENUMX BFD_RELOC_ARC_32_PCREL diff --git a/include/ChangeLog b/include/ChangeLog index 4d51d0b..72d915e 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,9 @@ +2016-08-26 Cupertino Miranda + * elf/arc-reloc.def: Fixed relocation formula for N*, SDA, SDA_12, + SDA_16_LD*, S13_PCREL, N32_ME, SECTOFF_* relocations. + * opcode/arc-func.h (replace_disp12s): Added. Used for SDA_12 + relocation. + 2016-08-04 Thomas Preud'homme * arm.h (ARM_GET_SYM_CMSE_SPCL): Define macro. diff --git a/include/elf/arc-reloc.def b/include/elf/arc-reloc.def index 17c2429..2d11b3f 100644 --- a/include/elf/arc-reloc.def +++ b/include/elf/arc-reloc.def @@ -69,35 +69,35 @@ ARC_RELOC_HOWTO(ARC_N8, 8, \ 8, \ replace_bits8, \ bitfield, \ - ( S - A )) + ( A - S )) ARC_RELOC_HOWTO(ARC_N16, 9, \ 1, \ 16, \ replace_bits16, \ bitfield, \ - ( S - A )) + ( A - S )) ARC_RELOC_HOWTO(ARC_N24, 10, \ 2, \ 24, \ replace_bits24, \ bitfield, \ - ( S - A )) + ( A - S )) ARC_RELOC_HOWTO(ARC_N32, 11, \ 2, \ 32, \ replace_word32, \ bitfield, \ - ( S - A )) + ( A - S )) ARC_RELOC_HOWTO(ARC_SDA, 12, \ 2, \ 9, \ replace_disp9, \ bitfield, \ - ( S + A )) + ( ME ( ( ( S + A ) - _SDA_BASE_ ) ) )) ARC_RELOC_HOWTO(ARC_SECTOFF, 13, \ 2, \ @@ -167,28 +167,28 @@ ARC_RELOC_HOWTO(ARC_SDA16_LD, 22, \ 9, \ replace_disp9s, \ signed, \ - ( ( ( S + A ) - _SDA_BASE_ ) )) + ( ( S + A ) - _SDA_BASE_ )) ARC_RELOC_HOWTO(ARC_SDA16_LD1, 23, \ 1, \ 9, \ replace_disp9s, \ signed, \ - ( ( ( ( S + A ) - _SDA_BASE_ ) >> 1 ) )) + ( ( ( S + A ) - _SDA_BASE_ ) >> 1 )) ARC_RELOC_HOWTO(ARC_SDA16_LD2, 24, \ 1, \ 9, \ replace_disp9s, \ signed, \ - ( ( ( ( S + A ) - _SDA_BASE_ ) >> 2 ) )) + ( ( ( S + A ) - _SDA_BASE_ ) >> 2 )) ARC_RELOC_HOWTO(ARC_S13_PCREL, 25, \ 1, \ 11, \ replace_disp13s, \ signed, \ - ( ( ( ( S + A ) - P ) >> 2 ) )) + ( ( ( S + A ) - P ) >> 2 )) ARC_RELOC_HOWTO(ARC_W, 26, \ 2, \ @@ -216,7 +216,7 @@ ARC_RELOC_HOWTO(ARC_N32_ME, 28, \ 32, \ replace_word32, \ bitfield, \ - ( ME ( ( S - A ) ) )) + ( ME ( ( A - S ) ) )) ARC_RELOC_HOWTO(ARC_SECTOFF_ME, 29, \ 2, \ @@ -244,42 +244,42 @@ ARC_RELOC_HOWTO(AC_SECTOFF_U8, 35, \ 9, \ replace_disp9ls, \ bitfield, \ - ( ( S + A ) - SECTSTART )) + ( ME ( ( ( S + A ) - SECTSTART ) ) )) ARC_RELOC_HOWTO(AC_SECTOFF_U8_1, 36, \ 2, \ 9, \ replace_disp9ls, \ bitfield, \ - ( ( ( S + A ) - SECTSTART ) >> 1 )) + ( ME ( ( ( ( S + A ) - SECTSTART ) >> 1 ) ) )) ARC_RELOC_HOWTO(AC_SECTOFF_U8_2, 37, \ 2, \ 9, \ replace_disp9ls, \ bitfield, \ - ( ( ( S + A ) - SECTSTART ) >> 2 )) + ( ME ( ( ( ( S + A ) - SECTSTART ) >> 2 ) ) )) -ARC_RELOC_HOWTO(AC_SECTFOFF_S9, 38, \ +ARC_RELOC_HOWTO(AC_SECTOFF_S9, 38, \ 2, \ 9, \ replace_disp9ls, \ bitfield, \ - ( ( S + A ) - SECTSTART )) + ( ME ( ( ( ( S + A ) - SECTSTART ) - 256 ) ) )) -ARC_RELOC_HOWTO(AC_SECTFOFF_S9_1, 39, \ +ARC_RELOC_HOWTO(AC_SECTOFF_S9_1, 39, \ 2, \ 9, \ replace_disp9ls, \ bitfield, \ - ( ( ( S + A ) - SECTSTART ) >> 1 )) + ( ME ( ( ( ( ( S + A ) - SECTSTART ) - 256 ) >> 1 ) ) )) -ARC_RELOC_HOWTO(AC_SECTFOFF_S9_2, 40, \ +ARC_RELOC_HOWTO(AC_SECTOFF_S9_2, 40, \ 2, \ 9, \ replace_disp9ls, \ bitfield, \ - ( ( ( S + A ) - SECTSTART ) >> 2 )) + ( ME ( ( ( ( ( S + A ) - SECTSTART ) - 256 ) >> 2 ) ) )) ARC_RELOC_HOWTO(ARC_SECTOFF_ME_1, 41, \ 2, \ @@ -309,6 +309,13 @@ ARC_RELOC_HOWTO(ARC_SECTOFF_2, 44, \ bitfield, \ ( ( ( S - SECTSTART ) + A ) >> 2 )) +ARC_RELOC_HOWTO(ARC_SDA_12, 45, \ + 2, \ + 12, \ + replace_disp12s, \ + signed, \ + ( ME ( ( ( S + A ) - _SDA_BASE_ ) ) )) + ARC_RELOC_HOWTO(ARC_SDA16_ST2, 48, \ 1, \ 9, \ diff --git a/include/opcode/arc-func.h b/include/opcode/arc-func.h index cafb92f..c92382b 100644 --- a/include/opcode/arc-func.h +++ b/include/opcode/arc-func.h @@ -264,3 +264,18 @@ replace_disp9s1 (unsigned insn, int value ATTRIBUTE_UNUSED) } #endif /* REPLACE_disp9s1 */ + +/* mask = 00000000000000000000111111222222. */ +#ifndef REPLACE_disp12s +#define REPLACE_disp12s +ATTRIBUTE_UNUSED static unsigned +replace_disp12s (unsigned insn, int value ATTRIBUTE_UNUSED) +{ + insn = insn & ~0xfff; + insn |= ((value >> 0) & 0x003f) << 6; + insn |= ((value >> 6) & 0x003f) << 0; + + return insn; +} + +#endif /* REPLACE_disp12s */ -- 2.7.4