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