[comp.lang.c++] Problem with asm

johnston@uiucdcsb.UUCP (01/24/87)

I think I've discovered a bug in the way cfront handles asm's in inlines.
I first noticed it using version 1.1 which I had ported to our Encore
Multimax (UMAX 4.2).  I first assumed that I had subtly botched the build
in some way, but the older version 1.0 compilers on our VAX 11/780 (4.3bsd)
and 3B2s do the same thing.  Here's some code to illustrate the problem:

C++ source code:

	inline void Barney() { asm("	op	src,dst"); }
	void Fred() { Barney(); }

C code for Fred() generated by cfront:

	int Fred () { { asm("rney"); } }

Any ideas?  Notice that "rney" is part of "Barney", the name of the
inline function.  I'd like to be able to generate inline assembly language
in some very low-level routines which need to be fast (i.e., I don't want
the subroutine call overhead and I *need* access to specific processor
instructions (like setting bits in the PSR to enable/disable interrupts,
etc.).  Thanks.

- Gary Johnston

Department of Computer Science
University of Illinois at Urbana-Champaign
1304 West Springfield Avenue
Urbana, IL 61801

Phone: (217) 333-2518

USENET:	{pur-ee,convex,inhp4}!uiucdcs!johnston
ARPA:	johnston@b.cs.uiuc.edu
CSNET:	johnston%uiuc@csnet-relay

bs@alice.UUCP (02/02/87)

I think I've discovered a bug in the way cfront handles asm's in inlines.
***> You did. Thanks. Quick and dirty fix follows.

I first noticed it using version 1.1 which I had ported to our Encore
Multimax (UMAX 4.2).  I first assumed that I had subtly botched the build
in some way, but the older version 1.0 compilers on our VAX 11/780 (4.3bsd)
and 3B2s do the same thing.  Here's some code to illustrate the problem:

C++ source code:
*/
	inline void Barney() { asm("	op	src,dst"); }
	void Fred() { Barney(); }
/*
C code for Fred() generated by cfront:

	int Fred () { { asm("rney"); } }

Any ideas?  Notice that "rney" is part of "Barney", the name of the
inline function.  I'd like to be able to generate inline assembly language
in some very low-level routines which need to be fast (i.e., I don't want
the subroutine call overhead and I *need* access to specific processor
instructions (like setting bits in the PSR to enable/disable interrupts,
etc.). Thanks.

- Gary Johnston

Department of Computer Science
University of Illinois at Urbana-Champaign
1304 West Springfield Avenue
Urbana, IL 61801

Phone: (217) 333-2518

USENET:	{pur-ee,convex,inhp4}!uiucdcs!johnston
b.cs.uiuc.edu
csnet-relay
***> Here is a fix.

	in dcl2.c: grep for "ASM:" and change the case to:

		case ASM:
			/* save string */
		{
			char* s = (char*)ss->e;
			int ll = strlen(s);
			char* s2 = new char[ll+1];
			strcpy(s2,s);
			ss->e = Pexpr(s2);
			break;
		}

	The ``save string'' comment was always there. I forgot to obey it.

	in dcl.c: grep for "ASM:" and change the case to:

		case ASM:
		{	Pbase b = (Pbase)tp;
			Pname n = tbl->insert(this,0);
			n->assign();
			n->use();
			char* s = (char*) b->b_name;	// save asm string. Shoddy
			int ll = strlen(s);
			char* s2 = new char[ll+1];
			strcpy(s2,s);
			b->b_name = Pname(s2);
			return this;
		}

	in expand.c add ASM cases to the two switches in stmt::expand:

		case ASM:
			if (s_list) {
				ee = new expr(CM, ee, (Pexpr)s_list->expand());
				PERM(ee);
			}
			return (Pstmt)ee;

	and
		case ASM:
			break;
*/