Re: Problems with trampoline.S with 64 bit binutils

Alan Modra (alan@SPRI.Levels.UniSA.Edu.Au)
Thu, 29 Jul 1999 08:22:11 +0930 (CST)


On Wed, 28 Jul 1999, Ralf Baechle wrote:

> Exactly the same also happens to a crosscompiler mips-irix6.5 -> i386-linux.
> In that setup no 64-bit BFD was involved and the i386-linux targets were
> the only ones configured. Binutils were compiled as N32 binary, so also it
> cannot be a problem caused by the larger type sizes of a 64-bit host.

Since this thread hasn't died due to lack of interest, I'd better post the
fix :-)

> --- binutils-current/gas/write.c~ Fri Jul 16 17:57:19 1999
> +++ binutils-current/gas/write.c Tue Jul 27 20:32:04 1999
> @@ -2733,24 +2733,13 @@
> {
> if ((size_t) size < sizeof (valueT))
> {
> - valueT mask, hibit;
> + valueT mask;
>
> - /* set all bits to one */
> mask = 0;
> - mask--;
> - /* Technically, combining these produces an undefined result
> - if size is sizeof (valueT), though I think these two
> - half-way operations should both be defined. And the
> - compiler should be able to combine them if it's valid on
> - the host architecture. */
> - mask <<= size * 4;
> - mask <<= size * 4;
> - hibit = (valueT) 1 << (size * 8 - 1);
> - if (((add_number & mask) != 0
> - || (fixP->fx_signed
> - && (add_number & hibit) != 0))
> - && ((add_number & mask) != mask
> - || (add_number & hibit) == 0))
> + mask--; /* set all bits to one */
> + mask <<= size * 8 - (fixP->fx_signed ? 1 : 0);
> + if ((add_number & mask) != 0
> + && (add_number & mask) != mask)
> {
> char buf[50], buf2[50];
> sprint_value (buf, fragP->fr_address + where);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/