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