1: /*
   2:  * Copyright (c) 1982 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #ifndef lint
   8: char copyright[] =
   9: "@(#) Copyright (c) 1982 Regents of the University of California.\n\
  10:  All rights reserved.\n";
  11: #endif not lint
  12: 
  13: #ifndef lint
  14: static char sccsid[] = "@(#)asmain.c	5.2 (Berkeley) 10/21/85";
  15: #endif not lint
  16: 
  17: #include <stdio.h>
  18: #include <ctype.h>
  19: #include <signal.h>
  20: 
  21: #include "as.h"
  22: #include "assyms.h"
  23: #include "asscan.h"
  24: #include "asexpr.h"
  25: 
  26: #include <sys/stat.h>
  27: 
  28: #define unix_lang_name "VAX/UNIX Assembler V10/21/85 5.2"
  29: /*
  30:  *	variables to manage reading the assembly source files
  31:  */
  32: char    *dotsname;  /*the current file name; managed by the parser*/
  33: int lineno;     /*current line number; managed by the parser*/
  34: char    **innames;  /*names of the files being assembled*/
  35: int ninfiles;   /*how many interesting files there are*/
  36: /*
  37:  *	Flags settable from the argv process argument list
  38:  */
  39: int silent = 0; /*don't complain about any errors*/
  40: int savelabels = 0; /*write the labels to the a.out file*/
  41: int     d124 = 4;   /*default allocate 4 bytes for unknown pointers*/
  42: int     maxalign = 2;   /*default .align maximum*/
  43: int anyerrs = 0;    /*no errors yet*/
  44: int anywarnings=0;  /*no warnings yet*/
  45: int orgwarn = 0;    /*Bad origins*/
  46: int passno = 1; /* current pass*/
  47: int jxxxJUMP = 0;   /* in jxxxes that branch too far, use jmp instead of brw */
  48: int readonlydata = 0;   /* initialzed data -> text space */
  49: 
  50: int nGHnumbers = 0;     /* GH numbers used */
  51: int nGHopcodes = 0;     /* GH opcodes used */
  52: int nnewopcodes = 0;    /* new opcodes used */
  53: 
  54: #ifdef DEBUG
  55: int     debug = 0;
  56: int toktrace = 0;
  57: #endif
  58: 
  59: int useVM = 0;
  60: 
  61: char    *endcore;   /*where to get more symbol space*/
  62: 
  63: /*
  64:  *	Managers of the a.out file.
  65:  */
  66: struct  exec    hdr;
  67: #define MAGIC   0407
  68: u_long  tsize;      /* total text size */
  69: u_long  dsize;      /* total data size */
  70: u_long  datbase;    /* base of the data segment */
  71: u_long  trsize;     /* total text relocation size */
  72: u_long  drsize;     /* total data relocation size */
  73: 
  74: /*
  75:  *	Information about the current segment is accumulated in
  76:  *	usedot; the most important information stored is the
  77:  *	accumulated size of each of the text and data segments
  78:  *
  79:  *	dotp points to the correct usedot expression for the current segment
  80:  */
  81: struct  exp usedot[NLOC+NLOC];  /* info about all segments */
  82: struct  exp *dotp;          /* data/text location pointer */
  83: /*
  84:  *	The inter pass temporary token file is opened and closed by stdio, but
  85:  *	is written to using direct read/write, as the temporary file
  86:  *	is composed of buffers exactly BUFSIZ long.
  87:  */
  88: FILE    *tokfile;           /* interpass communication file */
  89: char    tokfilename[TNAMESIZE];
  90: /*
  91:  *	The string file is the string table
  92:  *	cat'ed to the end of the built up a.out file
  93:  */
  94: FILE    *strfile;           /* interpass string file */
  95: char    strfilename[TNAMESIZE];
  96: int strfilepos = 0;         /* position within the string file */
  97: /*
  98:  *	a.out is created during the second pass.
  99:  *	It is opened by stdio, but is filled with the parallel
 100:  *	block I/O library
 101:  */
 102: char    *outfile = "a.out";
 103: FILE    *a_out_file;
 104: off_t   a_out_off;          /* cumulative offsets for segments */
 105: /*
 106:  *	The logical files containing the assembled data for each of
 107:  *	the text and data segments are
 108:  *	managed by the parallel block I/O library.
 109:  *	a.out is logically opened in many places at once to
 110:  *	receive the assembled data from the various segments as
 111:  *	it all trickles in, but is physically opened only once
 112:  *	to minimize file overhead.
 113:  */
 114: BFILE   *usefile[NLOC+NLOC];        /* text/data files */
 115: BFILE   *txtfil;            /* current text/data file */
 116: /*
 117:  *	Relocation information is accumulated seperately for each
 118:  *	segment.  This is required by the old loader (from BTL),
 119:  *	but not by the new loader (Bill Joy).
 120:  *
 121:  *	However, the size of the relocation information can not be computed
 122:  *	during or after the 1st pass because the ''absoluteness' of values
 123:  *	is unknown until all locally declared symbols have been seen.
 124:  *	Thus, the size of the relocation information is only
 125:  *	known after the second pass is finished.
 126:  *	This obviates the use of the block I/O
 127:  *	library, which requires knowing the exact offsets in a.out.
 128:  *
 129:  *	So, we save the relocation information internally (we don't
 130:  *	go to internal files to minimize overhead).
 131:  *
 132:  *	Empirically, we studied 259 files composing the system,
 133:  *	two compilers and a compiler generator: (all of which have
 134:  *	fairly large source files)
 135:  *
 136:  *	Number of files = 259
 137:  *		Number of non zero text reloc files: 233
 138:  *		Number of non zero data reloc files: 53
 139:  *	Average text relocation = 889
 140:  *	Average data relocation = 346
 141:  *	Number of files > BUFSIZ text relocation = 71
 142:  *	Number of files > BUFSIZ data relocation = 6
 143:  *
 144:  *	For compiled C code, there is usually one text segment and two
 145:  *	data segments; we see that allocating our own buffers and
 146:  *	doing our internal handling of relocation information will,
 147:  *	on the average, not use more memory than taken up by the buffers
 148:  *	allocated for doing file I/O in parallel to a number of file.
 149:  *
 150:  *	If we are assembling with the -V option, we
 151:  *	use the left over token buffers from the 2nd pass,
 152:  *	otherwise, we create our own.
 153:  *
 154:  *	When the 2nd pass is complete, closeoutrel flushes the token
 155:  *	buffers out to a BFILE.
 156:  *
 157:  *	The internals to relbufdesc are known only in assyms.c
 158:  *
 159:  *	outrel constructs the relocation information.
 160:  *	closeoutrel flushes the relocation information to relfil.
 161:  */
 162: struct  relbufdesc  *rusefile[NLOC+NLOC];
 163: struct  relbufdesc  *relfil;    /* un concatnated relocation info */
 164: BFILE   *relocfile;         /* concatnated relocation info */
 165: /*
 166:  *	Once the relocation information has been written,
 167:  *	we can write out the symbol table using the Block I/O
 168:  *	mechanisms, as we once again know the offsets into
 169:  *	the a.out file.
 170:  *
 171:  *	We use relfil to output the symbol table information.
 172:  */
 173: char    *tmpdirprefix = "/tmp/";
 174: int delexit();
 175: 
 176: main(argc, argv)
 177:     int argc;
 178:     char    **argv;
 179: {
 180:     char    *sbrk();
 181: 
 182:     tokfilename[0] = 0;
 183:     strfilename[0] = 0;
 184:     endcore = sbrk(0);
 185: 
 186:     argprocess(argc, argv);     /* process argument lists */
 187:     if (anyerrs) exit(1);
 188: 
 189:     initialize();
 190:     zeroorigins();          /* set origins to zero */
 191:     zerolocals();           /* fix local label counters */
 192: 
 193:     i_pass1();          /* open temp files, etc */
 194:     pass1();            /* first pass through .s files */
 195:     testlocals();           /* check for undefined locals */
 196:     if (anyerrs) delexit();
 197: 
 198:     pass1_5();          /* resolve jxxx */
 199:     if (anyerrs) delexit();
 200: 
 201:     open_a_out();           /* open a.out */
 202:     roundsegments();        /* round segments to FW */
 203:     build_hdr();            /* build initial header, and output */
 204: 
 205:     i_pass2();          /* reopen temporary file, etc */
 206:     pass2();            /* second pass through the virtual .s */
 207:     if (anyerrs) delexit();
 208: 
 209:     fillsegments();         /* fill segments with 0 to FW */
 210:     reloc_syms();           /* dump relocation and symbol table */
 211: 
 212:     delete();           /* remove tmp file */
 213:     bflush();           /* close off block I/O view of a.out */
 214:     fix_a_out();            /* add in text and data reloc counts */
 215: 
 216:     if (anyerrs == 0 && orgwarn)
 217:         yyerror("Caution: absolute origins.\n");
 218: 
 219:     if (nGHnumbers)
 220:         yywarning("Caution: G or H format floating point numbers");
 221:     if (nGHopcodes)
 222:         yywarning("Caution: G or H format floating point operators");
 223:     if (nnewopcodes)
 224:         yywarning("Caution: New Opcodes");
 225:     if (nGHnumbers || nGHopcodes || nnewopcodes)
 226:         yywarning("These are not defined for all implementations of the VAX architecture.\n");
 227: 
 228:     exit(anyerrs != 0);
 229: }
 230: 
 231: argprocess(argc, argv)
 232:     int argc;
 233:     char    *argv[];
 234: {
 235:     register    char    *cp;
 236: 
 237:     ninfiles = 0;
 238:     silent = 0;
 239: #ifdef DEBUG
 240:     debug = 0;
 241: #endif
 242:     innames = (char **)ClearCalloc(argc+1, sizeof (innames[0]));
 243:     dotsname = "<argv error>";
 244:     while (argc > 1) {
 245:         if (argv[1][0] != '-')
 246:             innames[ninfiles++] = argv[1];
 247:         else {
 248:             cp = argv[1] + 1;
 249:             /*
 250: 			 *	We can throw away single minus signs, so
 251: 			 *	that make scripts for the PDP 11 assembler work
 252: 			 *	on this assembler too
 253: 			 */
 254:             while (*cp){
 255:                 switch(*cp++){
 256:                  default:
 257:                     yyerror("Unknown flag: %c", *--cp);
 258:                     cp++;
 259:                     break;
 260:                  case 'v':
 261:                     selfwhat(stdout);
 262:                     exit(1);
 263:                  case 'd':
 264:                     d124 = *cp++ - '0';
 265:                     if ( (d124 != 1) && (d124 != 2) &&
 266:                          (d124 != 4)){
 267:                         yyerror("-d[124] only");
 268:                         exit(1);
 269:                     }
 270:                     break;
 271:                  case 'a':
 272:                     maxalign = atoi(cp+1);
 273:                     for (cp++; isdigit(*cp); cp++)
 274:                         /*VOID*/;
 275:                     if ( (maxalign > 16) || (maxalign < 0)){
 276:                         yyerror("-a: 0<=align<=16");
 277:                         exit(1);
 278:                     }
 279:                     break;
 280:                  case 'o':
 281:                     if (argc < 3){
 282:                         yyerror("-o what???");
 283:                         exit(1);
 284:                     }
 285:                     outfile = argv[2];
 286:                    bumpone:
 287:                     argc -= 2;
 288:                     argv += 2;
 289:                     goto nextarg;
 290: 
 291:                  case 't':
 292:                     if (argc < 3){
 293:                         yyerror("-t what???");
 294:                         exit(1);
 295:                     }
 296:                     tmpdirprefix = argv[2];
 297:                     goto bumpone;
 298: 
 299:                  case 'V':
 300:                     useVM = 1;
 301:                     break;
 302:                  case 'W':
 303:                     silent = 1;
 304:                     break;
 305:                  case 'L':
 306:                     savelabels = 1;
 307:                     break;
 308:                  case 'J':
 309:                     jxxxJUMP = 1;
 310:                     break;
 311: #ifdef DEBUG
 312:                  case 'D':
 313:                     debug = 1;
 314:                     break;
 315:                  case 'T':
 316:                     toktrace = 1;
 317:                     break;
 318: #endif
 319:                  case 'R':
 320:                     readonlydata = 1;
 321:                     break;
 322:                 }   /*end of the switch*/
 323:             }   /*end of pulling out all arguments*/
 324:         }   /*end of a flag argument*/
 325:         --argc; ++argv;
 326:        nextarg:;
 327:     }
 328:     /* innames[ninfiles] = 0; */
 329: }
 330: /*
 331:  *	poke through the data space and find all sccs identifiers.
 332:  *	We assume:
 333:  *	a) that extern char **environ; is the first thing in the bss
 334:  *	segment (true, if one is using the new version of cmgt.crt0.c)
 335:  *	b) that the sccsid's have not been put into text space.
 336:  */
 337: selfwhat(place)
 338:     FILE    *place;
 339: {
 340:     extern  char **environ;
 341:     register    char    *ub;
 342:     register    char *cp;
 343:     register    char    *pat;
 344:     char    *sbrk();
 345: 
 346:     for (cp = (char *)&environ, ub = sbrk(0); cp < ub; cp++){
 347:         if (cp[0] != '@') continue;
 348:         if (cp[1] != '(') continue;
 349:         if (cp[2] != '#') continue;
 350:         if (cp[3] != ')') continue;
 351:         fputc('\t', place);
 352:         for (cp += 4; cp < ub; cp++){
 353:             if (*cp == 0) break;
 354:             if (*cp == '>') break;
 355:             if (*cp == '\n') break;
 356:             fputc(*cp, place);
 357:         }
 358:         fputc('\n', place);
 359:     }
 360: }
 361: 
 362: initialize()
 363: {
 364:     if (signal(SIGINT, SIG_IGN) != SIG_IGN)
 365:         signal(SIGINT, delexit);
 366:     /*
 367: 	 *	Install symbols in the table
 368: 	 */
 369:     symtabinit();
 370:     syminstall();
 371:     /*
 372: 	 *	Build the expression parser accelerator token sets
 373: 	 */
 374:     buildtokensets();
 375: }
 376: 
 377: zeroorigins()
 378: {
 379:     register    int locindex;
 380:     /*
 381: 	 *	Mark usedot: the first NLOC slots are for named text segments,
 382: 	 *	the next for named data segments.
 383: 	 */
 384:     for (locindex = 0; locindex < NLOC; locindex++){
 385:         usedot[locindex].e_xtype = XTEXT;
 386:         usedot[NLOC + locindex].e_xtype = XDATA;
 387:         usedot[locindex].e_xvalue = 0;
 388:         usedot[NLOC + locindex].e_xvalue = 0;
 389:     }
 390: }
 391: 
 392: zerolocals()
 393: {
 394:     register    int i;
 395: 
 396:     for (i = 0; i <= 9; i++) {
 397:         lgensym[i] = 1;
 398:         genref[i] = 0;
 399:     }
 400: }
 401: 
 402: i_pass1()
 403: {
 404:     FILE    *tempopen();
 405:     if (useVM == 0)
 406:         tokfile = tempopen(tokfilename, "T");
 407:     strfile = tempopen(strfilename, "S");
 408:     /*
 409: 	 *	write out the string length.
 410: 	 *	This will be overwritten when the
 411: 	 *	strings are tacked onto the growing a.out file
 412: 	 */
 413:     strfilepos = sizeof(int);
 414:     fwrite(&strfilepos, sizeof(int), 1, strfile);
 415: 
 416:     inittokfile();
 417:     initijxxx();
 418: }
 419: 
 420: FILE *tempopen(tname, part)
 421:     char    *tname;
 422:     char    *part;
 423: {
 424:     FILE    *file;
 425:     sprintf(tname, "%s%sas%s%05d",
 426:         tmpdirprefix,
 427:         (tmpdirprefix[strlen(tmpdirprefix)-1] != '/') ? "/" : "",
 428:         part,
 429:         getpid());
 430:     file = fopen(tname, "w");
 431:     if (file == NULL) {
 432:         yyerror("Bad pass 1 temporary file for writing %s", tname);
 433:         delexit();
 434:     }
 435:     return(file);
 436: }
 437: 
 438: pass1()
 439: {
 440:     register    int i;
 441: 
 442:     passno = 1;
 443:     dotp = &usedot[0];
 444:     txtfil = (BFILE *)0;
 445:     relfil = (struct relbufdesc *)0;
 446: 
 447:     if (ninfiles == 0){     /*take the input from stdin directly*/
 448:         lineno = 1;
 449:         dotsname = "<stdin>";
 450: 
 451:         yyparse();
 452:     } else {        /*we have the names tanked*/
 453:         for (i = 0; i < ninfiles; i++){
 454:             new_dot_s(innames[i]);
 455:             if (freopen(innames[i], "r", stdin) == NULL) {
 456:                 yyerror( "Can't open source file %s\n",
 457:                     innames[i]);
 458:                 exit(2);
 459:             }
 460:             /* stdio is NOT used to read the input characters */
 461:             /* we use read directly, into our own buffers */
 462:             yyparse();
 463:         }
 464:     }
 465: 
 466:     closetokfile();     /*kick out the last buffered intermediate text*/
 467: }
 468: 
 469: testlocals()
 470: {
 471:     register    int i;
 472:     for (i = 0; i <= 9; i++) {
 473:         if (genref[i])
 474:             yyerror("Reference to undefined local label %df", i);
 475:         lgensym[i] = 1;
 476:         genref[i] = 0;
 477:     }
 478: }
 479: 
 480: pass1_5()
 481: {
 482:     sortsymtab();
 483: #ifdef DEBUG
 484:     if (debug) dumpsymtab();
 485: #endif
 486:     jxxxfix();
 487: #ifdef DEBUG
 488:     if (debug) dumpsymtab();
 489: #endif
 490: }
 491: 
 492: open_a_out()
 493: {
 494:     struct stat stb;
 495: 
 496:     /*
 497: 	 *	Open up the a.out file now, and get set to build
 498: 	 *	up offsets into it for all of the various text,data
 499: 	 *	text relocation and data relocation segments.
 500: 	 */
 501:     a_out_file = fopen(outfile, "w");
 502:     if (a_out_file == NULL) {
 503:         yyerror("Cannot create %s", outfile);
 504:         delexit();
 505:     }
 506:     biofd = a_out_file->_file;
 507:     fstat(biofd, &stb);
 508:     biobufsize = stb.st_blksize;
 509:     a_out_off = 0;
 510: }
 511: 
 512: roundsegments()
 513: {
 514:     register    int locindex;
 515:     register    long    v;
 516:     /*
 517: 	 *	round and assign text segment origins
 518: 	 *	the exec header always goes in usefile[0]
 519: 	 */
 520:     tsize = 0;
 521:     for (locindex=0; locindex<NLOC; locindex++) {
 522:         v = round(usedot[locindex].e_xvalue, FW);
 523:         usedot[locindex].e_xvalue = tsize;
 524:         if ((locindex == 0) || (v != 0) ){
 525:             usefile[locindex] = (BFILE *)Calloc(1, sizeof(BFILE));
 526:             bopen(usefile[locindex], a_out_off);
 527:             if (locindex == 0)
 528:                 a_out_off = sizeof (struct exec);
 529:         } else {
 530:             usefile[locindex] = (BFILE *)-1;
 531:         }
 532:         tsize += v;
 533:         a_out_off += v;
 534:     }
 535:     /*
 536: 	 *		Round and assign data segment origins.
 537: 	 */
 538:     datbase = round(tsize, FW);
 539:     for (locindex=0; locindex<NLOC; locindex++) {
 540:         v = round(usedot[NLOC+locindex].e_xvalue, FW);
 541:         usedot[NLOC+locindex].e_xvalue = datbase + dsize;
 542:         if (v != 0){
 543:             usefile[NLOC + locindex] = (BFILE *)Calloc(1,sizeof(BFILE));
 544:             bopen(usefile[NLOC + locindex], a_out_off);
 545:         } else {
 546:             usefile[NLOC + locindex] = (BFILE *)-1;
 547:         }
 548:         dsize += v;
 549:         a_out_off += v;
 550:     }
 551:     /*
 552: 	 *	Assign final values to symbols
 553: 	 */
 554:     hdr.a_bss = dsize;
 555:     freezesymtab();     /* this touches hdr.a_bss */
 556:     stabfix();
 557:     /*
 558: 	 *	Set up the relocation information "files" to
 559: 	 *	be zero; outrel takes care of the rest
 560: 	 */
 561:     for (locindex = 0; locindex < NLOC + NLOC; locindex++){
 562:         rusefile[locindex] = (struct relbufdesc *)0;
 563:     }
 564: }
 565: 
 566: build_hdr()
 567: {
 568:     /*
 569: 	 *	Except for the text and data relocation sizes,
 570: 	 *	calculate the final values for the header
 571: 	 *
 572: 	 *	Write out the initial copy; we to come
 573: 	 *	back later and patch up a_trsize and a_drsize,
 574: 	 *	and overwrite this first version of the header.
 575: 	 */
 576:     hdr.a_magic = MAGIC;
 577:     hdr.a_text = tsize;
 578:     hdr.a_data = dsize;
 579:     hdr.a_bss -= dsize;
 580:     hdr.a_syms = sizesymtab();  /* Does not include string pool length */
 581:     hdr.a_entry = 0;
 582:     hdr.a_trsize = 0;
 583:     hdr.a_drsize = 0;
 584: 
 585:     bwrite((char *)&hdr, sizeof(hdr), usefile[0]);
 586: }
 587: 
 588: i_pass2()
 589: {
 590:     if (useVM == 0) {
 591:         fclose(tokfile);
 592:         tokfile = fopen(tokfilename, "r");
 593:         if (tokfile==NULL) {
 594:            yyerror("Bad pass 2 temporary file for reading %s", tokfilename);
 595:            delexit();
 596:         }
 597:     }
 598:     fclose(strfile);
 599:     strfile = fopen(strfilename, "r");
 600: }
 601: 
 602: pass2()
 603: {
 604: #ifdef DEBUG
 605:     if (debug)
 606:         printf("\n\n\n\t\tPASS 2\n\n\n\n");
 607: #endif DEBUG
 608:     passno = 2;
 609:     lineno = 1;
 610:     dotp = &usedot[0];
 611:     txtfil = usefile[0];    /* already opened (always!) */
 612:     relfil = 0;     /* outrel takes care of the rest */
 613:     initoutrel();
 614: 
 615:     inittokfile();
 616: 
 617:     yyparse();
 618: 
 619:     closetokfile();
 620: }
 621: 
 622: fillsegments()
 623: {
 624:     int locindex;
 625:     /*
 626: 	 *	Round text and data segments to FW by appending zeros
 627: 	 */
 628:     for (locindex = 0; locindex < NLOC + NLOC; locindex++) {
 629:         if (usefile[locindex]) {
 630:             txtfil = usefile[locindex];
 631:             dotp = &usedot[locindex];
 632:             while (usedot[locindex].e_xvalue & FW)
 633:                 outb(0);
 634:         }
 635:     }
 636: }
 637: 
 638: reloc_syms()
 639: {
 640:     u_long  closerelfil();
 641:     /*
 642: 	 *	Move the relocation information to a.out
 643: 	 *	a_out_off is the offset so far:
 644: 	 *	exec + text segments + data segments
 645: 	 */
 646:     relocfile = (BFILE *)Calloc(1,sizeof(BFILE));
 647:     bopen(relocfile, a_out_off);
 648:     a_out_off += closeoutrel(relocfile);
 649: 
 650:     hdr.a_trsize = trsize;
 651:     hdr.a_drsize = drsize;
 652:     if (readonlydata) {
 653:         hdr.a_text += hdr.a_data;
 654:         hdr.a_data = 0;
 655:         hdr.a_trsize += hdr.a_drsize;
 656:         hdr.a_drsize = 0;
 657:     }
 658:     /*
 659: 	 *	Output the symbol table and the string pool
 660: 	 *
 661: 	 *	We must first rewind the string pool file to its beginning,
 662: 	 *	in case it was seek'ed into for fetching ascii and asciz
 663: 	 *	strings.
 664: 	 */
 665:     fseek(strfile, 0, 0);
 666:     symwrite(relocfile);
 667: }
 668: 
 669: fix_a_out()
 670: {
 671:     if (lseek(a_out_file->_file, 0L, 0) < 0L)
 672:         yyerror("Reposition for header rewrite fails");
 673:     if (write(a_out_file->_file, (char *)&hdr, sizeof (struct exec)) < 0)
 674:         yyerror("Rewrite of header fails");
 675: }
 676: 
 677: delexit()
 678: {
 679:     delete();
 680:     if (passno == 2){
 681:         unlink(outfile);
 682:     }
 683:     exit(1);
 684: }
 685: 
 686: delete()
 687: {
 688:     if (useVM == 0 || tokfilename[0])
 689:         unlink(tokfilename);
 690:     if (strfilename[0])
 691:         unlink(strfilename);
 692: }
 693: 
 694: sawabort()
 695: {
 696:     char    *fillinbuffer();
 697:     while (fillinbuffer() != (char *)0)
 698:         continue;
 699:     delete();
 700:     exit(1);    /*although the previous pass will also exit non zero*/
 701: }
 702: 
 703: panic(fmt, a1, a2, a3, a4)
 704:     char    *fmt;
 705:     /*VARARGS 1*/
 706: {
 707:     yyerror("Assembler panic: bad internal data structure.");
 708:     yyerror(fmt, a1, a2, a3, a4);
 709:     delete();
 710:     abort();
 711: }

