l.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include "../2c/2.out.h"
  5. #ifndef EXTERN
  6. #define EXTERN extern
  7. #endif
  8. #define P ((Prog*)0)
  9. #define S ((Sym*)0)
  10. #define TNAME (curtext?curtext->from.sym->name:noname)
  11. #define CPUT(c)\
  12. { *cbp++ = c;\
  13. if(--cbc <= 0)\
  14. cflush(); }
  15. typedef struct Adr Adr;
  16. typedef struct Prog Prog;
  17. typedef struct Sym Sym;
  18. typedef struct Auto Auto;
  19. typedef struct Optab Optab;
  20. struct Adr
  21. {
  22. short type;
  23. short index;
  24. union
  25. {
  26. struct
  27. {
  28. long u0displace;
  29. long u0offset;
  30. } s0;
  31. char u0scon[8];
  32. Prog *u0cond; /* not used, but should be D_BRANCH */
  33. Ieee u0ieee;
  34. } u0;
  35. union
  36. {
  37. Auto* u1autom;
  38. Sym* u1sym;
  39. } u1;
  40. uchar field;
  41. uchar scale;
  42. };
  43. #define displace u0.s0.u0displace
  44. #define offset u0.s0.u0offset
  45. #define scon u0.u0scon
  46. #define cond u0.u0cond
  47. #define ieee u0.u0ieee
  48. #define autom u1.u1autom
  49. #define sym u1.u1sym
  50. struct Prog
  51. {
  52. Adr from;
  53. Adr to;
  54. union
  55. {
  56. long u0stkoff;
  57. Prog *u0forwd;
  58. } u0;
  59. Prog* link;
  60. Prog* pcond; /* work on this */
  61. long pc;
  62. long line;
  63. short as;
  64. uchar mark; /* work on these */
  65. uchar back;
  66. };
  67. #define stkoff u0.u0stkoff
  68. #define forwd u0.u0forwd
  69. struct Auto
  70. {
  71. Sym* asym;
  72. Auto* link;
  73. long aoffset;
  74. short type;
  75. };
  76. struct Sym
  77. {
  78. char *name;
  79. short type;
  80. short version;
  81. short become;
  82. short frame;
  83. long value;
  84. Sym* link;
  85. };
  86. struct Optab
  87. {
  88. short as;
  89. short fas;
  90. short srcsp;
  91. short dstsp;
  92. ushort optype;
  93. ushort opcode0;
  94. ushort opcode1;
  95. ushort opcode2;
  96. ushort opcode3;
  97. };
  98. enum
  99. {
  100. STEXT = 1,
  101. SDATA,
  102. SBSS,
  103. SDATA1,
  104. SXREF,
  105. SAUTO,
  106. SPARAM,
  107. SFILE,
  108. NHASH = 10007,
  109. NHUNK = 100000,
  110. MINSIZ = 4,
  111. STRINGSZ = 200,
  112. MAXIO = 8192,
  113. MAXHIST = 20, /* limit of path elements for history symbols */
  114. A6OFFSET = 32766
  115. };
  116. EXTERN union
  117. {
  118. struct
  119. {
  120. char obuf[MAXIO]; /* output buffer */
  121. uchar ibuf[MAXIO]; /* input buffer */
  122. } u;
  123. char dbuf[1];
  124. } buf;
  125. #define cbuf u.obuf
  126. #define xbuf u.ibuf
  127. EXTERN long HEADR;
  128. EXTERN long HEADTYPE;
  129. EXTERN long INITDAT;
  130. EXTERN long INITRND;
  131. EXTERN long INITTEXT;
  132. EXTERN char* INITENTRY; /* entry point */
  133. EXTERN Biobuf bso;
  134. EXTERN long bsssize;
  135. EXTERN long casepc;
  136. EXTERN int cbc;
  137. EXTERN char* cbp;
  138. EXTERN int cout;
  139. EXTERN Auto* curauto;
  140. EXTERN Auto* curhist;
  141. EXTERN Prog* curp;
  142. EXTERN Prog* curtext;
  143. EXTERN Prog* datap;
  144. EXTERN long datsize;
  145. EXTERN char debug[128];
  146. EXTERN Prog* etextp;
  147. EXTERN Prog* firstp;
  148. EXTERN char fnuxi8[8];
  149. EXTERN char gnuxi8[8];
  150. EXTERN Sym* hash[NHASH];
  151. EXTERN Sym* histfrog[MAXHIST];
  152. EXTERN int histfrogp;
  153. EXTERN int histgen;
  154. EXTERN char* library[50];
  155. EXTERN char* libraryobj[50];
  156. EXTERN int libraryp;
  157. EXTERN int xrefresolv;
  158. EXTERN char* hunk;
  159. EXTERN char inuxi1[1];
  160. EXTERN char inuxi2[2];
  161. EXTERN char inuxi4[4];
  162. EXTERN Prog* lastp;
  163. EXTERN long lcsize;
  164. EXTERN long ncase;
  165. EXTERN long ndata;
  166. EXTERN int nerrors;
  167. EXTERN long nhunk;
  168. EXTERN long nsymbol;
  169. EXTERN char* noname;
  170. EXTERN short* op;
  171. EXTERN char* outfile;
  172. EXTERN long pc;
  173. EXTERN char simple[I_MASK];
  174. EXTERN char special[I_MASK];
  175. EXTERN long spsize;
  176. EXTERN Sym* symlist;
  177. EXTERN long symsize;
  178. EXTERN Prog* textp;
  179. EXTERN long textsize;
  180. EXTERN long thunk;
  181. EXTERN int version;
  182. EXTERN Prog zprg;
  183. extern Optab optab[];
  184. extern char mmsize[];
  185. extern char* anames[];
  186. #pragma varargck type "A" int
  187. #pragma varargck type "D" Adr*
  188. #pragma varargck type "P" Prog*
  189. #pragma varargck type "R" int
  190. #pragma varargck type "S" char*
  191. int Aconv(Fmt*);
  192. int Dconv(Fmt*);
  193. int Pconv(Fmt*);
  194. int Rconv(Fmt*);
  195. int Sconv(Fmt*);
  196. int Xconv(Fmt*);
  197. void addhist(long, int);
  198. int andsize(Prog*, Adr*);
  199. Prog* appendp(Prog*);
  200. void asmb(void);
  201. int asmea(Prog*, Adr*);
  202. void asmins(Prog*);
  203. void asmlc(void);
  204. void asmsp(void);
  205. void asmsym(void);
  206. long atolwhex(char*);
  207. Prog* brchain(Prog*);
  208. Prog* brloop(Prog*);
  209. void cflush(void);
  210. Prog* copyp(Prog*);
  211. double cputime(void);
  212. void datblk(long, long);
  213. void diag(char*, ...);
  214. void dodata(void);
  215. void doprof1(void);
  216. void doprof2(void);
  217. void dostkoff(void);
  218. long entryvalue(void);
  219. void errorexit(void);
  220. int find1(long, int);
  221. int find2(long, int);
  222. void follow(void);
  223. void gethunk(void);
  224. int gnuxi(Ieee*, int, int);
  225. void histtoauto(void);
  226. double ieeedtod(Ieee*);
  227. long ieeedtof(Ieee*);
  228. void ldobj(int, long, char*);
  229. void loadlib(void);
  230. void listinit(void);
  231. Sym* lookup(char*, int);
  232. void lput(long);
  233. void main(int, char*[]);
  234. void mkfwd(void);
  235. void* mysbrk(ulong);
  236. void nuxiinit(void);
  237. void objfile(char*);
  238. void patch(void);
  239. Prog* prg(void);
  240. int relinv(int);
  241. long reuse(Prog*, Sym*);
  242. long rnd(long, long);
  243. void s16put(char*);
  244. void span(void);
  245. void undef(void);
  246. void xdefine(char*, int, long);
  247. void xfol(Prog*);
  248. int zaddr(uchar*, Adr*, Sym*[]);