1*738Speter /* Copyright (c) 1979 Regents of the University of California */ 2*738Speter 3*738Speter /* static char sccsid[] = "@(#)pc.h 1.1 08/27/80"; */ 4*738Speter 5*738Speter /* 6*738Speter * random constants for pc 7*738Speter */ 8*738Speter 9*738Speter /* 10*738Speter * the name of the display. 11*738Speter * the display is made up of saved AP's and FP's. 12*738Speter * FP's are used to find locals, and AP's are used to find parameters. 13*738Speter * FP and AP are untyped pointers, but are used throughout as (char *). 14*738Speter * the display is used by adding AP_OFFSET or FP_OFFSET to the 15*738Speter * address of the approriate display entry. 16*738Speter */ 17*738Speter #define DISPLAYNAME "__disply" 18*738Speter struct dispsave { 19*738Speter char *savedAP; 20*738Speter char *savedFP; 21*738Speter }; 22*738Speter #define AP_OFFSET ( 0 ) 23*738Speter #define FP_OFFSET ( sizeof(char *) ) 24*738Speter 25*738Speter /* 26*738Speter * the structure below describes the locals used by the run time system. 27*738Speter * at function entry, at least this much space is allocated, 28*738Speter * and the following information is filled in: 29*738Speter * the address of a routine to close the current frame for unwinding, 30*738Speter * a pointer to the display entry for the current static level and 31*738Speter * the previous contents of the display for this static level. 32*738Speter * the curfile location is used to point to the currently active file, 33*738Speter * and is filled in as io is initiated. 34*738Speter * one of these structures is allocated on the (negatively growing) stack. 35*738Speter * at function entry, fp is set to point to the last field of the struct, 36*738Speter * thus the offsets of the fields are as indicated below. 37*738Speter */ 38*738Speter struct rtlocals { 39*738Speter struct iorec *curfile; 40*738Speter struct dispsave dsave; 41*738Speter struct dispsave *dptr; 42*738Speter int (*unwind)(); 43*738Speter } rtlocs; 44*738Speter #define CURFILEOFFSET ( ( -sizeof rtlocs ) + sizeof rtlocs.unwind ) 45*738Speter #define DSAVEOFFSET ( CURFILEOFFSET + sizeof rtlocs.curfile ) 46*738Speter #define DPTROFFSET ( DSAVEOFFSET + sizeof rtlocs.dsave ) 47*738Speter #define UNWINDOFFSET ( DPTROFFSET + sizeof rtlocs.dptr ) 48*738Speter #define UNWINDNAME "_UNWIND" 49*738Speter 50*738Speter /* 51*738Speter * the register save mask for saving no registers 52*738Speter */ 53*738Speter #define RSAVEMASK ( 0 ) 54*738Speter 55*738Speter /* 56*738Speter * runtime check mask for divide check and integer overflow 57*738Speter */ 58*738Speter #define RUNCHECK ( ( 1 << 15 ) | ( 1 << 14 ) ) 59*738Speter 60*738Speter /* 61*738Speter * formats for various names 62*738Speter * NAMEFORMAT arbitrary length strings. 63*738Speter * EXTFORMAT for externals, a preceding underscore. 64*738Speter * PREFIXFORMAT used to print made up names with prefixes. 65*738Speter * LABELPREFIX with getlab() makes up label names. 66*738Speter * LLABELPREFIX with getlab() makes up sdb labels. 67*738Speter * PLABELPREFIX with atol(symbol) makes up global pascal labels. 68*738Speter * GLABELPREFIX with getlab() makes up nested label names 69*738Speter * a typical use might be to print out a name with a preceeding underscore 70*738Speter * with putprintf( EXTFORMAT , 0 , name ); 71*738Speter */ 72*738Speter #define NAMEFORMAT "%s" 73*738Speter #define EXTFORMAT "_%s" 74*738Speter #define PREFIXFORMAT "%s%d" 75*738Speter #define LABELPREFIX "L" 76*738Speter #define LLABELPREFIX "LL" 77*738Speter #define PLABELPREFIX "P" 78*738Speter #define GLABELPREFIX "G" 79*738Speter 80*738Speter /* 81*738Speter * the name of the statement counter 82*738Speter */ 83*738Speter #define STMTCOUNT "__stcnt" 84*738Speter 85*738Speter /* 86*738Speter * the name of the pcp counters 87*738Speter */ 88*738Speter #define PCPCOUNT "__pcpcount" 89*738Speter 90*738Speter /* 91*738Speter * a vector of pointer to enclosing functions for fully qualified names. 92*738Speter */ 93*738Speter char *enclosing[ DSPLYSZ ]; 94*738Speter 95*738Speter /* 96*738Speter * and of course ... 97*738Speter */ 98*738Speter #define BITSPERBYTE 8 99*738Speter 100*738Speter /* 101*738Speter * error number for case label not found (ECASE) 102*738Speter * stolen from ~mckusick/px/lib/h01errs.h 103*738Speter */ 104*738Speter #define ECASE 5 105