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 and all,

I have tested and fixed this patch. The attached one should now work for all of the ARC variant emulations/targets.
I have also included a fix for all 8 bit relocs which were wrong for big endian format.

Andrew: Do you have any comments on the patch as it is?

Best regards,
Cupertino

bfd/ChangeLog:

Cupertino Miranda  <Cupertino.Miranda@synopsys.com> 
Andrew Burgess  <andrew.burgess@embecosm.com>

	* elf32-arc.c (arc_bfd_get_32): Becomes an alias for bfd_get_32.
	(arc_bfd_put_32): Becomes an alias for bfd_put_32.
	(arc_elf_howto_init): Added assert to validate relocations.
	(get_middle_endian_relocation): Delete.
	(middle_endian_convert): New function.
	(ME): Redefine, now does nothing.
	(IS_ME): New define.
	(arc_do_relocation): Extend the attached 'ARC_RELOC_HOWTO'
	definition to call middle_endian_convert.  Add a new local
	variable and make use of this throughout. Added call to 
	arc_bfd_get_8 and arc_bfd_put_8 for 8 bit relocations.

gas/ChangeLog:
Andrew Burgess  <andrew.burgess@embecosm.com>
	* testsuite/gas/arc/inline-data-1.d: New file.
	* testsuite/gas/arc/inline-data-1.s: New file.

include/ChangeLog:
Cupertino Miranda  <Cupertino.Miranda@synopsys.com> 
Andrew Burgess  <andrew.burgess@embecosm.com>

	* elf/arc-reloc.def: Add a call to ME within the formula for each
	relocation that requires middle-endian correction.

