list.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. #include "l.h"
  2. void
  3. listinit(void)
  4. {
  5. fmtinstall('A', Aconv);
  6. fmtinstall('D', Dconv);
  7. fmtinstall('P', Pconv);
  8. fmtinstall('S', Sconv);
  9. fmtinstall('N', Nconv);
  10. fmtinstall('R', Rconv);
  11. }
  12. void
  13. prasm(Prog *p)
  14. {
  15. print("%P\n", p);
  16. }
  17. int
  18. Pconv(Fmt *fp)
  19. {
  20. char str[STRINGSZ], *s;
  21. Prog *p;
  22. int a;
  23. p = va_arg(fp->args, Prog*);
  24. curp = p;
  25. a = p->as;
  26. if(a == ADATA || a == AINIT || a == ADYNT)
  27. sprint(str, "(%d) %A %D/%d,%D", p->line, a, &p->from, p->reg, &p->to);
  28. else {
  29. s = str;
  30. if(p->mark & NOSCHED)
  31. s += sprint(s, "*");
  32. if(p->reg == NREG && p->from3.type == D_NONE)
  33. sprint(s, "(%d) %A %D,%D", p->line, a, &p->from, &p->to);
  34. else
  35. if(a != ATEXT && p->from.type == D_OREG) {
  36. sprint(s, "(%d) %A %ld(R%d+R%d),%D", p->line, a,
  37. p->from.offset, p->from.reg, p->reg, &p->to);
  38. } else
  39. if(p->to.type == D_OREG) {
  40. sprint(s, "(%d) %A %D,%ld(R%d+R%d)", p->line, a,
  41. &p->from, p->to.offset, p->to.reg, p->reg);
  42. } else {
  43. s += sprint(s, "(%d) %A %D", p->line, a, &p->from);
  44. if(p->reg != NREG)
  45. s += sprint(s, ",%c%d", p->from.type==D_FREG?'F':'R', p->reg);
  46. if(p->from3.type != D_NONE)
  47. s += sprint(s, ",%D", &p->from3);
  48. sprint(s, ",%D", &p->to);
  49. }
  50. }
  51. return fmtstrcpy(fp, str);
  52. }
  53. int
  54. Aconv(Fmt *fp)
  55. {
  56. char *s;
  57. int a;
  58. a = va_arg(fp->args, int);
  59. s = "???";
  60. if(a >= AXXX && a < ALAST)
  61. s = anames[a];
  62. return fmtstrcpy(fp, s);
  63. }
  64. int
  65. Dconv(Fmt *fp)
  66. {
  67. char str[STRINGSZ];
  68. Adr *a;
  69. long v;
  70. a = va_arg(fp->args, Adr*);
  71. switch(a->type) {
  72. default:
  73. sprint(str, "GOK-type(%d)", a->type);
  74. break;
  75. case D_NONE:
  76. str[0] = 0;
  77. if(a->name != D_NONE || a->reg != NREG || a->sym != S)
  78. sprint(str, "%N(R%d)(NONE)", a, a->reg);
  79. break;
  80. case D_CONST:
  81. if(a->reg != NREG)
  82. sprint(str, "$%N(R%d)", a, a->reg);
  83. else
  84. sprint(str, "$%N", a);
  85. break;
  86. case D_OREG:
  87. if(a->reg != NREG)
  88. sprint(str, "%N(R%d)", a, a->reg);
  89. else
  90. sprint(str, "%N", a);
  91. break;
  92. case D_REG:
  93. sprint(str, "R%d", a->reg);
  94. if(a->name != D_NONE || a->sym != S)
  95. sprint(str, "%N(R%d)(REG)", a, a->reg);
  96. break;
  97. case D_FREG:
  98. sprint(str, "F%d", a->reg);
  99. if(a->name != D_NONE || a->sym != S)
  100. sprint(str, "%N(F%d)(REG)", a, a->reg);
  101. break;
  102. case D_CREG:
  103. if(a->reg == NREG)
  104. strcpy(str, "CR");
  105. else
  106. sprint(str, "CR%d", a->reg);
  107. if(a->name != D_NONE || a->sym != S)
  108. sprint(str, "%N(C%d)(REG)", a, a->reg);
  109. break;
  110. case D_SPR:
  111. if(a->name == D_NONE && a->sym == S) {
  112. switch(a->offset) {
  113. case D_XER: sprint(str, "XER"); break;
  114. case D_LR: sprint(str, "LR"); break;
  115. case D_CTR: sprint(str, "CTR"); break;
  116. default: sprint(str, "SPR(%ld)", a->offset); break;
  117. }
  118. break;
  119. }
  120. sprint(str, "SPR-GOK(%d)", a->reg);
  121. if(a->name != D_NONE || a->sym != S)
  122. sprint(str, "%N(SPR-GOK%d)(REG)", a, a->reg);
  123. break;
  124. case D_DCR:
  125. if(a->name == D_NONE && a->sym == S) {
  126. sprint(str, "DCR(%ld)", a->offset);
  127. break;
  128. }
  129. sprint(str, "DCR-GOK(%d)", a->reg);
  130. if(a->name != D_NONE || a->sym != S)
  131. sprint(str, "%N(DCR-GOK%d)(REG)", a, a->reg);
  132. break;
  133. case D_OPT:
  134. sprint(str, "OPT(%d)", a->reg);
  135. break;
  136. case D_FPSCR:
  137. if(a->reg == NREG)
  138. strcpy(str, "FPSCR");
  139. else
  140. sprint(str, "FPSCR(%d)", a->reg);
  141. break;
  142. case D_MSR:
  143. sprint(str, "MSR");
  144. break;
  145. case D_SREG:
  146. sprint(str, "SREG(%d)", a->reg);
  147. if(a->name != D_NONE || a->sym != S)
  148. sprint(str, "%N(SREG%d)(REG)", a, a->reg);
  149. break;
  150. case D_BRANCH:
  151. if(curp->cond != P) {
  152. v = curp->cond->pc;
  153. if(v >= INITTEXT)
  154. v -= INITTEXT-HEADR;
  155. if(a->sym != S)
  156. sprint(str, "%s+%.5lux(BRANCH)", a->sym->name, v);
  157. else
  158. sprint(str, "%.5lux(BRANCH)", v);
  159. } else
  160. if(a->sym != S)
  161. sprint(str, "%s+%ld(APC)", a->sym->name, a->offset);
  162. else
  163. sprint(str, "%ld(APC)", a->offset);
  164. break;
  165. case D_FCONST:
  166. sprint(str, "$%lux-%lux", a->ieee.h, a->ieee.l);
  167. break;
  168. case D_SCONST:
  169. sprint(str, "$\"%S\"", a->sval);
  170. break;
  171. }
  172. return fmtstrcpy(fp, str);
  173. }
  174. int
  175. Nconv(Fmt *fp)
  176. {
  177. char str[STRINGSZ];
  178. Adr *a;
  179. Sym *s;
  180. a = va_arg(fp->args, Adr*);
  181. s = a->sym;
  182. if(s == S) {
  183. sprint(str, "%ld", a->offset);
  184. goto out;
  185. }
  186. switch(a->name) {
  187. default:
  188. sprint(str, "GOK-name(%d)", a->name);
  189. break;
  190. case D_EXTERN:
  191. sprint(str, "%s+%ld(SB)", s->name, a->offset);
  192. break;
  193. case D_STATIC:
  194. sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
  195. break;
  196. case D_AUTO:
  197. sprint(str, "%s-%ld(SP)", s->name, -a->offset);
  198. break;
  199. case D_PARAM:
  200. sprint(str, "%s+%ld(FP)", s->name, a->offset);
  201. break;
  202. }
  203. out:
  204. return fmtstrcpy(fp, str);
  205. }
  206. int
  207. Rconv(Fmt *fp)
  208. {
  209. char *s;
  210. int a;
  211. a = va_arg(fp->args, int);
  212. s = "C_??";
  213. if(a >= C_NONE && a <= C_NCLASS)
  214. s = cnames[a];
  215. return fmtstrcpy(fp, s);
  216. }
  217. int
  218. Sconv(Fmt *fp)
  219. {
  220. int i, c;
  221. char str[STRINGSZ], *p, *a;
  222. a = va_arg(fp->args, char*);
  223. p = str;
  224. for(i=0; i<sizeof(long); i++) {
  225. c = a[i] & 0xff;
  226. if(c >= 'a' && c <= 'z' ||
  227. c >= 'A' && c <= 'Z' ||
  228. c >= '0' && c <= '9' ||
  229. c == ' ' || c == '%') {
  230. *p++ = c;
  231. continue;
  232. }
  233. *p++ = '\\';
  234. switch(c) {
  235. case 0:
  236. *p++ = 'z';
  237. continue;
  238. case '\\':
  239. case '"':
  240. *p++ = c;
  241. continue;
  242. case '\n':
  243. *p++ = 'n';
  244. continue;
  245. case '\t':
  246. *p++ = 't';
  247. continue;
  248. }
  249. *p++ = (c>>6) + '0';
  250. *p++ = ((c>>3) & 7) + '0';
  251. *p++ = (c & 7) + '0';
  252. }
  253. *p = 0;
  254. return fmtstrcpy(fp, str);
  255. }
  256. void
  257. diag(char *fmt, ...)
  258. {
  259. char buf[STRINGSZ], *tn;
  260. va_list arg;
  261. tn = "??none??";
  262. if(curtext != P && curtext->from.sym != S)
  263. tn = curtext->from.sym->name;
  264. va_start(arg, fmt);
  265. vseprint(buf, buf+sizeof(buf), fmt, arg);
  266. va_end(arg);
  267. print("%s: %s\n", tn, buf);
  268. nerrors++;
  269. if(nerrors > 10) {
  270. print("too many errors\n");
  271. errorexit();
  272. }
  273. }