[comp.bugs.4bsd] 4.3BSD c2 mangles some asm statements

ado@elsie.UUCP (Arthur David Olson) (12/02/86)

Index:	lib/c2/c21.c 4.3 Fix

Description:
	The 4.3BSD C optimizer (c2) mangles some asm statements.

Repeat-By:
	Do a "cc -S -O" of a file containing the lines:

		static k(i)	{ asm("chmk 4(ap)"); }

		static e(i)	{ asm("chme 4(ap)"); }

	and note the contents of the resulting assembly-language file:

		.data
		.text
		.set	L12,0x0
		.data
		.text
		.set	L17,0x0
		.data
		.text
		LL0:.align	1
		_k:.word	L12
		L2000000:chmk	4(ap)
		ret
		.align	1
		_e:.word	L17
		jbr	L2000000

	where the "chme" instruction in the original source has disappeared.

Fix:
	Here are changes to the function "equop" in the file "c21.c" that
	will avoid false optimizations of the kind illustrated above.
	The changes also cause the optimizer to (unconditionally) produce
	a warning message if your source code would be incorrectly compiled
	on uncorrected 4.3 systems.  The changes are conditionally compiled
	based on "ASWAS."  As always, should you or any. . .sorry, wrong tape.
	As always, the trade secret status of the code involved
	precludes a clearer posting.

	.
	.
	.
	if (cp1==0 && cp2==0)
#ifdef ASWAS
		return(1);
#else /* !ASWAS */
		if (p1->pop == p2->pop)
			return 1;
		else	goto dowarn;
#endif /* !ASWAS */
	if (cp1==0 || cp2==0)
		return(0);
	while (*cp1 == *cp2++)
		if (*cp1++ == 0)
#ifdef ASWAS
			return(1);
#else /* !ASWAS */
			if (p1->pop == p2->pop)
				return 1;
			else {
dowarn:
				(void) fprintf(stderr,
"c2: warning--\"%s %s\" & \"%s %s\" are the same to standard 4.3 C optimizer\n",
					p1->pop->opstring,
					(p1->code == 0) ? "" : p1->code,
					p2->pop->opstring,
					(p2->code == 0) ? "" : p2->code);
				return 0;
			}
#endif /* !ASWAS */
	return(0);
	.
	.
	.
--
Bug/s is a trademark of Volkswagen/Warner Brothers.
C is a trademark of Jack Benny/Mel Blanc.
--
	UUCP: ..decvax!seismo!elsie!ado   ARPA: elsie!ado@seismo.ARPA
	DEC, VAX, Elsie & Ado are Digital, Borden & Ampex trademarks.