]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/6l/l.h
audiohda: fix syntax error
[plan9front.git] / sys / src / cmd / 6l / l.h
1 #include        <u.h>
2 #include        <libc.h>
3 #include        <bio.h>
4 #include        "../6c/6.out.h"
5 #include        "../cc/compat.h"
6
7 #define P               ((Prog*)0)
8 #define S               ((Sym*)0)
9 #define TNAME           (curtext?curtext->from.sym->name:noname)
10 #define cput(c)\
11         { *cbp++ = c;\
12         if(--cbc <= 0)\
13                 cflush(); }
14
15 typedef struct  Adr     Adr;
16 typedef struct  Prog    Prog;
17 typedef struct  Sym     Sym;
18 typedef struct  Auto    Auto;
19 typedef struct  Optab   Optab;
20 typedef struct  Movtab  Movtab;
21
22 struct  Adr
23 {
24         union
25         {
26                 vlong   u0offset;
27                 char    u0scon[8];
28                 Prog    *u0cond;        /* not used, but should be D_BRANCH */
29                 Ieee    u0ieee;
30         } u0;
31         union
32         {
33                 Auto*   u1autom;
34                 Sym*    u1sym;
35         } u1;
36         short   type;
37         char    index;
38         char    scale;
39 };
40
41 #define offset  u0.u0offset
42 #define scon    u0.u0scon
43 #define cond    u0.u0cond
44 #define ieee    u0.u0ieee
45
46 #define autom   u1.u1autom
47 #define sym     u1.u1sym
48
49 struct  Prog
50 {
51         Adr     from;
52         Adr     to;
53         Prog    *forwd;
54         Prog*   link;
55         Prog*   pcond;  /* work on this */
56         vlong   pc;
57         long    line;
58         uchar   mark;   /* work on these */
59         uchar   back;
60
61         short   as;
62         char    width;          /* fake for DATA */
63         char    mode;   /* 16, 32, or 64 */
64 };
65 struct  Auto
66 {
67         Sym*    asym;
68         Auto*   link;
69         long    aoffset;
70         short   type;
71 };
72 struct  Sym
73 {
74         char    *name;
75         short   type;
76         short   version;
77         short   become;
78         short   frame;
79         char    dupok;
80         uchar   subtype;
81         ushort  file;
82         vlong   value;
83         long    sig;
84         Sym*    link;
85 };
86 struct  Optab
87 {
88         short   as;
89         uchar*  ytab;
90         uchar   prefix;
91         uchar   op[20];
92 };
93 struct  Movtab
94 {
95         short   as;
96         uchar   ft;
97         uchar   tt;
98         uchar   code;
99         uchar   op[4];
100 };
101
102 enum
103 {
104         STEXT           = 1,
105         SDATA,
106         SBSS,
107         SDATA1,
108         SXREF,
109         SFILE,
110         SCONST,
111         SUNDEF,
112
113         SIMPORT,
114         SEXPORT,
115
116         NHASH           = 10007,
117         NHUNK           = 100000,
118         MINSIZ          = 8,
119         STRINGSZ        = 200,
120         MINLC           = 1,
121         MAXIO           = 8192,
122         MAXHIST         = 20,                           /* limit of path elements for history symbols */
123
124         Yxxx            = 0,
125         Ynone,
126         Yi0,
127         Yi1,
128         Yi8,
129         Ys32,
130         Yi32,
131         Yi64,
132         Yiauto,
133         Yal,
134         Ycl,
135         Yax,
136         Ycx,
137         Yrb,
138         Yrl,
139         Yrf,
140         Yf0,
141         Yrx,
142         Ymb,
143         Yml,
144         Ym,
145         Ybr,
146         Ycol,
147
148         Ycs,    Yss,    Yds,    Yes,    Yfs,    Ygs,
149         Ygdtr,  Yidtr,  Yldtr,  Ymsw,   Ytask,
150         Ycr0,   Ycr1,   Ycr2,   Ycr3,   Ycr4,   Ycr5,   Ycr6,   Ycr7,   Ycr8,
151         Ydr0,   Ydr1,   Ydr2,   Ydr3,   Ydr4,   Ydr5,   Ydr6,   Ydr7,
152         Ytr0,   Ytr1,   Ytr2,   Ytr3,   Ytr4,   Ytr5,   Ytr6,   Ytr7,   Yrl32,  Yrl64,
153         Ymr, Ymm,
154         Yxr, Yxm,
155         Ymax,
156
157         Zxxx            = 0,
158
159         Zlit,
160         Z_rp,
161         Zbr,
162         Zcall,
163         Zib_,
164         Zib_rp,
165         Zibo_m,
166         Zibo_m_xm,
167         Zil_,
168         Zil_rp,
169         Ziq_rp,
170         Zilo_m,
171         Ziqo_m,
172         Zjmp,
173         Zloop,
174         Zo_iw,
175         Zm_o,
176         Zm_r,
177         Zm_r_xm,
178         Zm_r_i_xm,
179         Zm_r_3d,
180         Zm_r_xm_nr,
181         Zr_m_xm_nr,
182         Zibm_r, /* mmx1,mmx2/mem64,imm8 */
183         Zmb_r,
184         Zaut_r,
185         Zo_m,
186         Zo_m64,
187         Zpseudo,
188         Zr_m,
189         Zr_m_xm,
190         Zr_m_i_xm,
191         Zrp_,
192         Z_ib,
193         Z_il,
194         Zm_ibo,
195         Zm_ilo,
196         Zib_rr,
197         Zil_rr,
198         Zclr,
199         Zbyte,
200         Zmax,
201
202         Px              = 0,
203         P32             = 0x32, /* 32-bit only */
204         Pe              = 0x66, /* operand escape */
205         Pm              = 0x0f, /* 2byte opcode escape */
206         Pq              = 0xff, /* both escape */
207         Pb              = 0xfe, /* byte operands */
208         Pf2             = 0xf2, /* xmm escape 1 */
209         Pf3             = 0xf3, /* xmm escape 2 */
210         Pw              = 0x48, /* Rex.w */
211         Py              = 0x80, /* defaults to 64-bit mode */
212
213         Rxf             = 1<<9, /* internal flag for Rxr on from */
214         Rxt             = 1<<8, /* internal flag for Rxr on to */
215         Rxw             = 1<<3, /* =1, 64-bit operand size */
216         Rxr             = 1<<2, /* extend modrm reg */
217         Rxx             = 1<<1, /* extend sib index */
218         Rxb             = 1<<0, /* extend modrm r/m, sib base, or opcode reg */
219
220         Roffset = 22,           /* no. bits for offset in relocation address */
221         Rindex  = 10,           /* no. bits for index in relocation address */
222 };
223
224 EXTERN union
225 {
226         struct
227         {
228                 char    obuf[MAXIO];                    /* output buffer */
229                 uchar   ibuf[MAXIO];                    /* input buffer */
230         } u;
231         char    dbuf[1];
232 } buf;
233
234 #define cbuf    u.obuf
235 #define xbuf    u.ibuf
236
237 #pragma varargck        type    "A"     int
238 #pragma varargck        type    "A"     uint
239 #pragma varargck        type    "D"     Adr*
240 #pragma varargck        type    "P"     Prog*
241 #pragma varargck        type    "R"     int
242 #pragma varargck        type    "S"     char*
243
244 #pragma varargck        argpos  diag 1
245
246 EXTERN  long    HEADR;
247 EXTERN  long    HEADTYPE;
248 EXTERN  vlong   INITDAT;
249 EXTERN  long    INITRND;
250 EXTERN  vlong   INITTEXT;
251 EXTERN  char*   INITENTRY;              /* entry point */
252 EXTERN  Biobuf  bso;
253 EXTERN  long    bsssize;
254 EXTERN  int     cbc;
255 EXTERN  char*   cbp;
256 EXTERN  char*   pcstr;
257 EXTERN  int     cout;
258 EXTERN  Auto*   curauto;
259 EXTERN  Auto*   curhist;
260 EXTERN  Prog*   curp;
261 EXTERN  Prog*   curtext;
262 EXTERN  Prog*   datap;
263 EXTERN  Prog*   edatap;
264 EXTERN  vlong   datsize;
265 EXTERN  char    debug[128];
266 EXTERN  char    literal[32];
267 EXTERN  Prog*   etextp;
268 EXTERN  Prog*   firstp;
269 EXTERN  uchar   fnuxi8[8];
270 EXTERN  uchar   fnuxi4[4];
271 EXTERN  Sym*    hash[NHASH];
272 EXTERN  Sym*    histfrog[MAXHIST];
273 EXTERN  int     histfrogp;
274 EXTERN  int     histgen;
275 EXTERN  char*   library[50];
276 EXTERN  char*   libraryobj[50];
277 EXTERN  int     libraryp;
278 EXTERN  int     xrefresolv;
279 EXTERN  uchar   inuxi1[1];
280 EXTERN  uchar   inuxi2[2];
281 EXTERN  uchar   inuxi4[4];
282 EXTERN  uchar   inuxi8[8];
283 EXTERN  char    ycover[Ymax*Ymax];
284 EXTERN  uchar*  andptr;
285 EXTERN  uchar*  rexptr;
286 EXTERN  uchar   and[30];
287 EXTERN  int     reg[D_NONE];
288 EXTERN  int     regrex[D_NONE+1];
289 EXTERN  Prog*   lastp;
290 EXTERN  long    lcsize;
291 EXTERN  int     nerrors;
292 EXTERN  long    nsymbol;
293 EXTERN  char*   noname;
294 EXTERN  char*   outfile;
295 EXTERN  vlong   pc;
296 EXTERN  long    spsize;
297 EXTERN  Sym*    symlist;
298 EXTERN  long    symsize;
299 EXTERN  Prog*   textp;
300 EXTERN  vlong   textsize;
301 EXTERN  int     version;
302 EXTERN  Prog    zprg;
303 EXTERN  int     dtype;
304 EXTERN  char*   paramspace;
305
306 EXTERN  Adr*    reloca;
307 EXTERN  int     doexp, dlm;
308 EXTERN  int     imports, nimports;
309 EXTERN  int     exports, nexports;
310 EXTERN  char*   EXPTAB;
311 EXTERN  Prog    undefp;
312
313 #define UP      (&undefp)
314
315 extern  Optab   optab[];
316 extern  Optab*  opindex[];
317 extern  char*   anames[];
318
319 int     Aconv(Fmt*);
320 int     Dconv(Fmt*);
321 int     Pconv(Fmt*);
322 int     Rconv(Fmt*);
323 int     Sconv(Fmt*);
324 void    addhist(long, int);
325 Prog*   appendp(Prog*);
326 void    asmb(void);
327 void    asmdyn(void);
328 void    asmins(Prog*);
329 void    asmlc(void);
330 void    asmsp(void);
331 void    asmsym(void);
332 vlong   atolwhex(char*);
333 Prog*   brchain(Prog*);
334 Prog*   brloop(Prog*);
335 void    buildop(void);
336 void    cflush(void);
337 void    ckoff(Sym*, long);
338 Prog*   copyp(Prog*);
339 double  cputime(void);
340 void    datblk(long, long);
341 void    diag(char*, ...);
342 void    dodata(void);
343 void    doinit(void);
344 void    doprof1(void);
345 void    doprof2(void);
346 void    dostkoff(void);
347 void    dynreloc(Sym*, ulong, int);
348 vlong   entryvalue(void);
349 void    errorexit(void);
350 void    export(void);
351 int     find1(long, int);
352 int     find1v(vlong, int);
353 int     find2(long, int);
354 void    follow(void);
355 void    histtoauto(void);
356 double  ieeedtod(Ieee*);
357 long    ieeedtof(Ieee*);
358 void    import(void);
359 void    ldobj(int, long, char*);
360 void    loadlib(void);
361 void    listinit(void);
362 Sym*    lookup(char*, int);
363 void    lput(long);
364 void    lputl(long);
365 void    main(int, char*[]);
366 void    mkfwd(void);
367 void    nuxiinit(void);
368 void    objfile(char*);
369 int     opsize(Prog*);
370 void    patch(void);
371 Prog*   prg(void);
372 void    readundefs(char*, int);
373 int     relinv(int);
374 long    reuse(Prog*, Sym*);
375 vlong   rnd(vlong, vlong);
376 void    span(void);
377 void    undef(void);
378 void    undefsym(Sym*);
379 vlong   vaddr(Adr*);
380 void    wput(ushort);
381 void    xdefine(char*, int, vlong);
382 void    xfol(Prog*);
383 int     zaddr(uchar*, Adr*, Sym*[]);
384 void    zerosig(char*);