]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ql/l.h
disk/format: implement long name support
[plan9front.git] / sys / src / cmd / ql / l.h
1 #include        <u.h>
2 #include        <libc.h>
3 #include        <bio.h>
4 #include        "../qc/q.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         Sym     *sym;
29         Auto    *autom;
30         char    type;
31         uchar   reg;
32         char    name;
33         char    class;
34 };
35
36 #define offset  u0.u0offset
37 #define sval    u0.u0sval
38 #define ieee    u0.u0ieee
39
40 struct  Prog
41 {
42         Adr     from;
43         Adr     from3;  /* fma and rlwm */
44         Adr     to;
45         Prog    *forwd;
46         Prog    *cond;
47         Prog    *link;
48         long    pc;
49         long    regused;
50         short   line;
51         short   mark;
52         short   optab;          /* could be uchar */
53         ushort  as;
54         char    reg;
55 };
56 struct  Sym
57 {
58         char    *name;
59         short   type;
60         short   version;
61         short   become;
62         short   frame;
63         uchar   subtype;
64         char    dupok;
65         ushort  file;
66         long    value;
67         long    sig;
68         Sym     *link;
69 };
70 struct  Autom
71 {
72         Sym     *sym;
73         Auto    *link;
74         long    aoffset;
75         short   type;
76 };
77 struct  Optab
78 {
79         ushort  as;
80         char    a1;
81         char    a2;
82         char    a3;
83         char    a4;
84         char    type;
85         char    size;
86         char    param;
87 };
88 struct
89 {
90         Optab*  start;
91         Optab*  stop;
92 } oprange[ALAST];
93
94 enum
95 {
96         FPCHIP          = 1,
97         BIG             = 32768-8,
98         STRINGSZ        = 200,
99         MAXIO           = 8192,
100         MAXHIST         = 20,                           /* limit of path elements for history symbols */
101         DATBLK          = 1024,
102         NHASH           = 10007,
103         NHUNK           = 100000,
104         MINSIZ          = 64,
105         NENT            = 100,
106         NSCHED          = 20,
107
108 /* mark flags */
109         LABEL           = 1<<0,
110         LEAF            = 1<<1,
111         FLOAT           = 1<<2,
112         BRANCH          = 1<<3,
113         LOAD            = 1<<4,
114         FCMP            = 1<<5,
115         SYNC            = 1<<6,
116         LIST            = 1<<7,
117         FOLL            = 1<<8,
118         NOSCHED         = 1<<9,
119
120         STEXT           = 1,
121         SDATA,
122         SBSS,
123         SDATA1,
124         SXREF,
125         SLEAF,
126         SFILE,
127         SCONST,
128         SUNDEF,
129
130         SIMPORT,
131         SEXPORT,
132
133         C_NONE          = 0,
134         C_REG,
135         C_FREG,
136         C_CREG,
137         C_SPR,          /* special processor register */
138         C_SREG,         /* segment register (32 bit implementations only) */
139         C_ZCON,
140         C_SCON,         /* 16 bit signed */
141         C_UCON,         /* low 16 bits 0 */
142         C_ADDCON,       /* -0x8000 <= v < 0 */
143         C_ANDCON,       /* 0 < v <= 0xFFFF */
144         C_LCON,         /* other */
145         C_SACON,
146         C_SECON,
147         C_LACON,
148         C_LECON,
149         C_SBRA,
150         C_LBRA,
151         C_SAUTO,
152         C_LAUTO,
153         C_SEXT,
154         C_LEXT,
155         C_ZOREG,
156         C_SOREG,
157         C_LOREG,
158         C_FPSCR,
159         C_MSR,
160         C_XER,
161         C_LR,
162         C_CTR,
163         C_ANY,
164         C_GOK,
165         C_ADDR,
166
167         C_NCLASS,
168
169         Roffset = 22,           /* no. bits for offset in relocation address */
170         Rindex  = 10            /* no. bits for index in relocation address */
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  Prog*   prog_movsw;
204 EXTERN  Prog*   prog_movdw;
205 EXTERN  Prog*   prog_movws;
206 EXTERN  Prog*   prog_movwd;
207 EXTERN  long    datsize;
208 EXTERN  char    debug[128];
209 EXTERN  Prog*   firstp;
210 EXTERN  char    fnuxi8[8];
211 EXTERN  Sym*    hash[NHASH];
212 EXTERN  Sym*    histfrog[MAXHIST];
213 EXTERN  int     histfrogp;
214 EXTERN  int     histgen;
215 EXTERN  char*   library[50];
216 EXTERN  char*   libraryobj[50];
217 EXTERN  int     libraryp;
218 EXTERN  int     xrefresolv;
219 EXTERN  char*   hunk;
220 EXTERN  char    inuxi1[1];
221 EXTERN  char    inuxi2[2];
222 EXTERN  char    inuxi4[4];
223 EXTERN  Prog*   lastp;
224 EXTERN  long    lcsize;
225 EXTERN  char    literal[32];
226 EXTERN  int     nerrors;
227 EXTERN  long    nhunk;
228 EXTERN  char*   noname;
229 EXTERN  long    instoffset;
230 EXTERN  char*   outfile;
231 EXTERN  long    pc;
232 EXTERN  int     r0iszero;
233 EXTERN  long    symsize;
234 EXTERN  long    staticgen;
235 EXTERN  Prog*   textp;
236 EXTERN  long    textsize;
237 EXTERN  long    tothunk;
238 EXTERN  char    xcmp[C_NCLASS][C_NCLASS];
239 EXTERN  int     version;
240 EXTERN  Prog    zprg;
241 EXTERN  int     dtype;
242
243 EXTERN  int     doexp, dlm;
244 EXTERN  int     imports, nimports;
245 EXTERN  int     exports, nexports;
246 EXTERN  char*   EXPTAB;
247 EXTERN  Prog    undefp;
248
249 #define UP      (&undefp)
250
251 extern  Optab   optab[];
252 extern  char*   anames[];
253 extern  char*   cnames[];
254
255 int     Aconv(Fmt*);
256 int     Dconv(Fmt*);
257 int     Nconv(Fmt*);
258 int     Pconv(Fmt*);
259 int     Sconv(Fmt*);
260 int     Rconv(Fmt*);
261 int     aclass(Adr*);
262 void    addhist(long, int);
263 void    histtoauto(void);
264 void    addnop(Prog*);
265 void    append(Prog*, Prog*);
266 void    asmb(void);
267 void    asmdyn(void);
268 void    asmlc(void);
269 int     asmout(Prog*, Optab*, int);
270 void    asmsym(void);
271 long    atolwhex(char*);
272 Prog*   brloop(Prog*);
273 void    buildop(void);
274 void    cflush(void);
275 void    ckoff(Sym*, long);
276 int     cmp(int, int);
277 void    cput(long);
278 int     compound(Prog*);
279 double  cputime(void);
280 void    datblk(long, long);
281 void    diag(char*, ...);
282 void    dodata(void);
283 void    doprof1(void);
284 void    doprof2(void);
285 void    dynreloc(Sym*, long, int, int, int);
286 long    entryvalue(void);
287 void    errorexit(void);
288 void    exchange(Prog*);
289 void    export(void);
290 int     find1(long, int);
291 void    follow(void);
292 void    gethunk(void);
293 double  ieeedtod(Ieee*);
294 long    ieeedtof(Ieee*);
295 void    import(void);
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    nopout(Prog*);
309 void    nuxiinit(void);
310 void    objfile(char*);
311 int     ocmp(void*, void*);
312 long    opcode(int);
313 Optab*  oplook(Prog*);
314 void    patch(void);
315 void    prasm(Prog*);
316 void    prepend(Prog*, Prog*);
317 Prog*   prg(void);
318 int     pseudo(Prog*);
319 void    putsymb(char*, int, long, int);
320 void    readundefs(char*, int);
321 long    regoff(Adr*);
322 int     relinv(int);
323 long    rnd(long, long);
324 void    sched(Prog*, Prog*);
325 void    span(void);
326 void    undef(void);
327 void    undefsym(Sym*);
328 void    wput(long);
329 void    xdefine(char*, int, long);
330 void    xfol(Prog*);
331 void    zerosig(char*);
332
333 #pragma varargck        type    "A"     int
334 #pragma varargck        type    "A"     uint
335 #pragma varargck        type    "D"     Adr*
336 #pragma varargck        type    "N"     Adr*
337 #pragma varargck        type    "P"     Prog*
338 #pragma varargck        type    "R"     int
339 #pragma varargck        type    "S"     char*
340
341 #pragma varargck        argpos  diag 1