diff options
author | Shenghou Ma <minux@golang.org> | 2014-08-07 14:56:59 -0400 |
---|---|---|
committer | Shenghou Ma <minux@golang.org> | 2014-08-07 14:56:59 -0400 |
commit | d5f5813e711b9578d598b468f81898f4915fca81 (patch) | |
tree | 746352a0b88b65691fb817413513ad924e9a5f00 /src/cmd/9l | |
parent | 0178f2a25fe69bf71ea233df543f42267bc2e526 (diff) | |
download | go-d5f5813e711b9578d598b468f81898f4915fca81.tar.gz |
[dev.power64] cmd/9l: update header files for liblink
LGTM=rsc
R=rsc, iant
CC=golang-codereviews
https://codereview.appspot.com/128720044
Diffstat (limited to 'src/cmd/9l')
-rw-r--r-- | src/cmd/9l/9.out.h | 96 | ||||
-rw-r--r-- | src/cmd/9l/l.h | 351 |
2 files changed, 113 insertions, 334 deletions
diff --git a/src/cmd/9l/9.out.h b/src/cmd/9l/9.out.h index 8ad2f7d06..6e4f9ee1b 100644 --- a/src/cmd/9l/9.out.h +++ b/src/cmd/9l/9.out.h @@ -34,8 +34,7 @@ #define NSYM 50 #define NREG 32 -#define NOPROF (1<<0) -#define DUPOK (1<<1) +#include "../ld/textflag.h" enum { @@ -43,14 +42,16 @@ enum REGSP = 1, REGSB = 2, REGRET = 3, - REGARG = 3, + REGARG = -1, /* -1 disables passing the first argument in register */ REGMIN = 7, /* register variables allocated from here to REGMAX */ + REGENV = 11, /* environment variable for closures */ REGMAX = 27, REGEXT = 30, /* external registers allocated from here down */ REGTMP = 31, /* used by the linker */ FREGRET = 0, FREGMIN = 17, /* first register variable */ + FREGMAX = 26, /* last register variable for 9g only */ FREGEXT = 26, /* first external register */ FREGCVI = 27, /* floating conversion constant */ FREGZERO = 28, /* both float and double */ @@ -69,9 +70,66 @@ enum */ }; +enum { + BIG = 32768-8, +}; + +enum { +/* mark flags */ + LABEL = 1<<0, + LEAF = 1<<1, + FLOAT = 1<<2, + BRANCH = 1<<3, + LOAD = 1<<4, + FCMP = 1<<5, + SYNC = 1<<6, + LIST = 1<<7, + FOLL = 1<<8, + NOSCHED = 1<<9, +}; + +enum +{ + C_NONE, + C_REG, + C_FREG, + C_CREG, + C_SPR, /* special processor register */ + C_ZCON, + C_SCON, /* 16 bit signed */ + C_UCON, /* low 16 bits 0 */ + C_ADDCON, /* -0x8000 <= v < 0 */ + C_ANDCON, /* 0 < v <= 0xFFFF */ + C_LCON, /* other 32 */ + C_DCON, /* other 64 (could subdivide further) */ + C_SACON, + C_SECON, + C_LACON, + C_LECON, + C_SBRA, + C_LBRA, + C_SAUTO, + C_LAUTO, + C_SEXT, + C_LEXT, + C_ZOREG, + C_SOREG, + C_LOREG, + C_FPSCR, + C_MSR, + C_XER, + C_LR, + C_CTR, + C_ANY, + C_GOK, + C_ADDR, + + C_NCLASS, /* must be the last */ +}; + enum as { - AXXX = 0, + AXXX, AADD, AADDCC, AADDV, @@ -390,6 +448,17 @@ enum as /* more 64-bit operations */ AHRFID, + AUNDEF, + AUSEFIELD, + ATYPE, + AFUNCDATA, + APCDATA, + ACHECKNIL, + AVARDEF, + AVARKILL, + ADUFFCOPY, + ADUFFZERO, + ALAST }; @@ -422,6 +491,11 @@ enum D_FILE1, D_DCR, /* device control register */ D_DCONST, + D_ADDR, // not used, use D_CONST with non-empty sym. + +/* reg names for 9g OREGISTER */ + D_R0 = 0, // type is D_REG + D_F0 = D_R0+NREG, // type is D_FREG /* reg names iff type is D_SPR */ D_XER = 1, @@ -433,16 +507,4 @@ enum /* * this is the ranlib header */ -#define SYMDEF "__.SYMDEF" - -/* - * this is the simulated IEEE floating point - */ -typedef struct ieee Ieee; -struct ieee -{ - long l; /* contains ls-man 0xffffffff */ - long h; /* contains sign 0x80000000 - exp 0x7ff00000 - ms-man 0x000fffff */ -}; +#define SYMDEF "__.GOSYMDEF" diff --git a/src/cmd/9l/l.h b/src/cmd/9l/l.h index 0f2fd60a8..d787f1384 100644 --- a/src/cmd/9l/l.h +++ b/src/cmd/9l/l.h @@ -30,102 +30,29 @@ #include <u.h> #include <libc.h> #include <bio.h> -#include "../9c/9.out.h" -#include "../8l/elf.h" +#include <link.h> +#include "9.out.h" #ifndef EXTERN #define EXTERN extern #endif -#define LIBNAMELEN 300 - -typedef struct Adr Adr; -typedef struct Sym Sym; -typedef struct Autom Auto; -typedef struct Prog Prog; -typedef struct Optab Optab; - -#define P ((Prog*)0) -#define S ((Sym*)0) -#define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) - -struct Adr +enum { - union - { - vlong u0offset; - char u0sval[NSNAME]; - Ieee u0ieee; - }u0; - Sym *sym; - Auto *autom; - char type; - uchar reg; - char name; - char class; + thechar = '9', + PtrSize = 8, + IntSize = 8, + RegSize = 8, + MaxAlign = 32, // max data alignment + FuncAlign = 8 }; -#define offset u0.u0offset -#define sval u0.u0sval -#define ieee u0.u0ieee - -struct Prog -{ - Adr from; - Adr from3; /* fma and rlwm */ - Adr to; - Prog *forwd; - Prog *cond; - Prog *link; - vlong pc; - long regused; - short line; - short mark; - short optab; /* could be uchar */ - short as; - char reg; -}; -struct Sym -{ - char *name; - short type; - short version; - short become; - short frame; - uchar subtype; - ushort file; - vlong value; - long sig; - Sym *link; -}; -struct Autom -{ - Sym *sym; - Auto *link; - vlong aoffset; - short type; -}; -struct Optab -{ - short as; - char a1; - char a2; - char a3; - char a4; - char type; - char size; - char param; -}; -struct -{ - Optab* start; - Optab* stop; -} oprange[ALAST]; +#define P ((Prog*)0) +#define S ((LSym*)0) enum { FPCHIP = 1, - BIG = 32768-8, STRINGSZ = 200, MAXIO = 8192, MAXHIST = 20, /* limit of path elements for history symbols */ @@ -135,250 +62,40 @@ enum MINSIZ = 64, NENT = 100, NSCHED = 20, - -/* mark flags */ - LABEL = 1<<0, - LEAF = 1<<1, - FLOAT = 1<<2, - BRANCH = 1<<3, - LOAD = 1<<4, - FCMP = 1<<5, - SYNC = 1<<6, - LIST = 1<<7, - FOLL = 1<<8, - NOSCHED = 1<<9, - - STEXT = 1, - SDATA, - SBSS, - SDATA1, - SXREF, - SLEAF, - SFILE, - SCONST, - SUNDEF, - - SIMPORT, - SEXPORT, - - C_NONE = 0, - C_REG, - C_FREG, - C_CREG, - C_SPR, /* special processor register */ - C_ZCON, - C_SCON, /* 16 bit signed */ - C_UCON, /* low 16 bits 0 */ - C_ADDCON, /* -0x8000 <= v < 0 */ - C_ANDCON, /* 0 < v <= 0xFFFF */ - C_LCON, /* other 32 */ - C_DCON, /* other 64 (could subdivide further) */ - C_SACON, - C_SECON, - C_LACON, - C_LECON, - C_SBRA, - C_LBRA, - C_SAUTO, - C_LAUTO, - C_SEXT, - C_LEXT, - C_ZOREG, - C_SOREG, - C_LOREG, - C_FPSCR, - C_MSR, - C_XER, - C_LR, - C_CTR, - C_ANY, - C_GOK, - C_ADDR, - - C_NCLASS, + MINLC = 4, Roffset = 22, /* no. bits for offset in relocation address */ Rindex = 10 /* no. bits for index in relocation address */ }; -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 vlong INITDAT; /* data location */ -EXTERN long INITRND; /* data round above text location */ -EXTERN vlong 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 Prog* prog_movsw; -EXTERN Prog* prog_movdw; -EXTERN Prog* prog_movws; -EXTERN Prog* prog_movwd; -EXTERN vlong datsize; -EXTERN char debug[128]; -EXTERN Prog* firstp; -EXTERN uchar fnuxi8[8]; -EXTERN uchar fnuxi4[4]; -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 uchar inuxi1[1]; -EXTERN uchar inuxi2[2]; -EXTERN uchar inuxi4[4]; -EXTERN uchar inuxi8[8]; -EXTERN Prog* lastp; -EXTERN long lcsize; +EXTERN int32 autosize; +EXTERN LSym* datap; +EXTERN int debug[128]; +EXTERN int32 lcsize; EXTERN char literal[32]; EXTERN int nerrors; -EXTERN long nhunk; -EXTERN char* noname; EXTERN vlong instoffset; -EXTERN char* outfile; +EXTERN char* rpath; EXTERN vlong pc; -EXTERN int r0iszero; -EXTERN long symsize; -EXTERN long staticgen; -EXTERN Prog* textp; +EXTERN int32 symsize; +EXTERN int32 staticgen; +EXTERN Prog* lastp; EXTERN vlong textsize; -EXTERN long tothunk; -EXTERN char xcmp[C_NCLASS][C_NCLASS]; -EXTERN int version; -EXTERN Prog zprg; -EXTERN int dtype; - -EXTERN int doexp, dlm; -EXTERN int imports, nimports; -EXTERN int exports, nexports, allexport; -EXTERN char* EXPTAB; -EXTERN Prog undefp; - -#define UP (&undefp) - -extern Optab optab[]; -extern char* anames[]; -extern char* cnames[]; -int Aconv(Fmt*); -int Dconv(Fmt*); -int Nconv(Fmt*); -int Pconv(Fmt*); -int Sconv(Fmt*); -int Rconv(Fmt*); -int aclass(Adr*); -void addhist(long, int); -void histtoauto(void); -void addlibpath(char*); -void addnop(Prog*); -void append(Prog*, Prog*); void asmb(void); -void asmdyn(void); -void asmlc(void); -int asmout(Prog*, Optab*, int); -void asmsym(void); -vlong atolwhex(char*); -Prog* brloop(Prog*); -void buildop(void); -void cflush(void); -void ckoff(Sym*, vlong); -int cmp(int, int); -void cput(long); -int compound(Prog*); -double cputime(void); -void datblk(long, long); -void diag(char*, ...); -void dodata(void); -void doprof1(void); -void doprof2(void); -void dynreloc(Sym*, long, int, int, int); -vlong entryvalue(void); -void errorexit(void); -void exchange(Prog*); -void export(void); -int fileexists(char*); -int find1(long, int); -char* findlib(char*); -void follow(void); -void gethunk(void); -double ieeedtod(Ieee*); -long ieeedtof(Ieee*); -void import(void); -int isint32(vlong); -int isuint32(uvlong); -int isnop(Prog*); -void ldobj(int, long, char*); -void loadlib(void); +void adddynlib(char *lib); +void adddynrel(LSym *s, Reloc *r); +void adddynsym(Link *ctxt, LSym *s); +int archreloc(Reloc *r, LSym *s, vlong *val); void listinit(void); -void initmuldiv(void); -Sym* lookup(char*, int); -void llput(vlong); -void llputl(vlong); -void lput(long); -void lputl(long); -void mkfwd(void); -void* mysbrk(ulong); -void names(void); -void nocache(Prog*); -void noops(void); -void nopout(Prog*); -void nuxiinit(void); -void objfile(char*); -int ocmp(void*, void*); -long opcode(int); -Optab* oplook(Prog*); -void patch(void); -void prasm(Prog*); -void prepend(Prog*, Prog*); -Prog* prg(void); -int pseudo(Prog*); -void putsymb(char*, int, vlong, int); -void readundefs(char*, int); -long regoff(Adr*); -int relinv(int); -vlong rnd(vlong, long); -void sched(Prog*, Prog*); -void span(void); -void strnput(char*, int); -void undef(void); -void undefsym(Sym*); -vlong vregoff(Adr*); -void wput(long); -void wputl(long); -void xdefine(char*, int, vlong); -void xfol(Prog*); -void zerosig(char*); +vlong rnd(vlong, int32); -#pragma varargck type "D" Adr* -#pragma varargck type "N" Adr* -#pragma varargck type "P" Prog* -#pragma varargck type "R" int -#pragma varargck type "A" int -#pragma varargck type "S" char* -#pragma varargck argpos diag 1 +#define LPUT(a) (ctxt->arch->endian == BigEndian ? lputb(a):lputl(a)) +#define WPUT(a) (ctxt->arch->endian == BigEndian ? wputb(a):wputl(a)) +#define VPUT(a) (ctxt->arch->endian == BigEndian ? vputb(a):vputl(a)) + +/* Used by ../ld/dwarf.c */ +enum +{ + DWARFREGSP = 1 +}; |