[comp.sys.amiga.tech] 2 bugs in Manx "cc" V3.6a

ins_adjb@jhunix.HCF.JHU.EDU (Daniel Jay Barrett) (02/13/89)

	I have discovered 2 bugs in Manx 3.6a.  Both of these bugs
cause "cc" to generate code that "as" rejects.  Enclosed are minimal
programs that exhibit these bugs.  (I have enclosed a complete "shar"
file containing the programs, their assembly language output, and
very similar programs that do not exhibit the bugs.  Enjoy.  :-))

	Does Jim Goodnow have an e-mail address where I can send this?

	Anyway, the programs are very simple.  In a nutshell:

/* #1:  This gives the assembler error:
	tst.l	#.1
	     	   ^
File ram:ctmpA72.888; Line 6 # Opcode operands did not match.
src=0 dst=400
*/
		awful()
		{
			if ("any string")
				exit(0);
		}

/* #2:  This gives the assembler error:
	rol.w	#-8,d0
	     	    ^
File ram:ctmpA72.888; Line 8 # Opcode operands did not match.
src=1008400 dst=1
*/
		typedef struct
		{
		  unsigned      index:24,
			   constraint:8;
		} position;
		
		foo(p)
		position p;
		{
			char c;
			c = p.constraint;
		}


# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by crabcake!barrett on Sat Feb 11 20:38:25 EST 1989
# Contents:  COMPILING README rolwBug.asm rolwBug.c rolwNoBug.asm rolwNoBug.c
#	tstlBug.asm tstlBug.c tstlNoBug.asm tstlNoBug.c
 
echo x - COMPILING
sed 's/^@//' > "COMPILING" <<'@//E*O*F COMPILING//'
tstlBug.c:	Compile simply with "cc tstlBug.c".
		This generates the following ASSEMBLER ERROR:

	tst.l	#.1
	     	   ^
File ram:ctmpA72.888; Line 6 # Opcode operands did not match.
src=0 dst=400

----------------------------------------------------------------------
rolwBug.c:	Compile with "cc +L rolwBug.c".
		This generates the following ASSEMBLER ERROR:

	rol.w	#-8,d0
	     	    ^
File ram:ctmpA72.888; Line 8 # Opcode operands did not match.
src=1008400 dst=1


@//E*O*F COMPILING//
chmod u=rw,g=r,o=r COMPILING
 
echo x - README
sed 's/^@//' > "README" <<'@//E*O*F README//'
What I have discovered
----------------------
	I have discovered two bugs in the Manx 3.6a compiler.  Both
of these bugs cause the compiler to generate assembly code that the
assembler rejects.
	Enclosed are two sample programs that exhibit the errors.
"tstlBug.c" generates a "tst.l" instruction that the assembler dislikes,
and "rolwBug.c" generates a "rol.w" instruction that the assembler 
also dislikes.

Also enclosed are:

	tstlBug.asm:	The assembly language produced from tstlBug.c
	rolwBug.asm:	The assembly language produced from rolwBug.c

	tstlNoBug.c:	A legal version of tstlBug.c	
	tstlNoBug.asm:	Its assembly language output
	rolwNoBug.c:	A legal version of rolwBug.c
	rolwNoBug.asm:	Its assembly language output

To compile these programs
-------------------------

	See the enclosed file "COMPILING".
	
What about older versions of "cc"?
----------------------------------
	tstlBug.c produces the same assembler error using Manx cc
V3.4 and V3.2.
	However, both V3.4 and V3.2 refuse to compile rolwBug.c,
citing errors 118 ("field is too wide" for index:24) and 120
("invalid type for field" for both index:24 and constraint:8).

Where did this code come from?
------------------------------

	From the GNU Project version of "grep", "E?GREP", but cut
down massively to produce minimal programs exhibiting the bugs.
@//E*O*F README//
chmod u=rw,g=r,o=r README
 
echo x - rolwBug.asm
sed 's/^@//' > "rolwBug.asm" <<'@//E*O*F rolwBug.asm//'
;:ts=8
	public	_foo
_foo:
	link	a5,#.2
	movem.l	.3,-(sp)
	lea	8(a5),a0
	move.l	(a0),d0
	rol.w	#-8,d0
	and.w	#255,d0
	move.b	d0,-1(a5)
@.4
	movem.l	(sp)+,.3
	unlk	a5
	rts
@.2	equ	-2
@.3	reg	
	public	.begin
	dseg
	end
@//E*O*F rolwBug.asm//
chmod u=rw,g=r,o=r rolwBug.asm
 
echo x - rolwBug.c
sed 's/^@//' > "rolwBug.c" <<'@//E*O*F rolwBug.c//'
typedef struct
{
  unsigned      index:24,
	   constraint:8;
} position;

