summaryrefslogtreecommitdiff
path: root/src/cmd/5l/l.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/5l/l.h')
-rw-r--r--src/cmd/5l/l.h57
1 files changed, 44 insertions, 13 deletions
diff --git a/src/cmd/5l/l.h b/src/cmd/5l/l.h
index b1a48ded8..62dd8947f 100644
--- a/src/cmd/5l/l.h
+++ b/src/cmd/5l/l.h
@@ -36,7 +36,9 @@
enum
{
thechar = '5',
- PtrSize = 4
+ PtrSize = 4,
+ IntSize = 4,
+ FuncAlign = 4 // single-instruction alignment
};
#ifndef EXTERN
@@ -66,22 +68,24 @@ struct Adr
{
union
{
- int32 u0offset;
+ struct {
+ int32 u0offset;
+ int32 u0offset2; // argsize
+ } u0off;
char* u0sval;
Ieee u0ieee;
char* u0sbig;
} u0;
Sym* sym;
+ Sym* gotype;
char type;
- uchar index; // not used on arm, required by ld/go.c
char reg;
char name;
- int32 offset2; // argsize
char class;
- Sym* gotype;
};
-#define offset u0.u0offset
+#define offset u0.u0off.u0offset
+#define offset2 u0.u0off.u0offset2
#define sval u0.u0sval
#define scon sval
#define ieee u0.u0ieee
@@ -107,7 +111,7 @@ struct Prog
} u0;
Prog* cond;
Prog* link;
- Prog* dlink;
+ Prog* pcrel;
int32 pc;
int32 line;
int32 spadj;
@@ -116,7 +120,7 @@ struct Prog
uchar as;
uchar scond;
uchar reg;
- uchar align;
+ uchar align; // unused
};
#define regused u0.u0regused
@@ -135,8 +139,6 @@ struct Sym
uchar reachable;
uchar dynexport;
uchar leaf;
- uchar stkcheck;
- uchar hide;
int32 dynid;
int32 plt;
int32 got;
@@ -144,18 +146,26 @@ struct Sym
int32 sig;
int32 size;
int32 align; // if non-zero, required alignment in bytes
+ int32 elfsym;
+ int32 locals; // size of stack frame locals area
+ int32 args; // size of stack frame incoming arguments area
uchar special;
uchar fnptr; // used as fn ptr
+ uchar stkcheck;
+ uchar hide;
Sym* hash; // in hash table
Sym* allsym; // in all symbol list
Sym* next; // in text or data list
Sym* sub; // in SSUB list
Sym* outer; // container of sub
Sym* gotype;
+ Sym* reachparent;
+ Sym* queue;
char* file;
char* dynimpname;
char* dynimplib;
char* dynimpvers;
+ struct Section* sect;
// STEXT
Auto* autom;
@@ -168,6 +178,7 @@ struct Sym
Reloc* r;
int32 nr;
int32 maxr;
+ int rel_ro;
};
#define SIGNINTERN (1729*325*1729)
@@ -190,6 +201,7 @@ struct Optab
char size;
char param;
char flag;
+ uchar pcrelsiz;
};
struct Oprang
{
@@ -207,10 +219,12 @@ enum
LFROM = 1<<0,
LTO = 1<<1,
LPOOL = 1<<2,
+ LPCREL = 1<<3,
C_NONE = 0,
C_REG,
C_REGREG,
+ C_REGREG2,
C_SHIFT,
C_FREG,
C_PSR,
@@ -220,6 +234,7 @@ enum
C_NCON, /* ~RCON */
C_SCON, /* 0xffff */
C_LCON,
+ C_LCONADDR,
C_ZFCON,
C_SFCON,
C_LFCON,
@@ -273,6 +288,7 @@ EXTERN int32 INITDAT; /* data location */
EXTERN int32 INITRND; /* data round above text location */
EXTERN int32 INITTEXT; /* text location */
EXTERN char* INITENTRY; /* entry point */
+EXTERN char* LIBINITENTRY; /* shared library entry point */
EXTERN int32 autosize;
EXTERN Auto* curauto;
EXTERN Auto* curhist;
@@ -280,7 +296,7 @@ EXTERN Prog* curp;
EXTERN Sym* cursym;
EXTERN Sym* datap;
EXTERN int32 elfdatsize;
-EXTERN char debug[128];
+EXTERN int debug[128];
EXTERN Sym* etextp;
EXTERN char* noname;
EXTERN Prog* lastp;
@@ -298,12 +314,15 @@ EXTERN char* rpath;
EXTERN uint32 stroffset;
EXTERN int32 symsize;
EXTERN Sym* textp;
-EXTERN int32 textsize;
EXTERN int version;
EXTERN char xcmp[C_GOK+1][C_GOK+1];
EXTERN Prog zprg;
EXTERN int dtype;
+EXTERN int tlsoffset;
EXTERN int armsize;
+EXTERN int goarm;
+EXTERN Sym* adrgotype; // type symbol on last Adr read
+EXTERN Sym* fromgotype; // type symbol on last p->from read
extern char* anames[];
extern Optab optab[];
@@ -312,6 +331,8 @@ void addpool(Prog*, Adr*);
EXTERN Prog* blitrl;
EXTERN Prog* elitrl;
+EXTERN int goarm;
+
void initdiv(void);
EXTERN Prog* prog_div;
EXTERN Prog* prog_divu;
@@ -398,6 +419,9 @@ void span(void);
void strnput(char*, int);
int32 symaddr(Sym*);
void undef(void);
+void vputb(uint64);
+void vputl(uint64);
+void wputb(uint16);
void wput(int32);
void wputl(ushort w);
void xdefine(char*, int, int32);
@@ -407,8 +431,9 @@ int32 immaddr(int32);
int32 opbra(int, int);
int brextra(Prog*);
int isbranch(Prog*);
-void fnptrs(void);
+void fnptrs(void);
void doelf(void);
+void dozerostk(void); // used by -Z
vlong addaddr(Sym *s, Sym *t);
vlong addsize(Sym *s, Sym *t);
@@ -425,3 +450,9 @@ vlong adduintxx(Sym *s, uint64 v, int wid);
#define VPUT(a) abort()
#endif
+
+/* Used by ../ld/dwarf.c */
+enum
+{
+ DWARFREGSP = 13
+};