summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShenghou Ma <minux@golang.org>2014-08-07 14:56:59 -0400
committerShenghou Ma <minux@golang.org>2014-08-07 14:56:59 -0400
commitd5f5813e711b9578d598b468f81898f4915fca81 (patch)
tree746352a0b88b65691fb817413513ad924e9a5f00
parent0178f2a25fe69bf71ea233df543f42267bc2e526 (diff)
downloadgo-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
-rw-r--r--src/cmd/9c/gc.h1
-rw-r--r--src/cmd/9l/9.out.h96
-rw-r--r--src/cmd/9l/l.h351
3 files changed, 113 insertions, 335 deletions
diff --git a/src/cmd/9c/gc.h b/src/cmd/9c/gc.h
index 1c7d7837a..82204902b 100644
--- a/src/cmd/9c/gc.h
+++ b/src/cmd/9c/gc.h
@@ -281,7 +281,6 @@ void nullwarn(Node*, Node*);
void sextern(Sym*, Node*, int32, int32);
void gextern(Sym*, Node*, int32, int32);
void outcode(void);
-void ieeedtod(Ieee*, double);
/*
* list
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
+};