]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/6l/l.h
6l: fix vlong byte order when running on big endian machine (thanks erik quanstro)
[plan9front.git] / sys / src / cmd / 6l / l.h
1 #include        <u.h>
2 #include        <libc.h>
3 #include        <bio.h>
4 #include        "../6c/6.out.h"
5
6 #ifndef EXTERN
7 #define EXTERN  extern
8 #endif
9
10 #define P               ((Prog*)0)
11 #define S               ((Sym*)0)
12 #define TNAME           (curtext?curtext->from.sym->name:noname)
13 #define cput(c)\
14         { *cbp++ = c;\
15         if(--cbc <= 0)\
16                 cflush(); }
17
18 typedef struct  Adr     Adr;
19 typedef struct  Prog    Prog;
20 typedef struct  Sym     Sym;
21 typedef struct  Auto    Auto;
22 typedef struct  Optab   Optab;
23 typedef struct  Movtab  Movtab;
24
25 struct  Adr
26 {
27         union
28         {
29                 vlong   u0offset;
30                 char    u0scon[8];
31                 Prog    *u0cond;        /* not used, but should be D_BRANCH */
32                 Ieee    u0ieee;
33         } u0;
34         union
35         {
36                 Auto*   u1autom;
37                 Sym*    u1sym;
38         } u1;
39         short   type;
40         char    index;
41         char    scale;
42 };
43
44 #define offset  u0.u0offset
45 #define scon    u0.u0scon
46 #define cond    u0.u0cond
47 #define ieee    u0.u0ieee
48
49 #define autom   u1.u1autom
50 #define sym     u1.u1sym
51
52 struct  Prog
53 {
54         Adr     from;
55         Adr     to;
56         Prog    *forwd;
57         Prog*   link;
58         Prog*   pcond;  /* work on this */
59         vlong   pc;
60         long    line;
61         uchar   mark;   /* work on these */
62         uchar   back;
63
64         short   as;
65         char    width;          /* fake for DATA */
66         char    mode;   /* 16, 32, or 64 */
67 };
68 struct  Auto
69 {
70         Sym*    asym;
71         Auto*   link;
72         long    aoffset;
73         short   type;
74 };
75 struct  Sym
76 {
77         char    *name;
78         short   type;
79         short   version;
80         short   become;
81         short   frame;
82         uchar   subtype;
83         ushort  file;
84         vlong   value;
85         long    sig;
86         Sym*    link;
87 };
88 struct  Optab
89 {
90         short   as;
91         uchar*  ytab;
92         uchar   prefix;
93         uchar   op[20];
94 };
95 struct  Movtab
96 {
97         short   as;
98         uchar   ft;
99         uchar   tt;
100         uchar   code;
101         uchar   op[4];
102 };
103
104 enum
105 {
106         STEXT           = 1,
107         SDATA,
108         SBSS,
109         SDATA1,
110         SXREF,
111         SFILE,
112         SCONST,
113         SUNDEF,
114
115         SIMPORT,
116         SEXPORT,
117
118         NHASH           = 10007,
119         NHUNK           = 100000,
120         MINSIZ          = 8,
121         STRINGSZ        = 200,
122         MINLC           = 1,
123         MAXIO           = 8192,
124         MAXHIST         = 20,                           /* limit of path elements for history symbols */
125
126         Yxxx            = 0,
127         Ynone,
128         Yi0,
129         Yi1,
130         Yi8,
131         Ys32,
132         Yi32,
133         Yi64,
134         Yiauto,
135         Yal,
136         Ycl,
137         Yax,
138         Ycx,
139         Yrb,
140         Yrl,
141         Yrf,
142         Yf0,
143         Yrx,
144         Ymb,
145         Yml,
146         Ym,
147         Ybr,
148         Ycol,
149
150         Ycs,    Yss,    Yds,    Yes,    Yfs,    Ygs,
151         Ygdtr,  Yidtr,  Yldtr,  Ymsw,   Ytask,
152         Ycr0,   Ycr1,   Ycr2,   Ycr3,   Ycr4,   Ycr5,   Ycr6,   Ycr7,   Ycr8,
153         Ydr0,   Ydr1,   Ydr2,   Ydr3,   Ydr4,   Ydr5,   Ydr6,   Ydr7,
154         Ytr0,   Ytr1,   Ytr2,   Ytr3,   Ytr4,   Ytr5,   Ytr6,   Ytr7,   Yrl32,  Yrl64,
155         Ymr, Ymm,
156         Yxr, Yxm,
157         Ymax,
158
159         Zxxx            = 0,
160
161         Zlit,
162         Z_rp,
163         Zbr,
164         Zcall,
165         Zib_,
166         Zib_rp,
167         Zibo_m,
168         Zibo_m_xm,
169         Zil_,
170         Zil_rp,
171         Ziq_rp,
172         Zilo_m,
173         Ziqo_m,
174         Zjmp,
175         Zloop,
176         Zo_iw,
177         Zm_o,
178         Zm_r,
179         Zm_r_xm,
180         Zm_r_i_xm,
181         Zm_r_3d,
182         Zm_r_xm_nr,
183         Zr_m_xm_nr,
184         Zibm_r, /* mmx1,mmx2/mem64,imm8 */
185         Zmb_r,
186         Zaut_r,
187         Zo_m,
188         Zo_m64,
189         Zpseudo,
190         Zr_m,
191         Zr_m_xm,
192         Zr_m_i_xm,
193         Zrp_,
194         Z_ib,
195         Z_il,
196         Zm_ibo,
197         Zm_ilo,
198         Zib_rr,
199         Zil_rr,
200         Zclr,
201         Zbyte,
202         Zmax,
203
204         Px              = 0,
205         P32             = 0x32, /* 32-bit only */
206         Pe              = 0x66, /* operand escape */
207         Pm              = 0x0f, /* 2byte opcode escape */
208         Pq              = 0xff, /* both escape */
209         Pb              = 0xfe, /* byte operands */
210         Pf2             = 0xf2, /* xmm escape 1 */
211         Pf3             = 0xf3, /* xmm escape 2 */
212         Pw              = 0x48, /* Rex.w */
213         Py              = 0x80, /* defaults to 64-bit mode */
214
215         Rxf             = 1<<9, /* internal flag for Rxr on from */
216         Rxt             = 1<<8, /* internal flag for Rxr on to */
217         Rxw             = 1<<3, /* =1, 64-bit operand size */
218         Rxr             = 1<<2, /* extend modrm reg */
219         Rxx             = 1<<1, /* extend sib index */
220         Rxb             = 1<<0, /* extend modrm r/m, sib base, or opcode reg */
221
222         Roffset = 22,           /* no. bits for offset in relocation address */
223         Rindex  = 10,           /* no. bits for index in relocation address */
224 };
225
226 EXTERN union
227 {
228         struct
229         {
230                 char    obuf[MAXIO];                    /* output buffer */
231                 uchar   ibuf[MAXIO];                    /* input buffer */
232         } u;
233         char    dbuf[1];
234 } buf;
235
236 #define cbuf    u.obuf
237 #define xbuf    u.ibuf
238
239 #pragma varargck        type    "A"     int
240 #pragma varargck        type    "A"     uint
241 #pragma varargck        type    "D"     Adr*
242 #pragma varargck        type    "P"     Prog*
243 #pragma varargck        type    "R"     int
244 #pragma varargck        type    "S"     char*
245
246 #pragma varargck        argpos  diag 1
247
248 EXTERN  long    HEADR;
249 EXTERN  long    HEADTYPE;
250 EXTERN  vlong   INITDAT;
251 EXTERN  long    INITRND;
252 EXTERN  vlong   INITTEXT;
253 EXTERN  char*   INITENTRY;              /* entry point */
254 EXTERN  Biobuf  bso;
255 EXTERN  long    bsssize;
256 EXTERN  int     cbc;
257 EXTERN  char*   cbp;
258 EXTERN  char*   pcstr;
259 EXTERN  int     cout;
260 EXTERN  Auto*   curauto;
261 EXTERN  Auto*   curhist;
262 EXTERN  Prog*   curp;
263 EXTERN  Prog*   curtext;
264 EXTERN  Prog*   datap;
265 EXTERN  Prog*   edatap;
266 EXTERN  vlong   datsize;
267 EXTERN  char    debug[128];
268 EXTERN  char    literal[32];
269 EXTERN  Prog*   etextp;
270 EXTERN  Prog*   firstp;
271 EXTERN  uchar   fnuxi8[8];
272 EXTERN  uchar   fnuxi4[4];
273 EXTERN  Sym*    hash[NHASH];
274 EXTERN  Sym*    histfrog[MAXHIST];
275 EXTERN  int     histfrogp;
276 EXTERN  int     histgen;
277 EXTERN  char*   library[50];
278 EXTERN  char*   libraryobj[50];
279 EXTERN  int     libraryp;
280 EXTERN  int     xrefresolv;
281 EXTERN  char*   hunk;
282 EXTERN  uchar   inuxi1[1];
283 EXTERN  uchar   inuxi2[2];
284 EXTERN  uchar   inuxi4[4];
285 EXTERN  uchar   inuxi8[8];
286 EXTERN  char    ycover[Ymax*Ymax];
287 EXTERN  uchar*  andptr;
288 EXTERN  uchar*  rexptr;
289 EXTERN  uchar   and[30];
290 EXTERN  int     reg[D_NONE];
291 EXTERN  int     regrex[D_NONE+1];
292 EXTERN  Prog*   lastp;
293 EXTERN  long    lcsize;
294 EXTERN  int     nerrors;
295 EXTERN  long    nhunk;
296 EXTERN  long    nsymbol;
297 EXTERN  char*   noname;
298 EXTERN  char*   outfile;
299 EXTERN  vlong   pc;
300 EXTERN  long    spsize;
301 EXTERN  Sym*    symlist;
302 EXTERN  long    symsize;
303 EXTERN  Prog*   textp;
304 EXTERN  vlong   textsize;
305 EXTERN  long    thunk;
306 EXTERN  int     version;
307 EXTERN  Prog    zprg;
308 EXTERN  int     dtype;
309 EXTERN  char*   paramspace;
310
311 EXTERN  Adr*    reloca;
312 EXTERN  int     doexp, dlm;
313 EXTERN  int     imports, nimports;
314 EXTERN  int     exports, nexports;
315 EXTERN  char*   EXPTAB;
316 EXTERN  Prog    undefp;
317
318 #define UP      (&undefp)
319
320 extern  Optab   optab[];
321 extern  Optab*  opindex[];
322 extern  char*   anames[];
323
324 int     Aconv(Fmt*);
325 int     Dconv(Fmt*);
326 int     Pconv(Fmt*);
327 int     Rconv(Fmt*);
328 int     Sconv(Fmt*);
329 void    addhist(long, int);
330 Prog*   appendp(Prog*);
331 void    asmb(void);
332 void    asmdyn(void);
333 void    asmins(Prog*);
334 void    asmlc(void);
335 void    asmsp(void);
336 void    asmsym(void);
337 vlong   atolwhex(char*);
338 Prog*   brchain(Prog*);
339 Prog*   brloop(Prog*);
340 void    buildop(void);
341 void    cflush(void);
342 void    ckoff(Sym*, long);
343 Prog*   copyp(Prog*);
344 double  cputime(void);
345 void    datblk(long, long);
346 void    diag(char*, ...);
347 void    dodata(void);
348 void    doinit(void);
349 void    doprof1(void);
350 void    doprof2(void);
351 void    dostkoff(void);
352 void    dynreloc(Sym*, ulong, int);
353 vlong   entryvalue(void);
354 void    errorexit(void);
355 void    export(void);
356 int     find1(long, int);
357 int     find1v(vlong, int);
358 int     find2(long, int);
359 void    follow(void);
360 void    gethunk(void);
361 void    histtoauto(void);
362 double  ieeedtod(Ieee*);
363 long    ieeedtof(Ieee*);
364 void    import(void);
365 void    ldobj(int, long, char*);
366 void    loadlib(void);
367 void    listinit(void);
368 Sym*    lookup(char*, int);
369 void    lput(long);
370 void    lputl(long);
371 void    main(int, char*[]);
372 void    mkfwd(void);
373 void*   mysbrk(ulong);
374 void    nuxiinit(void);
375 void    objfile(char*);
376 int     opsize(Prog*);
377 void    patch(void);
378 Prog*   prg(void);
379 void    readundefs(char*, int);
380 int     relinv(int);
381 long    reuse(Prog*, Sym*);
382 vlong   rnd(vlong, vlong);
383 void    span(void);
384 void    undef(void);
385 void    undefsym(Sym*);
386 vlong   vaddr(Adr*);
387 void    wput(ushort);
388 void    xdefine(char*, int, vlong);
389 void    xfol(Prog*);
390 int     zaddr(uchar*, Adr*, Sym*[]);
391 void    zerosig(char*);