[gnu.utils.bug] gas-1.34

jfp@practic.UUCP (John F. Peters) (07/13/89)

DESCRIPTION:
   gas-1.34(ns32k) sometimes produces a displacement that is 
   slightly too large, and misses its target by a few bytes.

REPEAT-BY:
   Assemble this program, and examine the output file.
   Three displacement fields will be in error.
------------------------------------------------------------------------------
	.globl	_gets
_gets:
	enter	[r6,r7],0
	movd	12(fp),r7	
L93:
	cxp	_getchar	|ERROR: disp is 0xfffffffe should be 0xfffffffc
	movd	r0,r6	
	andd	127,r6	
L94:
	movd	r6,r0	
	br	L96
L97:
L98:
	addr	@10,r6	
	movqb	0,0(r7)	
	addqd	1,r7	
	br	L90
L99:
L100:
	addqd	-1,r7	
	cmpd	r7,12(fp)	
	bge	L101
	movd	12(fp),r7	
L101:
	br	L91		|ERROR: disp is L91+3
L102:
L103:
	movd	12(fp),r7	
	addr	@10,tos	
	cxp	_putchar	
	adjspb	-4
	br	L91
L104:
	movb	r6,0(r7)	
	addqd	1,r7	
	br	L95
L96:
	cmpd	8,r0
	beq	L99
	cmpd	10,r0
	beq	L97
	cmpd	13,r0
	beq	L98
	cmpd	21,r0
	beq	L103
	cmpd	35,r0
	beq	L100
	cmpd	64,r0
	beq	L102
	br	L104
L95:
L91:
	br	L93		|ERROR: disp is L93+3
L92:
L90:
	exit	[r6,r7]
	rxp	0
------------------------------------------------------------------------------

FIX:
   There is a brace error near the end of convert_iif(ns32k.c),
   that effectively accrues the size of *all* the iif entries
   into size_so_far, including the dead (i.e. type==0) ones.
   Every now and then, a dead entry will have a non-zero size
   left from a previous instruction, and this gets added to
   size_so_far.  The overlarge size_so_far is assigned to a
   fragment's fr_pcrel_adjust field, and later, md_convert_frag
   (ns32k.c) dutifully adds this bogus value to an otherwise-
   correct displacement.

------------------------------------------------------------------------------
*** ns32k.c.00	Fri May 26 19:35:55 1989
--- ns32k.c	Fri Jun 30 18:12:52 1989
***************
*** 1194,1197
  	  as_fatal("Internal logic error in iif.iifP[].type");
  	}
        }
        size_so_far+=size;

--- 1194,1199 -----
  	  as_fatal("Internal logic error in iif.iifP[].type");
  	}
+         size_so_far+=size;
+         size=0;
        }
      }
***************
*** 1195,1200
  	}
        }
-       size_so_far+=size;
-       size=0;
      }
  }

--- 1197,1200 -----
          size=0;
        }
      }
  }


-- 
jfp@practic.com   {uunet,sun,pyramid}!practic!jfp   408 749 8900