This is the mail archive of the binutils@sourceware.org mailing list for the binutils 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] bfd/arc: Allow non-instruction relocations within .text sections


Hi Andrew,

We are currently finishing cleaning up a patch to integrate support for Linux (PIC and TLS).
I am glad to say that we have realized this mistake and would intend to address it soon after the upcoming patch.
Nevertheless, your implementation does it a little different from how we would like to address it.

More precisely we do not define a new field in the RELOC_HOWTO but implement it through the FORMULA field using the ME preprocessor macro. 
       
       ARC_RELOC_HOWTO(ARC_PC32, 50, \
                       2, \
                       32, \
                       replace_word32, \
                       signed, \
                       ( ME ( ( S + A ) - P ) ))

ME macro instead of deleted gets replaced by:
	#define ME(RELOC) (RELOC)

And the remaining part does pretty much the same as your code, but resorting to the FORMULA to check if ME is present.

	static bfd_vma
	middle_endian_convert (bfd_vma insn, bfd_boolean do_it)
	{
	   if (do_it)
	     {
	       insn =
		((insn & 0xffff0000) >> 16) |
		((insn & 0xffff) << 16);
	     }
	   return insn;
	}
 
	#define IS_ME(FORMULA) (strstr(#FORMULA, "ME") != NULL)
	
	#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
	  case R_##TYPE: \
	    { \
	      bfd_vma bitsize ATTRIBUTE_UNUSED = BITSIZE; \
	      insn = middle_endian_convert (insn, IS_ME(FORMULA)); \
	      relocation = FORMULA  ; \
	      insn = middle_endian_convert (insn, IS_ME(FORMULA)); \
	    } \
	    break;

Our view is to keep relocation definitions to be limited to this FORMULA concept, instead of adding new fields to the relocation table.

-----Original Message-----
From: Andrew Burgess [mailto:andrew.burgess@embecosm.com] 
Sent: Wednesday, January 06, 2016 2:46 PM
To: binutils@sourceware.org
Cc: Claudiu.Zissulescu@synopsys.com; Cupertino.Miranda@synopsys.com; Andrew Burgess
Subject: [PATCH] bfd/arc: Allow non-instruction relocations within .text sections

On a little endian arc, a 4-byte instruction ABCD, where A is the most significant byte, and D is the least significant byte would be stored in memory (low to high) as BADC.  That is, each 2-byte chunk is stored in little endian order in memory.

Currently, when a relocation is applied to such a 4-byte instruction, we make use of arc_bfd_get_32 and arc_bfd_put_32, which perform byte manipulation to correct for this in memory byte ordering.

This byte ordering correction is applied to all relocations within executable sections (for little endian arc) when really the correction should only be applied to instruction relocations; it is the instruction fetch mechanism that loads 4-byte instructions 2-bytes at a time.

It is possible to place data into an executable section, for example it might be more efficient to place small jump tables inline within the code rather than placing them into a data section.

The problem then, is that these two aspects, the byte order correction, and inline data, conflict.  Placing a 4-byte label relocation inline in the code results in the byte-order correction being applied to it, which, when the label is loaded using a standard arc load instruction, returns a corrupted address.

Before the recent arc rewrite, placing data inline into the executable sections did work.  This was thanks to using a different code path to patch instruction related relocations, to the code that patched data related relocations.  The instruction related relocations therefore received the byte order correction, while the data related relocations didn't.

After the recent rewrite this feature was lost, though I believe this was by accident, rather than design.  This commit brings this feature back, though the implementation is different, in order to fit with the new arc design.

All arc relocations receive a new field that indicates if the relocation is an instruction relocation, or not.  Instruction relocations can then apply the byte order correction (for little endian arcs only).  Data relocations never apply byte order correction.

bfd/ChangeLog:

	* elf32-arc.c (ARC_RELOC_HOWTO): Add new 'IS_ME' parameter to each
	definition of this macro.  The new parameter is ignored in all
	cases except for in 'arc_do_relocation' where we perform endian
	correction if required.
	(arc_bfd_get_32): Becomes an alias for bfd_get_32.
	(arc_bfd_put_32): Becomes an alias for bfd_put_32.
	(get_middle_endian_relocation): Delete.
	(ME): Delete.

