PATCH: Fix sign-extension of bignums

Ian Lance Taylor ian@wasabisystems.com
Wed Aug 11 03:00:00 GMT 2004


Ian Lance Taylor <ian@wasabisystems.com> writes:

> The real problem is that we've already applied the negation, and the
> result has overflowed so that it appears to be a positive number.

Specifically, see this comment in expr.c:

	    if (c == '-')
	      {
		expressionP->X_add_number = - expressionP->X_add_number;
		/* Notice: '-' may overflow: no warning is given.
		   This is compatible with other people's
		   assemblers.  Sigh.  */
		expressionP->X_unsigned = 0;

I don't see any particularly obvious to fix this problem.  One fix
would seem to be to change expr() to pass in the size of the desired
result.  Then use that when doing arithmetic.  In other words, handle
these differently within expr() and operand():
  .8byte -3378511873
  .4byte -3378511873

Another fix might be to not resolve constant expressions as we go, and
instead resolve them using the desired size, although that would tend
to slow down the assembler.

Neither of these sound quite right, somehow.

Ian



More information about the Binutils mailing list