1*ce95e1b3SDavid du Colombier #include <ctype.h>
2*ce95e1b3SDavid du Colombier #define EXTERN
3*ce95e1b3SDavid du Colombier #include "a.h"
4*ce95e1b3SDavid du Colombier #include "y.tab.h"
5*ce95e1b3SDavid du Colombier
6*ce95e1b3SDavid du Colombier void
main(int argc,char * argv[])7*ce95e1b3SDavid du Colombier main(int argc, char *argv[])
8*ce95e1b3SDavid du Colombier {
9*ce95e1b3SDavid du Colombier char *p;
10*ce95e1b3SDavid du Colombier int nout, nproc, status, i, c;
11*ce95e1b3SDavid du Colombier
12*ce95e1b3SDavid du Colombier thechar = 'i';
13*ce95e1b3SDavid du Colombier p = strrchr(argv[0], '/');
14*ce95e1b3SDavid du Colombier if(p == nil)
15*ce95e1b3SDavid du Colombier p = argv[0];
16*ce95e1b3SDavid du Colombier else
17*ce95e1b3SDavid du Colombier p++;
18*ce95e1b3SDavid du Colombier if(*p == 'j')
19*ce95e1b3SDavid du Colombier thechar = 'j';
20*ce95e1b3SDavid du Colombier memset(debug, 0, sizeof(debug));
21*ce95e1b3SDavid du Colombier cinit();
22*ce95e1b3SDavid du Colombier outfile = 0;
23*ce95e1b3SDavid du Colombier include[ninclude++] = ".";
24*ce95e1b3SDavid du Colombier ARGBEGIN {
25*ce95e1b3SDavid du Colombier default:
26*ce95e1b3SDavid du Colombier c = ARGC();
27*ce95e1b3SDavid du Colombier if(c >= 0 || c < sizeof(debug))
28*ce95e1b3SDavid du Colombier debug[c] = 1;
29*ce95e1b3SDavid du Colombier break;
30*ce95e1b3SDavid du Colombier
31*ce95e1b3SDavid du Colombier case 'o':
32*ce95e1b3SDavid du Colombier outfile = ARGF();
33*ce95e1b3SDavid du Colombier break;
34*ce95e1b3SDavid du Colombier
35*ce95e1b3SDavid du Colombier case 'D':
36*ce95e1b3SDavid du Colombier p = ARGF();
37*ce95e1b3SDavid du Colombier if(p)
38*ce95e1b3SDavid du Colombier Dlist[nDlist++] = p;
39*ce95e1b3SDavid du Colombier break;
40*ce95e1b3SDavid du Colombier
41*ce95e1b3SDavid du Colombier case 'I':
42*ce95e1b3SDavid du Colombier p = ARGF();
43*ce95e1b3SDavid du Colombier setinclude(p);
44*ce95e1b3SDavid du Colombier break;
45*ce95e1b3SDavid du Colombier
46*ce95e1b3SDavid du Colombier } ARGEND
47*ce95e1b3SDavid du Colombier if(*argv == 0) {
48*ce95e1b3SDavid du Colombier print("usage: %ca [-options] file.s\n", thechar);
49*ce95e1b3SDavid du Colombier errorexit();
50*ce95e1b3SDavid du Colombier }
51*ce95e1b3SDavid du Colombier if(debug['j'])
52*ce95e1b3SDavid du Colombier thechar = 'j';
53*ce95e1b3SDavid du Colombier thestring = (thechar == 'j'? "riscv64" : "riscv");
54*ce95e1b3SDavid du Colombier if(argc > 1 && systemtype(Windows)){
55*ce95e1b3SDavid du Colombier print("can't assemble multiple files on windows\n");
56*ce95e1b3SDavid du Colombier errorexit();
57*ce95e1b3SDavid du Colombier }
58*ce95e1b3SDavid du Colombier if(argc > 1 && !systemtype(Windows)) {
59*ce95e1b3SDavid du Colombier nproc = 1;
60*ce95e1b3SDavid du Colombier if(p = getenv("NPROC"))
61*ce95e1b3SDavid du Colombier nproc = atol(p); /* */
62*ce95e1b3SDavid du Colombier c = 0;
63*ce95e1b3SDavid du Colombier nout = 0;
64*ce95e1b3SDavid du Colombier for(;;) {
65*ce95e1b3SDavid du Colombier while(nout < nproc && argc > 0) {
66*ce95e1b3SDavid du Colombier i = myfork();
67*ce95e1b3SDavid du Colombier if(i < 0) {
68*ce95e1b3SDavid du Colombier i = mywait(&status);
69*ce95e1b3SDavid du Colombier if(i < 0)
70*ce95e1b3SDavid du Colombier errorexit();
71*ce95e1b3SDavid du Colombier if(status)
72*ce95e1b3SDavid du Colombier c++;
73*ce95e1b3SDavid du Colombier nout--;
74*ce95e1b3SDavid du Colombier continue;
75*ce95e1b3SDavid du Colombier }
76*ce95e1b3SDavid du Colombier if(i == 0) {
77*ce95e1b3SDavid du Colombier print("%s:\n", *argv);
78*ce95e1b3SDavid du Colombier if(assemble(*argv))
79*ce95e1b3SDavid du Colombier errorexit();
80*ce95e1b3SDavid du Colombier exits(0);
81*ce95e1b3SDavid du Colombier }
82*ce95e1b3SDavid du Colombier nout++;
83*ce95e1b3SDavid du Colombier argc--;
84*ce95e1b3SDavid du Colombier argv++;
85*ce95e1b3SDavid du Colombier }
86*ce95e1b3SDavid du Colombier i = mywait(&status);
87*ce95e1b3SDavid du Colombier if(i < 0) {
88*ce95e1b3SDavid du Colombier if(c)
89*ce95e1b3SDavid du Colombier errorexit();
90*ce95e1b3SDavid du Colombier exits(0);
91*ce95e1b3SDavid du Colombier }
92*ce95e1b3SDavid du Colombier if(status)
93*ce95e1b3SDavid du Colombier c++;
94*ce95e1b3SDavid du Colombier nout--;
95*ce95e1b3SDavid du Colombier }
96*ce95e1b3SDavid du Colombier }
97*ce95e1b3SDavid du Colombier if(assemble(argv[0]))
98*ce95e1b3SDavid du Colombier errorexit();
99*ce95e1b3SDavid du Colombier exits(0);
100*ce95e1b3SDavid du Colombier }
101*ce95e1b3SDavid du Colombier
102*ce95e1b3SDavid du Colombier int
assemble(char * file)103*ce95e1b3SDavid du Colombier assemble(char *file)
104*ce95e1b3SDavid du Colombier {
105*ce95e1b3SDavid du Colombier char ofile[100], incfile[20], *p;
106*ce95e1b3SDavid du Colombier int i, of;
107*ce95e1b3SDavid du Colombier
108*ce95e1b3SDavid du Colombier strcpy(ofile, file);
109*ce95e1b3SDavid du Colombier p = utfrrune(ofile, pathchar());
110*ce95e1b3SDavid du Colombier if(p) {
111*ce95e1b3SDavid du Colombier include[0] = ofile;
112*ce95e1b3SDavid du Colombier *p++ = 0;
113*ce95e1b3SDavid du Colombier } else
114*ce95e1b3SDavid du Colombier p = ofile;
115*ce95e1b3SDavid du Colombier if(outfile == 0) {
116*ce95e1b3SDavid du Colombier outfile = p;
117*ce95e1b3SDavid du Colombier if(outfile){
118*ce95e1b3SDavid du Colombier p = utfrrune(outfile, '.');
119*ce95e1b3SDavid du Colombier if(p)
120*ce95e1b3SDavid du Colombier if(p[1] == 's' && p[2] == 0)
121*ce95e1b3SDavid du Colombier p[0] = 0;
122*ce95e1b3SDavid du Colombier p = utfrune(outfile, 0);
123*ce95e1b3SDavid du Colombier p[0] = '.';
124*ce95e1b3SDavid du Colombier p[1] = thechar;
125*ce95e1b3SDavid du Colombier p[2] = 0;
126*ce95e1b3SDavid du Colombier } else
127*ce95e1b3SDavid du Colombier outfile = "/dev/null";
128*ce95e1b3SDavid du Colombier }
129*ce95e1b3SDavid du Colombier p = getenv("INCLUDE");
130*ce95e1b3SDavid du Colombier if(p) {
131*ce95e1b3SDavid du Colombier setinclude(p);
132*ce95e1b3SDavid du Colombier } else {
133*ce95e1b3SDavid du Colombier if(systemtype(Plan9)) {
134*ce95e1b3SDavid du Colombier sprint(incfile,"/%s/include", thestring);
135*ce95e1b3SDavid du Colombier setinclude(strdup(incfile));
136*ce95e1b3SDavid du Colombier }
137*ce95e1b3SDavid du Colombier }
138*ce95e1b3SDavid du Colombier
139*ce95e1b3SDavid du Colombier of = mycreat(outfile, 0664);
140*ce95e1b3SDavid du Colombier if(of < 0) {
141*ce95e1b3SDavid du Colombier yyerror("%ca: cannot create %s", thechar, outfile);
142*ce95e1b3SDavid du Colombier errorexit();
143*ce95e1b3SDavid du Colombier }
144*ce95e1b3SDavid du Colombier Binit(&obuf, of, OWRITE);
145*ce95e1b3SDavid du Colombier
146*ce95e1b3SDavid du Colombier pass = 1;
147*ce95e1b3SDavid du Colombier pinit(file);
148*ce95e1b3SDavid du Colombier if(thechar == 'j')
149*ce95e1b3SDavid du Colombier dodefine("XLEN=8");
150*ce95e1b3SDavid du Colombier else
151*ce95e1b3SDavid du Colombier dodefine("XLEN=4");
152*ce95e1b3SDavid du Colombier for(i=0; i<nDlist; i++)
153*ce95e1b3SDavid du Colombier dodefine(Dlist[i]);
154*ce95e1b3SDavid du Colombier yyparse();
155*ce95e1b3SDavid du Colombier if(nerrors) {
156*ce95e1b3SDavid du Colombier cclean();
157*ce95e1b3SDavid du Colombier return nerrors;
158*ce95e1b3SDavid du Colombier }
159*ce95e1b3SDavid du Colombier
160*ce95e1b3SDavid du Colombier pass = 2;
161*ce95e1b3SDavid du Colombier outhist();
162*ce95e1b3SDavid du Colombier pinit(file);
163*ce95e1b3SDavid du Colombier if(thechar == 'j')
164*ce95e1b3SDavid du Colombier dodefine("XLEN=8");
165*ce95e1b3SDavid du Colombier else
166*ce95e1b3SDavid du Colombier dodefine("XLEN=4");
167*ce95e1b3SDavid du Colombier for(i=0; i<nDlist; i++)
168*ce95e1b3SDavid du Colombier dodefine(Dlist[i]);
169*ce95e1b3SDavid du Colombier yyparse();
170*ce95e1b3SDavid du Colombier cclean();
171*ce95e1b3SDavid du Colombier return nerrors;
172*ce95e1b3SDavid du Colombier }
173*ce95e1b3SDavid du Colombier
174*ce95e1b3SDavid du Colombier struct
175*ce95e1b3SDavid du Colombier {
176*ce95e1b3SDavid du Colombier char *name;
177*ce95e1b3SDavid du Colombier ushort type;
178*ce95e1b3SDavid du Colombier ushort value;
179*ce95e1b3SDavid du Colombier } itab[] =
180*ce95e1b3SDavid du Colombier {
181*ce95e1b3SDavid du Colombier "SP", LSP, D_AUTO,
182*ce95e1b3SDavid du Colombier "SB", LSB, D_EXTERN,
183*ce95e1b3SDavid du Colombier "FP", LFP, D_PARAM,
184*ce95e1b3SDavid du Colombier "PC", LPC, D_BRANCH,
185*ce95e1b3SDavid du Colombier
186*ce95e1b3SDavid du Colombier "R", LR, 0,
187*ce95e1b3SDavid du Colombier "R0", LREG, 0,
188*ce95e1b3SDavid du Colombier "R1", LREG, 1,
189*ce95e1b3SDavid du Colombier "R2", LREG, 2,
190*ce95e1b3SDavid du Colombier "R3", LREG, 3,
191*ce95e1b3SDavid du Colombier "R4", LREG, 4,
192*ce95e1b3SDavid du Colombier "R5", LREG, 5,
193*ce95e1b3SDavid du Colombier "R6", LREG, 6,
194*ce95e1b3SDavid du Colombier "R7", LREG, 7,
195*ce95e1b3SDavid du Colombier "R8", LREG, 8,
196*ce95e1b3SDavid du Colombier "R9", LREG, 9,
197*ce95e1b3SDavid du Colombier "R10", LREG, 10,
198*ce95e1b3SDavid du Colombier "R11", LREG, 11,
199*ce95e1b3SDavid du Colombier "R12", LREG, 12,
200*ce95e1b3SDavid du Colombier "R13", LREG, 13,
201*ce95e1b3SDavid du Colombier "R14", LREG, 14,
202*ce95e1b3SDavid du Colombier "R15", LREG, 15,
203*ce95e1b3SDavid du Colombier "R16", LREG, 16,
204*ce95e1b3SDavid du Colombier "R17", LREG, 17,
205*ce95e1b3SDavid du Colombier "R18", LREG, 18,
206*ce95e1b3SDavid du Colombier "R19", LREG, 19,
207*ce95e1b3SDavid du Colombier "R20", LREG, 20,
208*ce95e1b3SDavid du Colombier "R21", LREG, 21,
209*ce95e1b3SDavid du Colombier "R22", LREG, 22,
210*ce95e1b3SDavid du Colombier "R23", LREG, 23,
211*ce95e1b3SDavid du Colombier "R24", LREG, 24,
212*ce95e1b3SDavid du Colombier "R25", LREG, 25,
213*ce95e1b3SDavid du Colombier "R26", LREG, 26,
214*ce95e1b3SDavid du Colombier "R27", LREG, 27,
215*ce95e1b3SDavid du Colombier "R28", LREG, 28,
216*ce95e1b3SDavid du Colombier "R29", LREG, 29,
217*ce95e1b3SDavid du Colombier "R30", LREG, 30,
218*ce95e1b3SDavid du Colombier "R31", LREG, 31,
219*ce95e1b3SDavid du Colombier
220*ce95e1b3SDavid du Colombier "F", FR, 0,
221*ce95e1b3SDavid du Colombier "F0", LFREG, 0,
222*ce95e1b3SDavid du Colombier "F1", LFREG, 1,
223*ce95e1b3SDavid du Colombier "F2", LFREG, 2,
224*ce95e1b3SDavid du Colombier "F3", LFREG, 3,
225*ce95e1b3SDavid du Colombier "F4", LFREG, 4,
226*ce95e1b3SDavid du Colombier "F5", LFREG, 5,
227*ce95e1b3SDavid du Colombier "F6", LFREG, 6,
228*ce95e1b3SDavid du Colombier "F7", LFREG, 7,
229*ce95e1b3SDavid du Colombier "F8", LFREG, 8,
230*ce95e1b3SDavid du Colombier "F9", LFREG, 9,
231*ce95e1b3SDavid du Colombier "F10", LFREG, 10,
232*ce95e1b3SDavid du Colombier "F11", LFREG, 11,
233*ce95e1b3SDavid du Colombier "F12", LFREG, 12,
234*ce95e1b3SDavid du Colombier "F13", LFREG, 13,
235*ce95e1b3SDavid du Colombier "F14", LFREG, 14,
236*ce95e1b3SDavid du Colombier "F15", LFREG, 15,
237*ce95e1b3SDavid du Colombier "F16", LFREG, 16,
238*ce95e1b3SDavid du Colombier "F17", LFREG, 17,
239*ce95e1b3SDavid du Colombier "F18", LFREG, 18,
240*ce95e1b3SDavid du Colombier "F19", LFREG, 19,
241*ce95e1b3SDavid du Colombier "F20", LFREG, 20,
242*ce95e1b3SDavid du Colombier "F21", LFREG, 21,
243*ce95e1b3SDavid du Colombier "F22", LFREG, 22,
244*ce95e1b3SDavid du Colombier "F23", LFREG, 23,
245*ce95e1b3SDavid du Colombier "F24", LFREG, 24,
246*ce95e1b3SDavid du Colombier "F25", LFREG, 25,
247*ce95e1b3SDavid du Colombier "F26", LFREG, 26,
248*ce95e1b3SDavid du Colombier "F27", LFREG, 27,
249*ce95e1b3SDavid du Colombier "F28", LFREG, 28,
250*ce95e1b3SDavid du Colombier "F29", LFREG, 29,
251*ce95e1b3SDavid du Colombier "F30", LFREG, 30,
252*ce95e1b3SDavid du Colombier "F31", LFREG, 31,
253*ce95e1b3SDavid du Colombier
254*ce95e1b3SDavid du Colombier "CSR", LCTL, 0,
255*ce95e1b3SDavid du Colombier
256*ce95e1b3SDavid du Colombier "ADD", LADD, AADD,
257*ce95e1b3SDavid du Colombier "SLL", LADD, ASLL,
258*ce95e1b3SDavid du Colombier "SLT", LADD, ASLT,
259*ce95e1b3SDavid du Colombier "SLTU", LADD, ASLTU,
260*ce95e1b3SDavid du Colombier "XOR", LADD, AXOR,
261*ce95e1b3SDavid du Colombier "SRL", LADD, ASRL,
262*ce95e1b3SDavid du Colombier "OR", LADD, AOR,
263*ce95e1b3SDavid du Colombier "AND", LADD, AAND,
264*ce95e1b3SDavid du Colombier "SRA", LADD, ASRA,
265*ce95e1b3SDavid du Colombier "ADDW", LADD, AADDW,
266*ce95e1b3SDavid du Colombier "SLLW", LADD, ASLLW,
267*ce95e1b3SDavid du Colombier "SRLW", LADD, ASRLW,
268*ce95e1b3SDavid du Colombier "SRAW", LADD, ASRAW,
269*ce95e1b3SDavid du Colombier "SUB", LADD, ASUB,
270*ce95e1b3SDavid du Colombier "SUBW", LADD, ASUBW,
271*ce95e1b3SDavid du Colombier
272*ce95e1b3SDavid du Colombier "MUL", LMUL, AMUL,
273*ce95e1b3SDavid du Colombier "MULH", LMUL, AMULH,
274*ce95e1b3SDavid du Colombier "MULHSU", LMUL, AMULHSU,
275*ce95e1b3SDavid du Colombier "MULHU", LMUL, AMULHU,
276*ce95e1b3SDavid du Colombier "DIV", LMUL, ADIV,
277*ce95e1b3SDavid du Colombier "DIVU", LMUL, ADIVU,
278*ce95e1b3SDavid du Colombier "REM", LMUL, AREM,
279*ce95e1b3SDavid du Colombier "REMU", LMUL, AREMU,
280*ce95e1b3SDavid du Colombier "MULW", LMUL, AMULW,
281*ce95e1b3SDavid du Colombier "DIVW", LMUL, ADIVW,
282*ce95e1b3SDavid du Colombier "DIVUW", LMUL, ADIVUW,
283*ce95e1b3SDavid du Colombier "REMW", LMUL, AREMW,
284*ce95e1b3SDavid du Colombier "REMUW", LMUL, AREMUW,
285*ce95e1b3SDavid du Colombier
286*ce95e1b3SDavid du Colombier "BEQ", LBEQ, ABEQ,
287*ce95e1b3SDavid du Colombier "BNE", LBEQ, ABNE,
288*ce95e1b3SDavid du Colombier "BLT", LBEQ, ABLT,
289*ce95e1b3SDavid du Colombier "BGE", LBEQ, ABGE,
290*ce95e1b3SDavid du Colombier "BLTU", LBEQ, ABLTU,
291*ce95e1b3SDavid du Colombier "BGEU", LBEQ, ABGEU,
292*ce95e1b3SDavid du Colombier "BGT", LBEQ, ABGT,
293*ce95e1b3SDavid du Colombier "BGTU", LBEQ, ABGTU,
294*ce95e1b3SDavid du Colombier "BLE", LBEQ, ABLE,
295*ce95e1b3SDavid du Colombier "BLEU", LBEQ, ABLEU,
296*ce95e1b3SDavid du Colombier
297*ce95e1b3SDavid du Colombier "JMP", LBR, AJMP,
298*ce95e1b3SDavid du Colombier
299*ce95e1b3SDavid du Colombier "RET", LBRET, ARET,
300*ce95e1b3SDavid du Colombier "FENCE_I", LBRET, AFENCE_I,
301*ce95e1b3SDavid du Colombier "NOP", LBRET, ANOP,
302*ce95e1b3SDavid du Colombier "END", LBRET, AEND,
303*ce95e1b3SDavid du Colombier
304*ce95e1b3SDavid du Colombier "JAL", LCALL, AJAL,
305*ce95e1b3SDavid du Colombier "JALR", LCALL, AJAL,
306*ce95e1b3SDavid du Colombier
307*ce95e1b3SDavid du Colombier "MOVB", LMOVB, AMOVB,
308*ce95e1b3SDavid du Colombier "MOVH", LMOVB, AMOVH,
309*ce95e1b3SDavid du Colombier
310*ce95e1b3SDavid du Colombier "MOVF", LMOVF, AMOVF,
311*ce95e1b3SDavid du Colombier "MOVD", LMOVF, AMOVD,
312*ce95e1b3SDavid du Colombier
313*ce95e1b3SDavid du Colombier "MOVBU", LMOVBU, AMOVBU,
314*ce95e1b3SDavid du Colombier "MOVHU", LMOVBU, AMOVHU,
315*ce95e1b3SDavid du Colombier
316*ce95e1b3SDavid du Colombier "MOVW", LMOVW, AMOVW,
317*ce95e1b3SDavid du Colombier
318*ce95e1b3SDavid du Colombier "MOVFD", LFLT2, AMOVFD,
319*ce95e1b3SDavid du Colombier "MOVDF", LFLT2, AMOVDF,
320*ce95e1b3SDavid du Colombier "MOVWF", LFLT2, AMOVWF,
321*ce95e1b3SDavid du Colombier "MOVUF", LFLT2, AMOVUF,
322*ce95e1b3SDavid du Colombier "MOVFW", LFLT2, AMOVFW,
323*ce95e1b3SDavid du Colombier "MOVWD", LFLT2, AMOVWD,
324*ce95e1b3SDavid du Colombier "MOVUD", LFLT2, AMOVUD,
325*ce95e1b3SDavid du Colombier "MOVDW", LFLT2, AMOVDW,
326*ce95e1b3SDavid du Colombier "ADDF", LFLT3, AADDF,
327*ce95e1b3SDavid du Colombier "ADDD", LFLT3, AADDD,
328*ce95e1b3SDavid du Colombier "SUBF", LFLT3, ASUBF,
329*ce95e1b3SDavid du Colombier "SUBD", LFLT3, ASUBD,
330*ce95e1b3SDavid du Colombier "MULF", LFLT3, AMULF,
331*ce95e1b3SDavid du Colombier "MULD", LFLT3, AMULD,
332*ce95e1b3SDavid du Colombier "DIVF", LFLT3, ADIVF,
333*ce95e1b3SDavid du Colombier "DIVD", LFLT3, ADIVD,
334*ce95e1b3SDavid du Colombier "CMPLTF", LFLT3, ACMPLTF,
335*ce95e1b3SDavid du Colombier "CMPLTD", LFLT3, ACMPLTD,
336*ce95e1b3SDavid du Colombier "CMPEQF", LFLT3, ACMPEQF,
337*ce95e1b3SDavid du Colombier "CMPEQD", LFLT3, ACMPEQD,
338*ce95e1b3SDavid du Colombier "CMPLEF", LFLT3, ACMPLEF,
339*ce95e1b3SDavid du Colombier "CMPLED", LFLT3, ACMPLED,
340*ce95e1b3SDavid du Colombier
341*ce95e1b3SDavid du Colombier "LUI", LLUI, ALUI,
342*ce95e1b3SDavid du Colombier
343*ce95e1b3SDavid du Colombier "SYS", LSYS, ASYS,
344*ce95e1b3SDavid du Colombier "ECALL", LSYS0, 0,
345*ce95e1b3SDavid du Colombier "EBREAK", LSYS0, 1,
346*ce95e1b3SDavid du Colombier "CSRRW", LCSR, ACSRRW,
347*ce95e1b3SDavid du Colombier "CSRRS", LCSR, ACSRRS,
348*ce95e1b3SDavid du Colombier "CSRRC", LCSR, ACSRRC,
349*ce95e1b3SDavid du Colombier
350*ce95e1b3SDavid du Colombier "SWAP_W", LSWAP, ASWAP_W,
351*ce95e1b3SDavid du Colombier "SWAP_D", LSWAP, ASWAP_D,
352*ce95e1b3SDavid du Colombier "LR_W", LSWAP, ALR_W,
353*ce95e1b3SDavid du Colombier "LR_D", LSWAP, ALR_D,
354*ce95e1b3SDavid du Colombier "SC_W", LSWAP, ASC_W,
355*ce95e1b3SDavid du Colombier "SC_D", LSWAP, ASC_D,
356*ce95e1b3SDavid du Colombier
357*ce95e1b3SDavid du Colombier "AMO_W", LAMO, AAMO_W,
358*ce95e1b3SDavid du Colombier "AMO_D", LAMO, AAMO_D,
359*ce95e1b3SDavid du Colombier
360*ce95e1b3SDavid du Colombier "DATA", LDATA, ADATA,
361*ce95e1b3SDavid du Colombier "GLOBL", LTEXT, AGLOBL,
362*ce95e1b3SDavid du Colombier "TEXT", LTEXT, ATEXT,
363*ce95e1b3SDavid du Colombier "WORD", LWORD, AWORD,
364*ce95e1b3SDavid du Colombier "DWORD", LWORD, ADWORD,
365*ce95e1b3SDavid du Colombier
366*ce95e1b3SDavid du Colombier "MOV", LMOVW, AMOV,
367*ce95e1b3SDavid du Colombier "MOVWU", LMOVBU, AMOVWU,
368*ce95e1b3SDavid du Colombier
369*ce95e1b3SDavid du Colombier 0
370*ce95e1b3SDavid du Colombier };
371*ce95e1b3SDavid du Colombier
372*ce95e1b3SDavid du Colombier void
cinit(void)373*ce95e1b3SDavid du Colombier cinit(void)
374*ce95e1b3SDavid du Colombier {
375*ce95e1b3SDavid du Colombier Sym *s;
376*ce95e1b3SDavid du Colombier int i;
377*ce95e1b3SDavid du Colombier
378*ce95e1b3SDavid du Colombier nullgen.sym = S;
379*ce95e1b3SDavid du Colombier nullgen.offset = 0;
380*ce95e1b3SDavid du Colombier nullgen.type = D_NONE;
381*ce95e1b3SDavid du Colombier nullgen.name = D_NONE;
382*ce95e1b3SDavid du Colombier nullgen.reg = NREG;
383*ce95e1b3SDavid du Colombier if(FPCHIP)
384*ce95e1b3SDavid du Colombier nullgen.dval = 0;
385*ce95e1b3SDavid du Colombier for(i=0; i<sizeof(nullgen.sval); i++)
386*ce95e1b3SDavid du Colombier nullgen.sval[i] = 0;
387*ce95e1b3SDavid du Colombier
388*ce95e1b3SDavid du Colombier nerrors = 0;
389*ce95e1b3SDavid du Colombier iostack = I;
390*ce95e1b3SDavid du Colombier iofree = I;
391*ce95e1b3SDavid du Colombier peekc = IGN;
392*ce95e1b3SDavid du Colombier nhunk = 0;
393*ce95e1b3SDavid du Colombier for(i=0; i<NHASH; i++)
394*ce95e1b3SDavid du Colombier hash[i] = S;
395*ce95e1b3SDavid du Colombier for(i=0; itab[i].name; i++) {
396*ce95e1b3SDavid du Colombier s = slookup(itab[i].name);
397*ce95e1b3SDavid du Colombier s->type = itab[i].type;
398*ce95e1b3SDavid du Colombier s->value = itab[i].value;
399*ce95e1b3SDavid du Colombier }
400*ce95e1b3SDavid du Colombier
401*ce95e1b3SDavid du Colombier pathname = allocn(pathname, 0, 100);
402*ce95e1b3SDavid du Colombier if(mygetwd(pathname, 99) == 0) {
403*ce95e1b3SDavid du Colombier pathname = allocn(pathname, 100, 900);
404*ce95e1b3SDavid du Colombier if(mygetwd(pathname, 999) == 0)
405*ce95e1b3SDavid du Colombier strcpy(pathname, "/???");
406*ce95e1b3SDavid du Colombier }
407*ce95e1b3SDavid du Colombier }
408*ce95e1b3SDavid du Colombier
409*ce95e1b3SDavid du Colombier void
syminit(Sym * s)410*ce95e1b3SDavid du Colombier syminit(Sym *s)
411*ce95e1b3SDavid du Colombier {
412*ce95e1b3SDavid du Colombier
413*ce95e1b3SDavid du Colombier s->type = LNAME;
414*ce95e1b3SDavid du Colombier s->value = 0;
415*ce95e1b3SDavid du Colombier }
416*ce95e1b3SDavid du Colombier
417*ce95e1b3SDavid du Colombier void
cclean(void)418*ce95e1b3SDavid du Colombier cclean(void)
419*ce95e1b3SDavid du Colombier {
420*ce95e1b3SDavid du Colombier
421*ce95e1b3SDavid du Colombier outcode(AEND, &nullgen, NREG, &nullgen);
422*ce95e1b3SDavid du Colombier Bflush(&obuf);
423*ce95e1b3SDavid du Colombier }
424*ce95e1b3SDavid du Colombier
425*ce95e1b3SDavid du Colombier void
zname(char * n,int t,int s)426*ce95e1b3SDavid du Colombier zname(char *n, int t, int s)
427*ce95e1b3SDavid du Colombier {
428*ce95e1b3SDavid du Colombier
429*ce95e1b3SDavid du Colombier Bputc(&obuf, ANAME);
430*ce95e1b3SDavid du Colombier Bputc(&obuf, t); /* type */
431*ce95e1b3SDavid du Colombier Bputc(&obuf, s); /* sym */
432*ce95e1b3SDavid du Colombier while(*n) {
433*ce95e1b3SDavid du Colombier Bputc(&obuf, *n);
434*ce95e1b3SDavid du Colombier n++;
435*ce95e1b3SDavid du Colombier }
436*ce95e1b3SDavid du Colombier Bputc(&obuf, 0);
437*ce95e1b3SDavid du Colombier }
438*ce95e1b3SDavid du Colombier
439*ce95e1b3SDavid du Colombier void
zaddr(Gen * a,int s)440*ce95e1b3SDavid du Colombier zaddr(Gen *a, int s)
441*ce95e1b3SDavid du Colombier {
442*ce95e1b3SDavid du Colombier vlong v;
443*ce95e1b3SDavid du Colombier long l;
444*ce95e1b3SDavid du Colombier int i;
445*ce95e1b3SDavid du Colombier char *n;
446*ce95e1b3SDavid du Colombier Ieee e;
447*ce95e1b3SDavid du Colombier
448*ce95e1b3SDavid du Colombier Bputc(&obuf, a->type);
449*ce95e1b3SDavid du Colombier Bputc(&obuf, a->reg);
450*ce95e1b3SDavid du Colombier Bputc(&obuf, s);
451*ce95e1b3SDavid du Colombier Bputc(&obuf, a->name);
452*ce95e1b3SDavid du Colombier switch(a->type) {
453*ce95e1b3SDavid du Colombier default:
454*ce95e1b3SDavid du Colombier print("unknown type %d\n", a->type);
455*ce95e1b3SDavid du Colombier exits("arg");
456*ce95e1b3SDavid du Colombier
457*ce95e1b3SDavid du Colombier case D_NONE:
458*ce95e1b3SDavid du Colombier case D_REG:
459*ce95e1b3SDavid du Colombier case D_FREG:
460*ce95e1b3SDavid du Colombier break;
461*ce95e1b3SDavid du Colombier
462*ce95e1b3SDavid du Colombier case D_CTLREG:
463*ce95e1b3SDavid du Colombier case D_OREG:
464*ce95e1b3SDavid du Colombier case D_CONST:
465*ce95e1b3SDavid du Colombier case D_BRANCH:
466*ce95e1b3SDavid du Colombier l = a->offset;
467*ce95e1b3SDavid du Colombier Bputc(&obuf, l);
468*ce95e1b3SDavid du Colombier Bputc(&obuf, l>>8);
469*ce95e1b3SDavid du Colombier Bputc(&obuf, l>>16);
470*ce95e1b3SDavid du Colombier Bputc(&obuf, l>>24);
471*ce95e1b3SDavid du Colombier break;
472*ce95e1b3SDavid du Colombier
473*ce95e1b3SDavid du Colombier case D_VCONST:
474*ce95e1b3SDavid du Colombier v = a->vval;
475*ce95e1b3SDavid du Colombier Bputc(&obuf, v);
476*ce95e1b3SDavid du Colombier Bputc(&obuf, v>>8);
477*ce95e1b3SDavid du Colombier Bputc(&obuf, v>>16);
478*ce95e1b3SDavid du Colombier Bputc(&obuf, v>>24);
479*ce95e1b3SDavid du Colombier Bputc(&obuf, v>>32);
480*ce95e1b3SDavid du Colombier Bputc(&obuf, v>>40);
481*ce95e1b3SDavid du Colombier Bputc(&obuf, v>>48);
482*ce95e1b3SDavid du Colombier Bputc(&obuf, v>>56);
483*ce95e1b3SDavid du Colombier break;
484*ce95e1b3SDavid du Colombier
485*ce95e1b3SDavid du Colombier case D_SCONST:
486*ce95e1b3SDavid du Colombier n = a->sval;
487*ce95e1b3SDavid du Colombier for(i=0; i<NSNAME; i++) {
488*ce95e1b3SDavid du Colombier Bputc(&obuf, *n);
489*ce95e1b3SDavid du Colombier n++;
490*ce95e1b3SDavid du Colombier }
491*ce95e1b3SDavid du Colombier break;
492*ce95e1b3SDavid du Colombier
493*ce95e1b3SDavid du Colombier case D_FCONST:
494*ce95e1b3SDavid du Colombier ieeedtod(&e, a->dval);
495*ce95e1b3SDavid du Colombier Bputc(&obuf, e.l);
496*ce95e1b3SDavid du Colombier Bputc(&obuf, e.l>>8);
497*ce95e1b3SDavid du Colombier Bputc(&obuf, e.l>>16);
498*ce95e1b3SDavid du Colombier Bputc(&obuf, e.l>>24);
499*ce95e1b3SDavid du Colombier Bputc(&obuf, e.h);
500*ce95e1b3SDavid du Colombier Bputc(&obuf, e.h>>8);
501*ce95e1b3SDavid du Colombier Bputc(&obuf, e.h>>16);
502*ce95e1b3SDavid du Colombier Bputc(&obuf, e.h>>24);
503*ce95e1b3SDavid du Colombier break;
504*ce95e1b3SDavid du Colombier }
505*ce95e1b3SDavid du Colombier }
506*ce95e1b3SDavid du Colombier
507*ce95e1b3SDavid du Colombier void
outcode(int a,Gen * g1,int reg,Gen * g2)508*ce95e1b3SDavid du Colombier outcode(int a, Gen *g1, int reg, Gen *g2)
509*ce95e1b3SDavid du Colombier {
510*ce95e1b3SDavid du Colombier int sf, st, t;
511*ce95e1b3SDavid du Colombier Sym *s;
512*ce95e1b3SDavid du Colombier
513*ce95e1b3SDavid du Colombier if(pass == 1)
514*ce95e1b3SDavid du Colombier goto out;
515*ce95e1b3SDavid du Colombier jackpot:
516*ce95e1b3SDavid du Colombier sf = 0;
517*ce95e1b3SDavid du Colombier s = g1->sym;
518*ce95e1b3SDavid du Colombier while(s != S) {
519*ce95e1b3SDavid du Colombier sf = s->sym;
520*ce95e1b3SDavid du Colombier if(sf < 0 || sf >= NSYM)
521*ce95e1b3SDavid du Colombier sf = 0;
522*ce95e1b3SDavid du Colombier t = g1->name;
523*ce95e1b3SDavid du Colombier if(h[sf].type == t)
524*ce95e1b3SDavid du Colombier if(h[sf].sym == s)
525*ce95e1b3SDavid du Colombier break;
526*ce95e1b3SDavid du Colombier zname(s->name, t, sym);
527*ce95e1b3SDavid du Colombier s->sym = sym;
528*ce95e1b3SDavid du Colombier h[sym].sym = s;
529*ce95e1b3SDavid du Colombier h[sym].type = t;
530*ce95e1b3SDavid du Colombier sf = sym;
531*ce95e1b3SDavid du Colombier sym++;
532*ce95e1b3SDavid du Colombier if(sym >= NSYM)
533*ce95e1b3SDavid du Colombier sym = 1;
534*ce95e1b3SDavid du Colombier break;
535*ce95e1b3SDavid du Colombier }
536*ce95e1b3SDavid du Colombier st = 0;
537*ce95e1b3SDavid du Colombier s = g2->sym;
538*ce95e1b3SDavid du Colombier while(s != S) {
539*ce95e1b3SDavid du Colombier st = s->sym;
540*ce95e1b3SDavid du Colombier if(st < 0 || st >= NSYM)
541*ce95e1b3SDavid du Colombier st = 0;
542*ce95e1b3SDavid du Colombier t = g2->name;
543*ce95e1b3SDavid du Colombier if(h[st].type == t)
544*ce95e1b3SDavid du Colombier if(h[st].sym == s)
545*ce95e1b3SDavid du Colombier break;
546*ce95e1b3SDavid du Colombier zname(s->name, t, sym);
547*ce95e1b3SDavid du Colombier s->sym = sym;
548*ce95e1b3SDavid du Colombier h[sym].sym = s;
549*ce95e1b3SDavid du Colombier h[sym].type = t;
550*ce95e1b3SDavid du Colombier st = sym;
551*ce95e1b3SDavid du Colombier sym++;
552*ce95e1b3SDavid du Colombier if(sym >= NSYM)
553*ce95e1b3SDavid du Colombier sym = 1;
554*ce95e1b3SDavid du Colombier if(st == sf)
555*ce95e1b3SDavid du Colombier goto jackpot;
556*ce95e1b3SDavid du Colombier break;
557*ce95e1b3SDavid du Colombier }
558*ce95e1b3SDavid du Colombier Bputc(&obuf, a);
559*ce95e1b3SDavid du Colombier Bputc(&obuf, reg);
560*ce95e1b3SDavid du Colombier Bputc(&obuf, lineno);
561*ce95e1b3SDavid du Colombier Bputc(&obuf, lineno>>8);
562*ce95e1b3SDavid du Colombier Bputc(&obuf, lineno>>16);
563*ce95e1b3SDavid du Colombier Bputc(&obuf, lineno>>24);
564*ce95e1b3SDavid du Colombier zaddr(g1, sf);
565*ce95e1b3SDavid du Colombier zaddr(g2, st);
566*ce95e1b3SDavid du Colombier
567*ce95e1b3SDavid du Colombier out:
568*ce95e1b3SDavid du Colombier if(a != AGLOBL && a != ADATA)
569*ce95e1b3SDavid du Colombier pc++;
570*ce95e1b3SDavid du Colombier }
571*ce95e1b3SDavid du Colombier
572*ce95e1b3SDavid du Colombier void
outhist(void)573*ce95e1b3SDavid du Colombier outhist(void)
574*ce95e1b3SDavid du Colombier {
575*ce95e1b3SDavid du Colombier Gen g;
576*ce95e1b3SDavid du Colombier Hist *h;
577*ce95e1b3SDavid du Colombier char *p, *q, *op, c;
578*ce95e1b3SDavid du Colombier int n;
579*ce95e1b3SDavid du Colombier
580*ce95e1b3SDavid du Colombier g = nullgen;
581*ce95e1b3SDavid du Colombier c = pathchar();
582*ce95e1b3SDavid du Colombier for(h = hist; h != H; h = h->link) {
583*ce95e1b3SDavid du Colombier p = h->name;
584*ce95e1b3SDavid du Colombier op = 0;
585*ce95e1b3SDavid du Colombier /* on windows skip drive specifier in pathname */
586*ce95e1b3SDavid du Colombier if(systemtype(Windows) && p && p[1] == ':'){
587*ce95e1b3SDavid du Colombier p += 2;
588*ce95e1b3SDavid du Colombier c = *p;
589*ce95e1b3SDavid du Colombier }
590*ce95e1b3SDavid du Colombier if(p && p[0] != c && h->offset == 0 && pathname){
591*ce95e1b3SDavid du Colombier /* on windows skip drive specifier in pathname */
592*ce95e1b3SDavid du Colombier if(systemtype(Windows) && pathname[1] == ':') {
593*ce95e1b3SDavid du Colombier op = p;
594*ce95e1b3SDavid du Colombier p = pathname+2;
595*ce95e1b3SDavid du Colombier c = *p;
596*ce95e1b3SDavid du Colombier } else if(pathname[0] == c){
597*ce95e1b3SDavid du Colombier op = p;
598*ce95e1b3SDavid du Colombier p = pathname;
599*ce95e1b3SDavid du Colombier }
600*ce95e1b3SDavid du Colombier }
601*ce95e1b3SDavid du Colombier while(p) {
602*ce95e1b3SDavid du Colombier q = strchr(p, c);
603*ce95e1b3SDavid du Colombier if(q) {
604*ce95e1b3SDavid du Colombier n = q-p;
605*ce95e1b3SDavid du Colombier if(n == 0){
606*ce95e1b3SDavid du Colombier n = 1; /* leading "/" */
607*ce95e1b3SDavid du Colombier *p = '/'; /* don't emit "\" on windows */
608*ce95e1b3SDavid du Colombier }
609*ce95e1b3SDavid du Colombier q++;
610*ce95e1b3SDavid du Colombier } else {
611*ce95e1b3SDavid du Colombier n = strlen(p);
612*ce95e1b3SDavid du Colombier q = 0;
613*ce95e1b3SDavid du Colombier }
614*ce95e1b3SDavid du Colombier if(n) {
615*ce95e1b3SDavid du Colombier Bputc(&obuf, ANAME);
616*ce95e1b3SDavid du Colombier Bputc(&obuf, D_FILE); /* type */
617*ce95e1b3SDavid du Colombier Bputc(&obuf, 1); /* sym */
618*ce95e1b3SDavid du Colombier Bputc(&obuf, '<');
619*ce95e1b3SDavid du Colombier Bwrite(&obuf, p, n);
620*ce95e1b3SDavid du Colombier Bputc(&obuf, 0);
621*ce95e1b3SDavid du Colombier }
622*ce95e1b3SDavid du Colombier p = q;
623*ce95e1b3SDavid du Colombier if(p == 0 && op) {
624*ce95e1b3SDavid du Colombier p = op;
625*ce95e1b3SDavid du Colombier op = 0;
626*ce95e1b3SDavid du Colombier }
627*ce95e1b3SDavid du Colombier }
628*ce95e1b3SDavid du Colombier g.offset = h->offset;
629*ce95e1b3SDavid du Colombier
630*ce95e1b3SDavid du Colombier Bputc(&obuf, AHISTORY);
631*ce95e1b3SDavid du Colombier Bputc(&obuf, 0);
632*ce95e1b3SDavid du Colombier Bputc(&obuf, h->line);
633*ce95e1b3SDavid du Colombier Bputc(&obuf, h->line>>8);
634*ce95e1b3SDavid du Colombier Bputc(&obuf, h->line>>16);
635*ce95e1b3SDavid du Colombier Bputc(&obuf, h->line>>24);
636*ce95e1b3SDavid du Colombier zaddr(&nullgen, 0);
637*ce95e1b3SDavid du Colombier zaddr(&g, 0);
638*ce95e1b3SDavid du Colombier }
639*ce95e1b3SDavid du Colombier }
640*ce95e1b3SDavid du Colombier
641*ce95e1b3SDavid du Colombier #include "../cc/lexbody"
642*ce95e1b3SDavid du Colombier #include "../cc/macbody"
643*ce95e1b3SDavid du Colombier #include "../cc/compat"
644