include/ChangeLog:

	* elf/arc-reloc.def: Add field to indicate if each relocation
	requires middle-endian correction.
	* elf/arc.h (ARC_RELOC_HOWTO): Add, and ignore, 'IS_ME' field.

gas/ChangeLog:

	* testsuite/gas/arc/inline-data-1.d: New file.
	* testsuite/gas/arc/inline-data-1.s: New file.
---
 bfd/ChangeLog                         | 11 ++++++
 bfd/elf32-arc.c                       | 59 +++++++++----------------------
 gas/ChangeLog                         |  5 +++
 gas/testsuite/gas/arc/inline-data-1.d |  7 ++++  gas/testsuite/gas/arc/inline-data-1.s |  4 +++
 include/ChangeLog                     |  6 ++++
 include/elf/arc-reloc.def             | 66 +++++++++++++++++++++++++++++++++++
 include/elf/arc.h                     |  2 +-
 8 files changed, 116 insertions(+), 44 deletions(-)  create mode 100644 gas/testsuite/gas/arc/inline-data-1.d
 create mode 100644 gas/testsuite/gas/arc/inline-data-1.s

diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 063cd14..381521b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2016-01-05  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* elf32-arc.c (ARC_RELOC_HOWTO): Add new 'IS_ME' parameter to each
+	definition of this macro.  The new parameter is ignored in all
+	cases except for in 'arc_do_relocation' where we perform endian
+	correction if required.
+	(arc_bfd_get_32): Becomes an alias for bfd_get_32.
+	(arc_bfd_put_32): Becomes an alias for bfd_put_32.
+	(get_middle_endian_relocation): Delete.
+	(ME): Delete.
+
 2016-01-01  Alan Modra  <amodra@gmail.com>
 
 	Update year range in copyright notice of all files.
diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c index e9e299c..b08f94d 100644
--- a/bfd/elf32-arc.c
+++ b/bfd/elf32-arc.c
@@ -90,7 +90,7 @@ char * init_str = INIT_SYM_STRING;  char * fini_str = FINI_SYM_STRING;
 
 
-#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
+#define ARC_RELOC_HOWTO(TYPE, VALUE, IS_ME, SIZE, BITSIZE, 
+RELOC_FUNCTION, OVERFLOW, FORMULA) \
       case VALUE: \
 	return #TYPE; \
 	break;
@@ -140,32 +140,10 @@ is_reloc_for_PLT (reloc_howto_type * howto)
 
 #define arc_bfd_get_8(A,B,C) bfd_get_8(A,B)  #define arc_bfd_get_16(A,B,C) bfd_get_16(A,B)
+#define arc_bfd_get_32(A,B,C) bfd_get_32(A,B)
 #define arc_bfd_put_8(A,B,C,D) bfd_put_8(A,B,C)  #define arc_bfd_put_16(A,B,C,D) bfd_put_16(A,B,C)
-
-static long
-arc_bfd_get_32 (bfd * abfd, void *loc, asection * input_section) -{
-  long insn = bfd_get_32 (abfd, loc);
-
-  if (!bfd_big_endian (abfd)
-      && input_section
-      && (input_section->flags & SEC_CODE))
-    insn = ((0x0000fffff & insn) << 16) | ((0xffff0000 & insn) >> 16);
-
-  return insn;
-}
-
-static void
-arc_bfd_put_32 (bfd * abfd, long insn, void *loc, asection * input_section) -{
-  if (!bfd_big_endian (abfd)
-      && input_section
-      && (input_section->flags & SEC_CODE))
-    insn = ((0x0000fffff & insn) << 16) | ((0xffff0000 & insn) >> 16);
-
-  bfd_put_32 (abfd, insn, loc);
-}
+#define arc_bfd_put_32(A,B,C,D) bfd_put_32(A,B,C)
 
 static bfd_reloc_status_type
 arc_elf_reloc (bfd *abfd ATTRIBUTE_UNUSED, @@ -193,7 +171,7 @@ arc_elf_reloc (bfd *abfd ATTRIBUTE_UNUSED,  }
 
 
-#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
+#define ARC_RELOC_HOWTO(TYPE, VALUE, IS_ME, SIZE, BITSIZE, 
+RELOC_FUNCTION, OVERFLOW, FORMULA) \
   TYPE = VALUE,
 enum howto_list
 {
@@ -202,7 +180,7 @@ enum howto_list
 };
 #undef ARC_RELOC_HOWTO
 
