]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.power64] cmd/9l: update header files for liblink
authorShenghou Ma <minux@golang.org>
Thu, 7 Aug 2014 18:56:59 +0000 (14:56 -0400)
committerShenghou Ma <minux@golang.org>
Thu, 7 Aug 2014 18:56:59 +0000 (14:56 -0400)
LGTM=rsc
R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/128720044

src/cmd/9c/gc.h
src/cmd/9l/9.out.h
src/cmd/9l/l.h

index 1c7d7837a0f0ce6efa5a648c2dca82d7f2d916f5..82204902b78b4347d6007d0c8acd35db277056cf 100644 (file)
@@ -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
index 8ad2f7d06dabf2f5c356af5456a742c30245f0b9..6e4f9ee1b6ee90a86870d9a9d7019a8e70ec06fd 100644 (file)
@@ -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"
index 0f2fd60a82ad90c8cd3e124142d58bdc1f1905b1..d787f1384432f83f73ffd5fdaa8028a6a320db72 100644 (file)
 #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
+};