This is the mail archive of the binutils@sources.redhat.com 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]

Re: mn10300 GAS: remove a gross, disgusting hack :-)


Alexandre Oliva wrote:
> 
> Ok to install?
> 

Yep.

-eric

>   ------------------------------------------------------------------------
> Index: gas/ChangeLog
> from  Alexandre Oliva  <aoliva@redhat.com>
>         * config/tc-mn10300.c (md_assemble): Simplify offset adjustment of
>         pc-relative relocations not placed at the end of the instruction.
> 
> Index: gas/config/tc-mn10300.c
> ===================================================================
> RCS file: /cvs/src/src/gas/config/tc-mn10300.c,v
> retrieving revision 1.20
> diff -u -p -r1.20 tc-mn10300.c
> --- gas/config/tc-mn10300.c 2001/04/06 07:50:48 1.20
> +++ gas/config/tc-mn10300.c 2001/04/12 21:22:03
> @@ -937,7 +937,7 @@ md_assemble (str)
>    struct mn10300_opcode *next_opcode;
>    const unsigned char *opindex_ptr;
>    int next_opindex, relaxable;
> -  unsigned long insn, extension, size = 0, real_size;
> +  unsigned long insn, extension, size = 0;
>    char *f;
>    int i;
>    int match;
> @@ -1513,8 +1513,6 @@ keep_going:
>    if (opcode->format == FMT_D4)
>      size = 6;
> 
> -  real_size = size;
> -
>    if (relaxable && fc > 0)
>      {
>        int type;
> @@ -1729,25 +1727,14 @@ keep_going:
>               /* Is the reloc pc-relative?  */
>               pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0;
> 
> -             /* Gross.  This disgusting hack is to make sure we
> -                get the right offset for the 16/32 bit reloc in
> -                "call" instructions.  Basically they're a pain
> -                because the reloc isn't at the end of the instruction.  */
> -             if ((size == 5 || size == 7)
> -                 && (((insn >> 24) & 0xff) == 0xcd
> -                     || ((insn >> 24) & 0xff) == 0xdd))
> -               size -= 2;
> -
> -             /* Similarly for certain bit instructions which don't
> -                hav their 32bit reloc at the tail of the instruction.  */
> -             if (size == 7
> -                 && (((insn >> 16) & 0xffff) == 0xfe00
> -                     || ((insn >> 16) & 0xffff) == 0xfe01
> -                     || ((insn >> 16) & 0xffff) == 0xfe02))
> -               size -= 1;
> -
>               offset = size - reloc_size / 8;
> 
> +             /* If the pcrel relocation isn't at the end of the insn,
> +                we have to adjust the offset for the relocation to be
> +                correct.  */
> +             if (pcrel)
> +               offset -= operand->shift / 8;
> +
>               /* Choose a proper BFD relocation type.  */
>               if (pcrel)
>                 {
> @@ -1791,7 +1778,7 @@ keep_going:
>         }
>      }
> 
> -  dwarf2_emit_insn (real_size);
> +  dwarf2_emit_insn (size);
>  }
> 
>  /* If while processing a fixup, a reloc really needs to be created
> 
>   ------------------------------------------------------------------------
> 
> --
> Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
> Red Hat GCC Developer                  aoliva@{cygnus.com, redhat.com}
> CS PhD student at IC-Unicamp        oliva@{lsd.ic.unicamp.br, gnu.org}
> Free Software Evangelist    *Please* write to mailing lists, not to me

-- 
I will not dissect things unless instructed


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