|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)init.c 1.1 86/02/03 Copyr 1985 Sun Micro";
3: #endif
4:
5: /*
6: * Copyright (c) 1985 by Sun Microsystems, Inc.
7: */
8:
9: #include "as.h"
10:
11: char title[STR_MAX];
12: char o_outfile = 0; /* 1 if .rel file name is specified by user */
13: int pass = 0; /* which pass we're on */
14: int implicit_cpid = INITIAL_CPID ; /* Default coprocessor id. */
15: int current_cpid ; /* Coprocessor for current instruction. */
16: char rel_name[STR_MAX]; /* Name of .rel file */
17: FILE *rel_file; /* and ptr to it */
18: struct sym_bkt *dot_bkt ; /* Ptr to location counter's symbol bucket */
19: long tsize = 0; /* sizes of three main csects */
20: long dsize = 0;
21: long d1size = 0;
22: long d2size = 0;
23: long bsize = 0;
24: struct ins_ptr *ins_hash_tab[HASH_MAX];
25: struct ins_ptr *inst;
26: char *source_name[FILES_MAX];
27: FILE *source_file[FILES_MAX];
28: int file_count= 0, current_file= 0;
29: char *asm_name; /* set from argv[0] below: used in error.c */
30: int errors = 0; /* Number of errors in this pass */
31: char file_name[STR_MAX];
32: char o_lflag = 0;
33: int d2flag = 0; /* all offsets are 16 bits */
34: int rflag = 0; /* data goes at end of text segment (read-only) */
35: int Oflag = 0; /* sdi optimization : over the whole file */
36: int jsrflag = 0, /* all "long" jumps use 16-bit displacements */
37: Jflag = 0, /* all jumps are "long" */
38: even_align_flag = 0, /* 0 = align on 4 byte boundaries; 1 = align on 2 bytes */
39: hflag = 0; /* all calls use 4 byte displacement. other jumps are "long" */
40: #ifdef EBUG
41: int debflag = 0;
42: #endif
43:
44: extern int is68020(); /* undocumented hack from libc.a */
45: int ext_instruction_set;
46:
47: init(argc,argv)
48: char *argv[];
49: {
50: char *strncpy();
51: char *cp1, *cp2, *end, *rindex();
52:
53: ext_instruction_set = is68020();
54: asm_name = *(argv++);
55: while (--argc) {
56: if (argv[0][0] == '-') switch (argv[0][1]) {
57: case 'o': o_outfile++;
58: strcpy(rel_name, argv[1]);
59: argv++;
60: argc--;
61: break;
62:
63: case 'L':
64: o_lflag++;
65: break;
66: case 'R':
67: rflag++;
68: break;
69: case 'h':
70: if (Oflag) goto Owarn;
71: if (Jflag && !hflag) goto Jwarn;
72: hflag++;
73: Jflag++;
74: break;
75: case 'j':
76: jsrflag++;
77: Oflag++;
78: break;
79: case 'J':
80: Jflag++;
81: if (Oflag) {
82: fprintf(stderr,"Warning: -J overrides -O\n");
83: Oflag = 0;
84: }
85: if (hflag) {
86: Jwarn: fprintf(stderr,"Warning: -J overrides -h\n");
87: hflag = 0;
88: }
89: break;
90: case 'O':
91: if (Jflag) {
92: fprintf(stderr,"Warning: -J overrides -O\n");
93: Oflag = 0;
94: break;
95: }
96: if (hflag) {
97: Owarn: fprintf(stderr,"Warning: -h overrides -O\n");
98: Oflag = 0;
99: break;
100: }
101: Oflag++;
102: break;
103: case '1':
104: if (argv[0][2] == '0'){
105: ext_instruction_set=0;
106: break;
107: }
108: goto oops;
109: case '2':
110: if (argv[0][2] == '0'){
111: ext_instruction_set=1;
112: break;
113: }
114: goto oops;
115: case 'm':
116: /*
117: * this is redundant but consistent with
118: * cc, f77, and pc
119: */
120: if (!strcmp(argv[0]+1,"m68010")) {
121: ext_instruction_set=0;
122: break;
123: }
124: if (!strcmp(argv[0]+1,"m68020")) {
125: ext_instruction_set=1;
126: break;
127: }
128: goto oops;
129: case 'e':
130: even_align_flag = 1 ;
131: break ;
132: #ifdef EBUG
133: case 'D':
134: debflag++;
135: break;
136: #endif
137: case 'd':
138: if (argv[0][2] == '2'){
139: d2flag++;
140: Oflag++;
141: break;
142: }
143: /* else fall through */
144:
145: oops:
146: default: fprintf(stderr,"%s: Unknown option '%c' ignored.\n",
147: asm_name, argv[0][1]);
148: } else {
149: if (file_count >= FILES_MAX) {
150: fprintf(stderr, "Too many source files given (max=%d)\n", FILES_MAX); exit(99);};
151: source_name[file_count] = argv[0];
152: strcpy(file_name, argv[0]);
153: if ((source_file[file_count]= fopen(file_name,"r")) == NULL) {
154: /* open source file */
155: if ((end = rindex(source_name[file_count], '.')) == 0 || strcmp(end, ".a68") != 0) {
156: fprintf(stderr,"%s: Can't open source file: %s\n", asm_name, file_name);
157: exit(1);
158: }
159: strncpy(file_name, argv[0], STR_MAX);
160: if ((source_file[file_count]= fopen(file_name,"r")) == NULL) {
161: fprintf(stderr,"Can't open source file: %s\n",file_name);
162: exit(1);
163: }}
164: file_count++;
165: }
166: argv++;
167: }
168:
169: if (file_count == 0){
170: fprintf(stderr,"%s: No input file\n", asm_name);
171: exit( 99 );
172: }
173:
174:
175: /* Check to see if we can open output file */
176: if(!o_outfile) {
177: strcpy(rel_name, "a.out");
178: }
179: if ((rel_file = fopen(rel_name,"w")) == NULL){
180: printf("%s: Can't create output file: %s\n",asm_name,rel_name);
181: exit(1);
182: }
183: fclose(rel_file); /* rel_header will open properly */
184:
185: sym_init(); /* Initialize symbols */
186: dot_bkt = lookup("."); /* make bucket for location counter */
187: dot_bkt->csect_s = cur_csect_name;
188: dot_bkt->attr_s = S_DEC | S_DEF | S_LABEL; /* "S_LABEL" so it cant be redefined as a label */
189: init_regs(); /* define register names */
190: d_ins(); /* set up opcode hash table */
191: perm();
192: start_pass();
193: }
194:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.