-#define ARC_RELOC_HOWTO(TYPE, VALUE, RSIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
+#define ARC_RELOC_HOWTO(TYPE, VALUE, IS_ME, RSIZE, BITSIZE, 
+RELOC_FUNCTION, OVERFLOW, FORMULA) \
   [TYPE] = HOWTO (R_##TYPE, 0, RSIZE, BITSIZE, FALSE, 0, complain_overflow_##OVERFLOW, arc_elf_reloc, #TYPE, FALSE, 0, 0, FALSE),
 
 static struct reloc_howto_struct elf_arc_howto_table[] = @@ -228,7 +206,7 @@ static struct reloc_howto_struct elf_arc_howto_table[] =
 
 static void arc_elf_howto_init (void)
 {
-#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
+#define ARC_RELOC_HOWTO(TYPE, VALUE, IS_ME, SIZE, BITSIZE, 
+RELOC_FUNCTION, OVERFLOW, FORMULA) \
   elf_arc_howto_table[TYPE].pc_relative = \
     (strstr (#FORMULA, " P ") != NULL || strstr (#FORMULA, " PDATA ") != NULL); \
   elf_arc_howto_table[TYPE].dst_mask = RELOC_FUNCTION(0, ~0); @@ -238,7 +216,7 @@ static void arc_elf_howto_init (void)  #undef ARC_RELOC_HOWTO
 
 
-#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
+#define ARC_RELOC_HOWTO(TYPE, VALUE, IS_ME, SIZE, BITSIZE, 
+RELOC_FUNCTION, OVERFLOW, FORMULA) \
   [TYPE] = VALUE,
 const int howto_table_lookup[] =
 {
@@ -262,7 +240,7 @@ struct arc_reloc_map
   unsigned char   elf_reloc_val;
 };
 
-#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
+#define ARC_RELOC_HOWTO(TYPE, VALUE, IS_ME, SIZE, BITSIZE, 
+RELOC_FUNCTION, OVERFLOW, FORMULA) \
   { BFD_RELOC_##TYPE, R_##TYPE },
 static const struct arc_reloc_map arc_reloc_map[] =  { @@ -473,17 +451,6 @@ debug_arc_reloc (struct arc_relocation_data reloc_data)
     fprintf (stderr, "	input section is NULL\n");
 }
 
-static ATTRIBUTE_UNUSED bfd_vma
-get_middle_endian_relocation (bfd_vma reloc) -{
-  bfd_vma ret =
-	      ((reloc & 0xffff0000) >> 16) |
-	      ((reloc & 0xffff) << 16);
-  return ret;
-}
-
-#define ME(RELOC) (get_middle_endian_reloction(RELOC))
-
 #define S (reloc_data.sym_value \
 	   + reloc_data.sym_section->output_offset \
 	   + reloc_data.sym_section->output_section->vma)
@@ -513,12 +480,18 @@ get_middle_endian_relocation (bfd_vma reloc)
 
 #define none (0)
 
-#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
+#define ARC_RELOC_HOWTO(TYPE, VALUE, IS_ME, SIZE, BITSIZE, 
+RELOC_FUNCTION, OVERFLOW, FORMULA) \
   case R_##TYPE: \
     { \
-      bfd_vma bitsize ATTRIBUTE_UNUSED = BITSIZE; \
+      bfd_vma bitsize ATTRIBUTE_UNUSED = BITSIZE;   \
+      if (IS_ME && !bfd_big_endian (reloc_data.input_section->owner)) \
+        insn = (((0x0000fffff & insn) << 16) \
+                | ((0xffff0000 & insn) >> 16)); \
       relocation = FORMULA  ; \
       insn = RELOC_FUNCTION (insn, relocation); \
+      if (IS_ME && !bfd_big_endian (reloc_data.input_section->owner)) \
+        insn = (((0x0000fffff & insn) << 16) \
+                | ((0xffff0000 & insn) >> 16)); \
     } \
     break;
 
