1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../ld/elf.h" 5 6 typedef vlong int64; 7 8 /* 9 * basic types in all loaders 10 */ 11 12 typedef struct Adr Adr; 13 typedef struct Auto Auto; 14 typedef struct Count Count; 15 typedef struct Ieee Ieee; 16 typedef struct Prog Prog; 17 typedef struct Sym Sym; 18 19 #ifndef EXTERN 20 #define EXTERN extern 21 #endif 22 23 #define LIBNAMELEN 300 24 25 #define P ((Prog*)0) 26 #define S ((Sym*)0) 27 #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 28 29 struct Auto 30 { 31 Sym* asym; 32 Auto* link; 33 vlong aoffset; 34 short type; 35 }; 36 37 struct Count 38 { 39 long count; 40 long outof; 41 }; 42 43 enum 44 { 45 46 STRINGSZ = 200, 47 NHASH = 10007, 48 NHUNK = 100000, 49 MAXIO = 16*1024, 50 MAXHIST = 20, /* limit of path elements for history symbols */ 51 }; 52 53 #define SIGNINTERN (1729*325*1729) /* signature of internal functions such as _div */ 54 55 EXTERN union 56 { 57 struct 58 { 59 uchar obuf[MAXIO]; /* output buffer */ 60 uchar ibuf[MAXIO]; /* input buffer */ 61 } u; 62 char dbuf[1]; 63 } buf; 64 65 #define cbuf u.obuf 66 #define xbuf u.ibuf 67 68 EXTERN int cbc; 69 EXTERN uchar* cbp; 70 EXTERN int cout; 71 EXTERN char debug[128]; 72 EXTERN char fnuxi4[4]; 73 EXTERN char fnuxi8[8]; 74 EXTERN Sym* hash[NHASH]; 75 EXTERN Sym* histfrog[MAXHIST]; 76 EXTERN int histfrogp; 77 EXTERN int histgen; 78 EXTERN char* library[50]; 79 EXTERN char* libraryobj[50]; 80 EXTERN int libraryp; 81 EXTERN int xrefresolv; 82 EXTERN char inuxi1[1]; 83 EXTERN char inuxi2[2]; 84 EXTERN char inuxi4[4]; 85 EXTERN uchar inuxi8[8]; 86 EXTERN char* thestring; 87 EXTERN char thechar; 88 89 EXTERN int doexp, dlm; 90 EXTERN int imports, nimports; 91 EXTERN int exports, nexports; 92 EXTERN char* EXPTAB; 93 EXTERN Prog undefp; 94 95 #define UP (&undefp) 96 97 int Sconv(Fmt*); 98 void addhist(long, int); 99 void addlib(char*); 100 void addlibpath(char*); 101 void addlibroot(void); 102 vlong atolwhex(char*); 103 Prog* brchain(Prog*); 104 Prog* brloop(Prog*); 105 void cflush(void); 106 void ckoff(Sym*, long); 107 void collapsefrog(Sym*); 108 void cput(int); 109 void diag(char*, ...); 110 void errorexit(void); 111 double cputime(void); 112 void dodata(void); 113 void export(void); 114 int fileexists(char*); 115 int find1(long, int); 116 char* findlib(char*); 117 char* findlib(char*); 118 void follow(void); 119 void gethunk(void); 120 long hunkspace(void); 121 uchar* readsome(int, uchar*, uchar*, uchar*, int); 122 void* halloc(usize); 123 void histtoauto(void); 124 double ieeedtod(Ieee*); 125 long ieeedtof(Ieee*); 126 void import(void); 127 int isobjfile(char*); 128 void loadlib(void); 129 Sym* lookup(char*, int); 130 void mkfwd(void); 131 void* mysbrk(ulong); 132 void nopstat(char*, Count*); 133 void objfile(char*); 134 void patch(void); 135 void prasm(Prog*); 136 Prog* prg(void); 137 void readundefs(char*, int); 138 uchar* readsome(int, uchar*, uchar*, uchar*, int); 139 void readundefs(char*, int); 140 vlong rnd(vlong, long); 141 void strnput(char*, int); 142 void undef(void); 143 void undefsym(Sym*); 144 void xdefine(char*, int, vlong); 145 void xfol(Prog*); 146 void zerosig(char*); 147 148 #pragma varargck type "A" int 149 #pragma varargck type "A" uint 150 #pragma varargck type "C" int 151 #pragma varargck type "D" Adr* 152 #pragma varargck type "N" Adr* 153 #pragma varargck type "P" Prog* 154 #pragma varargck type "S" char* 155 156 #pragma varargck argpos diag 1 157