Defined functions

argprocess defined in line 231; used 1 times
build_hdr defined in line 566; used 1 times
delete defined in line 686; used 4 times
delexit defined in line 677; used 10 times
fillsegments defined in line 622; used 1 times
fix_a_out defined in line 669; used 1 times
i_pass1 defined in line 402; used 1 times
i_pass2 defined in line 588; used 1 times
initialize defined in line 362; used 1 times
main defined in line 176; never used
open_a_out defined in line 492; used 1 times
pass1 defined in line 438; used 1 times
pass1_5 defined in line 480; used 1 times
pass2 defined in line 602; used 1 times
reloc_syms defined in line 638; used 1 times
roundsegments defined in line 512; used 1 times
sawabort defined in line 694; used 1 times
selfwhat defined in line 337; used 1 times
tempopen defined in line 420; used 3 times
testlocals defined in line 469; used 1 times
zerolocals defined in line 392; used 1 times
zeroorigins defined in line 377; used 1 times

Defined variables

anyerrs defined in line 43; used 15 times
anywarnings defined in line 44; used 3 times
copyright defined in line 8; never used
d124 defined in line 41; used 12 times
debug defined in line 55; used 14 times
dotp defined in line 82; used 53 times
dotsname defined in line 32; used 9 times
endcore defined in line 61; used 1 times
hdr defined in line 66; used 42 times
innames defined in line 34; used 6 times
jxxxJUMP defined in line 47; used 6 times
maxalign defined in line 42; used 9 times
nGHnumbers defined in line 50; used 6 times
nGHopcodes defined in line 51; used 5 times
ninfiles defined in line 35; used 4 times
nnewopcodes defined in line 52; used 5 times
orgwarn defined in line 45; used 3 times
outfile defined in line 102; used 4 times
readonlydata defined in line 48; used 7 times
relfil defined in line 163; used 2 times
rusefile defined in line 162; used 1 times
savelabels defined in line 40; used 4 times
sccsid defined in line 14; never used
silent defined in line 39; used 8 times
strfilename defined in line 95; used 10 times
strfilepos defined in line 96; used 6 times
tmpdirprefix defined in line 173; used 4 times
tokfilename defined in line 89; used 12 times
toktrace defined in line 56; used 3 times
useVM defined in line 59; used 12 times
usedot defined in line 81; used 35 times

Defined macros

MAGIC defined in line 67; used 1 times
unix_lang_name defined in line 28; never used
Last modified: 1985-11-11
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2302
Valid CSS Valid XHTML 1.0 Strict