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