|
|
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: FILE *outs, *fd, *outl; /* outs goes to assembler, outl is for listing */ ! 19: extern FILE *popen(); ! 20: char line[256], fname[256]; /* file names must fit in fname */ ! 21: char curfunc[256]; ! 22: int lineno, lastline; ! 23: int cnt; ! 24: int state = SBBLK; ! 25: char *ptr, *curarg; ! 26: char curdir[256]; ! 27: ! 28: main(argc, argv) ! 29: char **argv; ! 30: { int i; ! 31: if(argc <= 1) { ! 32: fprintf(stderr, "no files given\n"); ! 33: exit(1); ! 34: } ! 35: for(i = 0; insts[i].iname; i++) ! 36: ; ! 37: for(; i >= 0; i--) ! 38: index[insts[i].iname[0]] = insts + i; ! 39: fd = popen("pwd", "r"); ! 40: for(i = 0; i < sizeof(curdir) && !feof(fd); i++) ! 41: curdir[i] = getc(fd); ! 42: curdir[i-2] = 0; /* thisdir\n */ ! 43: fclose(fd); ! 44: for(i = 1; i < argc; i++) { ! 45: if(setfd(argv[i])) /* fix fd, outs, outl */ ! 46: doarg(); /* do the work */ ! 47: } ! 48: exit(0); ! 49: } ! 50: ! 51: setfd(s) ! 52: char *s; ! 53: { char outnams[24], outnaml[24]; ! 54: fname[0] = 0; ! 55: cnt = 3; ! 56: if(fd != NULL) ! 57: fclose(fd); ! 58: if(outs != NULL) ! 59: fclose(outs); ! 60: if(outl != NULL) ! 61: fclose(outl); ! 62: sprintf(outnams, "X%s", s); ! 63: sprintf(outnaml, "%sL", s); ! 64: lastline = lineno = 0; ! 65: fd = fopen(s, "r"); ! 66: if(fd == NULL) { ! 67: perror(s); ! 68: return(0); ! 69: } ! 70: outs = fopen(outnams, "w"); ! 71: if(outs == NULL) { ! 72: perror(outnams); ! 73: return(0); ! 74: } ! 75: outl = fopen(outnaml, "w"); ! 76: if(outl == NULL) { ! 77: perror(outnaml); ! 78: return(0); ! 79: } ! 80: curarg = s; ! 81: return(1); ! 82: } ! 83: ! 84: doarg() ! 85: { struct inst *x, *firstword(); ! 86: state = SBBLK; ! 87: for(;;) { ! 88: (void) fgets(line, sizeof(line), fd); ! 89: if(feof(fd)) ! 90: break; ! 91: for(ptr = line; isspace(*ptr); *ptr++) ! 92: ; ! 93: if(*ptr == 0 || *ptr == '#') ! 94: continue; ! 95: testlabel(); ! 96: /* deal with symbol table info */ ! 97: if(*ptr == '.') { ! 98: stab(); ! 99: fprintf(outs, "%s", ptr); ! 100: continue; ! 101: } ! 102: if(*ptr == 0 || *ptr == '\n') ! 103: continue; ! 104: x = firstword(); ! 105: if(x == 0) ! 106: continue; ! 107: if(state == SPRO) ! 108: prolog(x); ! 109: if(state == SINST) ! 110: tally(x); ! 111: if(state == SBBLK && (x->type & JUMP)) ! 112: state = SINST; ! 113: outinstr(); ! 114: if(x->type & BYTE) ! 115: fixinstr(x); ! 116: fprintf(outs, "%s", ptr); ! 117: } ! 118: finish(); ! 119: } ! 120: /* unbelievable variability in sdb info */ ! 121: stab() ! 122: { char buf[128]; ! 123: int i, j, k; ! 124: if(state == SMAYBE && strncmp(ptr, ".word", 5) == 0) { ! 125: state = SPRO; ! 126: return; ! 127: } ! 128: if((i = *(ptr + 1)) != 's' && i != 'f' && i != 'l') ! 129: return; ! 130: /* real compiler output */ ! 131: if(sscanf(ptr, ".stabs \"%[^\"]\", %o", buf, &i) == 2 && i == 0144) ! 132: strcat(fname, buf); ! 133: else if(sscanf(ptr, ".stabs \"%[^\"]\", 0x%x", buf, &i) == 2 && i == 0x64) ! 134: strcat(fname, buf); ! 135: else if(sscanf(ptr, ".stabd %o,%o,%o", &i, &j, &k) == 3 && i == 0104) ! 136: lineno = k; ! 137: else if(sscanf(ptr, ".stabd 0x%x,0,%d", &i, &k) == 2 && i == 0x44) ! 138: lineno = k; ! 139: /* pwb 3.0 */ ! 140: else if(sscanf(ptr, ".stab %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%d", ! 141: buf, buf+2, buf+4, buf+6, buf+8, buf+10, buf+12, buf+14, &i) ! 142: == 9 && i == 144) { ! 143: for(i = k = 0; buf[i] ; i++) ! 144: if(buf[i] == '\'') ! 145: buf[k++] = buf[++i]; ! 146: buf[k] = 0; ! 147: strcat(fname, buf); ! 148: } ! 149: else if(sscanf(ptr, ".stab %[0,]%d,%d,%d", buf,&i, &j, &k) == 4 ! 150: && i == 104) ! 151: lineno = k; ! 152: /* pwb 5.0 */ ! 153: else if(sscanf(ptr," .file \"%[^\"]\"", buf) == 1) ! 154: strcat(fname, buf); ! 155: else if(sscanf(ptr, " .ln %d",&k) == 1) ! 156: lineno = k; ! 157: } ! 158: ! 159: testlabel() ! 160: { char *p; ! 161: again: ! 162: for(p = ptr; *p; p++) { ! 163: if(*p == ':') ! 164: break; ! 165: if(isalnum(*p) || *p == '_') ! 166: continue; ! 167: if(p > ptr && *p == '.') /* f77 */ ! 168: continue; ! 169: return; ! 170: } ! 171: if(*p == 0) ! 172: return; ! 173: *p++ = 0; /* that is overwriting the : */ ! 174: fprintf(outs, "%s:\n", ptr); ! 175: if(*ptr == '_') { ! 176: state = SMAYBE; ! 177: strcpy(curfunc, ptr); ! 178: } ! 179: else ! 180: if(state != SPRO) ! 181: state = SINST; ! 182: for(ptr = p; isspace(*ptr); ptr++) ! 183: ; ! 184: goto again; /* L68:L70: ... */ ! 185: } ! 186: ! 187: struct inst * ! 188: firstword() ! 189: { char buf[sizeof(line)], *p, *q; ! 190: struct inst *x; ! 191: for(p = buf, q = ptr; isalnum(*q); ) ! 192: *p++ = *q++; ! 193: if(p == buf) ! 194: return((struct inst *)0); ! 195: *p = 0; ! 196: for(x = index[buf[0]]; x && x->iname[0] == buf[0]; x++) ! 197: if(strcmp(buf, x->iname) == 0) ! 198: return(x); ! 199: return(0); ! 200: } ! 201: ! 202: tally(x) ! 203: struct inst *x; ! 204: { ! 205: if(x->type & E) ! 206: fprintf(outs, "incl locprof+%d\n", 4*cnt++); ! 207: else { ! 208: fprintf(outs, "movpsl -(sp)\n"); ! 209: fprintf(outs, "incl locprof+%d\n", 4*cnt++); ! 210: fprintf(outs, "movw (sp)+,(sp)\n"); ! 211: fprintf(outs, "bicpsw $0xff\n"); ! 212: fprintf(outs, "bispsw (sp)+\n"); ! 213: /* thanks to kirk mckusick */ ! 214: } ! 215: state = SBBLK; ! 216: } ! 217: ! 218: outinstr() ! 219: { int i; ! 220: for(i = lastline + 1; i <= lineno; i++) ! 221: fprintf(outl, "%d %s: %d\n", 4*(cnt - 1), fname, i); ! 222: lastline = lineno; ! 223: fprintf(outl, "%d %s", 4*(cnt - 1), ptr); ! 224: } ! 225: ! 226: prolog(x) /* no liveness test, presumes can't get here by jump */ ! 227: struct inst *x; ! 228: { int i; ! 229: fprintf(outs, ".data\n"); ! 230: fprintf(outs, ".comm _proFptr,4\n"); /* the global chain */ ! 231: fprintf(outs, ".text\n"); ! 232: fprintf(outs, "tstl locprof+4\n"); ! 233: fprintf(outs, "bneq L%da\n", i = cnt); ! 234: fprintf(outs, "movl _proFptr,locprof+4\n"); ! 235: fprintf(outs, "moval locprof,_proFptr\n"); ! 236: fprintf(outs, "L%da: incl locprof+%d\n", i, 4*cnt++); ! 237: state = SBBLK; ! 238: fprintf(outl, "%d %s: %s\n", 4*(cnt-1), fname, curfunc); ! 239: } ! 240: ! 241: finish() ! 242: { int i; ! 243: fprintf(outs, ".data\n"); ! 244: fprintf(outs, "locprof: .long %d\n", cnt); ! 245: fprintf(outs, ".long 0\n"); ! 246: fprintf(outs, ".long L%db\n", cnt); ! 247: fprintf(outs, ".space %d\n", 4 * cnt); ! 248: fprintf(outs, "L%db: .byte ", cnt); ! 249: for(i = 0; curdir[i]; i++) ! 250: fprintf(outs, "0x%x,", curdir[i]); ! 251: fprintf(outs, "0x%x\n", '/'); ! 252: fprintf(outs, ".byte "); ! 253: if(fname[0]) ! 254: for(i = 0; fname[i]; i++) ! 255: fprintf(outs, "0x%x,", fname[i]); ! 256: else ! 257: for(i = 0; curarg[i]; i++) ! 258: fprintf(outs, "0x%x,", curarg[i]); ! 259: fprintf(outs, "0\n"); ! 260: } ! 261: ! 262: fixinstr(x) ! 263: struct inst *x; ! 264: { ! 265: if(x->iname[0] == 'b') ! 266: *ptr = 'j'; /* let assembler worry about branches */ ! 267: /* this is where the code for aob and sob goes */ ! 268: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.