1
0
mirror of https://github.com/golang/go synced 2024-10-04 08:21:22 -06:00

[dev.power64] cmd/9l: update header files for liblink

LGTM=rsc
R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/128720044
This commit is contained in:
Shenghou Ma 2014-08-07 14:56:59 -04:00
parent bcf7f61f83
commit 7c33e5078f
3 changed files with 114 additions and 336 deletions

View File

@ -281,7 +281,6 @@ void nullwarn(Node*, Node*);
void sextern(Sym*, Node*, int32, int32); void sextern(Sym*, Node*, int32, int32);
void gextern(Sym*, Node*, int32, int32); void gextern(Sym*, Node*, int32, int32);
void outcode(void); void outcode(void);
void ieeedtod(Ieee*, double);
/* /*
* list * list

View File

@ -34,8 +34,7 @@
#define NSYM 50 #define NSYM 50
#define NREG 32 #define NREG 32
#define NOPROF (1<<0) #include "../ld/textflag.h"
#define DUPOK (1<<1)
enum enum
{ {
@ -43,14 +42,16 @@ enum
REGSP = 1, REGSP = 1,
REGSB = 2, REGSB = 2,
REGRET = 3, REGRET = 3,
REGARG = 3, REGARG = -1, /* -1 disables passing the first argument in register */
REGMIN = 7, /* register variables allocated from here to REGMAX */ REGMIN = 7, /* register variables allocated from here to REGMAX */
REGENV = 11, /* environment variable for closures */
REGMAX = 27, REGMAX = 27,
REGEXT = 30, /* external registers allocated from here down */ REGEXT = 30, /* external registers allocated from here down */
REGTMP = 31, /* used by the linker */ REGTMP = 31, /* used by the linker */
FREGRET = 0, FREGRET = 0,
FREGMIN = 17, /* first register variable */ FREGMIN = 17, /* first register variable */
FREGMAX = 26, /* last register variable for 9g only */
FREGEXT = 26, /* first external register */ FREGEXT = 26, /* first external register */
FREGCVI = 27, /* floating conversion constant */ FREGCVI = 27, /* floating conversion constant */
FREGZERO = 28, /* both float and double */ 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 enum as
{ {
AXXX = 0, AXXX,
AADD, AADD,
AADDCC, AADDCC,
AADDV, AADDV,
@ -390,6 +448,17 @@ enum as
/* more 64-bit operations */ /* more 64-bit operations */
AHRFID, AHRFID,
AUNDEF,
AUSEFIELD,
ATYPE,
AFUNCDATA,
APCDATA,
ACHECKNIL,
AVARDEF,
AVARKILL,
ADUFFCOPY,
ADUFFZERO,
ALAST ALAST
}; };
@ -422,6 +491,11 @@ enum
D_FILE1, D_FILE1,
D_DCR, /* device control register */ D_DCR, /* device control register */
D_DCONST, 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 */ /* reg names iff type is D_SPR */
D_XER = 1, D_XER = 1,
@ -433,16 +507,4 @@ enum
/* /*
* this is the ranlib header * this is the ranlib header
*/ */
#define SYMDEF "__.SYMDEF" #define SYMDEF "__.GOSYMDEF"
/*
* 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 */
};

View File

@ -30,102 +30,29 @@
#include <u.h> #include <u.h>
#include <libc.h> #include <libc.h>
#include <bio.h> #include <bio.h>
#include "../9c/9.out.h" #include <link.h>
#include "../8l/elf.h" #include "9.out.h"
#ifndef EXTERN #ifndef EXTERN
#define EXTERN extern #define EXTERN extern
#endif #endif
#define LIBNAMELEN 300 enum
{
typedef struct Adr Adr; thechar = '9',
typedef struct Sym Sym; PtrSize = 8,
typedef struct Autom Auto; IntSize = 8,
typedef struct Prog Prog; RegSize = 8,
typedef struct Optab Optab; MaxAlign = 32, // max data alignment
FuncAlign = 8
};
#define P ((Prog*)0) #define P ((Prog*)0)
#define S ((Sym*)0) #define S ((LSym*)0)
#define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname)
struct Adr
{
union
{
vlong u0offset;
char u0sval[NSNAME];
Ieee u0ieee;
}u0;
Sym *sym;
Auto *autom;
char type;
uchar reg;
char name;
char class;
};
#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];
enum enum
{ {
FPCHIP = 1, FPCHIP = 1,
BIG = 32768-8,
STRINGSZ = 200, STRINGSZ = 200,
MAXIO = 8192, MAXIO = 8192,
MAXHIST = 20, /* limit of path elements for history symbols */ MAXHIST = 20, /* limit of path elements for history symbols */
@ -135,250 +62,40 @@ enum
MINSIZ = 64, MINSIZ = 64,
NENT = 100, NENT = 100,
NSCHED = 20, NSCHED = 20,
MINLC = 4,
/* 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,
Roffset = 22, /* no. bits for offset in relocation address */ Roffset = 22, /* no. bits for offset in relocation address */
Rindex = 10 /* no. bits for index in relocation address */ Rindex = 10 /* no. bits for index in relocation address */
}; };
EXTERN union EXTERN int32 autosize;
{ EXTERN LSym* datap;
struct EXTERN int debug[128];
{ EXTERN int32 lcsize;
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 char literal[32]; EXTERN char literal[32];
EXTERN int nerrors; EXTERN int nerrors;
EXTERN long nhunk;
EXTERN char* noname;
EXTERN vlong instoffset; EXTERN vlong instoffset;
EXTERN char* outfile; EXTERN char* rpath;
EXTERN vlong pc; EXTERN vlong pc;
EXTERN int r0iszero; EXTERN int32 symsize;
EXTERN long symsize; EXTERN int32 staticgen;
EXTERN long staticgen; EXTERN Prog* lastp;
EXTERN Prog* textp;
EXTERN vlong textsize; 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 asmb(void);
void asmdyn(void); void adddynlib(char *lib);
void asmlc(void); void adddynrel(LSym *s, Reloc *r);
int asmout(Prog*, Optab*, int); void adddynsym(Link *ctxt, LSym *s);
void asmsym(void); int archreloc(Reloc *r, LSym *s, vlong *val);
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 listinit(void); void listinit(void);
void initmuldiv(void); vlong rnd(vlong, int32);
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*);
#pragma varargck type "D" Adr* #define LPUT(a) (ctxt->arch->endian == BigEndian ? lputb(a):lputl(a))
#pragma varargck type "N" Adr* #define WPUT(a) (ctxt->arch->endian == BigEndian ? wputb(a):wputl(a))
#pragma varargck type "P" Prog* #define VPUT(a) (ctxt->arch->endian == BigEndian ? vputb(a):vputl(a))
#pragma varargck type "R" int
#pragma varargck type "A" int /* Used by ../ld/dwarf.c */
#pragma varargck type "S" char* enum
#pragma varargck argpos diag 1 {
DWARFREGSP = 1
};