1: /* 2: * Interpret a C intermediate file. 3: */ 4: #include <stdio.h> 5: #include "c1.h" 6: 7: extern opdope[1]; 8: extern char *opntab[1]; 9: 10: struct table cctab[1], efftab[1], regtab[1], sptab[1]; 11: char maprel[1], notrel[1]; 12: char *outname(); 13: 14: main() 15: { 16: register t, op; 17: static char s[9]; 18: register char *tp; 19: double atof(); 20: char numbuf[64]; 21: int lbl, cond; 22: int sdep; 23: 24: sdep = 0; 25: for (;;) { 26: op = getw(stdin); 27: if ((op&0177400) != 0177000) { 28: error("Intermediate file error"); 29: exit(1); 30: } 31: lbl = 0; 32: switch(op &= 0377) { 33: 34: case SINIT: 35: printf("init %d\n", getw(stdin)); 36: break; 37: 38: case EOFC: 39: printf("eof\n"); 40: exit(0); 41: 42: case BDATA: 43: if (getw(stdin) == 1) { 44: printf(".byte "); 45: for (;;) { 46: printf("%d", getw(stdin)); 47: if (getw(stdin) != 1) 48: break; 49: printf(","); 50: } 51: printf("\n"); 52: } 53: break; 54: 55: case PROG: 56: printf("prog\n"); 57: break; 58: 59: case DATA: 60: printf("data\n"); 61: break; 62: 63: case BSS: 64: printf("bss\n"); 65: break; 66: 67: case SYMDEF: 68: printf("symdef "); 69: outname(s); 70: printf("%s\n", s); 71: break; 72: 73: case RETRN: 74: printf("return\n"); 75: break; 76: 77: case CSPACE: 78: tp = outname(s); 79: printf("comm %s,%d\n", tp, getw(stdin)); 80: break; 81: 82: case SSPACE: 83: printf("space %d\n", getw(stdin)); 84: break; 85: 86: case EVEN: 87: printf("even\n"); 88: break; 89: 90: case SAVE: 91: printf("save\n"); 92: break; 93: 94: case SETSTK: 95: t = getw(stdin)-6; 96: printf("setstack %d\n", t); 97: break; 98: 99: case PROFIL: 100: t = getw(stdin); 101: printf("profil %d\n", t); 102: break; 103: 104: case SNAME: 105: tp = outname(s); 106: printf("sname %s s%d\n", tp, getw(stdin)); 107: break; 108: 109: case ANAME: 110: tp = outname(s); 111: printf("aname %s a%d\n", tp, getw(stdin)); 112: break; 113: 114: case RNAME: 115: tp = outname(s); 116: printf("rname %s r%d\n", tp, getw(stdin)); 117: break; 118: 119: case SWIT: 120: t = getw(stdin); 121: line = getw(stdin); 122: printf("switch line %d def %d\n", line, t); 123: while (t = getw(stdin)) { 124: printf(" %d %d\n", t, getw(stdin)); 125: } 126: break; 127: 128: case CBRANCH: 129: lbl = getw(stdin); 130: cond = getw(stdin); 131: case EXPR: 132: line = getw(stdin); 133: if (sdep != 1) { 134: error("Expression input botch"); 135: exit(1); 136: } 137: sdep = 0; 138: if (lbl) 139: printf("cbranch %d line %d\n", lbl, line); 140: else 141: printf("expr line %d\n", line); 142: break; 143: 144: case NAME: 145: t = getw(stdin); 146: if (t==EXTERN) { 147: t = getw(stdin); 148: printf("name %o, %s\n", t, outname(s)); 149: } else if (t==AUTO) { 150: t = getw(stdin); 151: printf("name %o a%d\n", t, getw(stdin)); 152: } else if (t==STATIC) { 153: t = getw(stdin); 154: printf("name %o s%d\n", t, getw(stdin)); 155: } else if (t==REG) { 156: t = getw(stdin); 157: printf("name %o r%d\n", t, getw(stdin)); 158: } else 159: printf("name botch\n"); 160: sdep++; 161: break; 162: 163: case CON: 164: t = getw(stdin); 165: printf("const %d %d\n", t, getw(stdin)); 166: sdep++; 167: break; 168: 169: case LCON: 170: getw(stdin); /* ignore type, assume long */ 171: t = getw(stdin); 172: op = getw(stdin); 173: printf("lconst %D\n", (((long)t<<16) | (unsigned)op)); 174: sdep++; 175: break; 176: 177: case FCON: 178: t = getw(stdin); 179: printf("fcon %s\n", outname(numbuf)); 180: sdep++; 181: break; 182: 183: case FSEL: 184: printf("fsel %o ", getw(stdin)); 185: printf("%d ", getw(stdin)); 186: printf("%d\n", getw(stdin)); 187: break; 188: 189: case STRASG: 190: t = getw(stdin); 191: printf("strasg %o ", getw(stdin)); 192: printf("%d\n", getw(stdin)); 193: break; 194: 195: case NULLOP: 196: printf("null\n"); 197: sdep++; 198: break; 199: 200: case LABEL: 201: printf("label %d\n", getw(stdin)); 202: break; 203: 204: case NLABEL: 205: tp = outname(s); 206: printf("nlabel %s\n", tp); 207: break; 208: 209: case RLABEL: 210: tp = outname(s); 211: printf("rlabel %s\n", tp); 212: break; 213: 214: case BRANCH: 215: printf("branch %d\n", getw(stdin)); 216: break; 217: 218: case SETREG: 219: printf("nreg %d\n", getw(stdin)); 220: break; 221: 222: default: 223: t = getw(stdin); 224: if (op <=0 || op >=120) { 225: printf("Unknown op %d\n", op); 226: exit(1); 227: } 228: if (opdope[op]&BINARY) 229: sdep--; 230: if (sdep<=0) 231: printf("Binary expression botch\n"); 232: if (opntab[op] == 0) 233: printf("op %d %o\n", op, t); 234: else 235: printf("%s %o\n", opntab[op], t); 236: break; 237: } 238: } 239: } 240: 241: char * 242: outname(s) 243: char *s; 244: { 245: register char *p, c; 246: register n; 247: 248: p = s; 249: n = 0; 250: while (c = getc(stdin)) { 251: *p++ = c; 252: n++; 253: } 254: do { 255: *p++ = 0; 256: } while (n++ < 8); 257: return(s); 258: } 259: 260: error(s) 261: char *s; 262: { 263: printf("%s\n", s); 264: exit(1); 265: }