|
|
1.1 root 1: #define unsafe 1 /* pretend killing all but C is as good as killing
2: * all condition codes */
3: #ifdef unsafe
4: #define E (C|K)
5: #else
6: #define E K
7: #endif
8: #include "stdio.h"
9: #include "instr.c"
10: #include "ctype.h"
11: struct inst *index[128];
12:
13: #define SBBLK 1 /* looking for the start of a basic block */
14: #define SINST 2 /* thinking about generating a tally */
15: #define SPRO 3 /* thinking about generating prolog code */
16: #define SMAYBE 4 /* seen _, thinking about SPRO */
17:
18: #define MAXLA 5 /* max no. of lines that can be read for lookahead */
19:
20: FILE *outs, *fd, *outl; /* outs goes to assembler, outl is for listing */
21: extern FILE *popen();
22: char line[256], fname[256]; /* file names must fit in fname */
23:
24: char labuf[5][256]; /* look ahead needed for 5.0 stab entries */
25: int lastla, lookahead;
26: char begfcn[] = " .def .bf"; /* 5.0 stab entry */
27:
28: int lineno, lastline;
29: int base=0;
30:
31: int cnt;
32: int state = SBBLK;
33: char *ptr, *curarg;
34: char curdir[256];
35:
36: main(argc, argv)
37: char **argv;
38: { int i;
39: if(argc <= 1) {
40: fprintf(stderr, "no files given\n");
41: exit(1);
42: }
43: for(i = 0; insts[i].iname; i++)
44: ;
45: for(; i >= 0; i--)
46: index[insts[i].iname[0]] = insts + i;
47: fd = popen("pwd", "r");
48: for(i = 0; i < sizeof(curdir) && !feof(fd); i++)
49: curdir[i] = getc(fd);
50: curdir[i-2] = 0; /* thisdir\n */
51: fclose(fd);
52: for(i = 1; i < argc; i++) {
53: if(setfd(argv[i])) /* fix fd, outs, outl */
54: doarg(); /* do the work */
55: }
56: exit(0);
57: }
58:
59: setfd(s)
60: char *s;
61: { char outnams[24], outnaml[24];
62: fname[0] = 0;
63: cnt = 3;
64: if(fd != NULL)
65: fclose(fd);
66: if(outs != NULL)
67: fclose(outs);
68: if(outl != NULL)
69: fclose(outl);
70: sprintf(outnams, "X%s", s);
71: sprintf(outnaml, "%sL", s);
72: lastline = lineno = 0;
73: fd = fopen(s, "r");
74: if(fd == NULL) {
75: perror(s);
76: return(0);
77: }
78: outs = fopen(outnams, "w");
79: if(outs == NULL) {
80: perror(outnams);
81: return(0);
82: }
83: outl = fopen(outnaml, "w");
84: if(outl == NULL) {
85: perror(outnaml);
86: return(0);
87: }
88: curarg = s;
89: return(1);
90: }
91:
92: doarg()
93: { struct inst *x, *firstword();
94:
95: state = SBBLK;
96: lookahead = 0; /* empty buffer */
97: lastla = 0;
98: for(;;) {
99: if (lookahead != lastla){
100: strcpy(line,labuf[ (lookahead++) % MAXLA ] );
101: if (lookahead == lastla) lookahead = lastla = 0;
102: }
103: else
104: (void) fgets(line, sizeof(line), fd);
105: if(feof(fd))
106: break;
107: for(ptr = line; isspace(*ptr); *ptr++)
108: ;
109: if(*ptr == 0 || *ptr == '#')
110: continue;
111: testlabel();
112: /* deal with symbol table info */
113: if(*ptr == '.') {
114: stab();
115: fprintf(outs, " %s", ptr);
116: continue;
117: }
118: if(*ptr == 0 || *ptr == '\n')
119: continue;
120: x = firstword();
121: if(x == 0){
122: printf("unknown inst: %s\n",ptr);
123: continue;
124: }
125: #ifdef u3b
126: if ((state == SMAYBE) && !strncmp(ptr,"save",4)){
127: state = SPRO;
128: getlnum(); /* 5.0 true line # */
129: }
130: #endif
131: if(state == SPRO)
132: prolog(x);
133: if(state == SINST)
134: tally(x);
135: if(state == SBBLK && (x->type & JUMP))
136: state = SINST;
137: outinstr();
138: if(x->type & BYTE)
139: fixinstr(x);
140: fprintf(outs, " %s", ptr);
141: }
142: finish();
143: }
144:
145:
146: getlnum(){ /* get true line number from 5.0 sdb info */
147: char *la;
148: int l;
149:
150: /* get true line number by looking ahead */
151: /* this is necessary for 5.0 sdb output */
152: do
153: (void) fgets(labuf[l = ((lastla++)%MAXLA)], sizeof(line), fd);
154: while (!feof(fd) && strncmp(begfcn, labuf[l],
155: 9) && (lookahead != (lastla)%MAXLA ));
156: if ( strncmp(begfcn, labuf[l], 9) )
157: return; /* bad input or not 5.0 */
158: la = labuf[l];
159: while ( *la != '\0' ){
160: while ( *la != ';' && *la != '\0') la++;
161: if ( *la == ';' ) la++;
162: while ( isspace(*la) ) la++;
163: if ( !strncmp(la, ".line" , 5) ){
164: lineno = base = atoi( la + 5 );
165: return;
166: }
167: }
168: }
169:
170:
171: /* unbelievable variability in sdb info */
172: stab()
173: { char buf[128];
174: int i, j, k;
175:
176: #ifndef u3b
177: if(state == SMAYBE && strncmp(ptr, ".word", 5) == 0) {
178: state = SPRO;
179: getlnum();
180: return;
181: }
182: #endif
183:
184: if((i = *(ptr + 1)) != 's' && i != 'f' && i != 'l')
185: return;
186: /* real compiler output */
187: if(sscanf(ptr, ".stabs \"%[^\"]\", %o", buf, &i) == 2 && i == 0144)
188: strcat(fname, buf);
189: else if(sscanf(ptr, ".stabd %o,%o,%o", &i, &j, &k) == 3 && i == 0104)
190: lineno = k;
191: /* pwb 3.0 */
192: else if(sscanf(ptr, ".stab %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%d",
193: buf, buf+2, buf+4, buf+6, buf+8, buf+10, buf+12, buf+14, &i)
194: == 9 && i == 144) {
195: for(i = k = 0; buf[i] ; i++)
196: if(buf[i] == '\'')
197: buf[k++] = buf[++i];
198: buf[k] = 0;
199: strcat(fname, buf);
200: }
201: else if(sscanf(ptr, ".stab %[0,]%d,%d,%d", buf,&i, &j, &k) == 4
202: && i == 104)
203: lineno = k;
204: /* pwb 5.0 */
205: else if(sscanf(ptr," .file \"%[^\"]\"", buf) == 1)
206: strcat(fname, buf);
207: else if(sscanf(ptr, " .ln %d",&k) == 1)
208: lineno = k + base - 1;
209: }
210:
211: testlabel()
212: { char *p;
213: int i;
214:
215: for(;;){
216: for(p = ptr; *p; p++) {
217: if(*p == ':')
218: break;
219: if(!isalnum(*p) && *p != '_' && *p != '.')
220: return;
221: }
222: if(*p == 0)
223: return;
224: *p++ = 0; /* that is overwriting the : */
225: fprintf(outs, "%s:\n", ptr);
226: if (lineno != lastline){
227: for (i=lastline+1; i < lineno ; i++) /* allign label with right inst */
228: fprintf(outl, "0 %s: %d\n", fname, i);
229: lastline = lineno - 1;
230: }
231: fprintf(outl, "%d %s:\n", 4*(cnt - 1), ptr);
232: #ifdef u3b
233: if(*ptr != '.')
234: #else
235: if(*ptr == '_' )
236: #endif
237: state = SMAYBE;
238: else
239: if(state != SPRO)
240: state = SINST;
241: for(ptr = p; isspace(*ptr); ptr++)
242: ;
243: } /* L68:L70: ... */
244: }
245:
246: struct inst *
247: firstword()
248: { char buf[sizeof(line)], *p, *q;
249: struct inst *x;
250: for(p = buf, q = ptr; isalnum(*q); )
251: *p++ = *q++;
252: if(p == buf)
253: return((struct inst *)0);
254: *p = 0;
255: for(x = index[buf[0]]; x && x->iname[0] == buf[0]; x++)
256: if(strcmp(buf, x->iname) == 0)
257: return(x);
258: return(0);
259: }
260:
261: outinstr()
262: { int i;
263: for(i = lastline + 1; i < lineno; i++)
264: fprintf(outl, "0 %s: %d\n", fname, i);
265: if (lastline != lineno){
266: fprintf(outl, "%d %s: %d\n", 4*(cnt - 1), fname, lineno);
267: lastline = lineno;
268: }
269: fprintf(outl, "%d %s", 4*(cnt - 1), ptr);
270: }
271:
272: #ifdef u3b
273:
274: /* 3b code ***********************************/
275: tally(x)
276: struct inst *x;
277: {
278: if(x->type & E)
279: fprintf(outs, " addw2 &1,locprof+%d\n", 4*cnt++);
280: else {
281: fprintf(outs, " stsm &1,savecc\n");
282: fprintf(outs, " gcc %%r0\n");
283: fprintf(outs, " addw2 &1,locprof+%d\n", 4*cnt++);
284: fprintf(outs, " scc %%r0\n");
285: fprintf(outs, " lsm &1,savecc\n");
286: }
287: state = SBBLK;
288: }
289:
290: prolog(x) /* no liveness test, presumes can't get here by jump */
291: struct inst *x;
292: { int i;
293: fprintf(outs, " .data\n");
294: fprintf(outs, " .globl proFptr\n"); /* the global chain */
295: fprintf(outs, " .globl savecc\n");
296: fprintf(outs, " .text\n");
297: fprintf(outs, " cmpw &0,locprof+4\n");
298: fprintf(outs, " jne L%da\n", i = cnt);
299: fprintf(outs, " movw proFptr,locprof+4\n");
300: fprintf(outs, " movaw locprof,proFptr\n");
301: fprintf(outs, "L%da: addw2 &1,locprof+%d\n", i, 4*cnt++);
302: state = SBBLK;
303: }
304:
305: finish()
306: { int i;
307: fprintf(outs, " .data\n");
308: fprintf(outs, " .align 4\n");
309: fprintf(outs, "locprof:\n");
310: fprintf(outs, " .word %d\n", cnt);
311: fprintf(outs, " .word 0\n");
312: fprintf(outs, " .word L%db\n", cnt);
313: fprintf(outs, " .zero %d\n", 4 * cnt);
314: fprintf(outs, "L%db: .byte ", cnt);
315: for(i = 0; curdir[i]; i++)
316: fprintf(outs, " 0x%x,", curdir[i]);
317: fprintf(outs, " 0x%x\n", '/');
318: fprintf(outs, " .byte ");
319: if(fname[0])
320: for(i = 0; fname[i]; i++)
321: fprintf(outs, " 0x%x,", fname[i]);
322: else
323: for(i = 0; curarg[i]; i++)
324: fprintf(outs, " 0x%x,", curarg[i]);
325: fprintf(outs, "0\n");
326: }
327:
328: #else
329:
330: /* Vax code **************************/
331: tally(x)
332: struct inst *x;
333: {
334: if(x->type & E)
335: fprintf(outs, " incl locprof+%d\n", 4*cnt++);
336: else {
337: fprintf(outs, " movpsl -(sp)\n");
338: fprintf(outs, " incl locprof+%d\n", 4*cnt++);
339: fprintf(outs, " movw (sp)+,(sp)\n");
340: fprintf(outs, " bicpsw $0xff\n");
341: fprintf(outs, " bispsw (sp)+\n");
342: /* thanks to kirk mckusick */
343: }
344: state = SBBLK;
345: }
346:
347:
348: prolog(x) /* no liveness test, presumes can't get here by jump */
349: struct inst *x;
350: { int i;
351: fprintf(outs, " .data\n");
352: fprintf(outs, " .comm _proFptr,4\n"); /* the global chain */
353: fprintf(outs, " .text\n");
354: /*if(!(x->type & E))
355: fprintf(outs, " movpsl -(sp)\n");*/
356: fprintf(outs, " tstl locprof+4\n");
357: fprintf(outs, " bneq L%da\n", i = cnt);
358: fprintf(outs, " movl _proFptr,locprof+4\n");
359: fprintf(outs, " moval locprof,_proFptr\n");
360: fprintf(outs, "L%da: incl locprof+%d\n", i, 4*cnt++);
361: /*if(!(x->type & E)) {
362: fprintf(outs, " movw (sp)+,(sp)\n");
363: fprintf(outs, " bicpsw $0xff\n");
364: fprintf(outs, " bispsw (sp)+\n");
365: }*/
366: state = SBBLK;
367: }
368:
369: finish()
370: { int i;
371: fprintf(outs, " .data\n");
372: fprintf(outs, "locprof: .long %d\n", cnt);
373: fprintf(outs, " .long 0\n");
374: fprintf(outs, " .long L%db\n", cnt);
375: fprintf(outs, " .space %d\n", 4 * cnt);
376: fprintf(outs, "L%db: .byte ", cnt);
377: for(i = 0; curdir[i]; i++)
378: fprintf(outs, "0x%x,", curdir[i]);
379: fprintf(outs, "0x%x\n", '/');
380: fprintf(outs, " .byte ");
381: if(fname[0])
382: for(i = 0; fname[i]; i++)
383: fprintf(outs, "0x%x,", fname[i]);
384: else
385: for(i = 0; curarg[i]; i++)
386: fprintf(outs, "0x%x,", curarg[i]);
387: fprintf(outs, "0\n");
388: }
389:
390: #endif
391:
392:
393: fixinstr(x)
394: struct inst *x;
395: {
396: #ifndef u3b
397: if(x->iname[0] == 'b')
398: *ptr = 'j'; /* let assembler worry about branches */
399: /* this is where the code for aob and sob goes */
400: #endif
401: }
402:
403:
404:
405:
406:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.