]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/vl/l.h
merge
[plan9front.git] / sys / src / cmd / vl / l.h
1 #include        <u.h>
2 #include        <libc.h>
3 #include        <bio.h>
4 #include        "../vc/v.out.h"
5
6 #ifndef EXTERN
7 #define EXTERN  extern
8 #endif
9
10 typedef struct  Adr     Adr;
11 typedef struct  Sym     Sym;
12 typedef struct  Autom   Auto;
13 typedef struct  Prog    Prog;
14 typedef struct  Optab   Optab;
15 typedef struct  Oprang  Oprang;
16 typedef uchar   Opcross[32][2][32];
17 typedef struct  Count   Count;
18
19 #define P               ((Prog*)0)
20 #define S               ((Sym*)0)
21 #define TNAME           (curtext&&curtext->from.sym?curtext->from.sym->name:noname)
22
23 struct  Adr
24 {
25         union
26         {
27                 long    u0offset;
28                 char*   u0sval;
29                 Ieee*   u0ieee;
30         } u0;
31         union
32         {
33                 Auto*   u1autom;
34                 Sym*    u1sym;
35         } u1;
36         char    type;
37         char    reg;
38         char    name;
39         char    class;
40 };
41
42 #define offset  u0.u0offset
43 #define sval    u0.u0sval
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         union
54         {
55                 long    u0regused;
56                 Prog*   u0forwd;
57         } u0;
58         Prog*   cond;
59         Prog*   link;
60         long    pc;
61         long    line;
62         uchar   mark;
63         uchar   optab;
64         char    as;
65         char    reg;
66 };
67 #define regused u0.u0regused
68 #define forwd   u0.u0forwd
69
70 struct  Sym
71 {
72         char    *name;
73         short   type;
74         short   version;
75         short   become;
76         short   frame;
77         char    dupok;
78         long    value;
79         Sym*    link;
80 };
81 struct  Autom
82 {
83         Sym*    asym;
84         Auto*   link;
85         long    aoffset;
86         short   type;
87 };
88 struct  Optab
89 {
90         char    as;
91         char    a1;
92         char    a2;
93         char    a3;
94         char    type;
95         char    size;
96         char    param;
97 };
98 struct  Oprang
99 {
100         Optab*  start;
101         Optab*  stop;
102 };
103 struct  Count
104 {
105         long    count;
106         long    outof;
107 };
108
109 enum
110 {
111         STEXT           = 1,
112         SDATA,
113         SBSS,
114         SDATA1,
115         SXREF,
116         SLEAF,
117         SFILE,
118         SCONST,
119         SSTRING,
120
121         C_NONE          = 0,
122         C_REG,
123         C_FREG,
124         C_FCREG,
125         C_MREG,
126         C_HI,
127         C_LO,
128         C_ZCON,
129         C_SCON,
130         C_ADD0CON,
131         C_AND0CON,
132         C_ADDCON,
133         C_ANDCON,
134         C_UCON,
135         C_LCON,
136         C_SACON,
137         C_SECON,
138         C_LACON,
139         C_LECON,
140         C_SBRA,
141         C_LBRA,
142         C_SAUTO,
143         C_SEXT,
144         C_LAUTO,
145         C_LEXT,
146         C_ZOREG,
147         C_SOREG,
148         C_LOREG,
149         C_GOK,
150
151         NSCHED          = 20,
152
153 /* mark flags */
154         FOLL            = 1<<0,
155         LABEL           = 1<<1,
156         LEAF            = 1<<2,
157         SYNC            = 1<<3,
158         BRANCH          = 1<<4,
159         LOAD            = 1<<5,
160         FCMP            = 1<<6,
161         NOSCHED         = 1<<7,
162
163         BIG             = 32766,
164         STRINGSZ        = 200,
165         NHASH           = 10007,
166         NHUNK           = 100000,
167         MINSIZ          = 64,
168         NENT            = 100,
169         MAXIO           = 8192,
170         MAXHIST         = 20,                           /* limit of path elements for history symbols */
171 };
172
173 EXTERN union
174 {
175         struct
176         {
177                 uchar   obuf[MAXIO];                    /* output buffer */
178                 uchar   ibuf[MAXIO];                    /* input buffer */
179         } u;
180         char    dbuf[1];
181 } buf;
182
183 #define cbuf    u.obuf
184 #define xbuf    u.ibuf
185
186 EXTERN  long    HEADR;                  /* length of header */
187 EXTERN  int     HEADTYPE;               /* type of header */
188 EXTERN  long    INITDAT;                /* data location */
189 EXTERN  long    INITRND;                /* data round above text location */
190 EXTERN  long    INITTEXT;               /* text location */
191 EXTERN  char*   INITENTRY;              /* entry point */
192 EXTERN  long    autosize;
193 EXTERN  Biobuf  bso;
194 EXTERN  long    bsssize;
195 EXTERN  int     cbc;
196 EXTERN  uchar*  cbp;
197 EXTERN  int     cout;
198 EXTERN  Auto*   curauto;
199 EXTERN  Auto*   curhist;
200 EXTERN  Prog*   curp;
201 EXTERN  Prog*   curtext;
202 EXTERN  Prog*   datap;
203 EXTERN  long    datsize;
204 EXTERN  char    debug[128];
205 EXTERN  Prog*   etextp;
206 EXTERN  Prog*   firstp;
207 EXTERN  char    fnuxi4[4];      /* for 3l [sic] */
208 EXTERN  char    fnuxi8[8];
209 EXTERN  char*   noname;
210 EXTERN  Sym*    hash[NHASH];
211 EXTERN  Sym*    histfrog[MAXHIST];
212 EXTERN  int     histfrogp;
213 EXTERN  int     histgen;
214 EXTERN  char*   library[50];
215 EXTERN  char*   libraryobj[50];
216 EXTERN  int     libraryp;
217 EXTERN  int     xrefresolv;
218 EXTERN  char*   hunk;
219 EXTERN  char    inuxi1[1];
220 EXTERN  char    inuxi2[2];
221 EXTERN  char    inuxi4[4];
222 EXTERN  Prog*   lastp;
223 EXTERN  long    lcsize;
224 EXTERN  char    literal[32];
225 EXTERN  int     nerrors;
226 EXTERN  long    nhunk;
227 EXTERN  long    instoffset;
228 EXTERN  Opcross opcross[10];
229 EXTERN  Oprang  oprange[ALAST];
230 EXTERN  char*   outfile;
231 EXTERN  long    pc;
232 EXTERN  uchar   repop[ALAST];
233 EXTERN  long    symsize;
234 EXTERN  Prog*   textp;
235 EXTERN  long    textsize;
236 EXTERN  long    thunk;
237 EXTERN  int     version;
238 EXTERN  char    xcmp[32][32];
239 EXTERN  Prog    zprg;
240 EXTERN  int     dtype;
241 EXTERN  int     little;
242
243 EXTERN  struct
244 {
245         Count   branch;
246         Count   fcmp;
247         Count   load;
248         Count   mfrom;
249         Count   page;
250         Count   jump;
251 } nop;
252
253 extern  char*   anames[];
254 extern  Optab   optab[];
255
256 #pragma varargck        type    "A"     int
257 #pragma varargck        type    "D"     Adr*
258 #pragma varargck        type    "N"     Adr*
259 #pragma varargck        type    "P"     Prog*
260 #pragma varargck        type    "S"     char*
261
262 #pragma varargck        argpos  diag 1
263
264 int     Aconv(Fmt*);
265 int     Dconv(Fmt*);
266 int     Nconv(Fmt*);
267 int     Pconv(Fmt*);
268 int     Sconv(Fmt*);
269 int     aclass(Adr*);
270 void    addhist(long, int);
271 void    addnop(Prog*);
272 void    append(Prog*, Prog*);
273 void    asmb(void);
274 void    asmlc(void);
275 int     asmout(Prog*, Optab*, int);
276 void    asmsym(void);
277 long    atolwhex(char*);
278 Prog*   brloop(Prog*);
279 void    buildop(void);
280 void    buildrep(int, int);
281 void    cflush(void);
282 int     cmp(int, int);
283 int     compound(Prog*);
284 double  cputime(void);
285 void    datblk(long, long, int);
286 void    diag(char*, ...);
287 void    dodata(void);
288 void    doprof1(void);
289 void    doprof2(void);
290 long    entryvalue(void);
291 void    errorexit(void);
292 void    exchange(Prog*);
293 int     find1(long, int);
294 void    follow(void);
295 void    gethunk(void);
296 void    histtoauto(void);
297 double  ieeedtod(Ieee*);
298 long    ieeedtof(Ieee*);
299 int     isnop(Prog*);
300 void    ldobj(int, long, char*);
301 void    loadlib(void);
302 void    listinit(void);
303 Sym*    lookup(char*, int);
304 void    lput(long);
305 void    bput(long);
306 void    mkfwd(void);
307 void*   mysbrk(ulong);
308 void    names(void);
309 void    nocache(Prog*);
310 void    noops(void);
311 void    nuxiinit(void);
312 void    objfile(char*);
313 int     ocmp(const void*, const void*);
314 long    opirr(int);
315 Optab*  oplook(Prog*);
316 long    oprrr(int);
317 void    patch(void);
318 void    prasm(Prog*);
319 void    prepend(Prog*, Prog*);
320 Prog*   prg(void);
321 int     pseudo(Prog*);
322 void    putsymb(char*, int, long, int);
323 long    regoff(Adr*);
324 int     relinv(int);
325 long    rnd(long, long);
326 void    sched(Prog*, Prog*);
327 void    span(void);
328 void    strnput(char*, int);
329 void    undef(void);
330 void    xdefine(char*, int, long);
331 void    xfol(Prog*);
332 void    xfol(Prog*);
333 void    nopstat(char*, Count*);