list.c 4.4 KB

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