parse.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425
  1. #include "all.h"
  2. #include <ctype.h>
  3. #include <stdarg.h>
  4. enum {
  5. Ksb = 4, /* matches Oarg/Opar/Jret */
  6. Kub,
  7. Ksh,
  8. Kuh,
  9. Kc,
  10. K0,
  11. Ke = -2, /* erroneous mode */
  12. Km = Kl, /* memory pointer */
  13. };
  14. Op optab[NOp] = {
  15. #undef P
  16. #define P(cf, hi, id) .canfold = cf, .hasid = hi, .idval = id
  17. #define O(op, t, p) [O##op]={.name = #op, .argcls = t, p},
  18. #include "ops.h"
  19. #undef P
  20. };
  21. typedef enum {
  22. PXXX,
  23. PLbl,
  24. PPhi,
  25. PIns,
  26. PEnd,
  27. } PState;
  28. enum Token {
  29. Txxx = 0,
  30. /* aliases */
  31. Tloadw = NPubOp,
  32. Tloadl,
  33. Tloads,
  34. Tloadd,
  35. Talloc1,
  36. Talloc2,
  37. Tblit,
  38. Tcall,
  39. Tenv,
  40. Tphi,
  41. Tjmp,
  42. Tjnz,
  43. Tret,
  44. Thlt,
  45. Texport,
  46. Tthread,
  47. Tcommon,
  48. Tfunc,
  49. Ttype,
  50. Tdata,
  51. Tsection,
  52. Talign,
  53. Tdbgfile,
  54. Tl,
  55. Tw,
  56. Tsh,
  57. Tuh,
  58. Th,
  59. Tsb,
  60. Tub,
  61. Tb,
  62. Td,
  63. Ts,
  64. Tz,
  65. Tint,
  66. Tflts,
  67. Tfltd,
  68. Ttmp,
  69. Tlbl,
  70. Tglo,
  71. Ttyp,
  72. Tstr,
  73. Tplus,
  74. Teq,
  75. Tcomma,
  76. Tlparen,
  77. Trparen,
  78. Tlbrace,
  79. Trbrace,
  80. Tnl,
  81. Tdots,
  82. Teof,
  83. Ntok
  84. };
  85. static char *kwmap[Ntok] = {
  86. [Tloadw] = "loadw",
  87. [Tloadl] = "loadl",
  88. [Tloads] = "loads",
  89. [Tloadd] = "loadd",
  90. [Talloc1] = "alloc1",
  91. [Talloc2] = "alloc2",
  92. [Tblit] = "blit",
  93. [Tcall] = "call",
  94. [Tenv] = "env",
  95. [Tphi] = "phi",
  96. [Tjmp] = "jmp",
  97. [Tjnz] = "jnz",
  98. [Tret] = "ret",
  99. [Thlt] = "hlt",
  100. [Texport] = "export",
  101. [Tthread] = "thread",
  102. [Tcommon] = "common",
  103. [Tfunc] = "function",
  104. [Ttype] = "type",
  105. [Tdata] = "data",
  106. [Tsection] = "section",
  107. [Talign] = "align",
  108. [Tdbgfile] = "dbgfile",
  109. [Tsb] = "sb",
  110. [Tub] = "ub",
  111. [Tsh] = "sh",
  112. [Tuh] = "uh",
  113. [Tb] = "b",
  114. [Th] = "h",
  115. [Tw] = "w",
  116. [Tl] = "l",
  117. [Ts] = "s",
  118. [Td] = "d",
  119. [Tz] = "z",
  120. [Tdots] = "...",
  121. };
  122. enum {
  123. NPred = 63,
  124. TMask = 16383, /* for temps hash */
  125. BMask = 8191, /* for blocks hash */
  126. K = 11183273, /* found using tools/lexh.c */
  127. M = 23,
  128. };
  129. static uchar lexh[1 << (32-M)];
  130. static FILE *inf;
  131. static char *inpath;
  132. static int thead;
  133. static struct {
  134. char chr;
  135. double fltd;
  136. float flts;
  137. int64_t num;
  138. char *str;
  139. } tokval;
  140. static int lnum;
  141. static Fn *curf;
  142. static int *tmph;
  143. static int tmphcap;
  144. static Phi **plink;
  145. static Blk *curb;
  146. static Blk **blink;
  147. static Blk *blkh[BMask+1];
  148. static int nblk;
  149. static int rcls;
  150. static uint ntyp;
  151. void
  152. err(char *s, ...)
  153. {
  154. va_list ap;
  155. va_start(ap, s);
  156. fprintf(stderr, "qbe:%s:%d: ", inpath, lnum);
  157. vfprintf(stderr, s, ap);
  158. fprintf(stderr, "\n");
  159. va_end(ap);
  160. exit(1);
  161. }
  162. static void
  163. lexinit()
  164. {
  165. static int done;
  166. int i;
  167. long h;
  168. if (done)
  169. return;
  170. for (i=0; i<NPubOp; ++i)
  171. if (optab[i].name)
  172. kwmap[i] = optab[i].name;
  173. assert(Ntok <= UCHAR_MAX);
  174. for (i=0; i<Ntok; ++i)
  175. if (kwmap[i]) {
  176. h = hash(kwmap[i])*K >> M;
  177. assert(lexh[h] == Txxx);
  178. lexh[h] = i;
  179. }
  180. done = 1;
  181. }
  182. static int64_t
  183. getint()
  184. {
  185. uint64_t n;
  186. int c, m;
  187. n = 0;
  188. c = fgetc(inf);
  189. m = (c == '-');
  190. if (m)
  191. c = fgetc(inf);
  192. do {
  193. n = 10*n + (c - '0');
  194. c = fgetc(inf);
  195. } while ('0' <= c && c <= '9');
  196. ungetc(c, inf);
  197. if (m)
  198. n = 1 + ~n;
  199. return *(int64_t *)&n;
  200. }
  201. static int
  202. lex()
  203. {
  204. static char tok[NString];
  205. int c, i, esc;
  206. int t;
  207. do
  208. c = fgetc(inf);
  209. while (isblank(c));
  210. t = Txxx;
  211. tokval.chr = c;
  212. switch (c) {
  213. case EOF:
  214. return Teof;
  215. case ',':
  216. return Tcomma;
  217. case '(':
  218. return Tlparen;
  219. case ')':
  220. return Trparen;
  221. case '{':
  222. return Tlbrace;
  223. case '}':
  224. return Trbrace;
  225. case '=':
  226. return Teq;
  227. case '+':
  228. return Tplus;
  229. case 's':
  230. if (fscanf(inf, "_%f", &tokval.flts) != 1)
  231. break;
  232. return Tflts;
  233. case 'd':
  234. if (fscanf(inf, "_%lf", &tokval.fltd) != 1)
  235. break;
  236. return Tfltd;
  237. case '%':
  238. t = Ttmp;
  239. c = fgetc(inf);
  240. goto Alpha;
  241. case '@':
  242. t = Tlbl;
  243. c = fgetc(inf);
  244. goto Alpha;
  245. case '$':
  246. t = Tglo;
  247. if ((c = fgetc(inf)) == '"')
  248. goto Quoted;
  249. goto Alpha;
  250. case ':':
  251. t = Ttyp;
  252. c = fgetc(inf);
  253. goto Alpha;
  254. case '#':
  255. while ((c=fgetc(inf)) != '\n' && c != EOF)
  256. ;
  257. /* fall through */
  258. case '\n':
  259. lnum++;
  260. return Tnl;
  261. }
  262. if (isdigit(c) || c == '-') {
  263. ungetc(c, inf);
  264. tokval.num = getint();
  265. return Tint;
  266. }
  267. if (c == '"') {
  268. t = Tstr;
  269. Quoted:
  270. tokval.str = vnew(2, 1, PFn);
  271. tokval.str[0] = c;
  272. esc = 0;
  273. for (i=1;; i++) {
  274. c = fgetc(inf);
  275. if (c == EOF)
  276. err("unterminated string");
  277. vgrow(&tokval.str, i+2);
  278. tokval.str[i] = c;
  279. if (c == '"' && !esc) {
  280. tokval.str[i+1] = 0;
  281. return t;
  282. }
  283. esc = (c == '\\' && !esc);
  284. }
  285. }
  286. Alpha:
  287. if (!isalpha(c) && c != '.' && c != '_')
  288. err("invalid character %c (%d)", c, c);
  289. i = 0;
  290. do {
  291. if (i >= NString-1)
  292. err("identifier too long");
  293. tok[i++] = c;
  294. c = fgetc(inf);
  295. } while (isalpha(c) || c == '$' || c == '.' || c == '_' || isdigit(c));
  296. tok[i] = 0;
  297. ungetc(c, inf);
  298. tokval.str = tok;
  299. if (t != Txxx) {
  300. return t;
  301. }
  302. t = lexh[hash(tok)*K >> M];
  303. if (t == Txxx || strcmp(kwmap[t], tok) != 0) {
  304. err("unknown keyword %s", tok);
  305. return Txxx;
  306. }
  307. return t;
  308. }
  309. static int
  310. peek()
  311. {
  312. if (thead == Txxx)
  313. thead = lex();
  314. return thead;
  315. }
  316. static int
  317. next()
  318. {
  319. int t;
  320. t = peek();
  321. thead = Txxx;
  322. return t;
  323. }
  324. static int
  325. nextnl()
  326. {
  327. int t;
  328. while ((t = next()) == Tnl)
  329. ;
  330. return t;
  331. }
  332. static void
  333. expect(int t)
  334. {
  335. static char *ttoa[] = {
  336. [Tlbl] = "label",
  337. [Tcomma] = ",",
  338. [Teq] = "=",
  339. [Tnl] = "newline",
  340. [Tlparen] = "(",
  341. [Trparen] = ")",
  342. [Tlbrace] = "{",
  343. [Trbrace] = "}",
  344. [Teof] = 0,
  345. };
  346. char buf[128], *s1, *s2;
  347. int t1;
  348. t1 = next();
  349. if (t == t1)
  350. return;
  351. s1 = ttoa[t] ? ttoa[t] : "??";
  352. s2 = ttoa[t1] ? ttoa[t1] : "??";
  353. sprintf(buf, "%s expected, got %s instead", s1, s2);
  354. err(buf);
  355. }
  356. static Ref
  357. tmpref(char *v)
  358. {
  359. int t, i;
  360. if (tmphcap/2 <= curf->ntmp-Tmp0) {
  361. free(tmph);
  362. tmphcap = tmphcap ? tmphcap*2 : TMask+1;
  363. tmph = emalloc(tmphcap * sizeof tmph[0]);
  364. for (t=Tmp0; t<curf->ntmp; t++) {
  365. i = hash(curf->tmp[t].name) & (tmphcap-1);
  366. for (; tmph[i]; i=(i+1) & (tmphcap-1))
  367. ;
  368. tmph[i] = t;
  369. }
  370. }
  371. i = hash(v) & (tmphcap-1);
  372. for (; tmph[i]; i=(i+1) & (tmphcap-1)) {
  373. t = tmph[i];
  374. if (strcmp(curf->tmp[t].name, v) == 0)
  375. return TMP(t);
  376. }
  377. t = curf->ntmp;
  378. tmph[i] = t;
  379. newtmp(0, Kx, curf);
  380. strcpy(curf->tmp[t].name, v);
  381. return TMP(t);
  382. }
  383. static Ref
  384. parseref()
  385. {
  386. Con c;
  387. memset(&c, 0, sizeof c);
  388. switch (next()) {
  389. default:
  390. return R;
  391. case Ttmp:
  392. return tmpref(tokval.str);
  393. case Tint:
  394. c.type = CBits;
  395. c.bits.i = tokval.num;
  396. break;
  397. case Tflts:
  398. c.type = CBits;
  399. c.bits.s = tokval.flts;
  400. c.flt = 1;
  401. break;
  402. case Tfltd:
  403. c.type = CBits;
  404. c.bits.d = tokval.fltd;
  405. c.flt = 2;
  406. break;
  407. case Tthread:
  408. c.sym.type = SThr;
  409. expect(Tglo);
  410. /* fall through */
  411. case Tglo:
  412. c.type = CAddr;
  413. c.sym.id = intern(tokval.str);
  414. break;
  415. }
  416. return newcon(&c, curf);
  417. }
  418. static int
  419. findtyp(int i)
  420. {
  421. while (--i >= 0)
  422. if (strcmp(tokval.str, typ[i].name) == 0)
  423. return i;
  424. err("undefined type :%s", tokval.str);
  425. }
  426. static int
  427. parsecls(int *tyn)
  428. {
  429. switch (next()) {
  430. default:
  431. err("invalid class specifier");
  432. case Ttyp:
  433. *tyn = findtyp(ntyp);
  434. return Kc;
  435. case Tsb:
  436. return Ksb;
  437. case Tub:
  438. return Kub;
  439. case Tsh:
  440. return Ksh;
  441. case Tuh:
  442. return Kuh;
  443. case Tw:
  444. return Kw;
  445. case Tl:
  446. return Kl;
  447. case Ts:
  448. return Ks;
  449. case Td:
  450. return Kd;
  451. }
  452. }
  453. static int
  454. parserefl(int arg)
  455. {
  456. int k, ty, env, hasenv, vararg;
  457. Ref r;
  458. hasenv = 0;
  459. vararg = 0;
  460. expect(Tlparen);
  461. while (peek() != Trparen) {
  462. if (curi - insb >= NIns)
  463. err("too many instructions");
  464. if (!arg && vararg)
  465. err("no parameters allowed after '...'");
  466. switch (peek()) {
  467. case Tdots:
  468. if (vararg)
  469. err("only one '...' allowed");
  470. vararg = 1;
  471. if (arg) {
  472. *curi = (Ins){.op = Oargv};
  473. curi++;
  474. }
  475. next();
  476. goto Next;
  477. case Tenv:
  478. if (hasenv)
  479. err("only one environment allowed");
  480. hasenv = 1;
  481. env = 1;
  482. next();
  483. k = Kl;
  484. break;
  485. default:
  486. env = 0;
  487. k = parsecls(&ty);
  488. break;
  489. }
  490. r = parseref();
  491. if (req(r, R))
  492. err("invalid argument");
  493. if (!arg && rtype(r) != RTmp)
  494. err("invalid function parameter");
  495. if (env)
  496. if (arg)
  497. *curi = (Ins){Oarge, k, R, {r}};
  498. else
  499. *curi = (Ins){Opare, k, r, {R}};
  500. else if (k == Kc)
  501. if (arg)
  502. *curi = (Ins){Oargc, Kl, R, {TYPE(ty), r}};
  503. else
  504. *curi = (Ins){Oparc, Kl, r, {TYPE(ty)}};
  505. else if (k >= Ksb)
  506. if (arg)
  507. *curi = (Ins){Oargsb+(k-Ksb), Kw, R, {r}};
  508. else
  509. *curi = (Ins){Oparsb+(k-Ksb), Kw, r, {R}};
  510. else
  511. if (arg)
  512. *curi = (Ins){Oarg, k, R, {r}};
  513. else
  514. *curi = (Ins){Opar, k, r, {R}};
  515. curi++;
  516. Next:
  517. if (peek() == Trparen)
  518. break;
  519. expect(Tcomma);
  520. }
  521. expect(Trparen);
  522. return vararg;
  523. }
  524. static Blk *
  525. findblk(char *name)
  526. {
  527. Blk *b;
  528. uint32_t h;
  529. h = hash(name) & BMask;
  530. for (b=blkh[h]; b; b=b->dlink)
  531. if (strcmp(b->name, name) == 0)
  532. return b;
  533. b = newblk();
  534. b->id = nblk++;
  535. strcpy(b->name, name);
  536. b->dlink = blkh[h];
  537. blkh[h] = b;
  538. return b;
  539. }
  540. static void
  541. closeblk()
  542. {
  543. curb->nins = curi - insb;
  544. idup(&curb->ins, insb, curb->nins);
  545. blink = &curb->link;
  546. curi = insb;
  547. }
  548. static PState
  549. parseline(PState ps)
  550. {
  551. Ref arg[NPred] = {R};
  552. Blk *blk[NPred];
  553. Phi *phi;
  554. Ref r;
  555. Blk *b;
  556. Con *c;
  557. int t, op, i, k, ty;
  558. t = nextnl();
  559. if (ps == PLbl && t != Tlbl && t != Trbrace)
  560. err("label or } expected");
  561. switch (t) {
  562. case Ttmp:
  563. r = tmpref(tokval.str);
  564. expect(Teq);
  565. k = parsecls(&ty);
  566. op = next();
  567. break;
  568. default:
  569. if (isstore(t)) {
  570. case Tblit:
  571. case Tcall:
  572. case Ovastart:
  573. /* operations without result */
  574. r = R;
  575. k = Kw;
  576. op = t;
  577. break;
  578. }
  579. err("label, instruction or jump expected");
  580. case Trbrace:
  581. return PEnd;
  582. case Tlbl:
  583. b = findblk(tokval.str);
  584. if (curb && curb->jmp.type == Jxxx) {
  585. closeblk();
  586. curb->jmp.type = Jjmp;
  587. curb->s1 = b;
  588. }
  589. if (b->jmp.type != Jxxx)
  590. err("multiple definitions of block @%s", b->name);
  591. *blink = b;
  592. curb = b;
  593. plink = &curb->phi;
  594. expect(Tnl);
  595. return PPhi;
  596. case Tret:
  597. curb->jmp.type = Jretw + rcls;
  598. if (peek() == Tnl)
  599. curb->jmp.type = Jret0;
  600. else if (rcls != K0) {
  601. r = parseref();
  602. if (req(r, R))
  603. err("invalid return value");
  604. curb->jmp.arg = r;
  605. }
  606. goto Close;
  607. case Tjmp:
  608. curb->jmp.type = Jjmp;
  609. goto Jump;
  610. case Tjnz:
  611. curb->jmp.type = Jjnz;
  612. r = parseref();
  613. if (req(r, R))
  614. err("invalid argument for jnz jump");
  615. curb->jmp.arg = r;
  616. expect(Tcomma);
  617. Jump:
  618. expect(Tlbl);
  619. curb->s1 = findblk(tokval.str);
  620. if (curb->jmp.type != Jjmp) {
  621. expect(Tcomma);
  622. expect(Tlbl);
  623. curb->s2 = findblk(tokval.str);
  624. }
  625. if (curb->s1 == curf->start || curb->s2 == curf->start)
  626. err("invalid jump to the start block");
  627. goto Close;
  628. case Thlt:
  629. curb->jmp.type = Jhlt;
  630. Close:
  631. expect(Tnl);
  632. closeblk();
  633. return PLbl;
  634. case Odbgloc:
  635. op = t;
  636. k = Kw;
  637. r = R;
  638. expect(Tint);
  639. arg[0] = INT(tokval.num);
  640. if (arg[0].val != tokval.num)
  641. err("line number too big");
  642. if (peek() == Tcomma) {
  643. next();
  644. expect(Tint);
  645. arg[1] = INT(tokval.num);
  646. if (arg[1].val != tokval.num)
  647. err("column number too big");
  648. } else
  649. arg[1] = INT(0);
  650. goto Ins;
  651. }
  652. if (op == Tcall) {
  653. arg[0] = parseref();
  654. parserefl(1);
  655. op = Ocall;
  656. expect(Tnl);
  657. if (k == Kc) {
  658. k = Kl;
  659. arg[1] = TYPE(ty);
  660. }
  661. if (k >= Ksb)
  662. k = Kw;
  663. goto Ins;
  664. }
  665. if (op == Tloadw)
  666. op = Oloadsw;
  667. if (op >= Tloadl && op <= Tloadd)
  668. op = Oload;
  669. if (op == Talloc1 || op == Talloc2)
  670. op = Oalloc;
  671. if (op == Ovastart && !curf->vararg)
  672. err("cannot use vastart in non-variadic function");
  673. if (k >= Ksb)
  674. err("size class must be w, l, s, or d");
  675. i = 0;
  676. if (peek() != Tnl)
  677. for (;;) {
  678. if (i == NPred)
  679. err("too many arguments");
  680. if (op == Tphi) {
  681. expect(Tlbl);
  682. blk[i] = findblk(tokval.str);
  683. }
  684. arg[i] = parseref();
  685. if (req(arg[i], R))
  686. err("invalid instruction argument");
  687. i++;
  688. t = peek();
  689. if (t == Tnl)
  690. break;
  691. if (t != Tcomma)
  692. err(", or end of line expected");
  693. next();
  694. }
  695. next();
  696. switch (op) {
  697. case Tphi:
  698. if (ps != PPhi || curb == curf->start)
  699. err("unexpected phi instruction");
  700. phi = alloc(sizeof *phi);
  701. phi->to = r;
  702. phi->cls = k;
  703. phi->arg = vnew(i, sizeof arg[0], PFn);
  704. memcpy(phi->arg, arg, i * sizeof arg[0]);
  705. phi->blk = vnew(i, sizeof blk[0], PFn);
  706. memcpy(phi->blk, blk, i * sizeof blk[0]);
  707. phi->narg = i;
  708. *plink = phi;
  709. plink = &phi->link;
  710. return PPhi;
  711. case Tblit:
  712. if (curi - insb >= NIns-1)
  713. err("too many instructions");
  714. memset(curi, 0, 2 * sizeof(Ins));
  715. curi->op = Oblit0;
  716. curi->arg[0] = arg[0];
  717. curi->arg[1] = arg[1];
  718. curi++;
  719. if (rtype(arg[2]) != RCon)
  720. err("blit size must be constant");
  721. c = &curf->con[arg[2].val];
  722. r = INT(c->bits.i);
  723. if (c->type != CBits
  724. || rsval(r) < 0
  725. || rsval(r) != c->bits.i)
  726. err("invalid blit size");
  727. curi->op = Oblit1;
  728. curi->arg[0] = r;
  729. curi++;
  730. return PIns;
  731. default:
  732. if (op >= NPubOp)
  733. err("invalid instruction");
  734. Ins:
  735. if (curi - insb >= NIns)
  736. err("too many instructions");
  737. curi->op = op;
  738. curi->cls = k;
  739. curi->to = r;
  740. curi->arg[0] = arg[0];
  741. curi->arg[1] = arg[1];
  742. curi++;
  743. return PIns;
  744. }
  745. }
  746. static int
  747. usecheck(Ref r, int k, Fn *fn)
  748. {
  749. return rtype(r) != RTmp || fn->tmp[r.val].cls == k
  750. || (fn->tmp[r.val].cls == Kl && k == Kw);
  751. }
  752. static void
  753. typecheck(Fn *fn)
  754. {
  755. Blk *b;
  756. Phi *p;
  757. Ins *i;
  758. uint n;
  759. int k;
  760. Tmp *t;
  761. Ref r;
  762. BSet pb[1], ppb[1];
  763. fillpreds(fn);
  764. bsinit(pb, fn->nblk);
  765. bsinit(ppb, fn->nblk);
  766. for (b=fn->start; b; b=b->link) {
  767. for (p=b->phi; p; p=p->link)
  768. fn->tmp[p->to.val].cls = p->cls;
  769. for (i=b->ins; i<&b->ins[b->nins]; i++)
  770. if (rtype(i->to) == RTmp) {
  771. t = &fn->tmp[i->to.val];
  772. if (clsmerge(&t->cls, i->cls))
  773. err("temporary %%%s is assigned with"
  774. " multiple types", t->name);
  775. }
  776. }
  777. for (b=fn->start; b; b=b->link) {
  778. bszero(pb);
  779. for (n=0; n<b->npred; n++)
  780. bsset(pb, b->pred[n]->id);
  781. for (p=b->phi; p; p=p->link) {
  782. bszero(ppb);
  783. t = &fn->tmp[p->to.val];
  784. for (n=0; n<p->narg; n++) {
  785. k = t->cls;
  786. if (bshas(ppb, p->blk[n]->id))
  787. err("multiple entries for @%s in phi %%%s",
  788. p->blk[n]->name, t->name);
  789. if (!usecheck(p->arg[n], k, fn))
  790. err("invalid type for operand %%%s in phi %%%s",
  791. fn->tmp[p->arg[n].val].name, t->name);
  792. bsset(ppb, p->blk[n]->id);
  793. }
  794. if (!bsequal(pb, ppb))
  795. err("predecessors not matched in phi %%%s", t->name);
  796. }
  797. for (i=b->ins; i<&b->ins[b->nins]; i++)
  798. for (n=0; n<2; n++) {
  799. k = optab[i->op].argcls[n][i->cls];
  800. r = i->arg[n];
  801. t = &fn->tmp[r.val];
  802. if (k == Ke)
  803. err("invalid instruction type in %s",
  804. optab[i->op].name);
  805. if (rtype(r) == RType)
  806. continue;
  807. if (rtype(r) != -1 && k == Kx)
  808. err("no %s operand expected in %s",
  809. n == 1 ? "second" : "first",
  810. optab[i->op].name);
  811. if (rtype(r) == -1 && k != Kx)
  812. err("missing %s operand in %s",
  813. n == 1 ? "second" : "first",
  814. optab[i->op].name);
  815. if (!usecheck(r, k, fn))
  816. err("invalid type for %s operand %%%s in %s",
  817. n == 1 ? "second" : "first",
  818. t->name, optab[i->op].name);
  819. }
  820. r = b->jmp.arg;
  821. if (isret(b->jmp.type)) {
  822. if (b->jmp.type == Jretc)
  823. k = Kl;
  824. else if (b->jmp.type >= Jretsb)
  825. k = Kw;
  826. else
  827. k = b->jmp.type - Jretw;
  828. if (!usecheck(r, k, fn))
  829. goto JErr;
  830. }
  831. if (b->jmp.type == Jjnz && !usecheck(r, Kw, fn))
  832. JErr:
  833. err("invalid type for jump argument %%%s in block @%s",
  834. fn->tmp[r.val].name, b->name);
  835. if (b->s1 && b->s1->jmp.type == Jxxx)
  836. err("block @%s is used undefined", b->s1->name);
  837. if (b->s2 && b->s2->jmp.type == Jxxx)
  838. err("block @%s is used undefined", b->s2->name);
  839. }
  840. }
  841. static Fn *
  842. parsefn(Lnk *lnk)
  843. {
  844. Blk *b;
  845. int i;
  846. PState ps;
  847. curb = 0;
  848. nblk = 0;
  849. curi = insb;
  850. curf = alloc(sizeof *curf);
  851. curf->ntmp = 0;
  852. curf->ncon = 2;
  853. curf->tmp = vnew(curf->ntmp, sizeof curf->tmp[0], PFn);
  854. curf->con = vnew(curf->ncon, sizeof curf->con[0], PFn);
  855. for (i=0; i<Tmp0; ++i)
  856. if (T.fpr0 <= i && i < T.fpr0 + T.nfpr)
  857. newtmp(0, Kd, curf);
  858. else
  859. newtmp(0, Kl, curf);
  860. curf->con[0].type = CBits;
  861. curf->con[0].bits.i = 0xdeaddead; /* UNDEF */
  862. curf->con[1].type = CBits;
  863. curf->lnk = *lnk;
  864. blink = &curf->start;
  865. curf->retty = Kx;
  866. if (peek() != Tglo)
  867. rcls = parsecls(&curf->retty);
  868. else
  869. rcls = K0;
  870. if (next() != Tglo)
  871. err("function name expected");
  872. strncpy(curf->name, tokval.str, NString-1);
  873. curf->vararg = parserefl(0);
  874. if (nextnl() != Tlbrace)
  875. err("function body must start with {");
  876. ps = PLbl;
  877. do
  878. ps = parseline(ps);
  879. while (ps != PEnd);
  880. if (!curb)
  881. err("empty function");
  882. if (curb->jmp.type == Jxxx)
  883. err("last block misses jump");
  884. curf->mem = vnew(0, sizeof curf->mem[0], PFn);
  885. curf->nmem = 0;
  886. curf->nblk = nblk;
  887. curf->rpo = 0;
  888. for (b=curf->start; b; b=b->link)
  889. b->dlink = 0; /* was trashed by findblk() */
  890. for (i=0; i<BMask+1; ++i)
  891. blkh[i] = 0;
  892. memset(tmph, 0, tmphcap * sizeof tmph[0]);
  893. typecheck(curf);
  894. return curf;
  895. }
  896. static void
  897. parsefields(Field *fld, Typ *ty, int t)
  898. {
  899. Typ *ty1;
  900. int n, c, a, al, type;
  901. uint64_t sz, s;
  902. n = 0;
  903. sz = 0;
  904. al = ty->align;
  905. while (t != Trbrace) {
  906. ty1 = 0;
  907. switch (t) {
  908. default: err("invalid type member specifier");
  909. case Td: type = Fd; s = 8; a = 3; break;
  910. case Tl: type = Fl; s = 8; a = 3; break;
  911. case Ts: type = Fs; s = 4; a = 2; break;
  912. case Tw: type = Fw; s = 4; a = 2; break;
  913. case Th: type = Fh; s = 2; a = 1; break;
  914. case Tb: type = Fb; s = 1; a = 0; break;
  915. case Ttyp:
  916. type = FTyp;
  917. ty1 = &typ[findtyp(ntyp-1)];
  918. s = ty1->size;
  919. a = ty1->align;
  920. break;
  921. }
  922. if (a > al)
  923. al = a;
  924. a = (1 << a) - 1;
  925. a = ((sz + a) & ~a) - sz;
  926. if (a) {
  927. if (n < NField) {
  928. /* padding */
  929. fld[n].type = FPad;
  930. fld[n].len = a;
  931. n++;
  932. }
  933. }
  934. t = nextnl();
  935. if (t == Tint) {
  936. c = tokval.num;
  937. t = nextnl();
  938. } else
  939. c = 1;
  940. sz += a + c*s;
  941. if (type == FTyp)
  942. s = ty1 - typ;
  943. for (; c>0 && n<NField; c--, n++) {
  944. fld[n].type = type;
  945. fld[n].len = s;
  946. }
  947. if (t != Tcomma)
  948. break;
  949. t = nextnl();
  950. }
  951. if (t != Trbrace)
  952. err(", or } expected");
  953. fld[n].type = FEnd;
  954. a = 1 << al;
  955. if (sz < ty->size)
  956. sz = ty->size;
  957. ty->size = (sz + a - 1) & -a;
  958. ty->align = al;
  959. }
  960. static void
  961. parsetyp()
  962. {
  963. Typ *ty;
  964. int t, al;
  965. uint n;
  966. /* be careful if extending the syntax
  967. * to handle nested types, any pointer
  968. * held to typ[] might be invalidated!
  969. */
  970. vgrow(&typ, ntyp+1);
  971. ty = &typ[ntyp++];
  972. ty->isdark = 0;
  973. ty->isunion = 0;
  974. ty->align = -1;
  975. ty->size = 0;
  976. if (nextnl() != Ttyp || nextnl() != Teq)
  977. err("type name and then = expected");
  978. strcpy(ty->name, tokval.str);
  979. t = nextnl();
  980. if (t == Talign) {
  981. if (nextnl() != Tint)
  982. err("alignment expected");
  983. for (al=0; tokval.num /= 2; al++)
  984. ;
  985. ty->align = al;
  986. t = nextnl();
  987. }
  988. if (t != Tlbrace)
  989. err("type body must start with {");
  990. t = nextnl();
  991. if (t == Tint) {
  992. ty->isdark = 1;
  993. ty->size = tokval.num;
  994. if (ty->align == -1)
  995. err("dark types need alignment");
  996. if (nextnl() != Trbrace)
  997. err("} expected");
  998. return;
  999. }
  1000. n = 0;
  1001. ty->fields = vnew(1, sizeof ty->fields[0], PHeap);
  1002. if (t == Tlbrace) {
  1003. ty->isunion = 1;
  1004. do {
  1005. if (t != Tlbrace)
  1006. err("invalid union member");
  1007. vgrow(&ty->fields, n+1);
  1008. parsefields(ty->fields[n++], ty, nextnl());
  1009. t = nextnl();
  1010. } while (t != Trbrace);
  1011. } else
  1012. parsefields(ty->fields[n++], ty, t);
  1013. ty->nunion = n;
  1014. }
  1015. static void
  1016. parsedatref(Dat *d)
  1017. {
  1018. int t;
  1019. d->isref = 1;
  1020. d->u.ref.name = tokval.str;
  1021. d->u.ref.off = 0;
  1022. t = peek();
  1023. if (t == Tplus) {
  1024. next();
  1025. if (next() != Tint)
  1026. err("invalid token after offset in ref");
  1027. d->u.ref.off = tokval.num;
  1028. }
  1029. }
  1030. static void
  1031. parsedatstr(Dat *d)
  1032. {
  1033. d->isstr = 1;
  1034. d->u.str = tokval.str;
  1035. }
  1036. static void
  1037. parsedat(void cb(Dat *), Lnk *lnk)
  1038. {
  1039. char name[NString] = {0};
  1040. int t;
  1041. Dat d;
  1042. if (nextnl() != Tglo || nextnl() != Teq)
  1043. err("data name, then = expected");
  1044. strncpy(name, tokval.str, NString-1);
  1045. t = nextnl();
  1046. lnk->align = 8;
  1047. if (t == Talign) {
  1048. if (nextnl() != Tint)
  1049. err("alignment expected");
  1050. if (tokval.num <= 0 || tokval.num > CHAR_MAX
  1051. || (tokval.num & (tokval.num-1)) != 0)
  1052. err("invalid alignment");
  1053. lnk->align = tokval.num;
  1054. t = nextnl();
  1055. }
  1056. d.type = DStart;
  1057. d.name = name;
  1058. d.lnk = lnk;
  1059. cb(&d);
  1060. if (t != Tlbrace)
  1061. err("expected data contents in { .. }");
  1062. for (;;) {
  1063. switch (nextnl()) {
  1064. default: err("invalid size specifier %c in data", tokval.chr);
  1065. case Trbrace: goto Done;
  1066. case Tl: d.type = DL; break;
  1067. case Tw: d.type = DW; break;
  1068. case Th: d.type = DH; break;
  1069. case Tb: d.type = DB; break;
  1070. case Ts: d.type = DW; break;
  1071. case Td: d.type = DL; break;
  1072. case Tz: d.type = DZ; break;
  1073. }
  1074. t = nextnl();
  1075. do {
  1076. d.isstr = 0;
  1077. d.isref = 0;
  1078. memset(&d.u, 0, sizeof d.u);
  1079. if (t == Tflts)
  1080. d.u.flts = tokval.flts;
  1081. else if (t == Tfltd)
  1082. d.u.fltd = tokval.fltd;
  1083. else if (t == Tint)
  1084. d.u.num = tokval.num;
  1085. else if (t == Tglo)
  1086. parsedatref(&d);
  1087. else if (t == Tstr)
  1088. parsedatstr(&d);
  1089. else
  1090. err("constant literal expected");
  1091. cb(&d);
  1092. t = nextnl();
  1093. } while (t == Tint || t == Tflts || t == Tfltd || t == Tstr || t == Tglo);
  1094. if (t == Trbrace)
  1095. break;
  1096. if (t != Tcomma)
  1097. err(", or } expected");
  1098. }
  1099. Done:
  1100. d.type = DEnd;
  1101. cb(&d);
  1102. }
  1103. static int
  1104. parselnk(Lnk *lnk)
  1105. {
  1106. int t, haslnk;
  1107. for (haslnk=0;; haslnk=1)
  1108. switch ((t=nextnl())) {
  1109. case Texport:
  1110. lnk->export = 1;
  1111. break;
  1112. case Tthread:
  1113. lnk->thread = 1;
  1114. break;
  1115. case Tcommon:
  1116. lnk->common = 1;
  1117. break;
  1118. case Tsection:
  1119. if (lnk->sec)
  1120. err("only one section allowed");
  1121. if (next() != Tstr)
  1122. err("section \"name\" expected");
  1123. lnk->sec = tokval.str;
  1124. if (peek() == Tstr) {
  1125. next();
  1126. lnk->secf = tokval.str;
  1127. }
  1128. break;
  1129. default:
  1130. if (t == Tfunc && lnk->thread)
  1131. err("only data may have thread linkage");
  1132. if (haslnk && t != Tdata && t != Tfunc)
  1133. err("only data and function have linkage");
  1134. return t;
  1135. }
  1136. }
  1137. void
  1138. parse(FILE *f, char *path, void dbgfile(char *), void data(Dat *), void func(Fn *))
  1139. {
  1140. Lnk lnk;
  1141. uint n;
  1142. lexinit();
  1143. inf = f;
  1144. inpath = path;
  1145. lnum = 1;
  1146. thead = Txxx;
  1147. ntyp = 0;
  1148. typ = vnew(0, sizeof typ[0], PHeap);
  1149. for (;;) {
  1150. lnk = (Lnk){0};
  1151. switch (parselnk(&lnk)) {
  1152. default:
  1153. err("top-level definition expected");
  1154. case Tdbgfile:
  1155. expect(Tstr);
  1156. dbgfile(tokval.str);
  1157. break;
  1158. case Tfunc:
  1159. func(parsefn(&lnk));
  1160. break;
  1161. case Tdata:
  1162. parsedat(data, &lnk);
  1163. break;
  1164. case Ttype:
  1165. parsetyp();
  1166. break;
  1167. case Teof:
  1168. for (n=0; n<ntyp; n++)
  1169. if (typ[n].nunion)
  1170. vfree(typ[n].fields);
  1171. vfree(typ);
  1172. return;
  1173. }
  1174. }
  1175. }
  1176. static void
  1177. printcon(Con *c, FILE *f)
  1178. {
  1179. switch (c->type) {
  1180. case CUndef:
  1181. break;
  1182. case CAddr:
  1183. if (c->sym.type == SThr)
  1184. fprintf(f, "thread ");
  1185. fprintf(f, "$%s", str(c->sym.id));
  1186. if (c->bits.i)
  1187. fprintf(f, "%+"PRIi64, c->bits.i);
  1188. break;
  1189. case CBits:
  1190. if (c->flt == 1)
  1191. fprintf(f, "s_%f", c->bits.s);
  1192. else if (c->flt == 2)
  1193. fprintf(f, "d_%lf", c->bits.d);
  1194. else
  1195. fprintf(f, "%"PRIi64, c->bits.i);
  1196. break;
  1197. }
  1198. }
  1199. void
  1200. printref(Ref r, Fn *fn, FILE *f)
  1201. {
  1202. int i;
  1203. Mem *m;
  1204. switch (rtype(r)) {
  1205. case RTmp:
  1206. if (r.val < Tmp0)
  1207. fprintf(f, "R%d", r.val);
  1208. else
  1209. fprintf(f, "%%%s", fn->tmp[r.val].name);
  1210. break;
  1211. case RCon:
  1212. if (req(r, UNDEF))
  1213. fprintf(f, "UNDEF");
  1214. else
  1215. printcon(&fn->con[r.val], f);
  1216. break;
  1217. case RSlot:
  1218. fprintf(f, "S%d", rsval(r));
  1219. break;
  1220. case RCall:
  1221. fprintf(f, "%04x", r.val);
  1222. break;
  1223. case RType:
  1224. fprintf(f, ":%s", typ[r.val].name);
  1225. break;
  1226. case RMem:
  1227. i = 0;
  1228. m = &fn->mem[r.val];
  1229. fputc('[', f);
  1230. if (m->offset.type != CUndef) {
  1231. printcon(&m->offset, f);
  1232. i = 1;
  1233. }
  1234. if (!req(m->base, R)) {
  1235. if (i)
  1236. fprintf(f, " + ");
  1237. printref(m->base, fn, f);
  1238. i = 1;
  1239. }
  1240. if (!req(m->index, R)) {
  1241. if (i)
  1242. fprintf(f, " + ");
  1243. fprintf(f, "%d * ", m->scale);
  1244. printref(m->index, fn, f);
  1245. }
  1246. fputc(']', f);
  1247. break;
  1248. case RInt:
  1249. fprintf(f, "%d", rsval(r));
  1250. break;
  1251. case -1:
  1252. fprintf(f, "R");
  1253. break;
  1254. }
  1255. }
  1256. void
  1257. printfn(Fn *fn, FILE *f)
  1258. {
  1259. static char ktoc[] = "wlsd";
  1260. static char *jtoa[NJmp] = {
  1261. #define X(j) [J##j] = #j,
  1262. JMPS(X)
  1263. #undef X
  1264. };
  1265. Blk *b;
  1266. Phi *p;
  1267. Ins *i;
  1268. uint n;
  1269. fprintf(f, "function $%s() {\n", fn->name);
  1270. for (b=fn->start; b; b=b->link) {
  1271. fprintf(f, "@%s\n", b->name);
  1272. for (p=b->phi; p; p=p->link) {
  1273. fprintf(f, "\t");
  1274. printref(p->to, fn, f);
  1275. fprintf(f, " =%c phi ", ktoc[p->cls]);
  1276. assert(p->narg);
  1277. for (n=0;; n++) {
  1278. fprintf(f, "@%s ", p->blk[n]->name);
  1279. printref(p->arg[n], fn, f);
  1280. if (n == p->narg-1) {
  1281. fprintf(f, "\n");
  1282. break;
  1283. } else
  1284. fprintf(f, ", ");
  1285. }
  1286. }
  1287. for (i=b->ins; i<&b->ins[b->nins]; i++) {
  1288. fprintf(f, "\t");
  1289. if (!req(i->to, R)) {
  1290. printref(i->to, fn, f);
  1291. fprintf(f, " =%c ", ktoc[i->cls]);
  1292. }
  1293. assert(optab[i->op].name);
  1294. fprintf(f, "%s", optab[i->op].name);
  1295. if (req(i->to, R))
  1296. switch (i->op) {
  1297. case Oarg:
  1298. case Oswap:
  1299. case Oxcmp:
  1300. case Oacmp:
  1301. case Oacmn:
  1302. case Oafcmp:
  1303. case Oxtest:
  1304. case Oxdiv:
  1305. case Oxidiv:
  1306. fputc(ktoc[i->cls], f);
  1307. }
  1308. if (!req(i->arg[0], R)) {
  1309. fprintf(f, " ");
  1310. printref(i->arg[0], fn, f);
  1311. }
  1312. if (!req(i->arg[1], R)) {
  1313. fprintf(f, ", ");
  1314. printref(i->arg[1], fn, f);
  1315. }
  1316. fprintf(f, "\n");
  1317. }
  1318. switch (b->jmp.type) {
  1319. case Jret0:
  1320. case Jretsb:
  1321. case Jretub:
  1322. case Jretsh:
  1323. case Jretuh:
  1324. case Jretw:
  1325. case Jretl:
  1326. case Jrets:
  1327. case Jretd:
  1328. case Jretc:
  1329. fprintf(f, "\t%s", jtoa[b->jmp.type]);
  1330. if (b->jmp.type != Jret0 || !req(b->jmp.arg, R)) {
  1331. fprintf(f, " ");
  1332. printref(b->jmp.arg, fn, f);
  1333. }
  1334. if (b->jmp.type == Jretc)
  1335. fprintf(f, ", :%s", typ[fn->retty].name);
  1336. fprintf(f, "\n");
  1337. break;
  1338. case Jhlt:
  1339. fprintf(f, "\thlt\n");
  1340. break;
  1341. case Jjmp:
  1342. if (b->s1 != b->link)
  1343. fprintf(f, "\tjmp @%s\n", b->s1->name);
  1344. break;
  1345. default:
  1346. fprintf(f, "\t%s ", jtoa[b->jmp.type]);
  1347. if (b->jmp.type == Jjnz) {
  1348. printref(b->jmp.arg, fn, f);
  1349. fprintf(f, ", ");
  1350. }
  1351. assert(b->s1 && b->s2);
  1352. fprintf(f, "@%s, @%s\n", b->s1->name, b->s2->name);
  1353. break;
  1354. }
  1355. }
  1356. fprintf(f, "}\n");
  1357. }