diff --git a/gas/ChangeLog b/gas/ChangeLog index 64eeded..400f67a 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2016-01-06  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* testsuite/gas/arc/inline-data-1.d: New file.
+	* testsuite/gas/arc/inline-data-1.s: New file.
+
 2016-01-01  Alan Modra  <amodra@gmail.com>
 
 	Update year range in copyright notice of all files.
diff --git a/gas/testsuite/gas/arc/inline-data-1.d b/gas/testsuite/gas/arc/inline-data-1.d
new file mode 100644
index 0000000..ce5c272
--- /dev/null
+++ b/gas/testsuite/gas/arc/inline-data-1.d
@@ -0,0 +1,7 @@
+#as: -mcpu=arc700
+#objdump: -sj .text
+
+.*: +file format .*arc.*
+
+Contents of section .text:
+ [0-9a-f]+ ddccbbaa ffee .*
diff --git a/gas/testsuite/gas/arc/inline-data-1.s b/gas/testsuite/gas/arc/inline-data-1.s
new file mode 100644
index 0000000..e63bf06
--- /dev/null
+++ b/gas/testsuite/gas/arc/inline-data-1.s
@@ -0,0 +1,4 @@
+        .text
+
+        .word   0xaabbccdd
+        .short  0xeeff
diff --git a/include/ChangeLog b/include/ChangeLog index 70e19b7..0872d0e 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,9 @@
+2016-01-06  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* elf/arc-reloc.def: Add field to indicate if each relocation
+	requires middle-endian correction.
+	* elf/arc.h (ARC_RELOC_HOWTO): Add, and ignore, 'IS_ME' field.
+
 2016-01-01  Alan Modra  <amodra@gmail.com>
 
 	Update year range in copyright notice of all files.
