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