]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/1l/l.h
41ec656857e1f0a9d4fbf1a6375e1e1e70af4ce9
[plan9front.git] / sys / src / cmd / 1l / l.h
1 #include        <u.h>
2 #include        <libc.h>
3 #include        <bio.h>
4 #include        "../2c/2.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
24 struct  Adr
25 {
26         short   type;
27         uchar   field;
28         union
29         {
30                 struct
31                 {
32                         long    u0displace;
33                         long    u0offset;
34                 } s0;
35                 char    u0scon[8];
36                 Prog    *u0cond;        /* not used, but should be D_BRANCH */
37                 Ieee    u0ieee;
38         } u0;
39         union
40         {
41                 Auto*   u1autom;
42                 Sym*    u1sym;
43         } u1;
44 };
45
46 #define displace u0.s0.u0displace
47 #define offset  u0.s0.u0offset
48 #define scon    u0.u0scon
49 #define cond    u0.u0cond
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    u0stkoff;
62                 Prog    *u0forwd;
63         } u0;
64         Prog*   link;
65         Prog*   pcond;  /* work on this */
66         long    pc;
67         long    line;
68         short   as;
69         uchar   mark;   /* work on these */
70         uchar   back;
71 };
72
73 #define stkoff  u0.u0stkoff
74 #define forwd   u0.u0forwd
75
76 struct  Auto
77 {
78         Sym*    asym;
79         Auto*   link;
80         long    aoffset;
81         short   type;
82 };
83 struct  Sym
84 {
85         char    *name;
86         short   type;
87         short   version;
88         short   become;
89         short   frame;
90         long    value;
91         Sym*    link;
92 };
93 struct  Optab
94 {
95         short   as;
96         short   fas;
97         short   srcsp;
98         short   dstsp;
99         ushort  optype;
100         ushort  opcode0;
101         ushort  opcode1;
102         ushort  opcode2;
103         ushort  opcode3;
104 };
105
106 enum
107 {
108         STEXT           = 1,
109         SDATA,
110         SBSS,
111         SDATA1,
112         SXREF,
113         SAUTO,
114         SPARAM,
115         SFILE,
116         NHASH           = 10007,
117         NHUNK           = 100000,
118         MINSIZ          = 4,
119         STRINGSZ        = 200,
120         MAXIO           = 8192,
121         MAXHIST         = 20,                           /* limit of path elements for history symbols */
122         A6OFFSET        = 32766,
123 };
124
125 EXTERN union
126 {
127         struct
128         {
129                 char    obuf[MAXIO];                    /* output buffer */
130                 uchar   ibuf[MAXIO];                    /* input buffer */
131         } u;
132         char    dbuf[1];
133 } buf;
134
135 #define cbuf    u.obuf
136 #define xbuf    u.ibuf
137
138 #pragma varargck        type    "A"     int
139 #pragma varargck        type    "D"     Adr*
140 #pragma varargck        type    "P"     Prog*
141 #pragma varargck        type    "R"     int
142 #pragma varargck        type    "S"     char*
143
144 #pragma varargck        argpos  diag 1
145
146 EXTERN  long    HEADR;
147 EXTERN  long    HEADTYPE;
148 EXTERN  long    INITDAT;
149 EXTERN  long    INITRND;
150 EXTERN  long    INITTEXT;
151 EXTERN  char*   INITENTRY;              /* entry point */
152 EXTERN  Biobuf  bso;
153 EXTERN  long    bsssize;
154 EXTERN  long    casepc;
155 EXTERN  int     cbc;
156 EXTERN  char*   cbp;
157 EXTERN  int     cout;
158 EXTERN  Auto*   curauto;
159 EXTERN  Auto*   curhist;
160 EXTERN  Prog*   curp;
161 EXTERN  Prog*   curtext;
162 EXTERN  Prog*   datap;
163 EXTERN  long    datsize;
164 EXTERN  char    debug[128];
165 EXTERN  Prog*   etextp;
166 EXTERN  Prog*   firstp;
167 EXTERN  Prog*   prog_divsl;
168 EXTERN  Prog*   prog_divul;
169 EXTERN  Prog*   prog_mull;
170 EXTERN  Prog*   prog_ccr;
171 EXTERN  char    fnuxi8[8];
172 EXTERN  char    gnuxi8[8];
173 EXTERN  Sym*    hash[NHASH];
174 EXTERN  Sym*    histfrog[MAXHIST];
175 EXTERN  int     histfrogp;
176 EXTERN  int     histgen;
177 EXTERN  char*   library[50];
178 EXTERN  char*   libraryobj[50];
179 EXTERN  int     libraryp;
180 EXTERN  int     xrefresolv;
181 EXTERN  char*   hunk;
182 EXTERN  char    inuxi1[1];
183 EXTERN  char    inuxi2[2];
184 EXTERN  char    inuxi4[4];
185 EXTERN  Prog*   lastp;
186 EXTERN  long    lcsize;
187 EXTERN  long    relocsize;
188 EXTERN  long    ndata;
189 EXTERN  int     nerrors;
190 EXTERN  long    nhunk;
191 EXTERN  long    nsymbol;
192 EXTERN  char*   noname;
193 EXTERN  short*  op;
194 EXTERN  char*   outfile;
195 EXTERN  long    pc;
196 EXTERN  char    simple[I_MASK];
197 EXTERN  char    special[I_MASK];
198 EXTERN  long    spsize;
199 EXTERN  Sym*    symlist;
200 EXTERN  long    symsize;
201 EXTERN  Prog*   textp;
202 EXTERN  long    textsize;
203 EXTERN  long    thunk;
204 EXTERN  int     version;
205 EXTERN  Prog    zprg;
206
207 extern  Optab   optab[];
208 extern  char    mmsize[];
209 extern  char*   anames[];
210
211 int     Aconv(Fmt*);
212 int     Dconv(Fmt*);
213 int     Pconv(Fmt*);
214 int     Rconv(Fmt*);
215 int     Sconv(Fmt*);
216 int     Xconv(Fmt*);
217 void    addhist(long, int);
218 int     andsize(Prog*, Adr*);
219 void    asmb(void);
220 int     asmea(Prog*, Adr*);
221 void    asmins(Prog*);
222 void    asmlc(void);
223 void    asmsp(void);
224 void    asmsym(void);
225 void    asmreloc(void);
226 long    atolwhex(char*);
227 Prog*   brchain(Prog*);
228 Prog*   brloop(Prog*);
229 void    cflush(void);
230 Prog*   copyp(Prog*);
231 double  cputime(void);
232 void    datblk(long, long);
233 void    diag(char*, ...);
234 void    dodata(void);
235 void    doprof1(void);
236 void    doprof2(void);
237 void    dostkoff(void);
238 long    entryvalue(void);
239 void    errorexit(void);
240 int     find1(long, int);
241 int     find2(long, int);
242 void    follow(void);
243 void    gethunk(void);
244 int     gnuxi(Ieee*, int, int);
245 void    histtoauto(void);
246 double  ieeedtod(Ieee*);
247 long    ieeedtof(Ieee*);
248 void    initmuldiv1(void);
249 void    initmuldiv2(void);
250 void    ldobj(int, long, char*);
251 void    loadlib(void);
252 void    listinit(void);
253 Sym*    lookup(char*, int);
254 void    lput(long);
255 void    main(int, char*[]);
256 void    mkfwd(void);
257 void*   mysbrk(ulong);
258 void    nuxiinit(void);
259 void    objfile(char*);
260 void    patch(void);
261 Prog*   prg(void);
262 Prog*   nprg(Prog*);
263 int     relinv(int);
264 long    reuse(Prog*, Sym*);
265 long    rnd(long, long);
266 void    s16put(char*);
267 void    span(void);
268 void    undef(void);
269 void    xdefine(char*, int, long);
270 void    xfol(Prog*);
271 int     zaddr(uchar*, Adr*, Sym*[]);