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; */