diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/2l/l.h |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/2l/l.h')
-rwxr-xr-x | sys/src/cmd/2l/l.h | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/sys/src/cmd/2l/l.h b/sys/src/cmd/2l/l.h new file mode 100755 index 000000000..19c100f56 --- /dev/null +++ b/sys/src/cmd/2l/l.h @@ -0,0 +1,266 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include "../2c/2.out.h" + +#ifndef EXTERN +#define EXTERN extern +#endif + +#define P ((Prog*)0) +#define S ((Sym*)0) +#define TNAME (curtext?curtext->from.sym->name:noname) +#define CPUT(c)\ + { *cbp++ = c;\ + if(--cbc <= 0)\ + cflush(); } + +typedef struct Adr Adr; +typedef struct Prog Prog; +typedef struct Sym Sym; +typedef struct Auto Auto; +typedef struct Optab Optab; + +struct Adr +{ + short type; + short index; + union + { + struct + { + long u0displace; + long u0offset; + } s0; + char u0scon[8]; + Prog *u0cond; /* not used, but should be D_BRANCH */ + Ieee u0ieee; + } u0; + union + { + Auto* u1autom; + Sym* u1sym; + } u1; + uchar field; + uchar scale; +}; + +#define displace u0.s0.u0displace +#define offset u0.s0.u0offset +#define scon u0.u0scon +#define cond u0.u0cond +#define ieee u0.u0ieee + +#define autom u1.u1autom +#define sym u1.u1sym + +struct Prog +{ + Adr from; + Adr to; + union + { + long u0stkoff; + Prog *u0forwd; + } u0; + Prog* link; + Prog* pcond; /* work on this */ + long pc; + long line; + short as; + uchar mark; /* work on these */ + uchar back; +}; + +#define stkoff u0.u0stkoff +#define forwd u0.u0forwd + +struct Auto +{ + Sym* asym; + Auto* link; + long aoffset; + short type; +}; +struct Sym +{ + char *name; + short type; + short version; + short become; + short frame; + long value; + Sym* link; +}; +struct Optab +{ + short as; + short fas; + short srcsp; + short dstsp; + ushort optype; + ushort opcode0; + ushort opcode1; + ushort opcode2; + ushort opcode3; +}; + +enum +{ + STEXT = 1, + SDATA, + SBSS, + SDATA1, + SXREF, + SAUTO, + SPARAM, + SFILE, + NHASH = 10007, + NHUNK = 100000, + MINSIZ = 4, + STRINGSZ = 200, + MAXIO = 8192, + MAXHIST = 20, /* limit of path elements for history symbols */ + A6OFFSET = 32766 +}; + +EXTERN union +{ + struct + { + char obuf[MAXIO]; /* output buffer */ + uchar ibuf[MAXIO]; /* input buffer */ + } u; + char dbuf[1]; +} buf; + +#define cbuf u.obuf +#define xbuf u.ibuf + +EXTERN long HEADR; +EXTERN long HEADTYPE; +EXTERN long INITDAT; +EXTERN long INITRND; +EXTERN long INITTEXT; +EXTERN char* INITENTRY; /* entry point */ +EXTERN Biobuf bso; +EXTERN long bsssize; +EXTERN long casepc; +EXTERN int cbc; +EXTERN char* cbp; +EXTERN int cout; +EXTERN Auto* curauto; +EXTERN Auto* curhist; +EXTERN Prog* curp; +EXTERN Prog* curtext; +EXTERN Prog* datap; +EXTERN long datsize; +EXTERN char debug[128]; +EXTERN Prog* etextp; +EXTERN Prog* firstp; +EXTERN char fnuxi8[8]; +EXTERN char gnuxi8[8]; +EXTERN Sym* hash[NHASH]; +EXTERN Sym* histfrog[MAXHIST]; +EXTERN int histfrogp; +EXTERN int histgen; +EXTERN char* library[50]; +EXTERN char* libraryobj[50]; +EXTERN int libraryp; +EXTERN int xrefresolv; +EXTERN char* hunk; +EXTERN char inuxi1[1]; +EXTERN char inuxi2[2]; +EXTERN char inuxi4[4]; +EXTERN Prog* lastp; +EXTERN long lcsize; +EXTERN long ncase; +EXTERN long ndata; +EXTERN int nerrors; +EXTERN long nhunk; +EXTERN long nsymbol; +EXTERN char* noname; +EXTERN short* op; +EXTERN char* outfile; +EXTERN long pc; +EXTERN char simple[I_MASK]; +EXTERN char special[I_MASK]; +EXTERN long spsize; +EXTERN Sym* symlist; +EXTERN long symsize; +EXTERN Prog* textp; +EXTERN long textsize; +EXTERN long thunk; +EXTERN int version; +EXTERN Prog zprg; + +extern Optab optab[]; +extern char mmsize[]; +extern char* anames[]; + +#pragma varargck type "A" int +#pragma varargck type "D" Adr* +#pragma varargck type "P" Prog* +#pragma varargck type "R" int +#pragma varargck type "S" char* + +#pragma varargck argpos diag 1 + +int Aconv(Fmt*); +int Dconv(Fmt*); +int Pconv(Fmt*); +int Rconv(Fmt*); +int Sconv(Fmt*); +int Xconv(Fmt*); +void addhist(long, int); +int andsize(Prog*, Adr*); +Prog* appendp(Prog*); +void asmb(void); +int asmea(Prog*, Adr*); +void asmins(Prog*); +void asmlc(void); +void asmsp(void); +void asmsym(void); +long atolwhex(char*); +Prog* brchain(Prog*); +Prog* brloop(Prog*); +void cflush(void); +Prog* copyp(Prog*); +double cputime(void); +void datblk(long, long); +void diag(char*, ...); +void dodata(void); +void doprof1(void); +void doprof2(void); +void dostkoff(void); +long entryvalue(void); +void errorexit(void); +int find1(long, int); +int find2(long, int); +void follow(void); +void gethunk(void); +int gnuxi(Ieee*, int, int); +void histtoauto(void); +double ieeedtod(Ieee*); +long ieeedtof(Ieee*); +void ldobj(int, long, char*); +void loadlib(void); +void listinit(void); +Sym* lookup(char*, int); +void lput(long); +void main(int, char*[]); +void mkfwd(void); +void* mysbrk(ulong); +void nuxiinit(void); +void objfile(char*); +void patch(void); +Prog* prg(void); +int relinv(int); +long reuse(Prog*, Sym*); +long rnd(long, long); +void s16put(char*); +void span(void); +void undef(void); +void xdefine(char*, int, long); +void xfol(Prog*); +int zaddr(uchar*, Adr*, Sym*[]); |