|
|
1.1 ! root 1: #include <errno.h> ! 2: #include "cem.h" ! 3: #define STD_OBJ 1 ! 4: #include "stdobj.h" ! 5: ! 6: /* ! 7: * Read and load an object file. ! 8: */ ! 9: static void ! 10: read_obj(s, fd) ! 11: register char *s; ! 12: register int fd; ! 13: { ! 14: register int i; ! 15: register long sz; ! 16: header obj_header; ! 17: static char cmd[] = CMD; ! 18: static char mac[] = MAC; ! 19: extern void enter_types(); ! 20: extern void enter_vars(); ! 21: extern void install_strings(); ! 22: ! 23: switch (read(fd, (char *)&obj_header, sizeof (header))) ! 24: { ! 25: case SYSERROR: ! 26: fprintf(stderr, "%s: could not read ", my_name); ! 27: fflush(stderr); ! 28: perror(s); ! 29: exit(1); ! 30: ! 31: case sizeof (header): ! 32: break; ! 33: ! 34: default: ! 35: fprintf(stderr, "%s: %s is not an object module\n", my_name, s); ! 36: exit(1); ! 37: } ! 38: ! 39: if (strncmp(obj_header.hd_cmd, cmd, CMD_SZ) != 0) ! 40: { ! 41: fprintf(stderr, "%s: %s is not an object module\n", my_name, s); ! 42: exit(1); ! 43: } ! 44: ! 45: if (strncmp(obj_header.hd_mac, mac, MAC_SZ) != 0) ! 46: { ! 47: fprintf(stderr, "%s: version mismatch for %s (recompile)\n", my_name, s); ! 48: exit(1); ! 49: } ! 50: ! 51: if (obj_header.hd_type_size == 0) ! 52: { ! 53: fprintf(stderr, "%s: %s has compilation errors\n", my_name, s); ! 54: exit(1); ! 55: } ! 56: ! 57: sz = obj_header.hd_str_off + obj_header.hd_str_size - sizeof (header); ! 58: data_base = salloc(sz); ! 59: str_base = data_base + obj_header.hd_str_off - sizeof (header) - 1; ! 60: ! 61: if ((i = read(fd, data_base, (int)sz)) != sz) ! 62: { ! 63: if (i == SYSERROR) ! 64: { ! 65: fprintf(stderr, "%s: could not read ", my_name); ! 66: fflush(stderr); ! 67: perror(s); ! 68: } ! 69: else ! 70: fprintf(stderr, "%s: %s is too small\n", my_name, s); ! 71: ! 72: exit(1); ! 73: } ! 74: ! 75: #if DEBUG ! 76: if (debug) ! 77: { ! 78: register char *id; ! 79: register long l0; ! 80: register long l1; ! 81: register long l2; ! 82: ! 83: data_ptr = data_base; ! 84: data_end = data_base + obj_header.hd_str_off - sizeof (header); ! 85: type_index = 1; ! 86: var_index = 1; ! 87: str_num = 0; ! 88: ! 89: while (data_ptr < data_end) ! 90: { ! 91: i = getd(); ! 92: ! 93: switch (obj_item(i)) ! 94: { ! 95: case i_data: ! 96: l0 = getv(); ! 97: l1 = getv(); ! 98: printf("data: var %ld (%s:%ld)\n", l0, &str_base[l1], getv()); ! 99: ! 100: loop ! 101: { ! 102: i = getd(); ! 103: ! 104: switch (obj_item(i)) ! 105: { ! 106: case d_addr: ! 107: printf("\taddr var %ld for %ld\n", get4(), obj_id(i)); ! 108: continue; ! 109: ! 110: case d_bytes: ! 111: if (obj_id(i) == 0) ! 112: l0 = getv(); ! 113: else ! 114: l0 = obj_id(i); ! 115: ! 116: printf("\tbytes %ld\n", l0); ! 117: data_ptr += l0; ! 118: continue; ! 119: ! 120: case d_end: ! 121: printf("\tend\n"); ! 122: break; ! 123: ! 124: case d_istring: ! 125: if (obj_id(i) == 0) ! 126: l0 = getv(); ! 127: else ! 128: l0 = obj_id(i); ! 129: ! 130: data_ptr += l0; ! 131: printf("\tstring %ld, length %ld\n", str_num++, l0); ! 132: continue; ! 133: ! 134: case d_irstring: ! 135: if (obj_id(i) == 0) ! 136: l0 = getv(); ! 137: else ! 138: l0 = obj_id(i); ! 139: ! 140: data_ptr += l0; ! 141: printf("\tstring %ld + %ld, length %ld\n", str_num++, get4(), l0); ! 142: continue; ! 143: ! 144: case d_space: ! 145: printf("\tspace %ld\n", obj_id(i) == 0 ? getv() : obj_id(i)); ! 146: continue; ! 147: ! 148: case d_string: ! 149: printf("\tstring %ld\n", getv()); ! 150: continue; ! 151: ! 152: case d_reloc: ! 153: l0 = getv(); ! 154: printf("\treloc var %ld + %ld for %ld\n", l0, get4(), obj_id(i)); ! 155: continue; ! 156: ! 157: case d_rstring: ! 158: l0 = getv(); ! 159: printf("\tstring %ld + %ld\n", l0, get4()); ! 160: continue; ! 161: ! 162: default: ! 163: fprintf(stderr, "%s: unknown data id %d\n", my_name, i); ! 164: exit(1); ! 165: } ! 166: ! 167: break; ! 168: } ! 169: ! 170: break; ! 171: ! 172: case i_lib: ! 173: printf("lib: %s\n", &str_base[getv()]); ! 174: break; ! 175: ! 176: case i_src: ! 177: printf("src: %s\n", &str_base[getv()]); ! 178: break; ! 179: ! 180: case i_string: ! 181: if (obj_id(i) == 0) ! 182: l0 = getv(); ! 183: else ! 184: l0 = obj_id(i); ! 185: ! 186: printf("string %ld, length %ld\n", str_num++, l0); ! 187: data_ptr += l0; ! 188: break; ! 189: ! 190: case i_type: ! 191: printf("type "); ! 192: ! 193: switch (obj_id(i)) ! 194: { ! 195: case t_arrayof: ! 196: l0 = getv(); ! 197: l1 = getv(); ! 198: printf("%ld: array %ld of %ld\n", type_index++, l0, l1); ! 199: break; ! 200: ! 201: case t_basetype: ! 202: printf("%ld: ", type_index++); ! 203: print_basetype(getd() & 0xFF); ! 204: printf("\n"); ! 205: break; ! 206: ! 207: case t_bitfield: ! 208: l0 = getv(); ! 209: l1 = getv(); ! 210: printf("%ld: bitfield %ld of %ld\n", type_index++, l0, l1); ! 211: break; ! 212: ! 213: case t_dimless: ! 214: printf("%ld: array [] of %ld\n", type_index++, getv()); ! 215: break; ! 216: ! 217: case t_elaboration: ! 218: l0 = getv(); ! 219: l1 = getv(); ! 220: printf("elab %ld: (%s:%ld) ", l0, &str_base[l1], getv()); ! 221: ! 222: switch (i = obj_id(getd())) ! 223: { ! 224: case t_enum: ! 225: printf("enum\n"); ! 226: l0 = getv(); ! 227: goto elab_enum; ! 228: ! 229: case t_structof: ! 230: printf("struct\n"); ! 231: l0 = getv(); ! 232: ! 233: do ! 234: { ! 235: l1 = getv(); ! 236: printf("\t%s = %ld @ %ld\n", &str_base[l0], l1, getv()); ! 237: l0 = getv(); ! 238: } ! 239: while (l0 != 0); ! 240: ! 241: printf("\t(%ld)\n", getv()); ! 242: break; ! 243: ! 244: case t_unionof: ! 245: printf("union\n"); ! 246: l0 = getv(); ! 247: ! 248: do ! 249: { ! 250: l1 = getv(); ! 251: printf("\t%s = %ld\n", &str_base[l0], l1); ! 252: l0 = getv(); ! 253: } ! 254: while (l0 != 0); ! 255: ! 256: printf("\t(%ld)\n", getv()); ! 257: break; ! 258: ! 259: default: ! 260: fprintf(stderr, "%s: unknown elaboration id %d\n", my_name, i); ! 261: exit(1); ! 262: } ! 263: ! 264: break; ! 265: ! 266: case t_enum: ! 267: printf("%ld: ", type_index++); ! 268: ! 269: if ((l0 = getv()) == 0) ! 270: id = "<anon>"; ! 271: else ! 272: id = &str_base[l0]; ! 273: ! 274: l0 = getv(); ! 275: l1 = getv(); ! 276: ! 277: printf("enum %s (%s:%ld)\n", id, &str_base[l0], l1); ! 278: ! 279: if ((l0 = getv()) == 0) ! 280: { ! 281: printf("\tforward\n"); ! 282: break; ! 283: } ! 284: ! 285: elab_enum: ! 286: do ! 287: { ! 288: l1 = getu(); ! 289: printf("\t%s = %ld\n", &str_base[l0], l1); ! 290: l0 = getv(); ! 291: } ! 292: while (l0 != 0); ! 293: ! 294: l0 = getu(); ! 295: l1 = getu(); ! 296: ! 297: printf("\t(%ld, %ld)\n", l0, l1); ! 298: break; ! 299: ! 300: case t_ftnreturning: ! 301: printf("%ld: function returning %ld\n", type_index++, getv()); ! 302: break; ! 303: ! 304: case t_ptrto: ! 305: printf("%ld: pointer to %ld\n", type_index++, getv()); ! 306: break; ! 307: ! 308: case t_structof: ! 309: printf("%ld: ", type_index++); ! 310: ! 311: if ((l0 = getv()) == 0) ! 312: id = "<anon>"; ! 313: else ! 314: id = &str_base[l0]; ! 315: ! 316: l0 = getv(); ! 317: l1 = getv(); ! 318: ! 319: printf("struct %s (%s:%ld)\n", id, &str_base[l0], l1); ! 320: break; ! 321: ! 322: case t_unionof: ! 323: printf("%ld: ", type_index++); ! 324: ! 325: if ((l0 = getv()) == 0) ! 326: id = "<anon>"; ! 327: else ! 328: id = &str_base[l0]; ! 329: ! 330: l0 = getv(); ! 331: l1 = getv(); ! 332: ! 333: printf("union %s (%s:%ld)\n", id, &str_base[l0], l1); ! 334: break; ! 335: ! 336: default: ! 337: fprintf(stderr, "%s: unknown type id %d\n", my_name, obj_id(i)); ! 338: exit(1); ! 339: } ! 340: ! 341: break; ! 342: ! 343: case i_var: ! 344: printf("var "); ! 345: ! 346: switch (obj_id(i)) ! 347: { ! 348: case v_arglist: ! 349: l0 = getv(); ! 350: l1 = getv(); ! 351: printf("arglist: %ld (%s:%ld)\n", l0, &str_base[l1], getv()); ! 352: ! 353: while ((l0 = getv()) != 0) ! 354: { ! 355: l1 = getv(); ! 356: l2 = getv(); ! 357: printf("\t%ld: %s type %ld (%s:%ld)\n", var_index++, &str_base[l0], l1, &str_base[l2], getv()); ! 358: } ! 359: ! 360: break; ! 361: ! 362: case v_array_size: ! 363: l0 = getv(); ! 364: printf("array %ld new type %ld\n", l0, getv()); ! 365: break; ! 366: ! 367: case v_auto: ! 368: id = "auto"; ! 369: goto get_var; ! 370: ! 371: case v_block_static: ! 372: id = "block static"; ! 373: goto get_var; ! 374: ! 375: case v_call: ! 376: l0 = getv(); ! 377: l1 = getv(); ! 378: printf("call: var %ld (%s:%ld)\n", l0, &str_base[l1], getv()); ! 379: ! 380: while ((l0 = getv()) != 0) ! 381: printf("\ttype %ld\n", l0); ! 382: ! 383: break; ! 384: ! 385: case v_global: ! 386: id = "global"; ! 387: goto get_var; ! 388: ! 389: case v_implicit_function: ! 390: id = "implicit()"; ! 391: goto get_var; ! 392: ! 393: case v_static: ! 394: id = "static"; ! 395: goto get_var; ! 396: ! 397: get_var: ! 398: l0 = getv(); ! 399: l1 = getv(); ! 400: l2 = getv(); ! 401: printf("%ld: %s %s type %ld (%s:%ld)\n", var_index++, id, &str_base[l0], l1, &str_base[l2], getv()); ! 402: break; ! 403: ! 404: case v_varargs: ! 405: l0 = getv(); ! 406: printf("%ld: varargs %ld\n", l0, getv()); ! 407: break; ! 408: ! 409: default: ! 410: fprintf(stderr, "%s: unknown var id %d\n", my_name, obj_id(i)); ! 411: exit(1); ! 412: } ! 413: ! 414: break; ! 415: ! 416: default: ! 417: fprintf(stderr, "%s: unknown obj_item %d\n", my_name, obj_item(i)); ! 418: exit(1); ! 419: } ! 420: } ! 421: ! 422: fflush(stdout); ! 423: } ! 424: #endif DEBUG ! 425: ! 426: file_errors = 0; ! 427: install_strings(str_base + 1, obj_header.hd_str_size); ! 428: ! 429: type_index = 1; ! 430: data_ptr = data_base; ! 431: data_end = data_base + obj_header.hd_str_off - sizeof (header); ! 432: enter_types(obj_header.hd_type_size); ! 433: ! 434: str_num = 0; ! 435: var_index = 1; ! 436: data_ptr = data_base; ! 437: data_end = data_base + obj_header.hd_str_off - sizeof (header); ! 438: enter_vars(obj_header.hd_var_size); ! 439: ! 440: free((char *)str_trans); ! 441: free((char *)type_trans); ! 442: free((char *)var_trans); ! 443: free(data_base); ! 444: src_file = NULL; ! 445: ! 446: if (file_errors) ! 447: fflush(stdout); ! 448: } ! 449: ! 450: /* ! 451: * Open a library and load it. ! 452: */ ! 453: void ! 454: load_lib(l) ! 455: char *l; ! 456: { ! 457: register int fd; ! 458: register char *s; ! 459: extern int errno; ! 460: extern char *strcat(); ! 461: extern char *strcpy(); ! 462: ! 463: s = salloc(strlen(LIB_PATH) + strlen(l) + 1L); ! 464: (void)strcat(strcpy(s, LIB_PATH), l); ! 465: ! 466: if ((fd = open(s, 0)) == SYSERROR) ! 467: { ! 468: if (errno == ENOENT) ! 469: fprintf(stderr, "%s: no library '-l%s'\n", my_name, l); ! 470: else ! 471: { ! 472: fprintf(stderr, "%s: could not open ", my_name); ! 473: fflush(stderr); ! 474: perror(s); ! 475: } ! 476: ! 477: exit(1); ! 478: } ! 479: ! 480: read_obj(s, fd); ! 481: free(s); ! 482: (void)close(fd); ! 483: } ! 484: ! 485: /* ! 486: * Open an object file and load it. ! 487: */ ! 488: void ! 489: load_obj(s) ! 490: register char *s; ! 491: { ! 492: register int fd; ! 493: ! 494: if ((fd = open(s, 0)) == SYSERROR) ! 495: { ! 496: fprintf(stderr, "%s: could not open ", my_name); ! 497: fflush(stderr); ! 498: perror(s); ! 499: exit(1); ! 500: } ! 501: ! 502: read_obj(s, fd); ! 503: (void)close(fd); ! 504: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.