> -----Original Message-----
> From: Cupertino Miranda [mailto:cmiranda@synopsys.com]
> Sent: Friday, January 08, 2016 11:31 AM
> To: Andrew Burgess; Cupertino Miranda
> Cc: Claudiu Zissulescu; binutils@sourceware.org
> Subject: RE: [PATCH] bfd/arc: Allow non-instruction relocations within .text
> sections
> 
> Hi Andrew,
> 
> > From: Andrew Burgess [mailto:andrew.burgess@embecosm.com]
> >
> > * Cupertino Miranda <Cupertino.Miranda@synopsys.com> [2016-01-07
> > 16:45:49 +0000]:
> >
> > > The first statement from Claudiu doesn't apply, because the
> > > instruction is what suffers the ME conversion, so all short
> > > instructions must suffer through ME decoding/encoding..  The reality
> > > is that being ME or not is not a property of the relocation but of
> > > the memory region, or better, the type of usage given to the
> > > particular address, being patched.
> >
> > I agree, though I believe that the way that this memory-region / use
> > relationship is captured is with difference relocation types.  So I
> > think that something along the lines of either of the two patches I
> > have now posted is the way to go.
> >
> > >                                      Moreover, now looking back to
> > > it, I think we should not try to move this information (not from
> > > but) to the relocation, but to understand which cases we should be
> > > careful and pay special attention to perform or not to perform
> > > middle endianess conversion.
> >
> > I agree.  That is what I've done in both of the patches I've posted right?
> No, I made a correction to the sentence and made it confusing.
> It should have been read like:
> " I think we should not try to move this information to the relocation, but to
> understand which cases we should be careful and pay special attention to
> perform or not the middle endianess conversion."
> This middle endianess for the tools can be a property of whatever we want,
> however for the architecture, it is clearly a property of what is going to use
> the data being patched/relocated. More precisely, who is reading/writing the
> data (the instruction decoder, or an instruction being executed).
> - If it is the instruction decoder, then the data should always be recovered
> and rewritten with middle endian format conversion.
> - If it is an instruction (an ld for example), then independently of the type of
> section the relocation should happen, we should write it in non middle
> endian format.
>     - This happens to be the case only in ARC_32 like I specified in the previous
> email.
> 
> > The middle-endian conversion is moved out of the get/put methods, and
> > into relocation specific code.
> >
> > So far I think that we're in complete agreement.
> >
> > >
> > > In our current development code (my local fix), I keep the ME
> > > conversion in bfd_get_32 and bfd_put_32, but I perform a unME
> > > conversion before applying the relocation, if that is a requirement
> > > for the relocation type.
> >
> > I don't think that's a good idea.  Given that this get/put is only
> > used in the one location, that feels like we're just working around a
> > get/put that's doing the wrong thing.  This also feels like it goes
> > against what you said above; the conversion should be attached to the
> relocation, not to generic code.
> I tried to say the opposite. :-)
> 
> >
> > >                           Up until now we only identified a single
> > > relocation type where ME should not be applied in a SEC_CODE
> > > section, more precisely:
> >
> > OK, I admit that marking up those relocation where ME _should_ be
> > applied will result in more being marked than if we simply mark those
> > to which is does not apply.  But I think that's easier to understand,
> > so that doesn't seem like much of a negative to me.
> > > I would say that we should spend some more time to define how this
> > > middle endian conversion should be done.
> >
> > Well, I've put forward two patches now, the first (which I prefer),
> > then the second, which was based on your feedback in:
> >
> >    https://sourceware.org/ml/binutils/2016-01/msg00021.html
> >
> > So, I'm confused what more there is to discuss.  Though I prefer the
> > first patch, I'll take the second version if it's what you prefer.
> >
> >
> > >                                           Moreover, I won't be able
> > > to give the confidence that your patch would not create some
> > > problems, as the current upstreamed code is limited to baremetal
> > > applications, not allowing me to fully test all the relocation types involved.
> >
> > Given how small this patch is, merging into your local world and
> > testing should be pretty straight forward I'd have though.
> >
> > >             Furthermore, it would make more sense to fix this issue
> > > right after we apply the upcoming feature intensive patch,
> > > supporting Linux and making use of all the relocation types.
> >
> > Do you have a date for when the second patch will arrive?  This is a
> > blocking issue for me, and I'd like to see a solution merged sooner rather
> than later.
> We will send the patch with PIC and TLS support by Monday/Tuesday.
> 
> >
> > As a counter proposal, given how small that patch is, why don't we
> > merge the second version of this patch, which sounds like the closest
> > to whatever you're proposing, then when your next big patch arrives
> > you can rewrite this code as fits your design.
> Although it is a small patch, it makes a fundamental changes to how the
> relocations are performed.
> To be honest, at the moment I cannot test your changes and validate if they
> are all correct up until I send my patches (Monday/Tuesday).
> Also, I would like to validate them with the PIC and TLS support as well, as the
> current version (baremetal only) does not makes use of many of the
> changed relocations in your patch.
> 
> >
> > What do you think?
> After some further discussions locally, both me and Claudiu agree with the
> strategy to move ME to the relocations, however up until further testing we
> are not fully certain all of the changes are correct.
> Nevertheless, we accept the patch. :-)
> 
> Kind regards,
> Cupertino
> 
> >
> > Thanks,
> > Andrew
> >
> >
> >
> > >
> > >
> > > -----Original Message-----
> > > From: Claudiu Zissulescu [mailto:claziss@synopsys.com]
> > > Sent: Thursday, January 07, 2016 4:15 PM
> > > To: Andrew Burgess; Cupertino Miranda
> > > Cc: binutils@sourceware.org
> > > Subject: RE: [PATCH] bfd/arc: Allow non-instruction relocations
> > > within .text sections
> > >
> > > Hi guys,
> > >
> > > I have two remarks/questions for you:
> > > 	1. It seems to me adding ME modifier for relocations that are
> > handling short immediate values is superfluous, as the final values
> > are written taken into account the entire instruction, and the
> > big-endian/little- endian flags.  Hence, if it is a long instruction
> > always we write it in the form dictated by the endianess (ME for
> > little-endian), if it is short then ME switch is not needed at all.
> > However, if you say that this is ok, then it is fine for me as well.
> > > 	2.  The relocations which are handled by dynamic linker are marked
> > also ME (e.g., JMP_SLOT), is it required?
> > >
> > > Best,
> > > Claudiu
> > >
> > > > -----Original Message-----
> > > > From: Andrew Burgess [mailto:andrew.burgess@embecosm.com]
> > > > Sent: Thursday, January 07, 2016 3:44 PM
> > > > To: Cupertino Miranda
> > > > Cc: binutils@sourceware.org; Claudiu.Zissulescu@synopsys.com
> > > > Subject: Re: [PATCH] bfd/arc: Allow non-instruction relocations
> > > > within .text sections
> > > >
> > > > * Cupertino Miranda <Cupertino.Miranda@synopsys.com> [2016-01-06
> > > > 15:56:24 +0000]:
> > > >
> > > > > 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.
> > > >
> > > > The patch below is a rewrite inline with the description above.
> > > > The only change is that I have extended the IS_ME macro to
> > > > consider whether the bfd is big or little endian, and I believe
> > > > that this makes a difference as to whether the byte shuffling is
> required.
> > > >
> > > > Is this good with you?
> > > >
> > > > Does my list of formula modifications match the list of changes
> > > > you have?  I built my list based on how relocations were handled
> > > > before the big rewrite, but that doesn't mean it's correct, just
> > > > that I've not seen any test regressions either in binutils or GCC.
> > > >
> > > > Thanks,
> > > > Andrew
> > > >
> > > > ---
> > > >
> > > > 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.
> > > >
> > > > The formula field, in those relocations that should have the byte
> > > > ordering fix applied, is extended to include a call to a new macro
> > > > ME, this macro is then used within the bfd library to trigger the
> > > > application of the byte ordering fix when appropriate.  This
> > > > design is
> > discussed here:
> > > >   https://sourceware.org/ml/binutils/2016-01/msg00021.html
> > > >
> > > > bfd/ChangeLog:
> > > >
> > > > 	* elf32-arc.c (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.
> > > > 	(middle_endian_convert): New function.
> > > > 	(ME): Redefine, now does nothing.
> > > > 	(IS_ME): New define.
> > > > 	(arc_do_relocation): Extend the attached 'ARC_RELOC_HOWTO'
> > > > 	definition to call middle_endian_convert.  Add a new local
> > > > 	variable and make use of this throughout.
> > > >
> > > > include/ChangeLog:
> > > >
> > > > 	* elf/arc-reloc.def: Add a call to ME within the formula for each
> > > > 	relocation that requires middle-endian correction.
> > > >
> > > > gas/ChangeLog:
> > > >
> > > > 	* testsuite/gas/arc/inline-data-1.d: New file.
> > > > 	* testsuite/gas/arc/inline-data-1.s: New file.
> > > > ---
> > > >  bfd/ChangeLog                         | 13 ++++++++
> > > >  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             | 54 ++++++++++++++++----------------
> > > >  7 files changed, 85 insertions(+), 63 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..1f92602
> > > > 100644
> > > > --- a/bfd/ChangeLog
> > > > +++ b/bfd/ChangeLog
> > > > @@ -1,3 +1,16 @@
> > > > +2016-01-05  Cupertino Miranda  <Cupertino.Miranda@synopsys.com>
> > > > +	    Andrew Burgess  <andrew.burgess@embecosm.com>
> > > > +
> > > > +	* elf32-arc.c (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.
> > > > +	(middle_endian_convert): New function.
> > > > +	(ME): Redefine, now does nothing.
> > > > +	(IS_ME): New define.
> > > > +	(arc_do_relocation): Extend the attached 'ARC_RELOC_HOWTO'
> > > > +	definition to call middle_endian_convert.  Add a new local
> > > > +	variable and make use of this throughout.
> > > > +
> > > >  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..bf505fc
> > > > 100644
> > > > --- a/bfd/elf32-arc.c
> > > > +++ b/bfd/elf32-arc.c
> > > > @@ -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, @@ -473,16 +451,22
> @@
> > > > 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)
> > > > +static bfd_vma
> > > > +middle_endian_convert (bfd_vma insn, bfd_boolean do_it)
> > > >  {
> > > > -  bfd_vma ret =
> > > > -	      ((reloc & 0xffff0000) >> 16) |
> > > > -	      ((reloc & 0xffff) << 16);
> > > > -  return ret;
> > > > +  if (do_it)
> > > > +    {
> > > > +      insn =
> > > > +        ((insn & 0xffff0000) >> 16) |
> > > > +        ((insn & 0xffff) << 16);
> > > > +    }
> > > > +  return insn;
> > > >  }
> > > >
> > > > -#define ME(RELOC) (get_middle_endian_reloction(RELOC))
> > > > +#define ME(reloc) (reloc)
> > > > +
> > > > +#define IS_ME(FORMULA,BFD) ((strstr(#FORMULA, "ME") != NULL)
> &&
> > \
> > > > +                            !bfd_big_endian (BFD))
> > > >
> > > >  #define S (reloc_data.sym_value \
> > > >  	   + reloc_data.sym_section->output_offset \ @@ -518,7 +502,9 @@
> > > > get_middle_endian_relocation (bfd_vma reloc)
> > > >      { \
> > > >        bfd_vma bitsize ATTRIBUTE_UNUSED = BITSIZE; \
> > > >        relocation = FORMULA  ; \
> > > > +      insn = middle_endian_convert (insn, IS_ME (FORMULA, abfd));
> > > > + \
> > > >        insn = RELOC_FUNCTION (insn, relocation); \
> > > > +      insn = middle_endian_convert (insn, IS_ME (FORMULA, abfd));
> > > > + \
> > > >      } \
> > > >      break;
> > > >
> > > > @@ -528,6 +514,7 @@ arc_do_relocation (bfd_byte * contents, struct
> > > > arc_relocation_data reloc_data)
> > > >    bfd_vma relocation = 0;
> > > >    bfd_vma insn;
> > > >    bfd_vma orig_insn ATTRIBUTE_UNUSED;
> > > > +  bfd * abfd = reloc_data.input_section->owner;
> > > >
> > > >    if (reloc_data.should_relocate == FALSE)
> > > >      return bfd_reloc_notsupported; @@ -535,13 +522,13 @@
> > > > arc_do_relocation (bfd_byte * contents, struct arc_relocation_data
> > > > reloc_data)
> > > >    switch (reloc_data.howto->size)
> > > >      {
> > > >        case 2:
> > > > -	insn = arc_bfd_get_32 (reloc_data.input_section->owner,
> > > > +	insn = arc_bfd_get_32 (abfd,
> > > >  			       contents + reloc_data.reloc_offset,
> > > >  			       reloc_data.input_section);
> > > >  	break;
> > > >        case 1:
> > > >        case 0:
> > > > -	insn = arc_bfd_get_16 (reloc_data.input_section->owner,
> > > > +	insn = arc_bfd_get_16 (abfd,
> > > >  			       contents + reloc_data.reloc_offset,
> > > >  			       reloc_data.input_section);
> > > >  	break;
> > > > @@ -569,7 +556,7 @@ arc_do_relocation (bfd_byte * contents, struct
> > > > arc_relocation_data reloc_data)
> > > >        flag = bfd_check_overflow (reloc_data.howto-
> > >complain_on_overflow,
> > > >  				 reloc_data.howto->bitsize,
> > > >  				 reloc_data.howto->rightshift,
> > > > -				 bfd_arch_bits_per_address
> > > > (reloc_data.input_section->owner),
> > > > +				 bfd_arch_bits_per_address (abfd),
> > > >  				 relocation);
> > > >
> > > >  #undef DEBUG_ARC_RELOC
> > > > @@ -594,13 +581,13 @@ arc_do_relocation (bfd_byte * contents,
> > > > struct arc_relocation_data reloc_data)
> > > >    switch (reloc_data.howto->size)
> > > >      {
> > > >        case 2:
> > > > -	arc_bfd_put_32 (reloc_data.input_section->owner, insn,
> > > > +	arc_bfd_put_32 (abfd, insn,
> > > >  		       contents + reloc_data.reloc_offset,
> > > >  		       reloc_data.input_section);
> > > >  	break;
> > > >        case 1:
> > > >        case 0:
> > > > -	arc_bfd_put_16 (reloc_data.input_section->owner, insn,
> > > > +	arc_bfd_put_16 (abfd, insn,
> > > >  		       contents + reloc_data.reloc_offset,
> > > >  		       reloc_data.input_section);
> > > >  	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..9f2a5d6
> > > > 100644
> > > > --- a/include/ChangeLog
> > > > +++ b/include/ChangeLog
> > > > @@ -1,3 +1,9 @@
> > > > +2016-01-06  Andrew Burgess  <andrew.burgess@embecosm.com>
> > > > +	    Cupertino Miranda  <Cupertino.Miranda@synopsys.com>
> > > > +
> > > > +	* elf/arc-reloc.def: Add a call to ME within the formula for each
> > > > +	relocation that requires middle-endian correction.
> > > > +
> > > >  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..cb43a21 100644
> > > > --- a/include/elf/arc-reloc.def
> > > > +++ b/include/elf/arc-reloc.def
> > > > @@ -80,56 +80,56 @@ ARC_RELOC_HOWTO(ARC_S21H_PCREL, 14, \
> > > >                  20, \
> > > >                  replace_disp21h, \
> > > >                  signed, \
> > > > -                ( ( ( S + A ) - P ) >> 1 ))
> > > > +                ( ME ( ( ( S + A ) - P ) >> 1 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_S21W_PCREL, 15, \
> > > >                  2, \
> > > >                  19, \
> > > >                  replace_disp21w, \
> > > >                  signed, \
> > > > -                ( ( ( S + A ) - P ) >> 2 ))
> > > > +                ( ME ( ( ( S + A ) - P ) >> 2 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_S25H_PCREL, 16, \
> > > >                  2, \
> > > >                  24, \
> > > >                  replace_disp25h, \
> > > >                  signed, \
> > > > -                ( ( ( S + A ) - P ) >> 1 ))
> > > > +                ( ME ( ( ( S + A ) - P ) >> 1 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_S25W_PCREL, 17, \
> > > >                  2, \
> > > >                  23, \
> > > >                  replace_disp25w, \
> > > >                  signed, \
> > > > -                ( ( ( S + A ) - P ) >> 2 ))
> > > > +                ( ME ( ( ( S + A ) - P ) >> 2 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_SDA32, 18, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  signed, \
> > > > -                ( ( S + A ) - _SDA_BASE_ ))
> > > > +                ( ME ( ( S + A ) - _SDA_BASE_ )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_SDA_LDST, 19, \
> > > >                  2, \
> > > >                  9, \
> > > >                  replace_disp9ls, \
> > > >                  signed, \
> > > > -                ( ( S + A ) - _SDA_BASE_ ))
> > > > +                ( ME ( ( S + A ) - _SDA_BASE_ )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_SDA_LDST1, 20, \
> > > >                  2, \
> > > >                  9, \
> > > >                  replace_disp9ls, \
> > > >                  signed, \
> > > > -                ( ( ( S + A ) - _SDA_BASE_ ) >> 1 ))
> > > > +                ( ME ( ( ( S + A ) - _SDA_BASE_ ) >> 1 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_SDA_LDST2, 21, \
> > > >                  2, \
> > > >                  9, \
> > > >                  replace_disp9ls, \
> > > >                  signed, \
> > > > -                ( ( ( S + A ) - _SDA_BASE_ ) >> 2 ))
> > > > +                ( ME ( ( ( S + A ) - _SDA_BASE_ ) >> 2 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_SDA16_LD, 22, \
> > > >                  1, \
> > > > @@ -171,42 +171,42 @@ ARC_RELOC_HOWTO(ARC_32_ME, 27, \
> > > >                  32, \
> > > >                  replace_limm, \
> > > >                  signed, \
> > > > -                ( S + A ))
> > > > +                ( ME ( S + A )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_32_ME_S, 105, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_limms, \
> > > >                  signed, \
> > > > -                ( S + A ))
> > > > +                ( ME ( S + A )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_N32_ME, 28, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  bitfield, \
> > > > -                ( S - A ))
> > > > +                ( ME ( S - A )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_SECTOFF_ME, 29, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  bitfield, \
> > > > -                ( ( S - SECTSTART ) + A ))
> > > > +                ( ME ( ( S - SECTSTART ) + A )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_SDA32_ME, 30, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_limm, \
> > > >                  signed, \
> > > > -                ( ( S + A ) - _SDA_BASE_ ))
> > > > +                ( ME ( ( S + A ) - _SDA_BASE_ )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_W_ME, 31, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  bitfield, \
> > > > -                ( S + A ))
> > > > +                ( ME ( S + A )))
> > > >
> > > >  ARC_RELOC_HOWTO(AC_SECTOFF_U8, 35, \
> > > >                  2, \
> > > > @@ -255,14 +255,14 @@ ARC_RELOC_HOWTO(ARC_SECTOFF_ME_1,
> 41,
> > \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  bitfield, \
> > > > -                ( ( ( S - SECTSTART ) + A ) >> 1 ))
> > > > +                ( ME ( ( ( S - SECTSTART ) + A ) >> 1 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_SECTOFF_ME_2, 42, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  bitfield, \
> > > > -                ( ( ( S - SECTSTART ) + A ) >> 2 ))
> > > > +                ( ME ( ( ( S - SECTSTART ) + A ) >> 2 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_SECTOFF_1, 43, \
> > > >                  2, \
> > > > @@ -297,7 +297,7 @@ ARC_RELOC_HOWTO(ARC_PC32, 50, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  signed, \
> > > > -                ( ( S + A ) - P ))
> > > > +                ( ME ( ( S + A ) - P )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_GOT32, 59, \
> > > >                  2, \
> > > > @@ -311,14 +311,14 @@ ARC_RELOC_HOWTO(ARC_GOTPC32, 51, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  signed, \
> > > > -                ( ( ( GOT + G ) + A ) - P ))
> > > > +                ( ME ( ( ( GOT + G ) + A ) - P )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_PLT32, 52, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  signed, \
> > > > -                ( ( L + A ) - P ))
> > > > +                ( ME ( ( L + A ) - P )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_COPY, 53, \
> > > >                  2, \
> > > > @@ -339,42 +339,42 @@ ARC_RELOC_HOWTO(ARC_JMP_SLOT, 55, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  signed, \
> > > > -                S)
> > > > +                ( ME ( S )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_RELATIVE, 56, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  signed, \
> > > > -                ( B + A ))
> > > > +                ( ME ( B + A )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_GOTOFF, 57, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  signed, \
> > > > -                ( ( S + A ) - GOT ))
> > > > +                ( ME ( ( S + A ) - GOT )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_GOTPC, 58, \
> > > >                  2, \
> > > >                  32, \
> > > >                  replace_word32, \
> > > >                  signed, \
> > > > -                ( ( GOT + A ) - P ))
> > > > +                ( ME ( ( GOT + A ) - P )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_S21W_PCREL_PLT, 60, \
> > > >                  2, \
> > > >                  19, \
> > > >                  replace_disp21w, \
> > > >                  signed, \
> > > > -                ( ( ( L + A ) - P ) >> 2 ))
> > > > +                ( ME ( ( ( L + A ) - P ) >> 2 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_S25H_PCREL_PLT, 61, \
> > > >                  2, \
> > > >                  24, \
> > > >                  replace_disp25h, \
> > > >                  signed, \
> > > > -                ( ( ( L + A ) - P ) >> 1 ))
> > > > +                ( ME ( ( ( L + A ) - P ) >> 1 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_TLS_DTPMOD, 66, \
> > > >                  2, \
> > > > @@ -451,12 +451,12 @@ ARC_RELOC_HOWTO(ARC_S25W_PCREL_PLT,
> > 76, \
> > > >                  23, \
> > > >                  replace_disp25w, \
> > > >                  signed, \
> > > > -                ( ( ( L + A ) - P ) >> 2 ))
> > > > +                ( ME ( ( ( L + A ) - P ) >> 2 )))
> > > >
> > > >  ARC_RELOC_HOWTO(ARC_S21H_PCREL_PLT, 77, \
> > > >                  2, \
> > > >                  20, \
> > > >                  replace_disp21h, \
> > > >                  signed, \
> > > > -                ( ( ( L + A ) - P ) >> 1 ))
> > > > +                ( ME ( ( ( L + A ) - P ) >> 1 )))
> > > >
> > > > --
> > > > 2.6.4
> > >

Attachment: relocs.patch
Description: relocs.patch


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