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