+ putprintf( " .text" , 0 );
+ putprintf( " .align 1" , 0 );
+ putprintf( " .globl _main" , 0 );
+ putprintf( "_main:" , 0 );
+ putprintf( " .word 0" , 0 );
+ putprintf( " calls $0,_PCSTART" , 0 );
+ putprintf( " movl 4(ap),__argc" , 0 );
+ putprintf( " movl 8(ap),__argv" , 0 );
+ putprintf( " calls $0,_program" , 0 );
+ putprintf( " calls $0,_PCEXIT" , 0 );
+ ftnno = fp -> entloc;
+ putprintf( " .text" , 0 );
+ putprintf( " .align 1" , 0 );
+ putprintf( " .globl _program" , 0 );
+ putprintf( "_program:" , 0 );
+ } else {
+ ftnno = fp -> entloc;
+ putprintf( " .text" , 0 );
+ putprintf( " .align 1" , 0 );
+ putprintf( " .globl " , 1 );
+ for ( i = 1 ; i < cbn ; i++ ) {
+ putprintf( EXTFORMAT , 1 , enclosing[ i ] );
+ }
+ putprintf( "" , 0 );
+ for ( i = 1 ; i < cbn ; i++ ) {
+ putprintf( EXTFORMAT , 1 , enclosing[ i ] );
+ }
+ putprintf( ":" , 0 );
+ }
+ stablbrac( cbn );
+ /*
+ * register save mask
+ */
+ if ( opt( 't' ) ) {
+ putprintf( " .word 0x%x" , 0 , RUNCHECK | RSAVEMASK );
+ } else {
+ putprintf( " .word 0x%x" , 0 , RSAVEMASK );
+ }
+ putjbr( botlabel );
+ putlab( toplabel );
+ if ( profflag ) {
+ /*
+ * call mcount for profiling
+ */
+ putprintf( " moval 1f,r0" , 0 );
+ putprintf( " jsb mcount" , 0 );
+ putprintf( " .data" , 0 );
+ putprintf( " .align 2" , 0 );
+ putprintf( "1:" , 0 );
+ putprintf( " .long 0" , 0 );
+ putprintf( " .text" , 0 );
+ }
+ /*
+ * set up unwind exception vector.
+ */
+ putprintf( " moval %s,%d(%s)" , 0
+ , UNWINDNAME , UNWINDOFFSET , P2FPNAME );
+ /*
+ * save address of display entry, for unwind.
+ */
+ putprintf( " moval %s+%d,%d(%s)" , 0
+ , DISPLAYNAME , cbn * sizeof(struct dispsave)
+ , DPTROFFSET , P2FPNAME );
+ /*
+ * save old display
+ */
+ putprintf( " movq %s+%d,%d(%s)" , 0
+ , DISPLAYNAME , cbn * sizeof(struct dispsave)
+ , DSAVEOFFSET , P2FPNAME );
+ /*
+ * set up new display by saving AP and FP in appropriate
+ * slot in display structure.
+ */
+ putprintf( " movq %s,%s+%d" , 0
+ , P2APNAME , DISPLAYNAME , cbn * sizeof(struct dispsave) );
+ /*
+ * ask second pass to allocate known locals
+ */
+ putlbracket( ftnno , -sizes[ cbn ].om_max );
+ /*
+ * and zero them if checking is on
+ * by calling zframe( bytes of locals , highest local address );
+ */
+ if ( opt( 't' ) ) {
+ if ( ( -sizes[ cbn ].om_max ) > DPOFF1 ) {
+ putleaf( P2ICON , 0 , 0 , ADDTYPE( P2FTN | P2INT , P2PTR )
+ , "_ZFRAME" );
+ putleaf( P2ICON , ( -sizes[ cbn ].om_max ) - DPOFF1
+ , 0 , P2INT , 0 );
+ putLV( 0 , cbn , sizes[ cbn ].om_max , P2CHAR );
+ putop( P2LISTOP , P2INT );
+ putop( P2CALL , P2INT );
+ putdot( filename , line );
+ }
+ /*
+ * check number of longs of arguments
+ * this can only be wrong for formal calls.
+ */
+ if ( fp -> class != PROG ) {
+ putleaf( P2ICON , 0 , 0 , ADDTYPE( P2PTR , P2FTN | P2INT ) ,
+ "_NARGCHK" );
+ putleaf( P2ICON ,
+ (fp->value[NL_OFFS] - DPOFF2) / sizeof(long) ,
+ 0 , P2INT , 0 );
+ putop( P2CALL , P2INT );
+ putdot( filename , line );
+ }
+ }
+#endif PC
+ if ( monflg ) {
+ if ( fp -> value[ NL_CNTR ] != 0 ) {
+ inccnt( fp -> value [ NL_CNTR ] );
+ }
+ inccnt( bodycnts[ fp -> nl_block & 037 ] );