diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-04-08 14:05:27 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-04-08 14:05:27 +0200 |
commit | d8d4802f80b40bc9a43031e3d6484aa237e7d444 (patch) | |
tree | 7714690d2d47f2aedf4ad60ad9ad0e6d88db2a1b /sys/src/cmd/7l/l.h | |
parent | 394d095ee0a9e50242b88a783af6bb777cfb3e01 (diff) |
7l: add arm64 linker (initial sync)
Diffstat (limited to 'sys/src/cmd/7l/l.h')
-rw-r--r-- | sys/src/cmd/7l/l.h | 430 |
1 files changed, 430 insertions, 0 deletions
diff --git a/sys/src/cmd/7l/l.h b/sys/src/cmd/7l/l.h new file mode 100644 index 000000000..ac0dae6dc --- /dev/null +++ b/sys/src/cmd/7l/l.h @@ -0,0 +1,430 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include "../7c/7.out.h" + +#ifndef EXTERN +#define EXTERN extern +#endif + +#define LIBNAMELEN 300 + +void addlibpath(char*); +int fileexists(char*); +int find1(long, int); +char* findlib(char*); + +typedef struct Adr Adr; +typedef struct Autom Auto; +typedef struct Count Count; +typedef struct Ieee Ieee; +typedef struct Prog Prog; +typedef struct Sym Sym; +typedef struct Mask Mask; +typedef struct Optab Optab; +typedef struct Oprang Oprang; +typedef uchar Opcross[32][2][32]; + +#define P ((Prog*)0) +#define S ((Sym*)0) +#define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) + +struct Adr +{ + union + { + vlong u0offset; + char* u0sval; + Ieee* u0ieee; + } u0; + union + { + Auto* u1autom; + Sym* u1sym; + } u1; + char type; + char reg; + char name; + char class; +}; + +#define offset u0.u0offset +#define sval u0.u0sval +#define ieee u0.u0ieee + +#define autom u1.u1autom +#define sym u1.u1sym + +struct Prog +{ + Adr from; + Adr from3; /* third register operand */ + Adr to; + union + { + long u0regused; + Prog* u0forwd; + } u0; + Prog* cond; + Prog* link; + vlong pc; + long line; + uchar mark; + ushort optab; + ushort as; + uchar reg; +}; +#define regused u0.u0regused +#define forwd u0.u0forwd + +struct Sym +{ + char *name; + short type; + short version; + short become; + short frame; + uchar subtype; + ushort file; + vlong value; + long sig; + Sym* link; +}; + +#define SIGNINTERN (1729*325*1729) /* signature of internal functions such as _div */ + +struct Autom +{ + Sym* asym; + Auto* link; + long aoffset; + short type; +}; + +struct Optab +{ + ushort as; + char a1; + char a2; + char a3; + char type; + char size; + char param; + char flag; +}; +struct Oprang +{ + Optab* start; + Optab* stop; +}; +struct Mask +{ + uchar s; + uchar e; + uchar r; + uvlong v; +}; + +enum +{ + STEXT = 1, + SDATA, + SBSS, + SDATA1, + SXREF, + SLEAF, + SFILE, + SCONST, + SSTRING, + SUNDEF, + + SIMPORT, + SEXPORT, + + LFROM = 1<<0, + LTO = 1<<1, + LPOOL = 1<<2, + + C_NONE = 0, + C_REG, + C_RSP, /* D_REG or D_SP */ + C_SHIFT, /* D_SHIFT: shift type, amount, value */ + C_EXTREG, /* D_EXTREG: reg, ext type, shift */ + C_FREG, + C_SPR, + C_COND, + + C_ZCON, /* 0 (matching C_REG, not C_RSP, allowing REGZERO) */ + C_ADDCON0, /* 12-bit unsigned, unshifted */ + C_ADDCON, /* 12-bit unsigned, shifted left by 0 or 12 */ + C_MOVCON, /* generated by a 16-bit constant, optionally inverted and/or shifted by multiple of 16 */ + C_BITCON, /* bimm32 */ + C_ABCON, /* could be C_ADDCON or C_BITCON */ + C_MBCON, /* could be C_MOVCON or C_BITCON */ + C_LCON, /* 32-bit constant */ + C_FCON, /* floating-point constant */ + C_VCON, /* 64-bit constant */ + + C_AACON, /* ADDCON offset in auto constant $a(FP) */ + C_LACON, /* 32-bit offset in auto constant $a(FP) */ + + C_AECON, /* ADDCON offset in extern constant $e(SB) */ + + C_SBRA, + C_LBRA, + + C_NPAUTO, /* -512 <= x < 0, 0 mod 8 */ + C_NSAUTO, /* -256 <= x < 0 */ + C_PSAUTO, /* 0 to 255 */ + C_PPAUTO, /* 0 to 504, 0 mod 8 */ + C_UAUTO4K, /* 0 to 4095 */ + C_UAUTO8K, /* 0 to 8190, 0 mod 2 */ + C_UAUTO16K, /* 0 to 16380, 0 mod 4 */ + C_UAUTO32K, /* 0 to 32760, 0 mod 8 */ + C_UAUTO64K, /* 0 to 65520, 0 mod 16 */ + C_LAUTO, /* any other 32-bit constant */ + + C_SEXT1, /* 0 to 4095, direct */ + C_SEXT2, /* 0 to 8190 */ + C_SEXT4, /* 0 to 16380 */ + C_SEXT8, /* 0 to 32760 */ + C_SEXT16, /* 0 to 65520 */ + C_LEXT, + + C_NPOREG, /* mirror NPAUTO etc, except for ZOREG */ + C_NSOREG, + C_ZOREG, + C_PSOREG, + C_PPOREG, + C_UOREG4K, + C_UOREG8K, + C_UOREG16K, + C_UOREG32K, + C_UOREG64K, + C_LOREG, + + C_ADDR, /* relocatable address for dynamic loading */ + C_ROFF, /* register offset (inc register extended) */ + C_XPOST, + C_XPRE, + + C_VREG, + + C_GOK, + C_NCLASS, /* must be last */ + +/* mark flags */ + FOLL = 1<<0, + LABEL = 1<<1, + LEAF = 1<<2, + FLOAT = 1<<3, + BRANCH = 1<<4, + LOAD = 1<<5, + SYNC = 1<<6, + NOSCHED = 1<<7, + + MINSIZ = 64, + + Roffset = 22, /* no. bits for offset in relocation address */ + Rindex = 10, /* no. bits for index in relocation address */ + + STACKALIGN = 16, /* alignment of stack */ + PCSZ= 8, /* size of PC */ +}; + +enum +{ + + STRINGSZ = 200, + NHASH = 10007, + NHUNK = 100000, + MAXIO = 8192, + MAXHIST = 20, /* limit of path elements for history symbols */ +}; + +EXTERN union +{ + struct + { + uchar 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; /* length of header */ +EXTERN int HEADTYPE; /* type of header */ +EXTERN long INITDAT; /* data location */ +EXTERN long INITRND; /* data round above text location */ +EXTERN long INITTEXT; /* text location */ +EXTERN long INITTEXTP; /* text location (physical) */ +EXTERN char* INITENTRY; /* entry point */ +EXTERN long autosize; +EXTERN Biobuf bso; +EXTERN long bsssize; +EXTERN int cbc; +EXTERN uchar* 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 fnuxi4[4]; +EXTERN char fnuxi8[8]; +EXTERN char inuxi1[1]; +EXTERN char inuxi2[2]; +EXTERN char inuxi4[4]; +EXTERN uchar inuxi8[8]; + +EXTERN Sym* hash[NHASH]; +EXTERN Sym* histfrog[MAXHIST]; +EXTERN int histfrogp; +EXTERN int histgen; +EXTERN char* hunk; + +EXTERN char* library[50]; +EXTERN char* libraryobj[50]; +EXTERN int libraryp; +EXTERN Prog* lastp; +EXTERN long lcsize; +EXTERN char literal[32]; +EXTERN int nerrors; +EXTERN long nhunk; +EXTERN char* noname; +EXTERN vlong instoffset; +EXTERN Opcross opcross[8]; +EXTERN char* outfile; +EXTERN vlong pc; +EXTERN uchar repop[ALAST]; +EXTERN long symsize; +EXTERN Prog* textp; +EXTERN vlong textsize; +EXTERN long thunk; +EXTERN int version; +EXTERN char xcmp[C_NCLASS][C_NCLASS]; +EXTERN int xrefresolv; +EXTERN Prog zprg; +EXTERN int dtype; + +EXTERN int doexp, dlm; +EXTERN int imports, nimports; +EXTERN int exports, nexports; +EXTERN char* EXPTAB; +EXTERN Prog undefp; + +#define UP (&undefp) + +extern char* anames[]; +extern char* cnames[]; +extern Optab optab[]; + +EXTERN Prog* blitrl; +EXTERN Prog* elitrl; + +#pragma varargck argpos diag 1 + +#pragma varargck type "A" int +#pragma varargck type "A" uint +#pragma varargck type "C" int +#pragma varargck type "D" Adr* +#pragma varargck type "N" Adr* +#pragma varargck type "P" Prog* +#pragma varargck type "S" char* + + +int Aconv(Fmt*); +int Cconv(Fmt*); +int Dconv(Fmt*); +int Nconv(Fmt*); +int Pconv(Fmt*); +int Rconv(Fmt*); +int Sconv(Fmt*); +int aclass(Adr*); +void addpool(Prog*, Adr*); +vlong atolwhex(char*); +void asmb(void); +void asmdyn(void); +void asmlc(void); +void asmout(Prog*, Optab*); +void asmsym(void); +Prog* brchain(Prog*); +Prog* brloop(Prog*); +void buildop(void); +void buildrep(int, int); +void cflush(void); +void ckoff(Sym*, long); +int chipfloat(Ieee*); +int cmp(int, int); +int compound(Prog*); +void cput(int); +void datblk(long, long, int); +void diag(char*, ...); +void dodata(void); +void doprof1(void); +void doprof2(void); +void dynreloc(Sym*, long, int); +vlong entryvalue(void); +void errorexit(void); +void export(void); +void follow(void); +void gethunk(void); +void histtoauto(void); +void* halloc(usize); +int isnop(Prog*); +double ieeedtod(Ieee*); +long ieeedtof(Ieee*); +void import(void); +void ldobj(int, long, char*); +void listinit(void); +void llput(vlong); +void llputl(vlong); +void loadlib(void); +Sym* lookup(char*, int); +void lput(long); +void lputl(long); +void mkfwd(void); +int movcon(vlong); +void* mysbrk(ulong); +void names(void); +void nocache(Prog*); +void nuxiinit(void); +void objfile(char*); +vlong offsetshift(vlong, int); +Optab* oplook(Prog*); +void patch(void); +int pseudo(Prog*); +void prasm(Prog*); +Prog* prg(void); +void putsymb(char*, int, vlong, int); +void readundefs(char*, int); +long regoff(Adr*); +int relinv(int); +vlong rnd(vlong, long); +void span(void); +void undef(void); +void wput(long); +void wputl(long); +void noops(void); +Mask* findmask(uvlong); +void xdefine(char*, int, long); +void xfol(Prog*); +void zerosig(char*); + + +#pragma varargck type "R" int + +/* for ../ld */ +#define isbranch(a) ((a) == AB) +#define iscall(a) ((a) == ABL) +#define isreturn(a) ((a) == ARETURN || (a) == ARET || (a) == AERET) +#define branchop() AB +#define canfollow(a) ((a) != ATEXT && (a) != ABCASE) |