]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/5l/l.h
cwfs: fix listen filedescriptor leaks
[plan9front.git] / sys / src / cmd / 5l / l.h
1 #include        <u.h>
2 #include        <libc.h>
3 #include        <bio.h>
4 #include        "../5c/5.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 char*   findlib(char*);
15
16 typedef struct  Adr     Adr;
17 typedef struct  Sym     Sym;
18 typedef struct  Autom   Auto;
19 typedef struct  Prog    Prog;
20 typedef struct  Optab   Optab;
21 typedef struct  Oprang  Oprang;
22 typedef uchar   Opcross[32][2][32];
23 typedef struct  Count   Count;
24
25 #define P               ((Prog*)0)
26 #define S               ((Sym*)0)
27 #define TNAME           (curtext&&curtext->from.sym?curtext->from.sym->name:noname)
28
29 struct  Adr
30 {
31         union
32         {
33                 long    u0offset;
34                 char*   u0sval;
35                 Ieee*   u0ieee;
36         } u0;
37         union
38         {
39                 Auto*   u1autom;
40                 Sym*    u1sym;
41         } u1;
42         char    type;
43         char    reg;
44         char    name;
45         char    class;
46 };
47
48 #define offset  u0.u0offset
49 #define sval    u0.u0sval
50 #define ieee    u0.u0ieee
51
52 #define autom   u1.u1autom
53 #define sym     u1.u1sym
54
55 struct  Prog
56 {
57         Adr     from;
58         Adr     to;
59         union
60         {
61                 long    u0regused;
62                 Prog*   u0forwd;
63         } u0;
64         Prog*   cond;
65         Prog*   link;
66         long    pc;
67         long    line;
68         uchar   mark;
69         uchar   optab;
70         uchar   as;
71         uchar   scond;
72         uchar   reg;
73 };
74 #define regused u0.u0regused
75 #define forwd   u0.u0forwd
76
77 struct  Sym
78 {
79         char    *name;
80         short   type;
81         short   version;
82         short   become;
83         short   frame;
84         uchar   subtype;
85         char    dupok;
86         ushort  file;
87         long    value;
88         long    sig;
89         Sym*    link;
90 };
91
92 #define SIGNINTERN      (1729*325*1729)
93
94 struct  Autom
95 {
96         Sym*    asym;
97         Auto*   link;
98         long    aoffset;
99         short   type;
100 };
101 struct  Optab
102 {
103         char    as;
104         char    a1;
105         char    a2;
106         char    a3;
107         char    type;
108         char    size;
109         char    param;
110         char    flag;
111 };
112 struct  Oprang
113 {
114         Optab*  start;
115         Optab*  stop;
116 };
117 struct  Count
118 {
119         long    count;
120         long    outof;
121 };
122
123 enum
124 {
125         STEXT           = 1,
126         SDATA,
127         SBSS,
128         SDATA1,
129         SXREF,
130         SLEAF,
131         SFILE,
132         SCONST,
133         SSTRING,
134         SUNDEF,
135
136         SIMPORT,
137         SEXPORT,
138
139         LFROM           = 1<<0,
140         LTO             = 1<<1,
141         LPOOL           = 1<<2,
142         V4              = 1<<3, /* arm v4 arch */
143         VFP             = 1<<4, /* arm vfpv3 floating point */
144
145         C_NONE          = 0,
146         C_REG,
147         C_REGREG,
148         C_SHIFT,
149         C_FREG,
150         C_PSR,
151         C_FCR,
152
153         C_RCON,         /* 0xff rotated */
154         C_NCON,         /* ~RCON */
155         C_SCON,         /* 0xffff */
156         C_LCON,
157         C_FCON,
158
159         C_RACON,
160         C_LACON,
161
162         C_RECON,
163         C_LECON,
164
165         C_SBRA,
166         C_LBRA,
167
168         C_HAUTO,        /* halfword insn offset (-0xff to 0xff) */
169         C_FAUTO,        /* float insn offset (0 to 0x3fc, word aligned) */
170         C_HFAUTO,       /* both H and F */
171         C_SAUTO,        /* -0xfff to 0xfff */
172         C_LAUTO,
173
174         C_HEXT,
175         C_FEXT,
176         C_HFEXT,
177         C_SEXT,
178         C_LEXT,
179
180         C_HOREG,
181         C_FOREG,
182         C_HFOREG,
183         C_SOREG,
184         C_ROREG,
185         C_SROREG,       /* both S and R */
186         C_LOREG,
187
188         C_ADDR,         /* relocatable address */
189
190         C_GOK,
191
192 /* mark flags */
193         FOLL            = 1<<0,
194         LABEL           = 1<<1,
195         LEAF            = 1<<2,
196
197         BIG             = (1<<12)-4,
198         STRINGSZ        = 200,
199         NHASH           = 10007,
200         NHUNK           = 100000,
201         MINSIZ          = 64,
202         NENT            = 100,
203         MAXIO           = 8192,
204         MAXHIST         = 20,   /* limit of path elements for history symbols */
205
206         Roffset = 22,           /* no. bits for offset in relocation address */
207         Rindex  = 10,           /* no. bits for index in relocation address */
208 };
209
210 EXTERN union
211 {
212         struct
213         {
214                 uchar   obuf[MAXIO];                    /* output buffer */
215                 uchar   ibuf[MAXIO];                    /* input buffer */
216         } u;
217         char    dbuf[1];
218 } buf;
219
220 #define cbuf    u.obuf
221 #define xbuf    u.ibuf
222
223 EXTERN  long    HEADR;                  /* length of header */
224 EXTERN  int     HEADTYPE;               /* type of header */
225 EXTERN  long    INITDAT;                /* data location */
226 EXTERN  long    INITRND;                /* data round above text location */
227 EXTERN  long    INITTEXT;               /* text location */
228 EXTERN  char*   INITENTRY;              /* entry point */
229 EXTERN  long    autosize;
230 EXTERN  Biobuf  bso;
231 EXTERN  long    bsssize;
232 EXTERN  int     cbc;
233 EXTERN  uchar*  cbp;
234 EXTERN  int     cout;
235 EXTERN  Auto*   curauto;
236 EXTERN  Auto*   curhist;
237 EXTERN  Prog*   curp;
238 EXTERN  Prog*   curtext;
239 EXTERN  Prog*   datap;
240 EXTERN  long    datsize;
241 EXTERN  char    debug[128];
242 EXTERN  Prog*   etextp;
243 EXTERN  Prog*   firstp;
244 EXTERN  char    fnuxi4[4];
245 EXTERN  char    fnuxi8[8];
246 EXTERN  char*   noname;
247 EXTERN  Sym*    hash[NHASH];
248 EXTERN  Sym*    histfrog[MAXHIST];
249 EXTERN  int     histfrogp;
250 EXTERN  int     histgen;
251 EXTERN  char*   library[50];
252 EXTERN  char*   libraryobj[50];
253 EXTERN  int     libraryp;
254 EXTERN  int     xrefresolv;
255 EXTERN  char*   hunk;
256 EXTERN  char    inuxi1[1];
257 EXTERN  char    inuxi2[2];
258 EXTERN  char    inuxi4[4];
259 EXTERN  Prog*   lastp;
260 EXTERN  long    lcsize;
261 EXTERN  char    literal[32];
262 EXTERN  int     nerrors;
263 EXTERN  long    nhunk;
264 EXTERN  long    instoffset;
265 EXTERN  Opcross opcross[8];
266 EXTERN  Oprang  oprange[ALAST];
267 EXTERN  char*   outfile;
268 EXTERN  long    pc;
269 EXTERN  uchar   repop[ALAST];
270 EXTERN  long    symsize;
271 EXTERN  Prog*   textp;
272 EXTERN  long    textsize;
273 EXTERN  long    thunk;
274 EXTERN  int     version;
275 EXTERN  char    xcmp[C_GOK+1][C_GOK+1];
276 EXTERN  Prog    zprg;
277 EXTERN  int     dtype;
278 EXTERN  int     armv4;
279 EXTERN  int vfp;
280
281 EXTERN  int     doexp, dlm;
282 EXTERN  int     imports, nimports;
283 EXTERN  int     exports, nexports;
284 EXTERN  char*   EXPTAB;
285 EXTERN  Prog    undefp;
286
287 #define UP      (&undefp)
288
289 extern  char*   anames[];
290 extern  Optab   optab[];
291
292 void    addpool(Prog*, Adr*);
293 EXTERN  Prog*   blitrl;
294 EXTERN  Prog*   elitrl;
295
296 void    initdiv(void);
297 EXTERN  Prog*   prog_div;
298 EXTERN  Prog*   prog_divu;
299 EXTERN  Prog*   prog_mod;
300 EXTERN  Prog*   prog_modu;
301
302 #pragma varargck        type    "A"     int
303 #pragma varargck        type    "A"     uint
304 #pragma varargck        type    "C"     int
305 #pragma varargck        type    "D"     Adr*
306 #pragma varargck        type    "N"     Adr*
307 #pragma varargck        type    "P"     Prog*
308 #pragma varargck        type    "S"     char*
309
310 #pragma varargck        argpos  diag 1
311
312 int     Aconv(Fmt*);
313 int     Cconv(Fmt*);
314 int     Dconv(Fmt*);
315 int     Nconv(Fmt*);
316 int     Pconv(Fmt*);
317 int     Sconv(Fmt*);
318 int     aclass(Adr*);
319 void    addhist(long, int);
320 void    addlibpath(char*);
321 void    append(Prog*, Prog*);
322 void    asmb(void);
323 void    asmdyn(void);
324 void    asmlc(void);
325 void    asmout(Prog*, Optab*);
326 void    asmsym(void);
327 long    atolwhex(char*);
328 Prog*   brloop(Prog*);
329 void    buildop(void);
330 void    buildrep(int, int);
331 void    cflush(void);
332 void    ckoff(Sym*, long);
333 int     chipfloat(Ieee*);
334 int     cmp(int, int);
335 int     compound(Prog*);
336 double  cputime(void);
337 void    datblk(long, long, int);
338 void    diag(char*, ...);
339 void    divsig(void);
340 void    dodata(void);
341 void    doprof1(void);
342 void    doprof2(void);
343 void    dynreloc(Sym*, long, int);
344 long    entryvalue(void);
345 void    errorexit(void);
346 void    exchange(Prog*);
347 void    export(void);
348 int     fileexists(char*);
349 int     find1(long, int);
350 char*   findlib(char*);
351 void    follow(void);
352 void    gethunk(void);
353 void    histtoauto(void);
354 double  ieeedtod(Ieee*);
355 long    ieeedtof(Ieee*);
356 void    import(void);
357 int     isnop(Prog*);
358 void    ldobj(int, long, char*);
359 void    loadlib(void);
360 void    listinit(void);
361 Sym*    lookup(char*, int);
362 void    cput(int);
363 void    lput(long);
364 void    lputl(long);
365 void    mkfwd(void);
366 void*   mysbrk(ulong);
367 void    names(void);
368 void    nocache(Prog*);
369 void    nuxiinit(void);
370 void    objfile(char*);
371 int     ocmp(const void*, const void*);
372 long    opirr(int);
373 Optab*  oplook(Prog*);
374 long    oprrr(int, int);
375 long    opvfprrr(int, int);
376 long    olr(long, int, int, int);
377 long    olhr(long, int, int, int);
378 long    olrr(int, int, int, int);
379 long    olhrr(int, int, int, int);
380 long    osr(int, int, long, int, int);
381 long    oshr(int, long, int, int);
382 long    ofsr(int, int, long, int, int, Prog*);
383 long    osrr(int, int, int, int);
384 long    oshrr(int, int, int, int);
385 long    omvl(Prog*, Adr*, int);
386 void    patch(void);
387 void    prasm(Prog*);
388 void    prepend(Prog*, Prog*);
389 Prog*   prg(void);
390 int     pseudo(Prog*);
391 void    putsymb(char*, int, long, int);
392 void    readundefs(char*, int);
393 long    regoff(Adr*);
394 int     relinv(int);
395 long    rnd(long, long);
396 void    span(void);
397 void    strnput(char*, int);
398 void    undef(void);
399 void    undefsym(Sym*);
400 void    wput(long);
401 void    xdefine(char*, int, long);
402 void    xfol(Prog*);
403 void    zerosig(char*);
404 void    noops(void);
405 long    immrot(ulong);
406 long    immaddr(long);
407 long    opbra(int, int);