foo(p)
position p;
{
	char c;
	c = p.constraint;
}
@//E*O*F rolwBug.c//
chmod u=rw,g=r,o=r rolwBug.c
 
echo x - rolwNoBug.asm
sed 's/^@//' > "rolwNoBug.asm" <<'@//E*O*F rolwNoBug.asm//'
;:ts=8
	public	_foo
_foo:
	link	a5,#.2
	movem.l	.3,-(sp)
	lea	8(a5),a0
	move.l	(a0),d0
	and.w	#255,d0
	move.b	d0,-1(a5)
@.4
	movem.l	(sp)+,.3
	unlk	a5
	rts
@.2	equ	-2
@.3	reg	
	public	.begin
	dseg
	end
@//E*O*F rolwNoBug.asm//
chmod u=rw,g=r,o=r rolwNoBug.asm
 
echo x - rolwNoBug.c
sed 's/^@//' > "rolwNoBug.c" <<'@//E*O*F rolwNoBug.c//'
typedef struct
{
  unsigned      constraint:8,
		index:24;
} position;

foo(p)
position p;
{
	char c;
	c = p.constraint;
}
@//E*O*F rolwNoBug.c//
chmod u=rw,g=r,o=r rolwNoBug.c
 
echo x - tstlBug.asm
sed 's/^@//' > "tstlBug.asm" <<'@//E*O*F tstlBug.asm//'
;:ts=8
	public	_awful
_awful:
	link	a5,#.2
	movem.l	.3,-(sp)
	tst.l	#.1
	beq	.4
	clr.w	-(sp)
	jsr	_exit
	add.w	#2,sp
@.4
@.5
	movem.l	(sp)+,.3
	unlk	a5
	rts
@.2	equ	0
@.3	reg	
@.1
	dc.b	97,110,121,32,115,116,114,105,110,103,0
	ds	0
	public	_exit
	public	.begin
	dseg
	end
@//E*O*F tstlBug.asm//
chmod u=rw,g=r,o=r tstlBug.asm
 
echo x - tstlBug.c
sed 's/^@//' > "tstlBug.c" <<'@//E*O*F tstlBug.c//'
awful()
{
	if ("any string")
		exit(0);
}
@//E*O*F tstlBug.c//
chmod u=rw,g=r,o=r tstlBug.c
 
echo x - tstlNoBug.asm
sed 's/^@//' > "tstlNoBug.asm" <<'@//E*O*F tstlNoBug.asm//'
;:ts=8
	public	_awful
_awful:
	link	a5,#.2
	movem.l	.3,-(sp)
	dseg
@.4
	dc.b	97
	dc.b	110
	dc.b	121
	dc.b	32
	dc.b	115
	dc.b	116
	dc.b	114
	dc.b	105
	dc.b	110
	dc.b	103
	dc.b	0
	cseg
	lea	.4,a0
	move.l	a0,d0
	beq	.5
	clr.w	-(sp)
	jsr	_exit
	add.w	#2,sp
@.5
@.6
	movem.l	(sp)+,.3
	unlk	a5
	rts
@.2	equ	0
@.3	reg	
	public	_exit
	public	.begin
	dseg
	end
@//E*O*F tstlNoBug.asm//
chmod u=rw,g=r,o=r tstlNoBug.asm
 
echo x - tstlNoBug.c
sed 's/^@//' > "tstlNoBug.c" <<'@//E*O*F tstlNoBug.c//'
awful()
{
	static char c[] = "any string";
	if (c)
		exit(0);
}
@//E*O*F tstlNoBug.c//
chmod u=rw,g=r,o=r tstlNoBug.c
 
echo Inspecting for damage in transit...
temp=/tmp/shar$$; dtemp=/tmp/.shar$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
      18      55     468 COMPILING
      38     182    1333 README
      19      33     213 rolwBug.asm
      12      18     125 rolwBug.c
      18      31     199 rolwNoBug.asm
      12      18     123 rolwNoBug.c
      24      41     267 tstlBug.asm
       5       7      42 tstlBug.c
      36      63     347 tstlNoBug.asm
       6      12      64 tstlNoBug.c
     188     460    3181 total
!!!
wc  COMPILING README rolwBug.asm rolwBug.c rolwNoBug.asm rolwNoBug.c tstlBug.asm tstlBug.c tstlNoBug.asm tstlNoBug.c | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if [ -s $dtemp ]
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0
-- 
Dan Barrett	ins_adjb@jhunix.UUCP			UUCP
		barrett@cs.jhu.edu	(128.220.13.4)	ARPA
Dept. of Computer Science, Johns Hopkins University, Baltimore, MD  21218