]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/7l/l.h
cc, ?a, ?l: change thunk type to uintptr
[plan9front.git] / sys / src / cmd / 7l / l.h
1 #include        <u.h>
2 #include        <libc.h>
3 #include        <bio.h>
4 #include        "../7c/7.out.h"
5
6 #ifndef EXTERN
7 #define EXTERN  extern
8 #endif
9
10 #define LIBNAMELEN      300
11
12 void    addlibpath(char*);
13 int     fileexists(char*);
14 int     find1(long, int);
15 char*   findlib(char*);
16
17 typedef struct  Adr     Adr;
18 typedef struct  Autom   Auto;
19 typedef struct  Count   Count;
20 typedef struct  Ieee    Ieee;
21 typedef struct  Prog    Prog;
22 typedef struct  Sym     Sym;
23 typedef struct  Mask    Mask;
24 typedef struct  Optab   Optab;
25 typedef struct  Oprang  Oprang;
26 typedef uchar   Opcross[32][2][32];
27
28 #define P               ((Prog*)0)
29 #define S               ((Sym*)0)
30 #define TNAME           (curtext&&curtext->from.sym?curtext->from.sym->name:noname)
31
32 struct  Adr
33 {
34         union
35         {
36                 vlong   u0offset;
37                 char*   u0sval;
38                 Ieee*   u0ieee;
39         } u0;
40         union
41         {
42                 Auto*   u1autom;
43                 Sym*    u1sym;
44         } u1;
45         char    type;
46         char    reg;
47         char    name;
48         char    class;
49 };
50
51 #define offset  u0.u0offset
52 #define sval    u0.u0sval
53 #define ieee    u0.u0ieee
54
55 #define autom   u1.u1autom
56 #define sym     u1.u1sym
57
58 struct  Prog
59 {
60         Adr     from;
61         Adr     from3;  /* third register operand */
62         Adr     to;
63         union
64         {
65                 long    u0regused;
66                 Prog*   u0forwd;
67         } u0;
68         Prog*   cond;
69         Prog*   link;
70         vlong   pc;
71         long    line;
72         uchar   mark;
73         ushort  optab;
74         ushort  as;
75         uchar   reg;
76 };
77 #define regused u0.u0regused
78 #define forwd   u0.u0forwd
79
80 struct  Sym
81 {
82         char    *name;
83         short   type;
84         short   version;
85         short   become;
86         short   frame;
87         uchar   subtype;
88         ushort  file;
89         vlong   value;
90         long    sig;
91         Sym*    link;
92 };
93
94 #define SIGNINTERN      (1729*325*1729) /* signature of internal functions such as _div */
95
96 struct  Autom
97 {
98         Sym*    asym;
99         Auto*   link;
100         long    aoffset;
101         short   type;
102 };
103
104 struct  Optab
105 {
106         ushort  as;
107         char    a1;
108         char    a2;
109         char    a3;
110         char    type;
111         char    size;
112         char    param;
113         char    flag;
114 };
115 struct  Oprang
116 {
117         Optab*  start;
118         Optab*  stop;
119 };
120 struct  Mask
121 {
122         uchar   s;
123         uchar   e;
124         uchar   r;
125         uvlong  v;
126 };
127
128 enum
129 {
130         STEXT           = 1,
131         SDATA,
132         SBSS,
133         SDATA1,
134         SXREF,
135         SLEAF,
136         SFILE,
137         SCONST,
138         SSTRING,
139         SUNDEF,
140
141         SIMPORT,
142         SEXPORT,
143
144         LFROM           = 1<<0,
145         LTO             = 1<<1,
146         LPOOL           = 1<<2,
147
148         C_NONE          = 0,
149         C_REG,
150         C_RSP,          /* D_REG or D_SP */
151         C_SHIFT,                /* D_SHIFT: shift type, amount, value */
152         C_EXTREG,       /* D_EXTREG: reg, ext type, shift */
153         C_FREG,
154         C_SPR,
155         C_COND,
156
157         C_ZCON,         /* 0 (matching C_REG, not C_RSP, allowing REGZERO) */
158         C_ADDCON0,      /* 12-bit unsigned, unshifted */
159         C_ADDCON,       /* 12-bit unsigned, shifted left by 0 or 12 */
160         C_MOVCON,       /* generated by a 16-bit constant, optionally inverted and/or shifted by multiple of 16 */
161         C_BITCON,       /* bimm32/bimm64 */
162         C_BITCON32,     /* bimm32 */
163         C_BITCON64,     /* bimm64 */
164         C_ABCON,        /* could be C_ADDCON or C_BITCON */
165         C_MBCON,        /* could be C_MOVCON or C_BITCON */
166         C_LCON,         /* 32-bit constant */
167         C_FCON,         /* floating-point constant */
168         C_VCON,         /* 64-bit constant */
169
170         C_AACON,        /* ADDCON offset in auto constant $a(FP) */
171         C_LACON,        /* 32-bit offset in auto constant $a(FP) */
172
173         C_AECON,        /* ADDCON offset in extern constant $e(SB) */
174
175         C_SBRA,
176         C_LBRA,
177
178         C_NPAUTO,       /* -512 <= x < 0, 0 mod 8 */
179         C_NSAUTO,       /* -256 <= x < 0 */
180         C_PSAUTO,       /* 0 to 255 */
181         C_PPAUTO,       /* 0 to 504, 0 mod 8 */
182         C_UAUTO4K,      /* 0 to 4095 */
183         C_UAUTO8K,      /* 0 to 8190, 0 mod 2 */
184         C_UAUTO16K,     /* 0 to 16380, 0 mod 4 */
185         C_UAUTO32K,     /* 0 to 32760, 0 mod 8 */
186         C_UAUTO64K,     /* 0 to 65520, 0 mod 16 */
187         C_LAUTO,                /* any other 32-bit constant */
188
189         C_SEXT1,                /* 0 to 4095, direct */
190         C_SEXT2,                /* 0 to 8190 */
191         C_SEXT4,                /* 0 to 16380 */
192         C_SEXT8,                /* 0 to 32760 */
193         C_SEXT16,       /* 0 to 65520 */
194         C_LEXT,
195
196         C_NPOREG,       /* mirror NPAUTO etc, except for ZOREG */
197         C_NSOREG,
198         C_ZOREG,
199         C_PSOREG,
200         C_PPOREG,
201         C_UOREG4K,
202         C_UOREG8K,
203         C_UOREG16K,
204         C_UOREG32K,
205         C_UOREG64K,
206         C_LOREG,
207
208         C_ADDR,         /* relocatable address for dynamic loading */
209         C_ROFF,         /* register offset (inc register extended) */
210         C_XPOST,
211         C_XPRE,
212
213         C_VREG,
214
215         C_GOK,
216         C_NCLASS,       /* must be last */
217
218 /* mark flags */
219         FOLL            = 1<<0,
220         LABEL   = 1<<1,
221         LEAF            = 1<<2,
222         FLOAT           = 1<<3,
223         BRANCH          = 1<<4,
224         LOAD            = 1<<5,
225         SYNC            = 1<<6,
226         NOSCHED         = 1<<7,
227
228         MINSIZ          = 64,
229
230         Roffset = 22,           /* no. bits for offset in relocation address */
231         Rindex  = 10,           /* no. bits for index in relocation address */
232
233         STACKALIGN = 16,        /* alignment of stack */
234         PCSZ=   8,      /* size of PC */
235 };
236
237 enum
238 {
239
240         STRINGSZ        = 200,
241         NHASH           = 10007,
242         NHUNK           = 100000,
243         MAXIO           = 8192,
244         MAXHIST         = 20,   /* limit of path elements for history symbols */
245 };
246
247 EXTERN union
248 {
249         struct
250         {
251                 uchar   obuf[MAXIO];                    /* output buffer */
252                 uchar   ibuf[MAXIO];                    /* input buffer */
253         } u;
254         char    dbuf[1];
255 } buf;
256
257 #define cbuf    u.obuf
258 #define xbuf    u.ibuf
259
260 EXTERN  long    HEADR;                  /* length of header */
261 EXTERN  int     HEADTYPE;               /* type of header */
262 EXTERN  long    INITDAT;                /* data location */
263 EXTERN  long    INITRND;                /* data round above text location */
264 EXTERN  long    INITTEXT;               /* text location */
265 EXTERN  long    INITTEXTP;              /* text location (physical) */
266 EXTERN  char*   INITENTRY;              /* entry point */
267 EXTERN  long    autosize;
268 EXTERN  Biobuf  bso;
269 EXTERN  long    bsssize;
270 EXTERN  int     cbc;
271 EXTERN  uchar*  cbp;
272 EXTERN  int     cout;
273 EXTERN  Auto*   curauto;
274 EXTERN  Auto*   curhist;
275 EXTERN  Prog*   curp;
276 EXTERN  Prog*   curtext;
277 EXTERN  Prog*   datap;
278 EXTERN  long    datsize;
279 EXTERN  char    debug[128];
280 EXTERN  Prog*   etextp;
281 EXTERN  Prog*   firstp;
282
283 EXTERN  char    fnuxi4[4];
284 EXTERN  char    fnuxi8[8];
285 EXTERN  char    inuxi1[1];
286 EXTERN  char    inuxi2[2];
287 EXTERN  char    inuxi4[4];
288 EXTERN  uchar   inuxi8[8];
289
290 EXTERN  Sym*    hash[NHASH];
291 EXTERN  Sym*    histfrog[MAXHIST];
292 EXTERN  int     histfrogp;
293 EXTERN  int     histgen;
294 EXTERN  char*   hunk;
295
296 EXTERN  char*   library[50];
297 EXTERN  char*   libraryobj[50];
298 EXTERN  int     libraryp;
299 EXTERN  Prog*   lastp;
300 EXTERN  long    lcsize;
301 EXTERN  char    literal[32];
302 EXTERN  int     nerrors;
303 EXTERN  long    nhunk;
304 EXTERN  char*   noname;
305 EXTERN  vlong   instoffset;
306 EXTERN  Opcross opcross[8];
307 EXTERN  char*   outfile;
308 EXTERN  vlong   pc;
309 EXTERN  uchar   repop[ALAST];
310 EXTERN  long    symsize;
311 EXTERN  Prog*   textp;
312 EXTERN  vlong   textsize;
313 EXTERN  uintptr thunk;
314 EXTERN  int     version;
315 EXTERN  char    xcmp[C_NCLASS][C_NCLASS];
316 EXTERN  int     xrefresolv;
317 EXTERN  Prog    zprg;
318 EXTERN  int     dtype;
319
320 EXTERN  int     doexp, dlm;
321 EXTERN  int     imports, nimports;
322 EXTERN  int     exports, nexports;
323 EXTERN  char*   EXPTAB;
324 EXTERN  Prog    undefp;
325
326 #define UP      (&undefp)
327
328 extern  char*   anames[];
329 extern  char*   cnames[];
330 extern  Optab   optab[];
331
332 EXTERN  Prog*   blitrl;
333 EXTERN  Prog*   elitrl;
334
335 #pragma varargck        argpos  diag 1
336
337 #pragma varargck        type    "A"     int
338 #pragma varargck        type    "A"     uint
339 #pragma varargck        type    "C"     int
340 #pragma varargck        type    "D"     Adr*
341 #pragma varargck        type    "N"     Adr*
342 #pragma varargck        type    "P"     Prog*
343 #pragma varargck        type    "S"     char*
344
345
346 int     Aconv(Fmt*);
347 int     Cconv(Fmt*);
348 int     Dconv(Fmt*);
349 int     Nconv(Fmt*);
350 int     Pconv(Fmt*);
351 int     Rconv(Fmt*);
352 int     Sconv(Fmt*);
353 int     aclass(Adr*);
354 void    addpool(Prog*, Adr*);
355 vlong   atolwhex(char*);
356 void    asmb(void);
357 void    asmdyn(void);
358 void    asmlc(void);
359 void    asmout(Prog*, Optab*);
360 void    asmsym(void);
361 Prog*   brchain(Prog*);
362 Prog*   brloop(Prog*);
363 void    buildop(void);
364 void    buildrep(int, int);
365 void    cflush(void);
366 void    ckoff(Sym*, long);
367 int     chipfloat(Ieee*);
368 int     cmp(int, int);
369 int     compound(Prog*);
370 void    cput(int);
371 void    datblk(long, long, int);
372 void    diag(char*, ...);
373 void    dodata(void);
374 void    doprof1(void);
375 void    doprof2(void);
376 void    dynreloc(Sym*, long, int);
377 vlong   entryvalue(void);
378 void    errorexit(void);
379 void    export(void);
380 void    follow(void);
381 void    gethunk(void);
382 void    histtoauto(void);
383 void*   halloc(usize);
384 int     isnop(Prog*);
385 double  ieeedtod(Ieee*);
386 long    ieeedtof(Ieee*);
387 void    import(void);
388 void    ldobj(int, long, char*);
389 void    listinit(void);
390 void    llput(vlong);
391 void    llputl(vlong);
392 void    loadlib(void);
393 Sym*    lookup(char*, int);
394 void    lput(long);
395 void    lputl(long);
396 void    mkfwd(void);
397 int     movcon(vlong);
398 void*   mysbrk(ulong);
399 void    names(void);
400 void    nocache(Prog*);
401 void    nuxiinit(void);
402 void    objfile(char*);
403 vlong   offsetshift(vlong, int);
404 Optab*  oplook(Prog*);
405 void    patch(void);
406 int     pseudo(Prog*);
407 void    prasm(Prog*);
408 Prog*   prg(void);
409 void    putsymb(char*, int, vlong, int);
410 void    readundefs(char*, int);
411 long    regoff(Adr*);
412 int     relinv(int);
413 vlong   rnd(vlong, long);
414 void    span(void);
415 void    undef(void);
416 void    wput(long);
417 void    wputl(long);
418 void    noops(void);
419 Mask*   findmask(uvlong);
420 void    xdefine(char*, int, long);
421 void    xfol(Prog*);
422 void    zerosig(char*);
423
424
425 #pragma varargck        type    "R"     int
426
427 /* for ../ld */
428 #define isbranch(a)     ((a) == AB)
429 #define iscall(a)       ((a) == ABL)
430 #define isreturn(a)     ((a) == ARETURN || (a) == ARET || (a) == AERET)
431 #define branchop()      AB
432 #define canfollow(a)    ((a) != ATEXT && (a) != ABCASE)