l.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include "../qc/q.out.h"
  5. typedef struct Adr Adr;
  6. typedef struct Sym Sym;
  7. typedef struct Autom Auto;
  8. typedef struct Prog Prog;
  9. typedef struct Optab Optab;
  10. #define P ((Prog*)0)
  11. #define S ((Sym*)0)
  12. #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname)
  13. struct Adr
  14. {
  15. union
  16. {
  17. long offset;
  18. char sval[NSNAME];
  19. Ieee ieee;
  20. };
  21. Sym *sym;
  22. Auto *autom;
  23. char type;
  24. uchar reg;
  25. char name;
  26. char class;
  27. };
  28. struct Prog
  29. {
  30. Adr from;
  31. Adr from3; /* fma and rlwm */
  32. Adr to;
  33. Prog *forwd;
  34. Prog *cond;
  35. Prog *link;
  36. long pc;
  37. long regused;
  38. short line;
  39. short mark;
  40. short optab; /* could be uchar */
  41. uchar as;
  42. char reg;
  43. };
  44. struct Sym
  45. {
  46. char *name;
  47. short type;
  48. short version;
  49. short become;
  50. short frame;
  51. long value;
  52. Sym *link;
  53. };
  54. struct Autom
  55. {
  56. Sym *sym;
  57. Auto *link;
  58. long offset;
  59. short type;
  60. };
  61. struct Optab
  62. {
  63. uchar as;
  64. char a1;
  65. char a2;
  66. char a3;
  67. char a4;
  68. char type;
  69. char size;
  70. char param;
  71. };
  72. struct
  73. {
  74. Optab* start;
  75. Optab* stop;
  76. } oprange[AEND];
  77. enum
  78. {
  79. FPCHIP = 1,
  80. BIG = 32768-8,
  81. STRINGSZ = 200,
  82. MAXIO = 8192,
  83. MAXHIST = 20, /* limit of path elements for history symbols */
  84. DATBLK = 1024,
  85. NHASH = 10007,
  86. NHUNK = 100000,
  87. MINSIZ = 64,
  88. NENT = 100,
  89. NSCHED = 20,
  90. /* mark flags */
  91. LABEL = 1<<0,
  92. LEAF = 1<<1,
  93. FLOAT = 1<<2,
  94. BRANCH = 1<<3,
  95. LOAD = 1<<4,
  96. FCMP = 1<<5,
  97. SYNC = 1<<6,
  98. LIST = 1<<7,
  99. FOLL = 1<<8,
  100. NOSCHED = 1<<9,
  101. STEXT = 1,
  102. SDATA,
  103. SBSS,
  104. SDATA1,
  105. SXREF,
  106. SLEAF,
  107. SFILE,
  108. SCONST,
  109. C_NONE = 0,
  110. C_REG,
  111. C_FREG,
  112. C_CREG,
  113. C_SPR, /* special processor register */
  114. C_SREG, /* segment register (32 bit implementations only) */
  115. C_ZCON,
  116. C_SCON, /* 16 bit signed */
  117. C_UCON, /* low 16 bits 0 */
  118. C_ADDCON, /* -0x8000 <= v < 0 */
  119. C_ANDCON, /* 0 < v <= 0xFFFF */
  120. C_LCON, /* other */
  121. C_SACON,
  122. C_SECON,
  123. C_LACON,
  124. C_LECON,
  125. C_SBRA,
  126. C_LBRA,
  127. C_SAUTO,
  128. C_LAUTO,
  129. C_SEXT,
  130. C_LEXT,
  131. C_ZOREG,
  132. C_SOREG,
  133. C_LOREG,
  134. C_FPSCR,
  135. C_MSR,
  136. C_XER,
  137. C_LR,
  138. C_CTR,
  139. C_ANY,
  140. C_GOK,
  141. C_NCLASS
  142. };
  143. union
  144. {
  145. struct
  146. {
  147. uchar cbuf[MAXIO]; /* output buffer */
  148. uchar xbuf[MAXIO]; /* input buffer */
  149. };
  150. char dbuf[1];
  151. } buf;
  152. long HEADR; /* length of header */
  153. int HEADTYPE; /* type of header */
  154. long INITDAT; /* data location */
  155. long INITRND; /* data round above text location */
  156. long INITTEXT; /* text location */
  157. char* INITENTRY; /* entry point */
  158. long autosize;
  159. Biobuf bso;
  160. long bsssize;
  161. int cbc;
  162. uchar* cbp;
  163. int cout;
  164. Auto* curauto;
  165. Auto* curhist;
  166. Prog* curp;
  167. Prog* curtext;
  168. Prog* datap;
  169. Prog* prog_movsw;
  170. Prog* prog_movdw;
  171. Prog* prog_movws;
  172. Prog* prog_movwd;
  173. long datsize;
  174. char debug[128];
  175. Prog* firstp;
  176. char fnuxi8[8];
  177. Sym* hash[NHASH];
  178. Sym* histfrog[MAXHIST];
  179. int histfrogp;
  180. int histgen;
  181. char* library[50];
  182. char* libraryobj[50];
  183. int libraryp;
  184. int xrefresolv;
  185. char* hunk;
  186. char inuxi1[1];
  187. char inuxi2[2];
  188. char inuxi4[4];
  189. Prog* lastp;
  190. long lcsize;
  191. char literal[32];
  192. int nerrors;
  193. long nhunk;
  194. char* noname;
  195. long offset;
  196. char* outfile;
  197. long pc;
  198. long symsize;
  199. long staticgen;
  200. Prog* textp;
  201. long textsize;
  202. long tothunk;
  203. char xcmp[C_NCLASS][C_NCLASS];
  204. int version;
  205. Prog zprg;
  206. int dtype;
  207. extern Optab optab[];
  208. extern char* anames[];
  209. extern char* cnames[];
  210. int Aconv(Fmt*);
  211. int Dconv(Fmt*);
  212. int Nconv(Fmt*);
  213. int Pconv(Fmt*);
  214. int Sconv(Fmt*);
  215. int Rconv(Fmt*);
  216. int aclass(Adr*);
  217. void addhist(long, int);
  218. void histtoauto(void);
  219. void addnop(Prog*);
  220. void append(Prog*, Prog*);
  221. void asmb(void);
  222. void asmlc(void);
  223. int asmout(Prog*, Optab*, int);
  224. void asmsym(void);
  225. long atolwhex(char*);
  226. Prog* brloop(Prog*);
  227. void buildop(void);
  228. void cflush(void);
  229. int cmp(int, int);
  230. int compound(Prog*);
  231. double cputime(void);
  232. void datblk(long, long);
  233. void diag(char*, ...);
  234. void dodata(void);
  235. void doprof1(void);
  236. void doprof2(void);
  237. long entryvalue(void);
  238. void errorexit(void);
  239. void exchange(Prog*);
  240. int find1(long, int);
  241. void follow(void);
  242. void gethunk(void);
  243. double ieeedtod(Ieee*);
  244. long ieeedtof(Ieee*);
  245. int isnop(Prog*);
  246. void ldobj(int, long, char*);
  247. void loadlib(void);
  248. void listinit(void);
  249. void initmuldiv(void);
  250. Sym* lookup(char*, int);
  251. void lput(long);
  252. void mkfwd(void);
  253. void names(void);
  254. void nocache(Prog*);
  255. void noops(void);
  256. void nuxiinit(void);
  257. void objfile(char*);
  258. int ocmp(void*, void*);
  259. long opcode(int);
  260. Optab* oplook(Prog*);
  261. void patch(void);
  262. void prasm(Prog*);
  263. void prepend(Prog*, Prog*);
  264. Prog* prg(void);
  265. int pseudo(Prog*);
  266. void putsymb(char*, int, long, int);
  267. long regoff(Adr*);
  268. int relinv(int);
  269. long rnd(long, long);
  270. void sched(Prog*, Prog*);
  271. void span(void);
  272. void undef(void);
  273. void xdefine(char*, int, long);
  274. void xfol(Prog*);
  275. #pragma varargck type "D" Adr*
  276. #pragma varargck type "N" Adr*
  277. #pragma varargck type "P" Prog*
  278. #pragma varargck type "R" int
  279. #pragma varargck type "A" int
  280. #pragma varargck type "S" char*