|
|
1.1 ! root 1: /* ! 2: * coh/cc.c ! 3: * CC command. ! 4: * Compile, assemble and link edit C programs. ! 5: * A lot of grunge. ! 6: * Revised by rec 5/87 to incorporate all ! 7: * COHERENT and GEMDOS revisions to date. ! 8: * Revised by steve 3/92 to produce monolithic COHERENT compiler. ! 9: * ! 10: * Compliing with -DVeryVflag produces very verbose output under -V option. ! 11: * ! 12: * C compiler/loader switch map. ! 13: * *7 marks a version seven documented option. ! 14: * *7d marks a defunct version seven option. ! 15: * *7c marks a changed version seven option. ! 16: * *u marks an option unrecognized by cc, i.e. passed to loader ! 17: * with no interpretation or processing. ! 18: * ! 19: * Options still up for grabs: ! 20: * [ C FGH J P R W Y ] ! 21: * [ b h j m yz] ! 22: * Change the verbose usage() message below when options change! ! 23: * ! 24: * ? list available options, cf. usage(1) below ! 25: * A auto edit mode ! 26: *7c Bstring use string to find compiler passes ! 27: *7 Dname[=value] preprocessor: #define ! 28: *7 E run preprocessor to stdout ! 29: *7 Ipathname preprocessor: #include search directory ! 30: * K keep intermediate files ! 31: * Lpathname loader: library directory specification ! 32: * Mstring use string as cross-compiler prefix ! 33: * N[01ab2sdlrt]string rename pass with string ! 34: *7 O run object code optimiser ! 35: *7d P put preprocessor output into name.i; use -Kqp ! 36: * Q be quiet, make no messages ! 37: *7 S make assembly language output ! 38: * T[value] use in-memory tempfiles of size value (default: 64K) ! 39: *7 Uname preprocessor: #undef ! 40: * V be verbose, report everything ! 41: * Vvariant enable variant ! 42: * X loader: remove C-generated local symbols ! 43: * Z (GEMDOS) floppy change prompts for phases ! 44: * a do not implicit output file name to loader ! 45: *7 c compile but do not load ! 46: * d loader: define common space ! 47: *7 e name loader: entry point specification ! 48: *7c f load floating point output conversion routines ! 49: * g generate debug info, same as -VDB ! 50: *7u i loader: separate i and d spaces ! 51: * k system loader: bind as kernel process [but ld doesn't grok it] ! 52: *7c lname loader: library specification ! 53: *7u n loader: shared instruction space ! 54: *7 o name loader: output file name ! 55: *7 p generate code to profile function calls ! 56: * q[p012s] quit after specified pass ! 57: * r loader: retain relocation in output ! 58: * s loader: strip symbol table ! 59: *7c t[p012adlrt] take specified passes from -Bdirectory ! 60: *7 u name loader: undefine name ! 61: * v verbose, same as V ! 62: * w loader: watch ! 63: * x loader: remove local symbols from symbol table ! 64: */ ! 65: ! 66: #if GEMDOS ! 67: #ifndef VERS ! 68: #define VERS "2.1" ! 69: #endif ! 70: #endif ! 71: ! 72: #include <stdio.h> ! 73: #include <setjmp.h> ! 74: #include <string.h> ! 75: #include <ctype.h> ! 76: #include <signal.h> ! 77: #include <path.h> ! 78: #include <errno.h> ! 79: #include "mch.h" ! 80: #include "host.h" ! 81: #include "ops.h" ! 82: #include "stream.h" ! 83: #undef NONE ! 84: #include "var.h" ! 85: #include "varmch.h" ! 86: ! 87: #ifndef VeryVflag ! 88: #define VeryVflag 0 ! 89: #endif ! 90: ! 91: #ifndef PREFIX ! 92: #define PREFIX "" ! 93: #endif ! 94: ! 95: #if _I386 ! 96: #define DTEFG "_dtefg" ! 97: #else ! 98: #define DTEFG "_dtefg_" ! 99: #endif ! 100: ! 101: /* ! 102: ** Pass information. ! 103: */ ! 104: #define NONE -1 ! 105: #define CPP 0 /* Pass index numbers */ ! 106: #define CC0 1 ! 107: #define CC1 2 ! 108: #define CC2 3 ! 109: #define CC3 4 ! 110: #define CC4 5 /* Output writer postprocessor */ ! 111: #define AS 6 ! 112: #define LD 7 ! 113: #define LD2 8 /* Loader postprocessor */ ! 114: #define ED 9 ! 115: #define LIB 10 ! 116: #define CRT 11 ! 117: #define TMP 12 ! 118: #define ALL 13 ! 119: #define CC2B 14 /* for monolithic compiler */ ! 120: ! 121: #define P_TAKE 1 /* Take pass from backup directory */ ! 122: #define P_BACK 2 /* Backup directory specified */ ! 123: #define P_LIB 4 /* Take pass from LIBPATH */ ! 124: #define P_BIN 8 /* Take pass from BIN */ ! 125: ! 126: #define PTMP 32 /* Pass name buffer size */ ! 127: ! 128: char dnul[] = ""; /* Global null string */ ! 129: char dmch[PTMP] = PREFIX; /* Cross compiler prefix */ ! 130: ! 131: struct pass { ! 132: char p_flag; /* Flags */ ! 133: char p_psn; /* Pass short name */ ! 134: char p_pln[PTMP]; /* Pass long name */ ! 135: char p_pfs[4]; /* Pass output file suffix */ ! 136: char *p_ifn; /* Input file name */ ! 137: char *p_ofn; /* Output file name */ ! 138: char *p_sfn; /* Scratch file name */ ! 139: char *p_dir; /* Path lookup or backup string */ ! 140: char *p_mch; /* Machine prefix name */ ! 141: } pass[] = { ! 142: { P_LIB, 'p', "cpp", "i", NULL, NULL, NULL, NULL, dmch }, ! 143: { P_LIB, '0', "cc0", "0", NULL, NULL, NULL, NULL, dmch }, ! 144: { P_LIB, '1', "cc1", "1", NULL, NULL, NULL, NULL, dmch }, ! 145: { P_LIB, '2', "cc2", "o", NULL, NULL, NULL, NULL, dmch }, ! 146: { P_LIB, '3', "cc3", "s", NULL, NULL, NULL, NULL, dmch }, ! 147: { P_LIB, '4', "cc4", "o", NULL, NULL, NULL, NULL, dmch }, ! 148: { P_BIN, 's', "as", "o", NULL, NULL, NULL, NULL, dmch }, ! 149: { P_BIN, 'd', "ld", "", NULL, NULL, NULL, NULL, dnul }, ! 150: { P_BIN, 'x', "ld2", "", NULL, NULL, NULL, NULL, dnul }, ! 151: { P_BIN, 'e', "me", "", NULL, NULL, NULL, NULL, dnul }, ! 152: { P_LIB, 'l', "lib", "a", NULL, NULL, NULL, NULL, dmch }, ! 153: { P_LIB, 'r', "crts0.o", "", NULL, NULL, NULL, NULL, dmch }, ! 154: { 0, 't', "cc", "", NULL, NULL, NULL, NULL, dnul } ! 155: }; ! 156: ! 157: /* ! 158: ** Option and argument information. ! 159: */ ! 160: #define CCOPT 0x001 /* Argument flags in argf[] */ ! 161: #define PPOPT 0x002 /* Also in option table, at least */ ! 162: #define LDOPT 0x004 /* those that fit in a byte */ ! 163: #define LD2OPT 0x008 ! 164: #define CCLIB 0x010 ! 165: #define LDLIB 0x020 ! 166: #define CCARG 0x040 ! 167: #define ASARG 0x080 ! 168: #define MARG 0x100 ! 169: #define LDARG 0x200 ! 170: ! 171: /* Flag bits for ccvariant. */ ! 172: #define FLAG_c 0x001 /* -c flag */ ! 173: #define FLAG_O 0x002 /* -O flag */ ! 174: #define FLAG_f 0x004 /* -f flag */ ! 175: #define FLAG_K 0x008 /* -K or -VKEEP flag */ ! 176: #define VS 0x010 /* Turn on strict messages */ ! 177: #define VDB 0x020 /* Turn on debugging */ ! 178: #define FLAG_A 0x040 /* Auto edit mode */ ! 179: #define FLAG_Z 0x080 /* Floppy change prompts */ ! 180: #define FLAG_V 0x100 /* Verbose flag */ ! 181: #if GEMDOS ! 182: #define FLAG_GEMAPP 0x200 /* Gem application compile */ ! 183: #define FLAG_GEMACC 0x400 /* Gem accessory compile */ ! 184: #endif ! 185: #define FLAG_a 0x800 /* Suppress output file name to ld */ ! 186: ! 187: struct option { /* option table */ ! 188: char o_kind; ! 189: char o_flag; ! 190: char *o_name; ! 191: int o_bits; ! 192: } option[] = { ! 193: /* Strict */ ! 194: { 0, CCOPT, "VSUREG", VSUREG }, ! 195: { 0, CCOPT, "VSUVAR", VSUVAR }, ! 196: { 0, CCOPT, "VSNREG", VSNREG }, ! 197: { 0, CCOPT, "VSRTVC", VSRTVC }, ! 198: { 0, CCOPT, "VSMEMB", VSMEMB }, ! 199: { 0, CCOPT, "VSBOOK", VSBOOK }, ! 200: { 0, CCOPT, "VSLCON", VSLCON }, ! 201: { 0, CCOPT, "VSPVAL", VSPVAL }, ! 202: { 0, CCOPT, "VSCCON", VSCCON }, ! 203: /* ! 204: * Debug. ! 205: * The -VDB option turns on all of these; ! 206: * no earlier option may start with "VD", ! 207: * and the next non-debug option must not start with "VD". ! 208: */ ! 209: { 0, CCOPT, "VDEBUG", VDEBUG }, ! 210: { 0, CCOPT, "VDLINE", VLINES }, ! 211: { 0, CCOPT, "VDTYPE", VTYPES }, ! 212: { 0, CCOPT, "VDSYMB", VDSYMB }, ! 213: ! 214: /* Miscellaneous */ ! 215: { 0, CCOPT, "VSTAT", VSTAT }, ! 216: { 0, CCOPT, "VWIDEN", VWIDEN }, ! 217: { 0, CCOPT, "VPEEP", VPEEP }, ! 218: { 0, CCOPT, "VCOMM", VCOMM }, ! 219: { 0, CCOPT, "VQUIET", VQUIET }, ! 220: { 0, CCOPT, "VPSTR", VPSTR }, ! 221: { 0, CCOPT, "VROM", VROM }, ! 222: { 0, CCOPT, "VASM", VASM }, ! 223: ! 224: { 0, CCOPT, "VLIB", VLIB }, ! 225: { 0, CCOPT, "VNOWARN", VNOWARN }, ! 226: { 0, CCOPT, "VPROF", VPROF }, ! 227: { 0, CCOPT, "VALIEN", VALIEN }, ! 228: { 0, CCOPT, "VREADONLY", VREADONLY }, ! 229: { 0, CCOPT, "VSINU", VSINU }, ! 230: { 0, CCOPT, "VNOOPT", VNOOPT }, ! 231: { 0, CCOPT, "VCPLUS", VCPLUS }, ! 232: { 0, CCOPT, "VCPPE", VCPPE }, ! 233: { 0, CCOPT, "VCPPC", VCPPC }, ! 234: { 0, CCOPT, "VCPP", VCPP }, ! 235: { 0, CCOPT, "VTPROF", VTPROF }, ! 236: { 0, CCOPT, "V3GRAPH", V3GRAPH }, ! 237: #if 1 ! 238: /* Intel flags */ ! 239: { 0, CCOPT, "VSMALL", VSMALL }, ! 240: { 0, CCOPT, "VLARGE", VLARGE }, ! 241: { 0, CCOPT, "V8087", V8087 }, ! 242: { 0, CCOPT, "VNDP", VNDP }, ! 243: { 0, CCOPT, "VRAM", VRAM }, ! 244: { 0, CCOPT, "VOMF", VOMF }, ! 245: { 0, CCOPT, "V80186", V80186 }, ! 246: { 0, CCOPT, "V80287", V80287 }, ! 247: { 0, CCOPT, "VALIGN", VALIGN }, ! 248: { 0, CCOPT, "VEMU87", VEMU87 }, ! 249: { 0, CCOPT, "VXSTAT", VXSTAT }, ! 250: #endif ! 251: #if GEMDOS ! 252: /* Motorola and Gemdos flags */ ! 253: { 12, CCOPT, "VGEMACC", FLAG_GEMACC }, ! 254: { 12, CCOPT, "VGEMAPP", FLAG_GEMAPP }, ! 255: { 12, CCOPT, "VGEM", FLAG_GEMAPP }, ! 256: { 10, CCOPT, "VSPLIM", VSPLIM }, ! 257: { 10, CCOPT, "VNOTRAPS", VNOTRAPS }, ! 258: #endif ! 259: /* More miscellaneous flags */ ! 260: { 2, CCOPT, "VDB", VDB }, ! 261: { 2, CCOPT, "g", VDB }, ! 262: { 2, CCOPT, "VS", VS }, ! 263: { 12, CCOPT, "A", FLAG_A }, ! 264: { 12, CCOPT, "a", FLAG_a }, ! 265: { 12, CCOPT, "Z", FLAG_Z }, ! 266: { 12, CCOPT, "c", FLAG_c }, ! 267: { 10, CCOPT, "S", VASM }, ! 268: { 2, CCOPT, "O", FLAG_O }, ! 269: { 0, CCOPT, "E", VCPPE }, ! 270: { 12, CCOPT, "f", FLAG_f }, ! 271: { 12, CCOPT, "VFLOAT", FLAG_f }, ! 272: { 0, CCOPT, "p", VPROF }, ! 273: { 12, CCOPT, "VKEEP", FLAG_K }, ! 274: { 12, CCOPT, "K", FLAG_K }, ! 275: { 0, CCOPT, "Q", VQUIET }, ! 276: { 11, CCOPT, "VVERSION" }, ! 277: { 12, CCOPT, "V", FLAG_V }, /* all -V* must precede this */ ! 278: { 12, CCOPT, "v", FLAG_V }, ! 279: /* Preprocessor options */ ! 280: { 3, PPOPT, "D" }, ! 281: { 3, PPOPT, "I" }, ! 282: { 3, PPOPT, "U" }, ! 283: /* Loader options */ ! 284: { 4, LDOPT, "d" }, ! 285: { 4, LDOPT, "i" }, ! 286: { 4, LDOPT, "n" }, ! 287: { 5, LDOPT, "o" }, ! 288: { 4, LDOPT, "r" }, ! 289: { 4, LDOPT, "s" }, ! 290: { 4, LDOPT, "w" }, ! 291: { 4, LDOPT, "x" }, ! 292: { 4, LDOPT, "X" }, ! 293: #if 1 ! 294: { 8, LDOPT, "L" }, ! 295: #endif ! 296: { 5, LDOPT, "e" }, ! 297: { 5, LDOPT, "k" }, ! 298: { 5, LDOPT, "u" }, ! 299: /* C dispatcher options */ ! 300: { 6, CCOPT, "q" }, ! 301: { 7, CCOPT, "t" }, ! 302: { 7, CCOPT, "B" }, ! 303: { 7, CCOPT, "M" }, ! 304: { 7, CCOPT, "N" }, ! 305: #if TEMPBUF ! 306: { 9, CCOPT, "T" }, ! 307: #endif ! 308: { 8, CCLIB, "l" }, ! 309: { 13, CCOPT, "?" }, ! 310: { -1, -1, "" } ! 311: }; ! 312: ! 313: int ccvariant = 0; /* Variant template */ ! 314: VARIANT variant; /* Binary variant template */ ! 315: char vstr[2*VMAXIM/VGRANU + 1]; /* Ascii variant string */ ! 316: char vstr2[2*VMAXIM/VGRANU + 1]; /* Ascii variant string for .m */ ! 317: ! 318: /* ! 319: ** Compiler parameters and flags ! 320: */ ! 321: #define NCMDA 128 /* Size of argument pointer buffer */ ! 322: #define NCMDB 1024 /* Size of argument buffer */ ! 323: #define NTMP L_tmpnam /* Temp file buffer size, from stdio.h */ ! 324: #define MAGIC 127 /* Exit status mask */ ! 325: #define NSLEEP 10 /* # of sleeps */ ! 326: #define DELAY 5 /* Sleep delay, seconds */ ! 327: ! 328: int nldob; /* Number of objects created */ ! 329: int nfile; /* Number of files to compile or assemble */ ! 330: int nname; /* Number of file name arguments */ ! 331: int ndota; ! 332: int ndotc; ! 333: int ndotm; ! 334: int ndoto; ! 335: int ndots; ! 336: int partial; /* Partial link specified */ ! 337: ! 338: #define aflag ((ccvariant&FLAG_a)!=0) ! 339: #define cflag ((ccvariant&FLAG_c)!=0) ! 340: #define pflag isvariant(VPROF) ! 341: #define fflag ((ccvariant&FLAG_f)!=0) ! 342: #define Kflag ((ccvariant&FLAG_K)!=0) ! 343: #define Oflag ((ccvariant&FLAG_O)!=0) ! 344: #define Sflag isvariant(VASM) ! 345: #define Eflag isvariant(VCPPE) ! 346: #define Vflag ((ccvariant&FLAG_V)!=0) ! 347: #define Qflag isvariant(VQUIET) ! 348: #define Aflag ((ccvariant&FLAG_A)!=0) ! 349: #define Zflag ((ccvariant&FLAG_Z)!=0) ! 350: #if GEMDOS ! 351: #define GEMAPPflag ((ccvariant&FLAG_GEMAPP)!=0) ! 352: #define GEMACCflag ((ccvariant&FLAG_GEMACC)!=0) ! 353: #endif ! 354: ! 355: int qpass = NONE; /* Quit after this pass */ ! 356: int nload; /* No load phase */ ! 357: char *outf; /* Output file */ ! 358: char *doutf; /* Default output file stem */ ! 359: char *dpath = DEFPATH; ! 360: char *dlibpath = DEFLIBPATH; ! 361: int xstat; /* Exit status */ ! 362: ! 363: char *cmda[NCMDA]; /* Argument pointer buffer */ ! 364: char cmdb[NCMDB]; /* Argument buffer */ ! 365: char newo[NTMP]; /* New object to be removed */ ! 366: char tmp[7][NTMP]; /* Intermediate filenames */ ! 367: char istmp[7]; /* Truth about their temporariness */ ! 368: int argf[NCMDA]; /* Argument flags */ ! 369: char optb[NCMDB]; /* Option rewrite buffer */ ! 370: char *optp = &optb[0]; /* Option rewrite position */ ! 371: ! 372: #if TEMPBUF ! 373: unsigned char *inbuf; /* memory input buffer */ ! 374: unsigned char *inbufp; /* input buffer pointer */ ! 375: unsigned char *inbufmax; /* input buffer end */ ! 376: unsigned char *outbuf; /* memory output buffer */ ! 377: unsigned char *outbufp; /* output buffer pointer */ ! 378: unsigned char *outbufmax; /* output buffer end */ ! 379: unsigned int tempsize = 65536; /* memory buffer size */ ! 380: #endif ! 381: ! 382: #if MONOLITHIC ! 383: int monolithic = 1; /* set to 0 if phases needed */ ! 384: ! 385: /* Information passed to phases through globals in monolithic compiler */ ! 386: jmp_buf death; /* for fatal error handling */ ! 387: int dotseg; /* current segment */ ! 388: char file[NFNAME]; /* current input file name */ ! 389: char basefile[NFNAME]; /* original input file name */ ! 390: char id[NCSYMB]; /* global identifier buffer */ ! 391: FILE *ifp; /* input FILE */ ! 392: int line; /* line number */ ! 393: int mflag; /* debug flag */ ! 394: char module[NMNAME]; /* module name buffer */ ! 395: int oflag; /* debug flag */ ! 396: FILE *ofp; /* output FILE */ ! 397: int sflag; /* debug flag */ ! 398: #endif ! 399: ! 400: /* Forward. */ ! 401: FILE *ccopen(); ! 402: char *makepass(); ! 403: char *makelib(); ! 404: int cleanup(); ! 405: ! 406: /* External. */ ! 407: char *getenv(); ! 408: char *malloc(); ! 409: char *tempnam(); ! 410: char *path(); ! 411: ! 412: main(argc, argv) int argc; char *argv[]; ! 413: { ! 414: register char *p; ! 415: register struct option *op; ! 416: int i, narg, c, n; ! 417: ! 418: #if COHERENT ! 419: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 420: signal(SIGINT, cleanup); ! 421: #endif ! 422: #if _I386 ! 423: /* Conditionalized only because _addargs() not in COH286 libc.a yet. */ ! 424: _addargs("CC", &argc, &argv); ! 425: #endif ! 426: setbuf(stdout, NULL); ! 427: setbuf(stderr, NULL); ! 428: setvariant(VSUVAR); ! 429: setvariant(VSMEMB); ! 430: setvariant(VSLCON); ! 431: setvariant(VSPVAL); ! 432: setvariant(VPEEP); ! 433: setvariant(VCOMM); ! 434: setvariant(VPSTR); ! 435: setvariant(V80186); ! 436: ! 437: #if 0 ! 438: printmem("initially"); ! 439: #endif ! 440: if (p = getenv("PATH")) dpath = p; ! 441: if (p = getenv("LIBPATH")) dlibpath = p; ! 442: if (p = getenv("EDITOR")) strcpy(pass[ED].p_pln, p); ! 443: ! 444: for (i=1; i<argc; i+=narg) { ! 445: narg = 1; ! 446: p = argv[i]; ! 447: if (*p++ == '-') { ! 448: /* ! 449: * Process an option argument. ! 450: * This is particularly squirrly because it allows ! 451: * several options to be combined in a single arg. ! 452: */ ! 453: char *ppopt = ""; ! 454: static char tldopt[64] = "-"; ! 455: char *tlp = &tldopt[1]; ! 456: ! 457: if (*p == '\0') { ! 458: badopt: ! 459: whatopt(argv[i]); ! 460: continue; ! 461: } ! 462: while (*p != '\0') { ! 463: for (op = &option[0]; ; op += 1) ! 464: if (op->o_name[0] == '\0') ! 465: goto badopt; ! 466: else if (opeq(op->o_name, p)) ! 467: break; ! 468: if (VeryVflag && Vflag) ! 469: printf("Option: -%s\n", op->o_name); ! 470: argf[i] |= op->o_flag; ! 471: switch (op->o_kind) { ! 472: case 0: ! 473: /* Toggle variant. */ ! 474: chgvariant(op->o_bits); ! 475: p += strlen(op->o_name); ! 476: continue; ! 477: case 10: ! 478: /* Set variant. */ ! 479: setvariant(op->o_bits); ! 480: p += strlen(op->o_name); ! 481: continue; ! 482: case 2: ! 483: /* Toggle ccvariant. */ ! 484: ccvariant ^= op->o_bits; ! 485: p += strlen(op->o_name); ! 486: /* Set strict */ ! 487: if ((ccvariant&VS) != 0) { ! 488: for (op = &option[0];; op += 1) ! 489: if (op->o_name[1]=='S') ! 490: break; ! 491: while (op->o_name[1]=='S') { ! 492: setvariant(op->o_bits); ! 493: op += 1; ! 494: } ! 495: } ! 496: /* Set debug */ ! 497: if ((ccvariant&VDB) != 0) { ! 498: for (op = &option[0];; op += 1) ! 499: if (op->o_name[1]=='D') ! 500: break; ! 501: while (op->o_name[1]=='D') { ! 502: setvariant(op->o_bits); ! 503: op += 1; ! 504: } ! 505: } ! 506: continue; ! 507: case 12: ! 508: /* Set ccvariant. */ ! 509: ccvariant |= op->o_bits; ! 510: p += strlen(op->o_name); ! 511: continue; ! 512: case 3: ! 513: /* Preprocessor options. */ ! 514: ppopt = p; ! 515: p += strlen(p); ! 516: continue; ! 517: case 5: ! 518: /* ld options with file args */ ! 519: if (*p == 'o') { ! 520: outf = argv[i+narg]; ! 521: } ! 522: if (*p == 'u') ! 523: ndoto += 1; ! 524: if (i+narg >= argc) ! 525: missingname(); ! 526: argf[i+narg++] = LDOPT; ! 527: /* Fall through */ ! 528: case 4: ! 529: /* ld options without args */ ! 530: if (*p == 'r') ! 531: ++partial; ! 532: n = strlen(op->o_name); ! 533: if (tlp + n >= &tldopt[64]) ! 534: cquit("ld args too long"); ! 535: strcpy(tlp, op->o_name); ! 536: tlp += n; ! 537: p += n; ! 538: continue; ! 539: case 6: ! 540: /* -q */ ! 541: if ((c = p[1]) == '\0' ! 542: || (c = getpsn(c)) < CPP) ! 543: goto badopt; ! 544: qpass = c; ! 545: p += 2; ! 546: continue; ! 547: case 7: ! 548: /* Pass renaming options -tBMN */ ! 549: #if MONOLITHIC ! 550: monolithic = 0; /* need phases */ ! 551: #if TEMPBUF ! 552: tempsize = 0; /* use disk temps */ ! 553: #endif ! 554: #endif ! 555: c = p[0]; ! 556: getpass(c, p+1); ! 557: p = dnul; ! 558: continue; ! 559: case 8: ! 560: /* -l */ ! 561: p = dnul; ! 562: continue; ! 563: #if TEMPBUF ! 564: case 9: ! 565: /* -T */ ! 566: tempsize = atoi(++p); ! 567: tempsize = (tempsize + 3) & ~3; ! 568: p = dnul; ! 569: continue; ! 570: #endif ! 571: case 11: ! 572: /* -VVERSION */ ! 573: p += strlen(op->o_name); ! 574: fprintf(stderr, "cc: " ! 575: #if COHERENT ! 576: "COHERENT " ! 577: #endif ! 578: #if _I386 ! 579: "i386 " ! 580: #endif ! 581: "cc " VERSMWC "\n"); ! 582: break; ! 583: ! 584: case 13: ! 585: /* -? */ ! 586: usage(1); ! 587: break; ! 588: default: ! 589: cquit("options"); ! 590: } ! 591: } ! 592: if (((unsigned)argf[i]-1)&((unsigned)argf[i])) { ! 593: /* ! 594: * Handle multiple arg types in a single arg ! 595: * by writing the arg, ! 596: * then the cpp form of the arg, ! 597: * then the ld form of the arg. ! 598: * runpp and runld understand how to grovel ! 599: * for their args when this gets used, ! 600: * undoing this braindamage. ! 601: */ ! 602: if (optp + strlen(argv[i]) + 1 ! 603: + 1 + strlen(ppopt) + 1 ! 604: + strlen(tldopt) + 1 >= &optb[NCMDB]) ! 605: cquit("option buffer overflow"); ! 606: strcpy(optp, argv[i]); ! 607: argv[i] = optp; ! 608: optp += strlen(optp)+1; ! 609: *optp++ = '-'; ! 610: strcpy(optp, ppopt); ! 611: optp += strlen(optp)+1; ! 612: strcpy(optp, tldopt); ! 613: optp += strlen(optp)+1; ! 614: } ! 615: } else { ! 616: while (*p) p+=1; ! 617: c = *--p; ! 618: if (*--p != '.') c = 0; ! 619: if (c >= 'A' && c <= 'Z') ! 620: c |= 'a'-'A'; ! 621: switch (c) { ! 622: case 'h': ! 623: case 'c': ! 624: if (doutf == NULL) doutf = argv[i]; ! 625: ndotc += 1; ! 626: argf[i] = CCARG; ! 627: if (VeryVflag && Vflag) ! 628: printf("cc file: %s\n", argv[i]); ! 629: break; ! 630: case 's': ! 631: if (doutf == NULL) doutf = argv[i]; ! 632: ndots += 1; ! 633: argf[i] = ASARG; ! 634: if (VeryVflag && Vflag) ! 635: printf("as file: %s\n", argv[i]); ! 636: break; ! 637: case 'm': ! 638: if (doutf == NULL) doutf = argv[i]; ! 639: ndotm += 1; ! 640: argf[i] = MARG; ! 641: if (VeryVflag && Vflag) ! 642: printf("m file: %s\n", argv[i]); ! 643: break; ! 644: case 'o': ! 645: if (doutf == NULL) doutf = argv[i]; ! 646: ndoto += 1; ! 647: argf[i] = LDARG; ! 648: if (VeryVflag && Vflag) ! 649: printf("ld file: %s\n", argv[i]); ! 650: break; ! 651: case 'a': ! 652: default: ! 653: ndota += 1; ! 654: argf[i] = LDLIB; ! 655: if (VeryVflag && Vflag) ! 656: printf("library: %s\n", argv[i]); ! 657: break; ! 658: } ! 659: } ! 660: } ! 661: #if GEMDOS ! 662: if (Vflag) { ! 663: fprintf(stderr, "Mark Williams C for the Atari ST, %s\n", VERS); ! 664: fprintf(stderr, "Copyright 1984-1987, Mark Williams Co., Chicago\n"); ! 665: } ! 666: #endif ! 667: resolve(); ! 668: compile(argc, argv); ! 669: if (nload==0 && runld(argc, argv)==0) { ! 670: if (Kflag==0 && nldob==1 && newo[0]!=0) ! 671: rm(newo); ! 672: } ! 673: #if TEMPBUF ! 674: if (inbuf != NULL) ! 675: free(inbuf); ! 676: if (outbuf != NULL) ! 677: free(outbuf); ! 678: #if 0 ! 679: printmem("before exit"); ! 680: #endif ! 681: #endif ! 682: exit(xstat); ! 683: } ! 684: ! 685: /* ! 686: * Resolve remaining ambiguities. ! 687: * Initialize variant arguments and files. ! 688: */ ! 689: resolve() ! 690: { ! 691: register int i; ! 692: ! 693: #if TEMPBUF ! 694: register char *p; ! 695: ! 696: /* ! 697: * The following malloc is a temporary hack for COH386 efficiency. ! 698: * The rationale is: ! 699: * (1) reduce the number of required sbrk() calls, and ! 700: * (2) reduce the risk of running out of memory, ! 701: * because COH386 without paging requires old+new bytes free ! 702: * to grow from old to new. ! 703: * This will doubtless be changed in the future. ! 704: */ ! 705: #define NARENA 131072 ! 706: if ((p = malloc(tempsize + tempsize + NARENA)) != NULL) ! 707: free(p); ! 708: if (tempsize != 0 && Eflag == 0 && Kflag == 0) { ! 709: inbuf = malloc(tempsize); ! 710: outbuf = malloc(tempsize); ! 711: outbufp = outbuf; ! 712: outbufmax = outbuf + tempsize; ! 713: if (inbuf == NULL || outbuf == NULL) { ! 714: fprintf(stderr, "cc: in-memory tempfile buffer allocation failed\n"); ! 715: if (inbuf != NULL) ! 716: free(inbuf); ! 717: inbuf = outbuf = NULL; ! 718: } ! 719: } ! 720: #if 0 ! 721: printmem("after buffer allocation"); ! 722: #endif ! 723: #endif ! 724: for (i = CPP; i < ALL; i += 1) { ! 725: if (pass[i].p_flag & P_BACK) ! 726: ; ! 727: else if (pass[i].p_flag & P_LIB) ! 728: pass[i].p_dir = dlibpath; ! 729: else if (pass[i].p_flag & P_BIN) ! 730: pass[i].p_dir = dpath; ! 731: strcpy(cmdb, pass[i].p_mch); ! 732: strcat(cmdb, pass[i].p_pln); ! 733: #if GEMDOS ! 734: if (i <= ED && strchr(pass[i].p_pln, '.') == NULL) ! 735: strcat(cmdb, i==ED ? ".tos" : ".prg"); ! 736: #endif ! 737: if (strlen(cmdb) > PTMP-1) ! 738: cquit("pass name \"%s\" is too long", cmdb); ! 739: strcpy(pass[i].p_pln, cmdb); ! 740: } ! 741: #if 1 ! 742: if (isvariant(VOMF)) { ! 743: clrvariant(VCOMM); ! 744: if (isvariant(VLARGE) && isvariant(VSMALL)) ! 745: cquit("invalid model specification"); ! 746: if (notvariant(VLARGE) && notvariant(VSMALL)) ! 747: setvariant(VSMALL); ! 748: } else { ! 749: clrvariant(VLARGE); ! 750: setvariant(VSMALL); ! 751: } ! 752: #endif ! 753: #if GEMDOS ! 754: if (GEMAPPflag && GEMACCflag) ! 755: cquit("specify VGEMAPP or VGEMACC, not both"); ! 756: if (GEMAPPflag) getpass('N', "rcrtsg.o"); ! 757: if (GEMACCflag) getpass('N', "rcrtsd.o"); ! 758: #endif ! 759: if (pflag) getpass('N', "rmcrts0.o"); ! 760: if (Eflag) setvariant(VCPP); ! 761: if (qpass == NONE) { ! 762: if (isvariant(VCPP)) ! 763: qpass = CPP; ! 764: else if (Sflag) ! 765: qpass = CC3; ! 766: else if (cflag) ! 767: qpass = AS; ! 768: else ! 769: qpass = LD; ! 770: } else if (qpass == CPP) ! 771: setvariant(VCPP); ! 772: if (VeryVflag && Vflag) ! 773: printf("quit pass is %s\n", pass[qpass].p_pln); ! 774: makvariant(vstr); ! 775: if (ndotm != 0 && notvariant(VCPP) && notvariant(VCPPE)) { ! 776: setvariant(VCPP); ! 777: setvariant(VCPPE); ! 778: makvariant(vstr2); ! 779: clrvariant(VCPP); ! 780: clrvariant(VCPPE); ! 781: } ! 782: nfile = ndotc + ndots + ndotm; ! 783: nname = nfile + ndoto + ndota; ! 784: if (nname == 0) ! 785: usage(0); ! 786: if (qpass < LD) ! 787: ++nload; ! 788: if (Aflag) ! 789: maketempfile(6); ! 790: if ( ! Eflag) { ! 791: chkofile(); ! 792: if (Kflag) { ! 793: pass[CPP].p_ofn = pass[CC0].p_ifn = tmp[0]; ! 794: pass[CC0].p_ofn = pass[CC1].p_ifn = tmp[1]; ! 795: pass[CC1].p_ofn = pass[CC2].p_ifn = tmp[2]; ! 796: if ( ! Sflag) { ! 797: pass[CC2].p_sfn = tmp[3]; ! 798: pass[CC2].p_ofn = tmp[5]; ! 799: } else { ! 800: pass[CC3].p_ifn = pass[CC2].p_ofn = tmp[3]; ! 801: pass[CC3].p_ofn = tmp[5]; ! 802: } ! 803: } else { ! 804: pass[CPP].p_ofn = pass[CC0].p_ifn = tmp[0]; ! 805: pass[CC0].p_ofn = pass[CC1].p_ifn = tmp[1]; ! 806: pass[CC1].p_ofn = pass[CC2].p_ifn = tmp[0]; ! 807: if ( ! Sflag) { ! 808: pass[CC2].p_sfn = tmp[1]; ! 809: pass[CC2].p_ofn = tmp[5]; ! 810: } else { ! 811: pass[CC3].p_ifn = pass[CC2].p_ofn = tmp[1]; ! 812: pass[CC3].p_ofn = tmp[5]; ! 813: } ! 814: #if TEMPBUF ! 815: if (inbuf != NULL && outbuf != NULL) ! 816: tmp[0][0] = tmp[1][0] = '\0'; ! 817: else ! 818: #endif ! 819: { ! 820: maketempfile(0); ! 821: maketempfile(1); ! 822: } ! 823: } ! 824: pass[AS].p_ofn = tmp[5]; ! 825: } ! 826: } ! 827: ! 828: maketempfile(i) register int i; ! 829: { ! 830: register char *p; ! 831: ! 832: strcpy(tmp[i], p = tempnam(pass[TMP].p_dir, pass[TMP].p_pln)); ! 833: free(p); ! 834: ++istmp[i]; ! 835: } ! 836: ! 837: /* ! 838: ** Compilation. ! 839: */ ! 840: compile(argc, argv) int argc; char *argv[]; ! 841: { ! 842: register char *p1; ! 843: register c, i, err; ! 844: ! 845: err = 0; ! 846: for (i=1; i<argc; ++i) { ! 847: if ((c = (argf[i] & (CCARG | ASARG | MARG))) == 0) ! 848: continue; ! 849: p1 = argv[i]; ! 850: if (err) { ! 851: err = 0; ! 852: if (runme(p1)) { ! 853: ++nload; ! 854: } else { ! 855: --i; ! 856: xstat = 0; ! 857: } ! 858: continue; ! 859: } ! 860: if (nfile > 1 && Qflag == 0) ! 861: printf("%s:\n", p1); ! 862: setfiles(c, p1); ! 863: if (c == CCARG) { ! 864: if (runpp(argc, argv, vstr)) { ! 865: if (Aflag) { ! 866: ++err; --i; ! 867: } else ! 868: ++nload; ! 869: continue; ! 870: } ! 871: if (qpass <= CC0) ! 872: continue; ! 873: if (runcc(CC1)) { ! 874: ++nload; ! 875: continue; ! 876: } ! 877: if (qpass <= CC1) ! 878: continue; ! 879: if (runcc(CC2)) { ! 880: ++nload; ! 881: continue; ! 882: } ! 883: if (qpass <= CC2) ! 884: continue; ! 885: if (Sflag) { ! 886: if (runcc(CC3)) { ! 887: ++nload; ! 888: continue; ! 889: } ! 890: if (qpass <= CC3) ! 891: continue; ! 892: } ! 893: } else if (c == ASARG && qpass>=AS) { ! 894: if (runas()) { ! 895: if (Aflag) { ! 896: ++err; --i; ! 897: } else ! 898: ++nload; ! 899: continue; ! 900: } ! 901: if (qpass <= AS) ! 902: continue; ! 903: } else if (c == MARG) { ! 904: if (runpp(argc, argv, vstr2)) { ! 905: if (Aflag) { ! 906: ++err; --i; ! 907: } else ! 908: ++nload; ! 909: continue; ! 910: } ! 911: if (qpass < AS) ! 912: continue; ! 913: if (runas()) { ! 914: if (Aflag) { ! 915: ++err; --i; ! 916: } else ! 917: ++nload; ! 918: continue; ! 919: } ! 920: if (qpass == AS) ! 921: continue; ! 922: } ! 923: makeft(p1, p1, "o"); ! 924: } ! 925: cleanup(0); ! 926: } ! 927: ! 928: runpp(argc, argv, var) int argc; register char *argv[]; char var[]; ! 929: { ! 930: register char **cp; ! 931: register int i; ! 932: char *p1; ! 933: #if MONOLITHIC ! 934: int status; ! 935: extern int nerr; /* in common/diag.c */ ! 936: #endif ! 937: ! 938: cp = cmda; ! 939: #if MONOLITHIC ! 940: if (monolithic) { ! 941: nerr = 0; ! 942: *cp++ = "cc0"; ! 943: } else { ! 944: #endif ! 945: p1 = cmdb; ! 946: p1 = makepass(CC0, *cp++ = p1, AEXEC); ! 947: #if MONOLITHIC ! 948: } ! 949: #endif ! 950: *cp++ = var; ! 951: *cp++ = pass[CPP].p_ifn; ! 952: if (qpass < CC0) ! 953: p1 = *cp++ = Kflag ? pass[CPP].p_ofn : "-"; ! 954: else ! 955: p1 = *cp++ = pass[CC0].p_ofn; ! 956: for (i=1; i<argc; ++i) { ! 957: if ((argf[i]&PPOPT) != 0) { ! 958: *cp++ = argv[i]; ! 959: if ((argf[i]&~PPOPT) != 0) /* see comment in main */ ! 960: cp[-1] += strlen(cp[-1])+1; ! 961: } ! 962: } ! 963: *cp = 0; ! 964: #if MONOLITHIC ! 965: if (monolithic) { ! 966: if ((ifp = fopen(pass[CPP].p_ifn, "r")) == NULL) { ! 967: fprintf(stderr, "cc: cannot open %s\n", pass[CPP].p_ifn); ! 968: return 1; ! 969: } ! 970: if (Eflag) ! 971: ofp = (strcmp(p1, "-") == 0) ? stdout : ccopen(p1, "w"); ! 972: else ! 973: ofp = (*p1 == '\0') ? NULL : ccopen(p1, SWMODE); ! 974: argc = cp - cmda; ! 975: if (Vflag) { ! 976: for (i = 0; i < argc; i++) ! 977: printf("%s ", cmda[i]); ! 978: if (ofp == NULL) ! 979: printf("0x%x", outbuf); ! 980: printf("\n"); ! 981: } ! 982: if (Aflag) ! 983: err_open(); ! 984: status = cc0(argc, cmda); ! 985: if (Aflag) ! 986: err_close(status); ! 987: closeinout(); ! 988: #if 0 ! 989: printmem("after cc0"); ! 990: #endif ! 991: if (status) ! 992: xstat = 1; ! 993: return status; ! 994: } ! 995: #endif ! 996: return run(Aflag, 0); ! 997: } ! 998: ! 999: #if MONOLITHIC ! 1000: ! 1001: #if 0 ! 1002: /* This is temporary stuff, here for malloc arena debugging. */ ! 1003: /* Knows format of malloc arena. */ ! 1004: #include <sys/malloc.h> ! 1005: printmem(s) char *s; ! 1006: { ! 1007: register int i, j; ! 1008: unsigned int u; ! 1009: register MBLOCK *p; ! 1010: register unsigned char *cp; ! 1011: int nfree, nused, bfree, bused, freef; ! 1012: ! 1013: printf("%s:\n", s); ! 1014: printf("__a_count=%d\n", __a_count); ! 1015: printf("__a_scanp=%x\n", __a_scanp); ! 1016: printf("__a_first=%x\n", __a_first); ! 1017: nfree = nused = bfree = bused = 0; ! 1018: for (p = __a_first, i = 0; i < __a_count; i++) { ! 1019: u = p->blksize; ! 1020: freef = isfree(u); ! 1021: u = realsize(u); ! 1022: printf("%x: size %d ", p, u-4); ! 1023: if (freef) { ! 1024: printf("free\n"); ! 1025: ++nfree; ! 1026: bfree += u - sizeof(unsigned); ! 1027: } else { ! 1028: ++nused; ! 1029: if (u != 0) { ! 1030: printf("%x: size %d ", p, u-4); ! 1031: printf("used\n"); ! 1032: bused += u - sizeof(unsigned); ! 1033: } ! 1034: if (u != tempsize + 4) { ! 1035: for (j = 4, cp = (char *)p + 4; j < u; j++) ! 1036: printf("%02x ", *cp++); ! 1037: printf("\n"); ! 1038: } ! 1039: } ! 1040: p = bumpp(p, u); ! 1041: } ! 1042: printf("nfree=%d nused=%d\n", nfree, nused-1); ! 1043: printf("bfree=%d bused=%d overhead=%d total=%d\n", ! 1044: bfree, bused, 4*(nfree+nused+1), bfree+bused+4*(nfree+nused+1)); ! 1045: } ! 1046: #endif ! 1047: ! 1048: /* ! 1049: * Close input and output files as appropriate. ! 1050: */ ! 1051: closeinout() ! 1052: { ! 1053: if (ifp != NULL) { ! 1054: fclose(ifp); ! 1055: ifp = NULL; ! 1056: } ! 1057: if (ofp != NULL) { ! 1058: fclose(ofp); ! 1059: ofp = NULL; ! 1060: } ! 1061: } ! 1062: ! 1063: /* ! 1064: * Set input and output file pointers for monolithic compiler. ! 1065: * Print verbose phase message if Vflag. ! 1066: */ ! 1067: setinout(pn) register int pn; ! 1068: { ! 1069: register char *p, *in, *out, *ln; ! 1070: ! 1071: if (pn == CC2B) { ! 1072: ln = "cc2b"; ! 1073: in = pass[CC2].p_sfn; ! 1074: out = pass[CC2].p_ofn; ! 1075: } else { ! 1076: in = pass[pn].p_ifn; ! 1077: if (pn == CC2) { ! 1078: ln = "cc2a"; ! 1079: out = (Sflag) ? pass[pn].p_ofn : pass[pn].p_sfn; ! 1080: } else { ! 1081: ln = pass[pn].p_pln; ! 1082: out = pass[pn].p_ofn; ! 1083: } ! 1084: } ! 1085: if (Vflag) ! 1086: printf("%s %s ", ln, vstr); ! 1087: if (*in == '\0') { ! 1088: ifp = NULL; ! 1089: p = inbuf; ! 1090: inbuf = inbufp = outbuf; ! 1091: inbufmax = outbufp; ! 1092: outbuf = outbufp = p; ! 1093: outbufmax = outbuf + tempsize; ! 1094: if (Vflag) ! 1095: printf("0x%x ", inbuf); ! 1096: } else { ! 1097: ifp = ccopen(in, SRMODE); ! 1098: if (Vflag) ! 1099: printf("%s ", in); ! 1100: } ! 1101: if (*out == '\0') { ! 1102: ofp = NULL; ! 1103: if (Vflag) ! 1104: printf("0x%x\n", outbuf); ! 1105: } else { ! 1106: ofp = ccopen(out, SWMODE); ! 1107: if (Vflag) ! 1108: printf("%s\n", out); ! 1109: } ! 1110: } ! 1111: #endif ! 1112: ! 1113: runcc(pn) register int pn; ! 1114: { ! 1115: register char **cp; ! 1116: #if MONOLITHIC ! 1117: register int status; ! 1118: ! 1119: if (monolithic) { ! 1120: setinout(pn); ! 1121: switch(pn) { ! 1122: case CC1: ! 1123: status = cc1(); ! 1124: break; ! 1125: case CC2: ! 1126: if (status = cc2a()) ! 1127: break; ! 1128: if (!Sflag) { ! 1129: closeinout(); ! 1130: setinout(CC2B); ! 1131: status = cc2b(); ! 1132: } ! 1133: break; ! 1134: case CC3: ! 1135: status = cc3(); ! 1136: break; ! 1137: default: ! 1138: cquit("bad pass number %d", pn); ! 1139: break; ! 1140: } ! 1141: closeinout(); ! 1142: #if 0 ! 1143: printmem((pn == CC1) ? "after cc1": (pn == CC2) ? "after cc2" : "after cc3"); ! 1144: #endif ! 1145: return status; ! 1146: } ! 1147: #endif ! 1148: cp = cmda; ! 1149: makepass(pn, *cp++ = cmdb, AEXEC); ! 1150: *cp++ = vstr; ! 1151: *cp++ = pass[pn].p_ifn; ! 1152: *cp++ = pass[pn].p_ofn; ! 1153: if (pn == CC2) ! 1154: *cp++ = pass[CC2].p_sfn; ! 1155: *cp = 0; ! 1156: return run(0, 0); ! 1157: } ! 1158: ! 1159: runas() ! 1160: { ! 1161: register char **cp; ! 1162: ! 1163: cp = cmda; ! 1164: makepass(AS, *cp++ = cmdb, AEXEC); ! 1165: #if _I386 ! 1166: *cp++ = "-fgx"; ! 1167: if (Qflag) ! 1168: *cp++ = "-w"; ! 1169: #else ! 1170: *cp++ = "-gx"; ! 1171: #endif ! 1172: *cp++ = "-o"; ! 1173: *cp++ = pass[AS].p_ofn; ! 1174: *cp++ = pass[AS].p_ifn; ! 1175: *cp = 0; ! 1176: return run(Aflag, 0); ! 1177: } ! 1178: ! 1179: runme(fn) ! 1180: char *fn; ! 1181: { ! 1182: register char **cp; ! 1183: ! 1184: cp = cmda; ! 1185: makepass(ED, *cp++ = cmdb, AEXEC); ! 1186: *cp++ = fn; ! 1187: *cp++ = "-e"; ! 1188: *cp++ = tmp[6]; ! 1189: *cp = 0; ! 1190: return run(0, 0); ! 1191: } ! 1192: runld(argc, argv) ! 1193: char *argv[]; ! 1194: { ! 1195: char *p1; ! 1196: register char *p2; ! 1197: register char **cp; ! 1198: char **cp1; ! 1199: register char **cp2; ! 1200: int i; ! 1201: static char buff[32]; ! 1202: ! 1203: cp = cmda; ! 1204: p1 = makepass(LD, *cp++ = cmdb, AEXEC); ! 1205: *cp++ = ((ccvariant&VDB) != 0) ? "-g" : "-X"; ! 1206: #if _I386 ! 1207: if (Qflag) ! 1208: *cp++ = "-Q"; ! 1209: #endif ! 1210: if (isvariant(VNDP)) { ! 1211: /* ! 1212: * This gets libraries and rts from /lib/ndp on system ! 1213: * with both software fp and NDP libraries, hack hack... ! 1214: * It also puts /usr/lib/ndp in the ld library search path. ! 1215: */ ! 1216: pass[CRT].p_flag |= P_BACK; ! 1217: pass[CRT].p_dir = "/lib/ndp"; ! 1218: *cp++ = "-L/lib/ndp"; ! 1219: *cp++ = "-L/usr/lib/ndp"; ! 1220: } ! 1221: if (outf == NULL && !aflag) { ! 1222: *cp++ = "-o"; ! 1223: if (partial || doutf == NULL) { ! 1224: #if COHERENT ! 1225: #if _I386 ! 1226: *cp++ = "a.out"; ! 1227: #else ! 1228: *cp++ = "l.out"; ! 1229: #endif ! 1230: #endif ! 1231: #if GEMDOS ! 1232: *cp++ = "l.prg"; ! 1233: #endif ! 1234: } else { ! 1235: basename(doutf, buff); ! 1236: #if GEMDOS ! 1237: strcat(buff, ".prg"); ! 1238: #endif ! 1239: *cp++ = buff; ! 1240: } ! 1241: } ! 1242: for (i=1; i<argc; ++i) { ! 1243: if ((argf[i]&LDOPT)!=0) { ! 1244: *cp++ = argv[i]; ! 1245: if ((argf[i]&~LDOPT)!=0) { /* see comment in main */ ! 1246: cp[-1] += strlen(cp[-1])+1; ! 1247: cp[-1] += strlen(cp[-1])+1; ! 1248: } ! 1249: } ! 1250: } ! 1251: cp1 = cp; ! 1252: p1 = makepass(CRT, *cp++ = p1, AREAD); ! 1253: if (fflag) { ! 1254: *cp++ = "-u"; ! 1255: *cp++ = DTEFG; ! 1256: } ! 1257: for (i=1; i<argc; ++i) { ! 1258: p2 = argv[i]; ! 1259: if ((argf[i]&CCLIB)!=0) { ! 1260: while (*p2++ != 'l'); ! 1261: p1 = makelib(LIB, *cp++ = p1, p2); ! 1262: } else if ((argf[i]&(CCARG|ASARG|MARG|LDARG))!=0) { ! 1263: for (cp2=cp1; cp2<cp; ++cp2) ! 1264: if (strcmp(*cp2, p2) == 0) ! 1265: break; ! 1266: if (cp2 == cp) { ! 1267: *cp++ = p2; ! 1268: ++nldob; ! 1269: } ! 1270: } else if ((argf[i]&LDLIB)!=0) { ! 1271: *cp++ = p2; ! 1272: } ! 1273: } ! 1274: #if GEMDOS ! 1275: if ( ! partial && (GEMAPPflag || GEMACCflag)) { ! 1276: p1 = makelib(LIB, *cp++ = p1, "aes"); ! 1277: p1 = makelib(LIB, *cp++ = p1, "vdi"); ! 1278: } ! 1279: #endif ! 1280: p1 = makelib(LIB, *cp++ = p1, "c"); ! 1281: #if _I386 ! 1282: if (Kflag == 0 && nldob == 1 && newo[0] != 0) { ! 1283: *cp++ = "-Z"; ! 1284: *cp++ = newo; ! 1285: } ! 1286: #endif ! 1287: *cp = 0; ! 1288: return run(0, 1); ! 1289: } ! 1290: ! 1291: basename(in, out) ! 1292: char *in, *out; ! 1293: { ! 1294: register char *s; ! 1295: register int n; ! 1296: ! 1297: if ((s = strrchr(in, PATHSEP)) != NULL) ! 1298: in = ++s; /* skip past last PATHSEP */ ! 1299: if ((s = strrchr(in, '.')) != NULL) ! 1300: n = s - in; /* copy to last '.' */ ! 1301: else ! 1302: n = strlen(in); /* copy all */ ! 1303: strncpy(out, in, n); /* copy as appropriate */ ! 1304: out[n] = '\0'; /* and NUL-terminate */ ! 1305: } ! 1306: ! 1307: run(catch_errors, nofork) int catch_errors; int nofork; ! 1308: { ! 1309: int s; ! 1310: extern char **environ; ! 1311: ! 1312: if (Vflag) { ! 1313: char *cp, **cpp; ! 1314: cpp = cmda; ! 1315: while ((cp = *cpp) != NULL) { ! 1316: if (cpp != cmda) ! 1317: putchar(' '); ! 1318: printf("%s", cp); ! 1319: ++cpp; ! 1320: } ! 1321: putchar('\n'); ! 1322: fflush(stdout); ! 1323: } ! 1324: if (catch_errors) ! 1325: err_open(); ! 1326: #if COHERENT ! 1327: #if _I386 ! 1328: if (nofork) { ! 1329: execve(cmda[0], cmda, environ); ! 1330: cquit("cannot execute %s", cmda[0]); ! 1331: } ! 1332: #endif ! 1333: { ! 1334: int nsleep; ! 1335: int status; ! 1336: int pid; ! 1337: nsleep = NSLEEP; ! 1338: while ((pid=fork())<0 && nsleep--) ! 1339: sleep(DELAY); ! 1340: if (pid < 0) ! 1341: cquit("can't fork"); ! 1342: if (pid == 0) { ! 1343: execve(cmda[0], cmda, environ); ! 1344: exit(MAGIC); ! 1345: } ! 1346: while (wait(&status) != pid) ! 1347: ; ! 1348: if ((s = status&0177)!=0 && s!=SIGINT) { ! 1349: extern char *signame[]; ! 1350: ! 1351: fprintf(stderr, "cc: %s ", cmda[0]); ! 1352: if (s==SIGSYS && (status&0200)==0) ! 1353: fprintf(stderr, "exec failed"); ! 1354: else ! 1355: fprintf(stderr, signame[s]); ! 1356: if ((status&0200) != 0) ! 1357: fprintf(stderr, " -- core dumped"); ! 1358: fprintf(stderr, "\n"); ! 1359: } else if ((s = (status>>8)&0377) == MAGIC) ! 1360: cquit("cannot execute %s", cmda[0]); ! 1361: } ! 1362: #else ! 1363: if (s = execve(cmda[0], cmda, environ)) ! 1364: if (s < 0) ! 1365: perror(cmda[0]); ! 1366: #endif ! 1367: if (catch_errors) ! 1368: err_close(s); ! 1369: if (s != 0) ! 1370: xstat = 1; ! 1371: return s; ! 1372: } ! 1373: ! 1374: /* ! 1375: * Routines to catch and release stderr for -A. ! 1376: */ ! 1377: int new_fd; ! 1378: int saved_fd; ! 1379: ! 1380: err_open() ! 1381: { ! 1382: fflush(stderr); ! 1383: saved_fd = dup(2); ! 1384: if ((new_fd = creat(tmp[6], 0644)) < 0) ! 1385: cquit("%s: %s", tmp[6], sys_errlist[errno]); ! 1386: if (dup2(new_fd, 2) < 0) ! 1387: cquit("dup2 failed"); ! 1388: } ! 1389: ! 1390: err_close(status) int status; ! 1391: { ! 1392: register int c; ! 1393: register FILE *fp; ! 1394: ! 1395: fflush(stderr); ! 1396: if (dup2(saved_fd, 2) < 0) ! 1397: cquit("dup2 failed"); ! 1398: if (close(new_fd) < 0) ! 1399: /* cquit("error on close") */ ; ! 1400: if (status == 0 && (fp = fopen(tmp[6], "r")) != NULL) { ! 1401: /* Copy warnings, otherwise they go down the rathole. */ ! 1402: while ((c = getc(fp)) != EOF) ! 1403: fputc(c, stderr); ! 1404: fclose(fp); ! 1405: } ! 1406: } ! 1407: ! 1408: /* ! 1409: ** Option processing. ! 1410: */ ! 1411: ! 1412: /* ! 1413: * Compare option name to argument. ! 1414: */ ! 1415: opeq(op, ap) ! 1416: register char *op, *ap; ! 1417: { ! 1418: while (*op!=0) ! 1419: if (*op++ != *ap++) ! 1420: return 0; ! 1421: return 1; ! 1422: } ! 1423: ! 1424: ! 1425: /* ! 1426: * Get short pass name. ! 1427: * translate single character code into pass index number. ! 1428: */ ! 1429: getpsn(c) ! 1430: register int c; ! 1431: { ! 1432: register int pn; ! 1433: ! 1434: for (pn = CPP; pn < ALL; pn += 1) ! 1435: if (pass[pn].p_psn == c) ! 1436: return pn; ! 1437: return NONE; ! 1438: } ! 1439: ! 1440: /* ! 1441: * Process -t*, -B*, -M* options. ! 1442: * -t* sets take flag for specified passes. ! 1443: * -B* copies prefix string for flagged passes ! 1444: * or for all machine dependent passes if none flagged. ! 1445: * -M* copies machine string for machine dependent passes. ! 1446: * -N* renames a pass, such as crts0.o. ! 1447: */ ! 1448: getpass(c, cp) ! 1449: register int c; ! 1450: register char *cp; ! 1451: { ! 1452: if (c == 't') { /* Take passes from backup */ ! 1453: if (*cp != 0) ! 1454: while ((c = *cp++) != 0) ! 1455: if ((c = getpsn(c)) >= CPP) { ! 1456: pass[c].p_flag |= P_TAKE; ! 1457: pass[c].p_dir = dnul; ! 1458: if (Vflag) ! 1459: passrpt(c); ! 1460: } else { ! 1461: badpsn(cp[-1]); ! 1462: } ! 1463: else ! 1464: getpass('t', "01234"); ! 1465: } else if (c == 'B') { /* Get backup string */ ! 1466: for (c = CPP; c < ALL; c += 1) { ! 1467: if ((pass[c].p_flag&P_TAKE) != 0) { ! 1468: pass[c].p_flag ^= P_TAKE; ! 1469: pass[c].p_flag |= P_BACK; ! 1470: pass[c].p_dir = cp; ! 1471: if (Vflag) ! 1472: passrpt(c); ! 1473: } ! 1474: } ! 1475: } else if (c == 'M') { /* Machine prefix string */ ! 1476: if (strlen(cp) > PTMP-1) ! 1477: toolong(cp); ! 1478: strcpy(dmch, cp); ! 1479: if (Vflag) ! 1480: printf("Prefix: %s\n", dmch); ! 1481: } else if (c == 'N') { /* New pass name */ ! 1482: if ((c = getpsn(*cp++)) >= CPP) { ! 1483: if (strlen(cp) > PTMP-1) ! 1484: toolong(cp); ! 1485: if (Vflag) ! 1486: printf("Rename: %s to %s\n", pass[c].p_pln, cp); ! 1487: strcpy(pass[c].p_pln, cp); ! 1488: } else ! 1489: badpsn(cp[-1]); ! 1490: } ! 1491: } ! 1492: ! 1493: passrpt(c) ! 1494: register int c; ! 1495: { ! 1496: printf("Use: {%s}%s%s\n", pass[c].p_dir, pass[c].p_mch, pass[c].p_pln); ! 1497: } ! 1498: ! 1499: missingname() ! 1500: { ! 1501: fprintf(stderr, "cc: missing name in -o, -e or -u\n"); ! 1502: exit(1); ! 1503: } ! 1504: ! 1505: badoutput() ! 1506: { ! 1507: fprintf(stderr, "cc: improbable name in -o: %s\n", outf); ! 1508: exit(1); ! 1509: } ! 1510: ! 1511: toomany() ! 1512: { ! 1513: fprintf(stderr, "cc: too many files for -o option\n"); ! 1514: exit(1); ! 1515: } ! 1516: ! 1517: badpsn(c) ! 1518: { ! 1519: fprintf(stderr, "cc: unknown short path name: %c\n", c); ! 1520: exit(1); ! 1521: } ! 1522: ! 1523: toolong(cp) ! 1524: char *cp; ! 1525: { ! 1526: fprintf(stderr, "cc: name, prefix, or directory too long: %s\n", cp); ! 1527: exit(1); ! 1528: } ! 1529: ! 1530: /* ! 1531: * Check specified output file name, ! 1532: * or construct name from first file ! 1533: * name seen. ! 1534: */ ! 1535: chkofile() ! 1536: { ! 1537: register char *fn; ! 1538: register char c; ! 1539: ! 1540: if ((fn = outf) == NULL) ! 1541: return; ! 1542: if (fn[0] == '-') ! 1543: badoutput(); ! 1544: if (nname > 1 && qpass < LD) ! 1545: toomany(); ! 1546: while (*fn != 0) ! 1547: ++fn; ! 1548: while (*fn != '.' && fn > outf) ! 1549: --fn; ! 1550: if (*fn++ == '.' && (c = *fn++) && *fn == '\0') { ! 1551: if (c == 'c' ! 1552: || c == 'h' ! 1553: || c == 'm' ! 1554: || (c != 'o' && cflag) ! 1555: || (c == 'o' && !cflag) ! 1556: || (c != 's' && Sflag) ! 1557: || (c == 's' && !Sflag)) ! 1558: badoutput(); ! 1559: } else { ! 1560: if (Sflag || cflag) ! 1561: badoutput(); ! 1562: } ! 1563: } ! 1564: ! 1565: whatopt(s) ! 1566: char *s; ! 1567: { ! 1568: fprintf(stderr, "cc: unrecognized option: %s\n", s); ! 1569: usage(0); ! 1570: } ! 1571: ! 1572: cquit(s) ! 1573: char *s; ! 1574: { ! 1575: fprintf(stderr, "cc: fatal error: %r\n", &s); ! 1576: cleanup(0); ! 1577: exit(1); ! 1578: } ! 1579: ! 1580: /* ! 1581: ** Intermediate file processing. ! 1582: */ ! 1583: /* ! 1584: * Given cp -> `name.[chms]' rewrite ultimate destination and intermediates ! 1585: * if necessary. ! 1586: */ ! 1587: setfiles(c, cp) ! 1588: int c; ! 1589: register char *cp; ! 1590: { ! 1591: register char *ip; ! 1592: ! 1593: ip = cp; ! 1594: if (qpass < LD && outf != NULL) ! 1595: cp = outf; ! 1596: if (c == CCARG) { ! 1597: pass[CPP].p_ifn = ip; ! 1598: if (Eflag) ! 1599: return; ! 1600: if (Kflag) { ! 1601: makeft(pass[CPP].p_ofn, cp, "i"); ! 1602: makeft(pass[CC0].p_ofn, cp, "0"); ! 1603: makeft(pass[CC1].p_ofn, cp, "1"); ! 1604: if ( ! Sflag) ! 1605: makeft(pass[CC2].p_sfn, cp, "2"); ! 1606: else ! 1607: makeft(pass[CC2].p_ofn, cp, "2"); ! 1608: } ! 1609: } else if (c == MARG) { ! 1610: pass[CPP].p_ifn = ip; ! 1611: if (Kflag) ! 1612: makeft(pass[CC0].p_ofn, cp, "s"); ! 1613: pass[AS].p_ifn = pass[CC0].p_ofn; ! 1614: } else if (c == ASARG) ! 1615: pass[AS].p_ifn = ip; ! 1616: makeft(tmp[5], cp, Sflag ? "s" : "o"); ! 1617: if (!Sflag && newo[0] == 0 && access(tmp[5], 0) < 0) ! 1618: strcpy(newo, tmp[5]); ! 1619: } ! 1620: ! 1621: #if MONOLITHIC ! 1622: /* ! 1623: * Open a file, die on failure. ! 1624: */ ! 1625: FILE * ! 1626: ccopen(name, mode) char *name; char *mode; ! 1627: { ! 1628: register FILE *fp; ! 1629: ! 1630: if ((fp = fopen(name, mode)) != NULL) ! 1631: return fp; ! 1632: cquit("cannot open file \"%s\"", name); ! 1633: } ! 1634: #endif ! 1635: ! 1636: /* ! 1637: * Unlink a file. ! 1638: * If `-V' echo the rm. ! 1639: */ ! 1640: rm(s) ! 1641: register char *s; ! 1642: { ! 1643: if (Vflag) ! 1644: printf("rm %s\n", s); ! 1645: unlink(s); ! 1646: } ! 1647: ! 1648: /* ! 1649: * Cleanup after yourself if ! 1650: * the user hits interrupt during a compile (sig == SIGINT), ! 1651: * or when all compiles have completed (sig == 0). ! 1652: */ ! 1653: cleanup(sig) ! 1654: { ! 1655: register int i; ! 1656: ! 1657: #if COHERENT ! 1658: if (sig == SIGINT) ! 1659: signal(SIGINT, SIG_IGN); ! 1660: #endif ! 1661: for (i = 0; i < 7; i += 1) ! 1662: if (istmp[i]) ! 1663: rm(tmp[i]); ! 1664: #if COHERENT ! 1665: if (sig == SIGINT && nldob==1 && newo[0]!=0) ! 1666: rm(newo); ! 1667: if (sig == SIGINT) ! 1668: exit(1); ! 1669: #endif ! 1670: } ! 1671: ! 1672: /* ! 1673: ** Name construction. ! 1674: */ ! 1675: char * ! 1676: ccpath(cp, p, n, mode) register char *cp; char *p, *n; int mode; ! 1677: { ! 1678: register char *pn; ! 1679: if (VeryVflag && Vflag) ! 1680: printf("search %s for %s\n", p, n); ! 1681: while ((pn = path(p, n, mode)) == NULL) { ! 1682: if (Zflag) { /* Disk swap dialog flag */ ! 1683: fprintf(stderr, "Insert %s's disk in a free drive and press <Return>\n", n); ! 1684: gets(cp); ! 1685: continue; ! 1686: } ! 1687: pn = n; ! 1688: break; ! 1689: } ! 1690: while (*cp++ = *pn++) ; ! 1691: return cp; ! 1692: } ! 1693: ! 1694: char * ! 1695: makepass(pn, cp, mode) ! 1696: int pn; ! 1697: register char *cp; ! 1698: int mode; ! 1699: { ! 1700: return ccpath(cp, pass[pn].p_dir, pass[pn].p_pln, mode); ! 1701: } ! 1702: ! 1703: char * ! 1704: makelib(pn, cp, lp) ! 1705: int pn; ! 1706: char *cp; ! 1707: char *lp; ! 1708: { ! 1709: #if _I386 ! 1710: /* Let ld do the work, just pass -lwhatever. */ ! 1711: strcpy(cp, "-l"); ! 1712: strcat(cp, lp); ! 1713: return cp + strlen(cp) + 1; ! 1714: #else ! 1715: strcpy(cp, pass[pn].p_pln); ! 1716: strcat(cp, lp); ! 1717: strcat(cp, ".a"); ! 1718: return ccpath(cp, pass[pn].p_dir, cp, AREAD); ! 1719: #endif ! 1720: } ! 1721: ! 1722: makeft(op, ip, ft) ! 1723: char *op, *ip, *ft; ! 1724: { ! 1725: register char *ep, *tp; ! 1726: register c; ! 1727: char *dp; ! 1728: ! 1729: ep = ip; ! 1730: tp = op; ! 1731: dp = NULL; ! 1732: while ((c = *ep++) != '\0') { ! 1733: if (c == PATHSEP && ip != outf) { ! 1734: tp = op; ! 1735: dp = NULL; ! 1736: } else { ! 1737: if (c == '.') ! 1738: dp = tp; ! 1739: *tp++ = c; ! 1740: } ! 1741: } ! 1742: if (ip == outf) ! 1743: return; ! 1744: if (dp != NULL) ! 1745: tp = dp; ! 1746: *tp++ = '.'; ! 1747: ep = ft; ! 1748: while (*tp++ = *ep++) ! 1749: ; ! 1750: } ! 1751: ! 1752: /* ! 1753: * Print a terse or verbose usage message. ! 1754: */ ! 1755: usage(flag) register int flag; ! 1756: { ! 1757: register FILE *ofp; ! 1758: ! 1759: ofp = (flag) ? stdout : stderr; ! 1760: fprintf(ofp, "Usage: cc [ option ... ] file ...\n"); ! 1761: if (flag == 0) ! 1762: fprintf(ofp, "Type \"cc -?\" to list the available options.\n"); ! 1763: else ! 1764: fprintf(ofp, ! 1765: "Options:\n" ! 1766: "\t-A\t\tAuto edit mode\n" ! 1767: "\t-Bpathname\tUse pathname to find substitute compiler passes\n" ! 1768: "\t-Dname[=value]\tcpp: #define\n" ! 1769: "\t-E\t\tExpand: run preprocessor to stdout\n" ! 1770: "\t-Ipathname\tcpp: #include search directory\n" ! 1771: "\t-K\t\tKeep intermediate files\n" ! 1772: "\t-Lpathname\tld: library directory specification\n" ! 1773: "\t-Mstring\t\tUse string as cross-compiler prefix\n" ! 1774: "\t-N[01ab2sdlrt]string\tRename pass with string\n" ! 1775: "\t-O\t\tOptimize: run object code optimizer\n" ! 1776: "\t-Q\t\tQuiet: no error or warning messages\n" ! 1777: "\t-S\t\tOutput assembly language\n" ! 1778: "\t-T[value]\tTemp size for in-memory tempfiles (default: 64K)\n" ! 1779: "\t-Uname\t\tcpp: #undef\n" ! 1780: "\t-V\t\tVerbose: report everything\n" ! 1781: "\t-Vvariant\tVariant enable/disable, see list below\n" ! 1782: "\t-X\t\tld: remove C-generated local symbols\n" ! 1783: #if GEMDOS ! 1784: "\t-Z\t\t(GEMDOS) floppy change prompts for phases\n" ! 1785: #endif ! 1786: "\t-a\t\tDo not use implicit output file name for loader\n" ! 1787: "\t-c\t\tCompile only, do not load\n" ! 1788: "\t-d\t\tld: define common space\n" ! 1789: "\t-e name\t\tld: entry point specification\n" ! 1790: "\t-f\t\tld: use floating point output conversion routines\n" ! 1791: "\t-g\t\tGenerate debug information, same as -VDB\n" ! 1792: "\t-i\t\tld: separate i and d spaces\n" ! 1793: "\t-lname\t\tld: library specification\n" ! 1794: "\t-n\t\tld: shared instruction space\n" ! 1795: "\t-o name\t\tld: output file name\n" ! 1796: "\t-p\t\tProfile: generate code to profile function calls\n" ! 1797: "\t-q[p012s]\tQuit after specified pass\n" ! 1798: "\t-r\t\tld: retain relocation information in output\n" ! 1799: "\t-s\t\tld: strip symbol table\n" ! 1800: "\t-t[p012adlrt]\ttake specified passes from -Bdirectory\n" ! 1801: "\t-u name\t\tld: undefine name\n" ! 1802: "\t-v\t\tVerbose: report everything, same as -V\n" ! 1803: "\t-w\t\tld: watch\n" ! 1804: "\t-x\t\tld: remove all local symbols from symbol table\n" ! 1805: "Variant options:\n" ! 1806: "\t-VASM\t\tAssembly language output, same as -S\n" ! 1807: "\t-VCOMM\t\tCommon data items (default)\n" ! 1808: "\t-VCPLUS\t\tIgnore C++ style online //-delimited comments\n" ! 1809: "\t-VCPPE\t\tRun cpp in -E mode, same as -E\n" ! 1810: "\t-VDB\t\tDebug: generate debug output, same as -g\n" ! 1811: "\t-VFLOAT\t\tFloating point output conversion, same as -f\n" ! 1812: "\t-VKEEP\t\tKeep intermediate files, same as -K\n" ! 1813: "\t-VNDP\t\tUse hardware (80x87) floating point\n" ! 1814: "\t-VNOOPT\t\tNo optimization\n" ! 1815: "\t-VNOWARN\tNo warning messages\n" ! 1816: "\t-VPEEP\t\tPeephole optimization (default)\n" ! 1817: "\t-VPROF\t\tProfile: generate code to profile function calls\n" ! 1818: "\t-VPSTR\t\tPure strings (default)\n" ! 1819: "\t-VQUIET\t\tNo messages, same as -Q\n" ! 1820: "\t-VREADONLY\tRecognize \"readonly\" keyword\n" ! 1821: "\t-VS\t\tStrict: turn on all strict messages\n" ! 1822: "\t-VSBOOK\t\tStrict: only constructs in K&R\n" ! 1823: "\t-VSCCON\t\tStrict: constant conditional\n" ! 1824: "\t-VSINU\t\tAllow struct-in-union constructs\n" ! 1825: "\t-VSLCON\t\tStrict: long constant promotion (default)\n" ! 1826: "\t-VSMEMB\t\tStrict: strict member checking (default)\n" ! 1827: "\t-VSNREG\t\tStrict: declared register but allocated auto\n" ! 1828: "\t-VSPVAL\t\tStrict: pointer value truncation (default)\n" ! 1829: "\t-VSRTVC\t\tStrict: risky constructs in truth contexts\n" ! 1830: "\t-VSTAT\t\tStatistics on optimization\n" ! 1831: "\t-VSUREG\t\tStrict: unused registers\n" ! 1832: "\t-VSUVAR\t\tStrict: unused variables (default)\n" ! 1833: "\t-VVERSION\tPrint compiler version number\n" ! 1834: "\t-VWIDEN\t\tWidening of parameter or function value warning\n" ! 1835: "\t-VXSTAT\t\tWrite static external symbols\n" ! 1836: "\t-V3GRAPH\tRecognize ANSI trigraphs\n" ! 1837: ); ! 1838: exit(1); ! 1839: #if 0 ! 1840: /* ! 1841: * The following variants are not included in the usage(1) output above ! 1842: * because they are useful primarily for MWC internal purposes ! 1843: * or they are for machine models which are currently irrelevant ! 1844: * or because I'm not sure what they do. ! 1845: */ ! 1846: /* Miscellaneous */ ! 1847: /* ld does not grok -k, dunno why -k exists. */ ! 1848: "\tk system\tld: bind as kernel process\n" ! 1849: VALIEN\t\tAlien (PL/M) calling conventions ! 1850: VALIGN\t\tAlign the stack (i8086) ! 1851: VTPROF\t\tCode table profiling ! 1852: VROM\t\tProduce ROMable code ! 1853: VLIB ! 1854: VCPPC\t ! 1855: VCPP\t ! 1856: /* Debug */ ! 1857: VDEBUG\tDebug: ! 1858: VDLINE\tDebug: ! 1859: VDTYPE\tDebug: ! 1860: VDSYMB\tDebug: ! 1861: /* Intel */ ! 1862: VSMALL ! 1863: VLARGE ! 1864: V8087 ! 1865: VRAM ! 1866: VOMF ! 1867: V80186 (default) ! 1868: V80287 ! 1869: VEMU87 ! 1870: #if GEMDOS ! 1871: /* Motorola and Gemdos */ ! 1872: VGEMACC ! 1873: VGEMAPP ! 1874: VGEM ! 1875: VSPLIM ! 1876: VNOTRAPS ! 1877: #endif ! 1878: #endif ! 1879: } ! 1880: ! 1881: /* end of coh/cc.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.