66
69
#define P ((Prog*)0)
68
#define TNAME (cursym?cursym->name:noname)
70
typedef struct Adr Adr;
71
typedef struct Prog Prog;
72
typedef struct Sym Sym;
73
typedef struct Auto Auto;
74
typedef struct Optab Optab;
75
typedef struct Movtab Movtab;
76
typedef struct Reloc Reloc;
84
Prog *u0cond; /* not used, but should be D_BRANCH */
94
#define offset u0.u0offset
95
#define scon u0.u0scon
96
#define cond u0.u0cond
97
#define ieee u0.u0ieee
98
#define sbig u0.u0sbig
119
Prog* pcond; /* work on this */
124
char ft; /* oclass cache */
126
uchar mark; /* work on these */
129
char width; /* fake for DATA */
130
char mode; /* 16, 32, or 64 */
132
#define datasize from.scale
133
#define textflag from.scale
134
#define iscall(p) ((p)->as == ACALL)
147
char* extname; // name used in external object files
160
int32 align; // if non-zero, required alignment in bytes
162
int32 args; // size of stack frame incoming arguments area
163
Sym* hash; // in hash table
164
Sym* allsym; // in all symbol list
165
Sym* next; // in text or data list
166
Sym* sub; // in SSUB list
167
Sym* outer; // container of sub
176
struct Section* sect;
177
struct Hist* hist; // for ATEXT
71
#define TNAME (ctxt->cursym?ctxt->cursym->name:noname)
213
78
MAXHIST = 40, /* limit of path elements for history symbols */
239
Ycs, Yss, Yds, Yes, Yfs, Ygs,
240
Ygdtr, Yidtr, Yldtr, Ymsw, Ytask,
241
Ycr0, Ycr1, Ycr2, Ycr3, Ycr4, Ycr5, Ycr6, Ycr7, Ycr8,
242
Ydr0, Ydr1, Ydr2, Ydr3, Ydr4, Ydr5, Ydr6, Ydr7,
243
Ytr0, Ytr1, Ytr2, Ytr3, Ytr4, Ytr5, Ytr6, Ytr7, Yrl32, Yrl64,
275
Zibm_r, /* mmx1,mmx2/mem64,imm8 */
296
P32 = 0x32, /* 32-bit only */
297
Pe = 0x66, /* operand escape */
298
Pm = 0x0f, /* 2byte opcode escape */
299
Pq = 0xff, /* both escapes: 66 0f */
300
Pb = 0xfe, /* byte operands */
301
Pf2 = 0xf2, /* xmm escape 1: f2 0f */
302
Pf3 = 0xf3, /* xmm escape 2: f3 0f */
303
Pq3 = 0x67, /* xmm escape 3: 66 48 0f */
304
Pw = 0x48, /* Rex.w */
305
Py = 0x80, /* defaults to 64-bit mode */
307
Rxf = 1<<9, /* internal flag for Rxr on from */
308
Rxt = 1<<8, /* internal flag for Rxr on to */
309
Rxw = 1<<3, /* =1, 64-bit operand size */
310
Rxr = 1<<2, /* extend modrm reg */
311
Rxx = 1<<1, /* extend sib index */
312
Rxb = 1<<0, /* extend modrm r/m, sib base, or opcode reg */
314
Maxand = 10, /* in -a output width of the byte codes */
317
#pragma varargck type "A" uint
318
#pragma varargck type "D" Adr*
319
81
#pragma varargck type "I" uchar*
320
#pragma varargck type "P" Prog*
321
#pragma varargck type "R" int
322
#pragma varargck type "S" char*
323
#pragma varargck type "i" char*
326
EXTERN int32 HEADTYPE;
327
EXTERN int32 INITRND;
328
EXTERN int64 INITTEXT;
329
EXTERN int64 INITDAT;
330
EXTERN char* INITENTRY; /* entry point */
332
EXTERN Auto* curauto;
333
EXTERN Auto* curhist;
337
84
EXTERN int debug[128];
338
85
EXTERN char literal[32];
341
EXTERN char ycover[Ymax*Ymax];
342
EXTERN uchar* andptr;
343
EXTERN uchar* rexptr;
344
EXTERN uchar and[30];
345
EXTERN int reg[D_NONE];
346
EXTERN int regrex[D_NONE+1];
347
86
EXTERN int32 lcsize;
350
EXTERN char* outfile;
352
EXTERN char* interpreter;
353
87
EXTERN char* rpath;
354
88
EXTERN int32 spsize;
356
90
EXTERN int32 symsize;
357
EXTERN int tlsoffset;
360
EXTERN char* paramspace;
361
EXTERN Sym* adrgotype; // type symbol on last Adr read
362
EXTERN Sym* fromgotype; // type symbol on last p->from read
364
92
EXTERN vlong textstksiz;
365
93
EXTERN vlong textarg;
367
extern Optab optab[];
368
extern Optab* opindex[];
369
extern char* anames[];
377
void addhist(int32, int);
378
void addstackmark(void);
379
Prog* appendp(Prog*);
96
void adddynlib(char *lib);
97
void adddynrel(LSym *s, Reloc *r);
98
void adddynrela(LSym *rela, LSym *s, Reloc *r);
99
void adddynsym(Link *ctxt, LSym *s);
100
int archreloc(Reloc *r, LSym *s, vlong *val);
384
void asmelfsym(void);
385
vlong atolwhex(char*);
386
Prog* brchain(Prog*);
390
double cputime(void);
391
void datblk(int32, int32);
393
void diag(char*, ...);
400
vlong entryvalue(void);
403
void gotypestrings(void);
102
int elfreloc1(Reloc *r, vlong sectoff);
103
void elfsetupplt(void);
404
104
void listinit(void);
405
Sym* lookup(char*, int);
409
void main(int, char*[]);
410
void* mysbrk(uint32);
411
Prog* newtext(Prog*, Sym*);
416
void parsetextconst(vlong);
418
vlong rnd(vlong, vlong);
426
void xdefine(char*, int, vlong);
428
void machseg(char*, vlong, vlong, vlong, vlong, uint32, uint32, uint32, uint32);
429
void machsymseg(uint32, uint32);
430
void machsect(char*, char*, vlong, vlong, uint32, uint32, uint32, uint32, uint32);
431
void machstack(vlong);
432
void machdylink(void);
433
uint32 machheadr(void);
105
int machoreloc1(Reloc *r, vlong sectoff);
106
void main(int argc, char *argv[]);
107
void parsetextconst(vlong arg);
108
vlong rnd(vlong v, vlong r);
435
110
/* Native is little-endian */
436
111
#define LPUT(a) lputl(a)
437
112
#define WPUT(a) wputl(a)
438
113
#define VPUT(a) vputl(a)
440
#pragma varargck type "D" Adr*
441
#pragma varargck type "P" Prog*
442
#pragma varargck type "R" int
443
#pragma varargck type "Z" char*
444
#pragma varargck type "A" int
445
#pragma varargck argpos diag 1
447
115
/* Used by ../ld/dwarf.c */