1 /* static char *sccsid = "@(#)0.h 2.3 (Berkeley) 05/13/85";*/ 2 /* Copyright (c) 1979 Regents of the University of California */ 3 /* #define DEBUG */ 4 #define CHAR 5 #define STATIC 6 /* 7 * pxp - Pascal execution profiler 8 * 9 * Bill Joy 10 * University of California, Berkeley (UCB) 11 * Version 1.1 February 1978 12 */ 13 14 /* 15 * Option flags 16 * 17 * The following options are recognized on the command line by pxp. 18 * Only the u, w, and z options here have effect in comments in the 19 * program; the others are command line only, and unrelated 20 * to the options with the same designations in comments. 21 * 22 * a Print all routines in a profile; normally, routines 23 * which have never been executed have their bodies suppressed. 24 * 25 * c Extract profile data from the file core, or the file 26 * named after the last argument rather than the file 'pmon.out'. 27 * Must be used with z to have an effect. 28 * 29 * d Suppress declarations 30 * 31 * f Fully parenthesize expressions. 32 * 33 * j Left justify all procedures and functions rather than 34 * indenting them. 35 * 36 * n Eject a new page in the listing as each 'include' file 37 * is incorporated into the profile. 38 * 39 * o Put output prettyprint in first argument file 40 * 41 * p Pretty print a main program without processing 42 * the include statements. 43 * 44 * t Print a table summarizing procedure and function call counts. 45 * 46 * u Card image mode; only the first 72 chars on a line count. 47 * 48 * w Suppress certain warning diagnostics. 49 * 50 * z Generate an execution profile of the program. 51 * May also be followed by a list of procedure and function 52 * names mixed, if desired, with include file names. 53 * Only these procedures and functions, and the contents 54 * of the specified include files will then be profiled. 55 * 56 * [23456789] Use the specified number of spaces for the basic 57 * indenting unit in the program. 58 * 59 * _ Underline keywords in the output. 60 * 61 * O remove `others'. if an `others' label is found in a 62 * case statement the case statement (minus the others case) 63 * is printed as a guarded case statement, and the others case 64 * is the else branch of the guard. this transformation 65 * causes the case selector to be evaluated twice, a lose 66 * if the selector has side-effects. this option is only 67 * available if pxp is compiled with RMOTHERS defined. 68 */ 69 70 char all, core, nodecl, full, justify, pmain, stripcomm, table, underline; 71 char profile, onefile; 72 #ifdef RMOTHERS 73 char rmothers; 74 #endif RMOTHERS 75 char *firstname, *stdoutn; 76 #ifdef DEBUG 77 char fulltrace, errtrace, testtrace, yyunique, typetest; 78 #endif 79 int unit; 80 81 /* 82 * The flag nojunk means that header lines 83 * of procedures and functions are to be suppressed 84 * when the z option is off. 85 * It is the default when command line z option 86 * control is specified. 87 * 88 * The flag noinclude indicates that include statements are not 89 * to be processed since we are pretty-printing the contents 90 * of a single file. 91 * 92 * The flag bracket indicates that the source code should be 93 * bracketed with lines of the form 94 * program x(output); 95 * and 96 * begin end. 97 * so that an include will pretty print without syntax errors. 98 */ 99 char nojunk, noinclude, bracket; 100 101 /* 102 * IMPORTANT NOTE 103 * 104 * Many of the following globals are shared by pi and pxp. 105 * For more discussion of these see the available documentation 106 * on the structure of pi. 107 */ 108 109 /* 110 * Each option has a stack of 17 option values, with opts giving 111 * the current, top value, and optstk the value beneath it. 112 * One refers to option `l' as, e.g., opt('l') in the text for clarity. 113 */ 114 char opts[26]; 115 int optstk[26]; 116 117 #define opt(c) opts[c-'a'] 118 119 /* 120 * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES 121 * 122 * Pxp uses expandable tables for its string table 123 * hash table, and parse tree space. The following 124 * definitions specify the size of the increments 125 * for these items in fundamental units so that 126 * each uses approximately 1024 bytes. 127 */ 128 129 #define STRINC 1024 /* string space increment */ 130 #define TRINC 1024 /* tree space increment */ 131 #define HASHINC 509 /* hash table size in words, each increment */ 132 133 /* 134 * The initial sizes of the structures. 135 * These should be large enough to profile 136 * an "average" sized program so as to minimize 137 * storage requests. 138 * On a small system or and 11/34 or 11/40 139 * these numbers can be trimmed to make the 140 * profiler smaller. 141 */ 142 #define ITREE 2000 143 #define IHASH 509 144 145 /* 146 * The following limits on hash and tree tables currently 147 * allow approximately 1200 symbols and 20k words of tree 148 * space. The fundamental limit of 64k total data space 149 * should be exceeded well before these are full. 150 */ 151 /* 152 * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables 153 */ 154 #ifdef ADDR32 155 #define TABLE_MULTIPLIER 8 156 #endif ADDR32 157 #ifdef ADDR16 158 #define TABLE_MULTIPLIER 1 159 #endif ADDR16 160 #define MAXHASH (4 * TABLE_MULTIPLIER) 161 #define MAXTREE (40 * TABLE_MULTIPLIER) 162 /* 163 * MAXDEPTH is the depth of the parse stack. 164 * STACK_MULTIPLIER is for increasing its size. 165 */ 166 #ifdef ADDR32 167 #define STACK_MULTIPLIER 8 168 #endif ADDR32 169 #ifdef ADDR16 170 #define STACK_MULTIPLIER 1 171 #endif ADDR16 172 #define MAXDEPTH ( 150 * STACK_MULTIPLIER ) 173 174 /* 175 * ERROR RELATED DEFINITIONS 176 */ 177 178 /* 179 * Exit statuses to pexit 180 * 181 * AOK 182 * ERRS Compilation errors inhibit obj productin 183 * NOSTART Errors before we ever got started 184 * DIED We ran out of memory or some such 185 */ 186 #define AOK 0 187 #define ERRS 1 188 #define NOSTART 2 189 #define DIED 3 190 191 char Recovery; 192 /* 193 * The flag eflg is set whenever we have a hard error. 194 * The character in errpfx will precede the next error message. 195 */ 196 int eflg; 197 char errpfx; 198 199 #define setpfx(x) errpfx = x 200 201 #define standard() setpfx('s') 202 #define warning() setpfx('w') 203 #define recovered() setpfx('e') 204 #define quit() setpfx('Q') 205 #define continuation() setpfx(' ') 206 207 /* 208 * SEMANTIC DEFINITIONS 209 */ 210 211 #define NIL 0 212 213 /* 214 * NOCON and SAWCON are flags in the tree telling whether 215 * a constant set is part of an expression. 216 */ 217 #define NOCON 0 218 #define SAWCON 1 219 220 /* 221 * The variable cbn gives the current block number. 222 * The variable lastbn gives the block number before 223 * it last changed and is used to know that we were 224 * in a nested procedure so that we can print 225 * begin { solve } 226 * when solve has nested procedures or functions in it. 227 */ 228 int cbn, lastbn; 229 230 /* 231 * The variable line is the current semantic 232 * line and is set in stat.c from the numbers 233 * embedded in statement type tree nodes. 234 */ 235 int line; 236 237 /* 238 * The size of the display 239 * which defines the maximum nesting 240 * of procedures and functions allowed. 241 */ 242 #define DSPLYSZ 20 243 244 /* 245 * Routines which need types 246 * other than "integer" to be 247 * assumed by the compiler. 248 */ 249 struct tnode *tree(); 250 char *skipbl(); 251 int *hash(); 252 char *alloc(); 253 long cntof(); 254 long nowcnt(); 255 256 /* 257 * type cast nils to keep lint happy. 258 */ 259 #define TR_NIL ((struct tnode *) NIL) 260 261 /* 262 * Funny structures to use 263 * pointers in wild and wooly ways 264 */ 265 struct cstruct { 266 char pchar; 267 }; 268 struct { 269 int pint; 270 int pint2; 271 }; 272 struct { 273 long plong; 274 }; 275 struct { 276 double pdouble; 277 }; 278 279 #define OCT 1 280 #define HEX 2 281 282 /* 283 * MAIN PROGRAM GLOBALS, MISCELLANY 284 */ 285 286 /* 287 * Variables forming a data base referencing 288 * the command line arguments with the "z" option. 289 */ 290 char **pflist; 291 int pflstc; 292 int pfcnt; 293 294 char *filename; /* current source file name */ 295 char *lastname; /* last file name printed */ 296 long tvec; /* mod time of the source file */ 297 long ptvec; /* time profiled */ 298 char printed; /* current file has been printed */ 299 char hadsome; /* had some output */ 300 301 /* 302 * PROFILING AND FORMATTING DEFINITIONS 303 */ 304 305 /* 306 * The basic counter information recording structure. 307 * This is global only because people outside 308 * the cluster in pmon.c need to know its size. 309 */ 310 struct pxcnt { 311 long ntimes; /* the count this structure is all about */ 312 int counter; /* a unique counter number for us */ 313 int gos; /* global goto count when we hatched */ 314 int printed; /* are we considered to have been printed? */ 315 } pfcnts[DSPLYSZ]; 316 317 /* 318 * The pieces we divide the output line indents into: 319 * line# PRFN label: STAT 999.---| DECL text 320 */ 321 #define STAT 0 322 #define DECL 1 323 #define PRFN 2 324 325 /* 326 * Gocnt records the total number of goto's and 327 * cnts records the current counter for generating 328 * COUNT operators. 329 */ 330 int gocnt; 331 int cnts; 332 333 #include <stdio.h> 334 #include <sys/types.h> 335 336 typedef enum {FALSE, TRUE} bool; 337 338 #undef putchar 339