diff --git a/include/elf/arc-reloc.def b/include/elf/arc-reloc.def index 893291f..07a5e66 100644
--- a/include/elf/arc-reloc.def
+++ b/include/elf/arc-reloc.def
@@ -1,4 +1,5 @@
 ARC_RELOC_HOWTO(ARC_NONE, 0, \
+                FALSE,
                 2, \
                 32, \
                 replace_none, \
@@ -6,6 +7,7 @@ ARC_RELOC_HOWTO(ARC_NONE, 0, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_8, 1, \
+                FALSE,
                 0, \
                 8, \
                 replace_bits8, \
@@ -13,6 +15,7 @@ ARC_RELOC_HOWTO(ARC_8, 1, \
                 ( S + A ))
 
 ARC_RELOC_HOWTO(ARC_16, 2, \
+                FALSE,
                 1, \
                 16, \
                 replace_bits16, \
@@ -20,6 +23,7 @@ ARC_RELOC_HOWTO(ARC_16, 2, \
                 ( S + A ))
 
 ARC_RELOC_HOWTO(ARC_24, 3, \
+                FALSE,
                 2, \
                 24, \
                 replace_bits24, \
@@ -27,6 +31,7 @@ ARC_RELOC_HOWTO(ARC_24, 3, \
                 ( S + A ))
 
 ARC_RELOC_HOWTO(ARC_32, 4, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -34,6 +39,7 @@ ARC_RELOC_HOWTO(ARC_32, 4, \
                 ( S + A ))
 
 ARC_RELOC_HOWTO(ARC_N8, 8, \
+                FALSE,
                 0, \
                 8, \
                 replace_bits8, \
@@ -41,6 +47,7 @@ ARC_RELOC_HOWTO(ARC_N8, 8, \
                 ( S - A ))
 
 ARC_RELOC_HOWTO(ARC_N16, 9, \
+                FALSE,
                 1, \
                 16, \
                 replace_bits16, \
@@ -48,6 +55,7 @@ ARC_RELOC_HOWTO(ARC_N16, 9, \
                 ( S - A ))
 
 ARC_RELOC_HOWTO(ARC_N24, 10, \
+                FALSE,
                 2, \
                 24, \
                 replace_bits24, \
@@ -55,6 +63,7 @@ ARC_RELOC_HOWTO(ARC_N24, 10, \
                 ( S - A ))
 
 ARC_RELOC_HOWTO(ARC_N32, 11, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -62,6 +71,7 @@ ARC_RELOC_HOWTO(ARC_N32, 11, \
                 ( S - A ))
 
 ARC_RELOC_HOWTO(ARC_SDA, 12, \
+                FALSE,
                 2, \
                 9, \
                 replace_disp9, \
@@ -69,6 +79,7 @@ ARC_RELOC_HOWTO(ARC_SDA, 12, \
                 ( S + A ))
 
 ARC_RELOC_HOWTO(ARC_SECTOFF, 13, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -76,6 +87,7 @@ ARC_RELOC_HOWTO(ARC_SECTOFF, 13, \
                 ( ( S - SECTSTART ) + A ))
 
 ARC_RELOC_HOWTO(ARC_S21H_PCREL, 14, \
+                TRUE,
                 2, \
                 20, \
                 replace_disp21h, \
@@ -83,6 +95,7 @@ ARC_RELOC_HOWTO(ARC_S21H_PCREL, 14, \
                 ( ( ( S + A ) - P ) >> 1 ))
 
 ARC_RELOC_HOWTO(ARC_S21W_PCREL, 15, \
+                TRUE,
                 2, \
                 19, \
                 replace_disp21w, \
@@ -90,6 +103,7 @@ ARC_RELOC_HOWTO(ARC_S21W_PCREL, 15, \
                 ( ( ( S + A ) - P ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_S25H_PCREL, 16, \
+                TRUE,
                 2, \
                 24, \
                 replace_disp25h, \
@@ -97,6 +111,7 @@ ARC_RELOC_HOWTO(ARC_S25H_PCREL, 16, \
                 ( ( ( S + A ) - P ) >> 1 ))
 
 ARC_RELOC_HOWTO(ARC_S25W_PCREL, 17, \
+                TRUE,
                 2, \
                 23, \
                 replace_disp25w, \
@@ -104,6 +119,7 @@ ARC_RELOC_HOWTO(ARC_S25W_PCREL, 17, \
                 ( ( ( S + A ) - P ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_SDA32, 18, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -111,6 +127,7 @@ ARC_RELOC_HOWTO(ARC_SDA32, 18, \
                 ( ( S + A ) - _SDA_BASE_ ))
 
 ARC_RELOC_HOWTO(ARC_SDA_LDST, 19, \
+                TRUE,
                 2, \
                 9, \
                 replace_disp9ls, \
@@ -118,6 +135,7 @@ ARC_RELOC_HOWTO(ARC_SDA_LDST, 19, \
                 ( ( S + A ) - _SDA_BASE_ ))
 
 ARC_RELOC_HOWTO(ARC_SDA_LDST1, 20, \
+                TRUE,
                 2, \
                 9, \
                 replace_disp9ls, \
@@ -125,6 +143,7 @@ ARC_RELOC_HOWTO(ARC_SDA_LDST1, 20, \
                 ( ( ( S + A ) - _SDA_BASE_ ) >> 1 ))
 
 ARC_RELOC_HOWTO(ARC_SDA_LDST2, 21, \
+                TRUE,
                 2, \
                 9, \
                 replace_disp9ls, \
@@ -132,6 +151,7 @@ ARC_RELOC_HOWTO(ARC_SDA_LDST2, 21, \
                 ( ( ( S + A ) - _SDA_BASE_ ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_SDA16_LD, 22, \
+                FALSE,
                 1, \
                 9, \
                 replace_disp9s, \
@@ -139,6 +159,7 @@ ARC_RELOC_HOWTO(ARC_SDA16_LD, 22, \
                 ( ( S + A ) - _SDA_BASE_ ))
 
 ARC_RELOC_HOWTO(ARC_SDA16_LD1, 23, \
+                FALSE,
                 1, \
                 9, \
                 replace_disp9s, \
@@ -146,6 +167,7 @@ ARC_RELOC_HOWTO(ARC_SDA16_LD1, 23, \
                 ( ( ( S + A ) - _SDA_BASE_ ) >> 1 ))
 
 ARC_RELOC_HOWTO(ARC_SDA16_LD2, 24, \
+                FALSE,
                 1, \
                 9, \
                 replace_disp9s, \
@@ -153,6 +175,7 @@ ARC_RELOC_HOWTO(ARC_SDA16_LD2, 24, \
                 ( ( ( S + A ) - _SDA_BASE_ ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_S13_PCREL, 25, \
+                FALSE,
                 1, \
                 11, \
                 replace_disp13s, \
@@ -160,6 +183,7 @@ ARC_RELOC_HOWTO(ARC_S13_PCREL, 25, \
                 ( ( ( S + A ) - P ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_W, 26, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -167,6 +191,7 @@ ARC_RELOC_HOWTO(ARC_W, 26, \
                 ( ( S + A ) & ( ~3 ) ))
 
 ARC_RELOC_HOWTO(ARC_32_ME, 27, \
+                TRUE,
                 2, \
                 32, \
                 replace_limm, \
@@ -174,6 +199,7 @@ ARC_RELOC_HOWTO(ARC_32_ME, 27, \
                 ( S + A ))
 
 ARC_RELOC_HOWTO(ARC_32_ME_S, 105, \
+                TRUE,
                 2, \
                 32, \
                 replace_limms, \
@@ -181,6 +207,7 @@ ARC_RELOC_HOWTO(ARC_32_ME_S, 105, \
                 ( S + A ))
 
 ARC_RELOC_HOWTO(ARC_N32_ME, 28, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -188,6 +215,7 @@ ARC_RELOC_HOWTO(ARC_N32_ME, 28, \
                 ( S - A ))
 
 ARC_RELOC_HOWTO(ARC_SECTOFF_ME, 29, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -195,6 +223,7 @@ ARC_RELOC_HOWTO(ARC_SECTOFF_ME, 29, \
                 ( ( S - SECTSTART ) + A ))
 
 ARC_RELOC_HOWTO(ARC_SDA32_ME, 30, \
+                TRUE,
                 2, \
                 32, \
                 replace_limm, \
@@ -202,6 +231,7 @@ ARC_RELOC_HOWTO(ARC_SDA32_ME, 30, \
                 ( ( S + A ) - _SDA_BASE_ ))
 
 ARC_RELOC_HOWTO(ARC_W_ME, 31, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -209,6 +239,7 @@ ARC_RELOC_HOWTO(ARC_W_ME, 31, \
                 ( S + A ))
 
 ARC_RELOC_HOWTO(AC_SECTOFF_U8, 35, \
+                FALSE,
                 2, \
                 9, \
                 replace_disp9ls, \
@@ -216,6 +247,7 @@ ARC_RELOC_HOWTO(AC_SECTOFF_U8, 35, \
                 ( ( S + A ) - SECTSTART ))
 
 ARC_RELOC_HOWTO(AC_SECTOFF_U8_1, 36, \
+                FALSE,
                 2, \
                 9, \
                 replace_disp9ls, \
@@ -223,6 +255,7 @@ ARC_RELOC_HOWTO(AC_SECTOFF_U8_1, 36, \
                 ( ( ( S + A ) - SECTSTART ) >> 1 ))
 
 ARC_RELOC_HOWTO(AC_SECTOFF_U8_2, 37, \
+                FALSE,
                 2, \
                 9, \
                 replace_disp9ls, \
@@ -230,6 +263,7 @@ ARC_RELOC_HOWTO(AC_SECTOFF_U8_2, 37, \
                 ( ( ( S + A ) - SECTSTART ) >> 2 ))
 
 ARC_RELOC_HOWTO(AC_SECTFOFF_S9, 38, \
+                FALSE,
                 2, \
                 9, \
                 replace_disp9ls, \
@@ -237,6 +271,7 @@ ARC_RELOC_HOWTO(AC_SECTFOFF_S9, 38, \
                 ( ( S + A ) - SECTSTART ))
 
 ARC_RELOC_HOWTO(AC_SECTFOFF_S9_1, 39, \
+                FALSE,
                 2, \
                 9, \
                 replace_disp9ls, \
@@ -244,6 +279,7 @@ ARC_RELOC_HOWTO(AC_SECTFOFF_S9_1, 39, \
                 ( ( ( S + A ) - SECTSTART ) >> 1 ))
 
 ARC_RELOC_HOWTO(AC_SECTFOFF_S9_2, 40, \
+                FALSE,
                 2, \
                 9, \
                 replace_disp9ls, \
@@ -251,6 +287,7 @@ ARC_RELOC_HOWTO(AC_SECTFOFF_S9_2, 40, \
                 ( ( ( S + A ) - SECTSTART ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_SECTOFF_ME_1, 41, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -258,6 +295,7 @@ ARC_RELOC_HOWTO(ARC_SECTOFF_ME_1, 41, \
                 ( ( ( S - SECTSTART ) + A ) >> 1 ))
 
 ARC_RELOC_HOWTO(ARC_SECTOFF_ME_2, 42, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -265,6 +303,7 @@ ARC_RELOC_HOWTO(ARC_SECTOFF_ME_2, 42, \
                 ( ( ( S - SECTSTART ) + A ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_SECTOFF_1, 43, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -272,6 +311,7 @@ ARC_RELOC_HOWTO(ARC_SECTOFF_1, 43, \
                 ( ( ( S - SECTSTART ) + A ) >> 1 ))
 
 ARC_RELOC_HOWTO(ARC_SECTOFF_2, 44, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -279,6 +319,7 @@ ARC_RELOC_HOWTO(ARC_SECTOFF_2, 44, \
                 ( ( ( S - SECTSTART ) + A ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_SDA16_ST2, 48, \
+                FALSE,
                 1, \
                 9, \
                 replace_disp9s1, \
@@ -286,6 +327,7 @@ ARC_RELOC_HOWTO(ARC_SDA16_ST2, 48, \
                 ( ( ( S + A ) - _SDA_BASE_ ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_32_PCREL, 49, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -293,6 +335,7 @@ ARC_RELOC_HOWTO(ARC_32_PCREL, 49, \
                 ( ( S + A ) - PDATA ))
 
 ARC_RELOC_HOWTO(ARC_PC32, 50, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -300,6 +343,7 @@ ARC_RELOC_HOWTO(ARC_PC32, 50, \
                 ( ( S + A ) - P ))
 
 ARC_RELOC_HOWTO(ARC_GOT32, 59, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -307,6 +351,7 @@ ARC_RELOC_HOWTO(ARC_GOT32, 59, \
                 ( G + A ))
 
 ARC_RELOC_HOWTO(ARC_GOTPC32, 51, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -314,6 +359,7 @@ ARC_RELOC_HOWTO(ARC_GOTPC32, 51, \
                 ( ( ( GOT + G ) + A ) - P ))
 
 ARC_RELOC_HOWTO(ARC_PLT32, 52, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -321,6 +367,7 @@ ARC_RELOC_HOWTO(ARC_PLT32, 52, \
                 ( ( L + A ) - P ))
 
 ARC_RELOC_HOWTO(ARC_COPY, 53, \
+                TRUE,
                 2, \
                 0, \
                 replace_none, \
@@ -328,6 +375,7 @@ ARC_RELOC_HOWTO(ARC_COPY, 53, \
                 none)
 
 ARC_RELOC_HOWTO(ARC_GLOB_DAT, 54, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -335,6 +383,7 @@ ARC_RELOC_HOWTO(ARC_GLOB_DAT, 54, \
                 S)
 
 ARC_RELOC_HOWTO(ARC_JMP_SLOT, 55, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -342,6 +391,7 @@ ARC_RELOC_HOWTO(ARC_JMP_SLOT, 55, \
                 S)
 
 ARC_RELOC_HOWTO(ARC_RELATIVE, 56, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -349,6 +399,7 @@ ARC_RELOC_HOWTO(ARC_RELATIVE, 56, \
                 ( B + A ))
 
 ARC_RELOC_HOWTO(ARC_GOTOFF, 57, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -356,6 +407,7 @@ ARC_RELOC_HOWTO(ARC_GOTOFF, 57, \
                 ( ( S + A ) - GOT ))
 
 ARC_RELOC_HOWTO(ARC_GOTPC, 58, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -363,6 +415,7 @@ ARC_RELOC_HOWTO(ARC_GOTPC, 58, \
                 ( ( GOT + A ) - P ))
 
 ARC_RELOC_HOWTO(ARC_S21W_PCREL_PLT, 60, \
+                TRUE,
                 2, \
                 19, \
                 replace_disp21w, \
@@ -370,6 +423,7 @@ ARC_RELOC_HOWTO(ARC_S21W_PCREL_PLT, 60, \
                 ( ( ( L + A ) - P ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_S25H_PCREL_PLT, 61, \
+                TRUE,
                 2, \
                 24, \
                 replace_disp25h, \
@@ -377,6 +431,7 @@ ARC_RELOC_HOWTO(ARC_S25H_PCREL_PLT, 61, \
                 ( ( ( L + A ) - P ) >> 1 ))
 
 ARC_RELOC_HOWTO(ARC_TLS_DTPMOD, 66, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -384,6 +439,7 @@ ARC_RELOC_HOWTO(ARC_TLS_DTPMOD, 66, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_TLS_TPOFF, 68, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -391,6 +447,7 @@ ARC_RELOC_HOWTO(ARC_TLS_TPOFF, 68, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_TLS_GD_GOT, 69, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -398,6 +455,7 @@ ARC_RELOC_HOWTO(ARC_TLS_GD_GOT, 69, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_TLS_GD_LD, 70, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -405,6 +463,7 @@ ARC_RELOC_HOWTO(ARC_TLS_GD_LD, 70, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_TLS_GD_CALL, 71, \
+                FALSE,
                 2, \
                 32, \
                 replace_word32, \
@@ -412,6 +471,7 @@ ARC_RELOC_HOWTO(ARC_TLS_GD_CALL, 71, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_TLS_IE_GOT, 72, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -419,6 +479,7 @@ ARC_RELOC_HOWTO(ARC_TLS_IE_GOT, 72, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_TLS_DTPOFF, 67, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -426,6 +487,7 @@ ARC_RELOC_HOWTO(ARC_TLS_DTPOFF, 67, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_TLS_DTPOFF_S9, 73, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -433,6 +495,7 @@ ARC_RELOC_HOWTO(ARC_TLS_DTPOFF_S9, 73, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_TLS_LE_S9, 74, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -440,6 +503,7 @@ ARC_RELOC_HOWTO(ARC_TLS_LE_S9, 74, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_TLS_LE_32, 75, \
+                TRUE,
                 2, \
                 32, \
                 replace_word32, \
@@ -447,6 +511,7 @@ ARC_RELOC_HOWTO(ARC_TLS_LE_32, 75, \
                 0)
 
 ARC_RELOC_HOWTO(ARC_S25W_PCREL_PLT, 76, \
+                TRUE,
                 2, \
                 23, \
                 replace_disp25w, \
@@ -454,6 +519,7 @@ ARC_RELOC_HOWTO(ARC_S25W_PCREL_PLT, 76, \
                 ( ( ( L + A ) - P ) >> 2 ))
 
 ARC_RELOC_HOWTO(ARC_S21H_PCREL_PLT, 77, \
+                TRUE,
                 2, \
                 20, \
                 replace_disp21h, \
diff --git a/include/elf/arc.h b/include/elf/arc.h index e535f24..06aa00c 100644
--- a/include/elf/arc.h
+++ b/include/elf/arc.h
@@ -28,7 +28,7 @@
 
 /* Relocations.  */
 
-#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
+#define ARC_RELOC_HOWTO(TYPE, VALUE, IS_ME, SIZE, BITSIZE, 
+RELOC_FUNCTION, OVERFLOW, FORMULA) \
   RELOC_NUMBER(R_##TYPE, VALUE)
 
 START_RELOC_NUMBERS (elf_arc_reloc_type)
--
2.5.1


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