sub.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995
  1. #include "cc.h"
  2. Node*
  3. new(int t, Node *l, Node *r)
  4. {
  5. Node *n;
  6. n = alloc(sizeof(*n));
  7. n->op = t;
  8. n->left = l;
  9. n->right = r;
  10. n->lineno = lineno;
  11. newflag = 1;
  12. return n;
  13. }
  14. Node*
  15. new1(int o, Node *l, Node *r)
  16. {
  17. Node *n;
  18. n = new(o, l, r);
  19. n->lineno = nearln;
  20. return n;
  21. }
  22. void
  23. prtree(Node *n, char *s)
  24. {
  25. print(" == %s ==\n", s);
  26. prtree1(n, 0, 0);
  27. print("\n");
  28. }
  29. void
  30. prtree1(Node *n, int d, int f)
  31. {
  32. int i;
  33. if(f)
  34. for(i=0; i<d; i++)
  35. print(" ");
  36. if(n == Z) {
  37. print("Z\n");
  38. return;
  39. }
  40. if(n->op == OLIST) {
  41. prtree1(n->left, d, 0);
  42. prtree1(n->right, d, 1);
  43. return;
  44. }
  45. d++;
  46. print("%O", n->op);
  47. i = 3;
  48. switch(n->op)
  49. {
  50. case ONAME:
  51. print(" \"%F\"", n);
  52. print(" %ld", n->xoffset);
  53. i = 0;
  54. break;
  55. case OINDREG:
  56. print(" %ld(R%d)", n->xoffset, n->reg);
  57. i = 0;
  58. break;
  59. case OREGISTER:
  60. if(n->xoffset)
  61. print(" %ld+R%d", n->xoffset, n->reg);
  62. else
  63. print(" R%d", n->reg);
  64. i = 0;
  65. break;
  66. case OSTRING:
  67. print(" \"%s\"", n->cstring);
  68. i = 0;
  69. break;
  70. case OLSTRING:
  71. print(" \"%S\"", n->rstring);
  72. i = 0;
  73. break;
  74. case ODOT:
  75. case OELEM:
  76. print(" \"%F\"", n);
  77. break;
  78. case OCONST:
  79. if(typefd[n->type->etype])
  80. print(" \"%.8e\"", n->fconst);
  81. else
  82. print(" \"%lld\"", n->vconst);
  83. i = 0;
  84. break;
  85. }
  86. if(n->addable != 0)
  87. print(" <%d>", n->addable);
  88. if(n->type != T)
  89. print(" %T", n->type);
  90. if(n->complex != 0)
  91. print(" (%d)", n->complex);
  92. print("\n");
  93. if(i & 2)
  94. prtree1(n->left, d, 1);
  95. if(i & 1)
  96. prtree1(n->right, d, 1);
  97. }
  98. Type*
  99. typ(int et, Type *d)
  100. {
  101. Type *t;
  102. t = alloc(sizeof(*t));
  103. t->etype = et;
  104. t->link = d;
  105. t->down = T;
  106. t->sym = S;
  107. t->width = ewidth[et];
  108. t->offset = 0;
  109. t->shift = 0;
  110. t->nbits = 0;
  111. t->garb = 0;
  112. return t;
  113. }
  114. Type*
  115. copytyp(Type *t)
  116. {
  117. Type *nt;
  118. nt = typ(TXXX, T);
  119. *nt = *t;
  120. return nt;
  121. }
  122. Type*
  123. garbt(Type *t, long b)
  124. {
  125. Type *t1;
  126. if(b & BGARB) {
  127. t1 = copytyp(t);
  128. t1->garb = simpleg(b);
  129. return t1;
  130. }
  131. return t;
  132. }
  133. int
  134. simpleg(long b)
  135. {
  136. b &= BGARB;
  137. switch(b) {
  138. case BCONSTNT:
  139. return GCONSTNT;
  140. case BVOLATILE:
  141. return GVOLATILE;
  142. case BVOLATILE|BCONSTNT:
  143. return GCONSTNT|GVOLATILE;
  144. }
  145. return GXXX;
  146. }
  147. int
  148. simplec(long b)
  149. {
  150. b &= BCLASS;
  151. switch(b) {
  152. case 0:
  153. case BREGISTER:
  154. return CXXX;
  155. case BAUTO:
  156. case BAUTO|BREGISTER:
  157. return CAUTO;
  158. case BEXTERN:
  159. return CEXTERN;
  160. case BEXTERN|BREGISTER:
  161. return CEXREG;
  162. case BSTATIC:
  163. return CSTATIC;
  164. case BTYPEDEF:
  165. return CTYPEDEF;
  166. case BTYPESTR:
  167. return CTYPESTR;
  168. }
  169. diag(Z, "illegal combination of classes %Q", b);
  170. return CXXX;
  171. }
  172. Type*
  173. simplet(long b)
  174. {
  175. b &= ~BCLASS & ~BGARB;
  176. switch(b) {
  177. case BCHAR:
  178. case BCHAR|BSIGNED:
  179. return types[TCHAR];
  180. case BCHAR|BUNSIGNED:
  181. return types[TUCHAR];
  182. case BSHORT:
  183. case BSHORT|BINT:
  184. case BSHORT|BSIGNED:
  185. case BSHORT|BINT|BSIGNED:
  186. return types[TSHORT];
  187. case BUNSIGNED|BSHORT:
  188. case BUNSIGNED|BSHORT|BINT:
  189. return types[TUSHORT];
  190. case 0:
  191. case BINT:
  192. case BINT|BSIGNED:
  193. case BSIGNED:
  194. return types[TINT];
  195. case BUNSIGNED:
  196. case BUNSIGNED|BINT:
  197. return types[TUINT];
  198. case BLONG:
  199. case BLONG|BINT:
  200. case BLONG|BSIGNED:
  201. case BLONG|BINT|BSIGNED:
  202. return types[TLONG];
  203. case BUNSIGNED|BLONG:
  204. case BUNSIGNED|BLONG|BINT:
  205. return types[TULONG];
  206. case BVLONG|BLONG:
  207. case BVLONG|BLONG|BINT:
  208. case BVLONG|BLONG|BSIGNED:
  209. case BVLONG|BLONG|BINT|BSIGNED:
  210. return types[TVLONG];
  211. case BVLONG|BLONG|BUNSIGNED:
  212. case BVLONG|BLONG|BINT|BUNSIGNED:
  213. return types[TUVLONG];
  214. case BFLOAT:
  215. return types[TFLOAT];
  216. case BDOUBLE:
  217. case BDOUBLE|BLONG:
  218. case BFLOAT|BLONG:
  219. return types[TDOUBLE];
  220. case BVOID:
  221. return types[TVOID];
  222. }
  223. diag(Z, "illegal combination of types %Q", b);
  224. return types[TINT];
  225. }
  226. int
  227. stcompat(Node *n, Type *t1, Type *t2, long ttab[])
  228. {
  229. int i;
  230. ulong b;
  231. i = 0;
  232. if(t2 != T)
  233. i = t2->etype;
  234. b = 1L << i;
  235. i = 0;
  236. if(t1 != T)
  237. i = t1->etype;
  238. if(b & ttab[i]) {
  239. if(ttab == tasign)
  240. if(b == BSTRUCT || b == BUNION)
  241. if(!sametype(t1, t2))
  242. return 1;
  243. if(n->op != OCAST)
  244. if(b == BIND && i == TIND)
  245. if(!sametype(t1, t2))
  246. return 1;
  247. return 0;
  248. }
  249. return 1;
  250. }
  251. int
  252. tcompat(Node *n, Type *t1, Type *t2, long ttab[])
  253. {
  254. if(stcompat(n, t1, t2, ttab)) {
  255. if(t1 == T)
  256. diag(n, "incompatible type: \"%T\" for op \"%O\"",
  257. t2, n->op);
  258. else
  259. diag(n, "incompatible types: \"%T\" and \"%T\" for op \"%O\"",
  260. t1, t2, n->op);
  261. return 1;
  262. }
  263. return 0;
  264. }
  265. void
  266. makedot(Node *n, Type *t, long o)
  267. {
  268. Node *n1, *n2;
  269. if(t->nbits) {
  270. n1 = new(OXXX, Z, Z);
  271. *n1 = *n;
  272. n->op = OBIT;
  273. n->left = n1;
  274. n->right = Z;
  275. n->type = t;
  276. n->addable = n1->left->addable;
  277. n = n1;
  278. }
  279. n->addable = n->left->addable;
  280. if(n->addable == 0) {
  281. n1 = new1(OCONST, Z, Z);
  282. n1->vconst = o;
  283. n1->type = types[TLONG];
  284. n->right = n1;
  285. n->type = t;
  286. return;
  287. }
  288. n->left->type = t;
  289. if(o == 0) {
  290. *n = *n->left;
  291. return;
  292. }
  293. n->type = t;
  294. n1 = new1(OCONST, Z, Z);
  295. n1->vconst = o;
  296. t = typ(TIND, t);
  297. t->width = types[TIND]->width;
  298. n1->type = t;
  299. n2 = new1(OADDR, n->left, Z);
  300. n2->type = t;
  301. n1 = new1(OADD, n1, n2);
  302. n1->type = t;
  303. n->op = OIND;
  304. n->left = n1;
  305. n->right = Z;
  306. }
  307. Type*
  308. dotsearch(Sym *s, Type *t, Node *n, long *off)
  309. {
  310. Type *t1, *xt, *rt;
  311. xt = T;
  312. /*
  313. * look it up by name
  314. */
  315. for(t1 = t; t1 != T; t1 = t1->down)
  316. if(t1->sym == s) {
  317. if(xt != T)
  318. goto ambig;
  319. xt = t1;
  320. }
  321. /*
  322. * look it up by type
  323. */
  324. if(s->class == CTYPEDEF || s->class == CTYPESTR)
  325. for(t1 = t; t1 != T; t1 = t1->down)
  326. if(t1->sym == S && typesu[t1->etype])
  327. if(sametype(s->type, t1)) {
  328. if(xt != T)
  329. goto ambig;
  330. xt = t1;
  331. }
  332. if(xt != T) {
  333. *off = xt->offset;
  334. return xt;
  335. }
  336. /*
  337. * look it up in unnamed substructures
  338. */
  339. for(t1 = t; t1 != T; t1 = t1->down)
  340. if(t1->sym == S && typesu[t1->etype]){
  341. rt = dotsearch(s, t1->link, n, off);
  342. if(rt != T) {
  343. if(xt != T)
  344. goto ambig;
  345. xt = rt;
  346. *off += t1->offset;
  347. }
  348. }
  349. return xt;
  350. ambig:
  351. diag(n, "ambiguous structure element: %s", s->name);
  352. return xt;
  353. }
  354. long
  355. dotoffset(Type *st, Type *lt, Node *n)
  356. {
  357. Type *t;
  358. Sym *g;
  359. long o, o1;
  360. o = -1;
  361. /*
  362. * first try matching at the top level
  363. * for matching tag names
  364. */
  365. g = st->tag;
  366. if(g != S)
  367. for(t=lt->link; t!=T; t=t->down)
  368. if(t->sym == S)
  369. if(g == t->tag) {
  370. if(o >= 0)
  371. goto ambig;
  372. o = t->offset;
  373. }
  374. if(o >= 0)
  375. return o;
  376. /*
  377. * second try matching at the top level
  378. * for similar types
  379. */
  380. for(t=lt->link; t!=T; t=t->down)
  381. if(t->sym == S)
  382. if(sametype(st, t)) {
  383. if(o >= 0)
  384. goto ambig;
  385. o = t->offset;
  386. }
  387. if(o >= 0)
  388. return o;
  389. /*
  390. * last try matching sub-levels
  391. */
  392. for(t=lt->link; t!=T; t=t->down)
  393. if(t->sym == S)
  394. if(typesu[t->etype]) {
  395. o1 = dotoffset(st, t, n);
  396. if(o1 >= 0) {
  397. if(o >= 0)
  398. goto ambig;
  399. o = o1 + t->offset;
  400. }
  401. }
  402. return o;
  403. ambig:
  404. diag(n, "ambiguous unnamed structure element");
  405. return o;
  406. }
  407. /*
  408. * look into tree for floating point constant expressions
  409. */
  410. int
  411. allfloat(Node *n, int flag)
  412. {
  413. if(n != Z) {
  414. if(n->type->etype != TDOUBLE)
  415. return 1;
  416. switch(n->op) {
  417. case OCONST:
  418. if(flag)
  419. n->type = types[TFLOAT];
  420. return 1;
  421. case OADD: /* no need to get more exotic than this */
  422. case OSUB:
  423. case OMUL:
  424. case ODIV:
  425. if(!allfloat(n->right, flag))
  426. break;
  427. case OCAST:
  428. if(!allfloat(n->left, flag))
  429. break;
  430. if(flag)
  431. n->type = types[TFLOAT];
  432. return 1;
  433. }
  434. }
  435. return 0;
  436. }
  437. void
  438. constas(Node *n, Type *il, Type *ir)
  439. {
  440. Type *l, *r;
  441. l = il;
  442. r = ir;
  443. if(l == T)
  444. return;
  445. if(l->garb & GCONSTNT) {
  446. warn(n, "assignment to a constant type (%T)", il);
  447. return;
  448. }
  449. if(r == T)
  450. return;
  451. for(;;) {
  452. if(l->etype != TIND || r->etype != TIND)
  453. break;
  454. l = l->link;
  455. r = r->link;
  456. if(l == T || r == T)
  457. break;
  458. if(r->garb & GCONSTNT)
  459. if(!(l->garb & GCONSTNT)) {
  460. warn(n, "assignment of a constant pointer type (%T)", ir);
  461. break;
  462. }
  463. }
  464. }
  465. void
  466. typeext1(Type *st, Node *l)
  467. {
  468. if(st->etype == TFLOAT && allfloat(l, 0))
  469. allfloat(l, 1);
  470. }
  471. void
  472. typeext(Type *st, Node *l)
  473. {
  474. Type *lt;
  475. Node *n1, *n2;
  476. long o;
  477. lt = l->type;
  478. if(lt == T)
  479. return;
  480. if(st->etype == TIND && vconst(l) == 0) {
  481. l->type = st;
  482. l->vconst = 0;
  483. return;
  484. }
  485. typeext1(st, l);
  486. /*
  487. * extension of C
  488. * if assign of struct containing unnamed sub-struct
  489. * to type of sub-struct, insert the DOT.
  490. * if assign of *struct containing unnamed substruct
  491. * to type of *sub-struct, insert the add-offset
  492. */
  493. if(typesu[st->etype] && typesu[lt->etype]) {
  494. o = dotoffset(st, lt, l);
  495. if(o >= 0) {
  496. n1 = new1(OXXX, Z, Z);
  497. *n1 = *l;
  498. l->op = ODOT;
  499. l->left = n1;
  500. l->right = Z;
  501. makedot(l, st, o);
  502. }
  503. return;
  504. }
  505. if(st->etype == TIND && typesu[st->link->etype])
  506. if(lt->etype == TIND && typesu[lt->link->etype]) {
  507. o = dotoffset(st->link, lt->link, l);
  508. if(o >= 0) {
  509. l->type = st;
  510. if(o == 0)
  511. return;
  512. n1 = new1(OXXX, Z, Z);
  513. *n1 = *l;
  514. n2 = new1(OCONST, Z, Z);
  515. n2->vconst = o;
  516. n2->type = st;
  517. l->op = OADD;
  518. l->left = n1;
  519. l->right = n2;
  520. }
  521. return;
  522. }
  523. }
  524. /*
  525. * a cast that generates no code
  526. * (same size move)
  527. */
  528. int
  529. nocast(Type *t1, Type *t2)
  530. {
  531. int i, b;
  532. if(t1->nbits)
  533. return 0;
  534. i = 0;
  535. if(t2 != T)
  536. i = t2->etype;
  537. b = 1<<i;
  538. i = 0;
  539. if(t1 != T)
  540. i = t1->etype;
  541. if(b & ncast[i])
  542. return 1;
  543. return 0;
  544. }
  545. /*
  546. * a cast that has a noop semantic
  547. * (small to large, convert)
  548. */
  549. int
  550. nilcast(Type *t1, Type *t2)
  551. {
  552. int et1, et2;
  553. if(t1 == T)
  554. return 0;
  555. if(t1->nbits)
  556. return 0;
  557. if(t2 == T)
  558. return 0;
  559. et1 = t1->etype;
  560. et2 = t2->etype;
  561. if(et1 == et2)
  562. return 1;
  563. if(typefd[et1] && typefd[et2]) {
  564. if(ewidth[et1] < ewidth[et2])
  565. return 1;
  566. return 0;
  567. }
  568. if(typechlp[et1] && typechlp[et2]) {
  569. if(ewidth[et1] < ewidth[et2])
  570. return 1;
  571. return 0;
  572. }
  573. return 0;
  574. }
  575. /*
  576. * "the usual arithmetic conversions are performed"
  577. */
  578. void
  579. arith(Node *n, int f)
  580. {
  581. Type *t1, *t2;
  582. int i, j, k;
  583. Node *n1;
  584. long w;
  585. t1 = n->left->type;
  586. if(n->right == Z)
  587. t2 = t1;
  588. else
  589. t2 = n->right->type;
  590. i = TXXX;
  591. if(t1 != T)
  592. i = t1->etype;
  593. j = TXXX;
  594. if(t2 != T)
  595. j = t2->etype;
  596. k = tab[i][j];
  597. if(k == TIND) {
  598. if(i == TIND)
  599. n->type = t1;
  600. else
  601. if(j == TIND)
  602. n->type = t2;
  603. } else {
  604. /* convert up to at least int */
  605. if(f == 1)
  606. while(k < TINT)
  607. k += 2;
  608. n->type = types[k];
  609. }
  610. if(n->op == OSUB)
  611. if(i == TIND && j == TIND) {
  612. w = n->right->type->link->width;
  613. if(w < 1)
  614. goto bad;
  615. if(w > 1) {
  616. n1 = new1(OXXX, Z, Z);
  617. *n1 = *n;
  618. n->op = ODIV;
  619. n->left = n1;
  620. n1 = new1(OCONST, Z, Z);
  621. n1->vconst = w;
  622. n1->type = n->type;
  623. n->right = n1;
  624. w = vlog(n1);
  625. if(w >= 0) {
  626. n->op = OASHR;
  627. n1->vconst = w;
  628. }
  629. }
  630. n->type = types[TLONG];
  631. return;
  632. }
  633. if(!sametype(n->type, n->left->type)) {
  634. n->left = new1(OCAST, n->left, Z);
  635. n->left->type = n->type;
  636. if(n->type->etype == TIND) {
  637. w = n->type->link->width;
  638. if(w < 1) {
  639. snap(n->type->link);
  640. w = n->type->link->width;
  641. if(w < 1)
  642. goto bad;
  643. }
  644. if(w > 1) {
  645. n1 = new1(OCONST, Z, Z);
  646. n1->vconst = w;
  647. n1->type = n->type;
  648. n->left = new1(OMUL, n->left, n1);
  649. n->left->type = n->type;
  650. }
  651. }
  652. }
  653. if(n->right != Z)
  654. if(!sametype(n->type, n->right->type)) {
  655. n->right = new1(OCAST, n->right, Z);
  656. n->right->type = n->type;
  657. if(n->type->etype == TIND) {
  658. w = n->type->link->width;
  659. if(w < 1) {
  660. snap(n->type->link);
  661. w = n->type->link->width;
  662. if(w < 1)
  663. goto bad;
  664. }
  665. if(w != 1) {
  666. n1 = new1(OCONST, Z, Z);
  667. n1->vconst = w;
  668. n1->type = n->type;
  669. n->right = new1(OMUL, n->right, n1);
  670. n->right->type = n->type;
  671. }
  672. }
  673. }
  674. return;
  675. bad:
  676. diag(n, "pointer addition not fully declared: %T", n->type->link);
  677. }
  678. /*
  679. * try to rewrite shift & mask
  680. */
  681. void
  682. simplifyshift(Node *n)
  683. {
  684. ulong c3;
  685. int o, s1, s2, c1, c2;
  686. if(!typechlp[n->type->etype])
  687. return;
  688. switch(n->op) {
  689. default:
  690. return;
  691. case OASHL:
  692. s1 = 0;
  693. break;
  694. case OLSHR:
  695. s1 = 1;
  696. break;
  697. case OASHR:
  698. s1 = 2;
  699. break;
  700. }
  701. if(n->right->op != OCONST)
  702. return;
  703. if(n->left->op != OAND)
  704. return;
  705. if(n->left->right->op != OCONST)
  706. return;
  707. switch(n->left->left->op) {
  708. default:
  709. return;
  710. case OASHL:
  711. s2 = 0;
  712. break;
  713. case OLSHR:
  714. s2 = 1;
  715. break;
  716. case OASHR:
  717. s2 = 2;
  718. break;
  719. }
  720. if(n->left->left->right->op != OCONST)
  721. return;
  722. c1 = n->right->vconst;
  723. c2 = n->left->left->right->vconst;
  724. c3 = n->left->right->vconst;
  725. /*
  726. if(debug['h'])
  727. print("%.3o %ld %ld %d #%.lux\n",
  728. (s1<<3)|s2, c1, c2, topbit(c3), c3);
  729. */
  730. o = n->op;
  731. switch((s1<<3)|s2) {
  732. case 000: /* (((e <<u c2) & c3) <<u c1) */
  733. c3 >>= c2;
  734. c1 += c2;
  735. if(c1 >= 32)
  736. break;
  737. goto rewrite1;
  738. case 002: /* (((e >>s c2) & c3) <<u c1) */
  739. if(topbit(c3) >= (32-c2))
  740. break;
  741. case 001: /* (((e >>u c2) & c3) <<u c1) */
  742. if(c1 > c2) {
  743. c3 <<= c2;
  744. c1 -= c2;
  745. o = OASHL;
  746. goto rewrite1;
  747. }
  748. c3 <<= c1;
  749. if(c1 == c2)
  750. goto rewrite0;
  751. c1 = c2-c1;
  752. o = OLSHR;
  753. goto rewrite2;
  754. case 022: /* (((e >>s c2) & c3) >>s c1) */
  755. if(c2 <= 0)
  756. break;
  757. case 012: /* (((e >>s c2) & c3) >>u c1) */
  758. if(topbit(c3) >= (32-c2))
  759. break;
  760. goto s11;
  761. case 021: /* (((e >>u c2) & c3) >>s c1) */
  762. if(topbit(c3) >= 31 && c2 <= 0)
  763. break;
  764. goto s11;
  765. case 011: /* (((e >>u c2) & c3) >>u c1) */
  766. s11:
  767. c3 <<= c2;
  768. c1 += c2;
  769. if(c1 >= 32)
  770. break;
  771. o = OLSHR;
  772. goto rewrite1;
  773. case 020: /* (((e <<u c2) & c3) >>s c1) */
  774. if(topbit(c3) >= 31)
  775. break;
  776. case 010: /* (((e <<u c2) & c3) >>u c1) */
  777. c3 >>= c1;
  778. if(c1 == c2)
  779. goto rewrite0;
  780. if(c1 > c2) {
  781. c1 -= c2;
  782. goto rewrite2;
  783. }
  784. c1 = c2 - c1;
  785. o = OASHL;
  786. goto rewrite2;
  787. }
  788. return;
  789. rewrite0: /* get rid of both shifts */
  790. if(debug['<'])prtree(n, "rewrite0");
  791. *n = *n->left;
  792. n->left = n->left->left;
  793. n->right->vconst = c3;
  794. return;
  795. rewrite1: /* get rid of lower shift */
  796. if(debug['<'])prtree(n, "rewrite1");
  797. n->left->left = n->left->left->left;
  798. n->left->right->vconst = c3;
  799. n->right->vconst = c1;
  800. n->op = o;
  801. return;
  802. rewrite2: /* get rid of upper shift */
  803. if(debug['<'])prtree(n, "rewrite2");
  804. *n = *n->left;
  805. n->right->vconst = c3;
  806. n->left->right->vconst = c1;
  807. n->left->op = o;
  808. }
  809. int
  810. side(Node *n)
  811. {
  812. loop:
  813. if(n != Z)
  814. switch(n->op) {
  815. case OCAST:
  816. case ONOT:
  817. case OADDR:
  818. case OIND:
  819. n = n->left;
  820. goto loop;
  821. case OCOND:
  822. if(side(n->left))
  823. break;
  824. n = n->right;
  825. case OEQ:
  826. case ONE:
  827. case OLT:
  828. case OGE:
  829. case OGT:
  830. case OLE:
  831. case OADD:
  832. case OSUB:
  833. case OMUL:
  834. case OLMUL:
  835. case ODIV:
  836. case OLDIV:
  837. case OLSHR:
  838. case OASHL:
  839. case OASHR:
  840. case OAND:
  841. case OOR:
  842. case OXOR:
  843. case OMOD:
  844. case OLMOD:
  845. case OANDAND:
  846. case OOROR:
  847. case OCOMMA:
  848. case ODOT:
  849. if(side(n->left))
  850. break;
  851. n = n->right;
  852. goto loop;
  853. case OSIGN:
  854. case OSIZE:
  855. case OCONST:
  856. case OSTRING:
  857. case OLSTRING:
  858. case ONAME:
  859. return 0;
  860. }
  861. return 1;
  862. }
  863. int
  864. vconst(Node *n)
  865. {
  866. int i;
  867. if(n == Z)
  868. goto no;
  869. if(n->op != OCONST)
  870. goto no;
  871. if(n->type == T)
  872. goto no;
  873. switch(n->type->etype)
  874. {
  875. case TFLOAT:
  876. case TDOUBLE:
  877. i = 100;
  878. if(n->fconst > i || n->fconst < -i)
  879. goto no;
  880. i = n->fconst;
  881. if(i != n->fconst)
  882. goto no;
  883. return i;
  884. case TVLONG:
  885. case TUVLONG:
  886. i = n->vconst;
  887. if(i != n->vconst)
  888. goto no;
  889. return i;
  890. case TCHAR:
  891. case TUCHAR:
  892. case TSHORT:
  893. case TUSHORT:
  894. case TINT:
  895. case TUINT:
  896. case TLONG:
  897. case TULONG:
  898. case TIND:
  899. i = n->vconst;
  900. if(i != n->vconst)
  901. goto no;
  902. return i;
  903. }
  904. no:
  905. return -159; /* first uninteresting constant */
  906. }
  907. /*
  908. * return log(n) if n is a power of 2 constant
  909. */
  910. int
  911. log2(uvlong v)
  912. {
  913. int s, i;
  914. uvlong m;
  915. s = 0;
  916. m = MASK(8*sizeof(uvlong));
  917. for(i=32; i; i>>=1) {
  918. m >>= i;
  919. if(!(v & m)) {
  920. v >>= i;
  921. s += i;
  922. }
  923. }
  924. if(v == 1)
  925. return s;
  926. return -1;
  927. }
  928. int
  929. vlog(Node *n)
  930. {
  931. if(n->op != OCONST)
  932. goto bad;
  933. if(typefd[n->type->etype])
  934. goto bad;
  935. return log2(n->vconst);
  936. bad:
  937. return -1;
  938. }
  939. int
  940. topbit(ulong v)
  941. {
  942. int i;
  943. for(i = -1; v; i++)
  944. v >>= 1;
  945. return i;
  946. }
  947. /*
  948. * try to cast a constant down
  949. * rather than cast a variable up
  950. * example:
  951. * if(c == 'a')
  952. */
  953. void
  954. relcon(Node *l, Node *r)
  955. {
  956. vlong v;
  957. if(l->op != OCONST)
  958. return;
  959. if(r->op != OCAST)
  960. return;
  961. if(!nilcast(r->left->type, r->type))
  962. return;
  963. switch(r->type->etype) {
  964. default:
  965. return;
  966. case TCHAR:
  967. case TUCHAR:
  968. case TSHORT:
  969. case TUSHORT:
  970. v = convvtox(l->vconst, r->type->etype);
  971. if(v != l->vconst)
  972. return;
  973. break;
  974. }
  975. l->type = r->left->type;
  976. *r = *r->left;
  977. }
  978. int
  979. relindex(int o)
  980. {
  981. switch(o) {
  982. default:
  983. diag(Z, "bad in relindex: %O", o);
  984. case OEQ: return 0;
  985. case ONE: return 1;
  986. case OLE: return 2;
  987. case OLS: return 3;
  988. case OLT: return 4;
  989. case OLO: return 5;
  990. case OGE: return 6;
  991. case OHS: return 7;
  992. case OGT: return 8;
  993. case OHI: return 9;
  994. }
  995. }
  996. Node*
  997. invert(Node *n)
  998. {
  999. Node *i;
  1000. if(n == Z || n->op != OLIST)
  1001. return n;
  1002. i = n;
  1003. for(n = n->left; n != Z; n = n->left) {
  1004. if(n->op != OLIST)
  1005. break;
  1006. i->left = n->right;
  1007. n->right = i;
  1008. i = n;
  1009. }
  1010. i->left = n;
  1011. return i;
  1012. }
  1013. int
  1014. bitno(long b)
  1015. {
  1016. int i;
  1017. for(i=0; i<32; i++)
  1018. if(b & (1L<<i))
  1019. return i;
  1020. diag(Z, "bad in bitno");
  1021. return 0;
  1022. }
  1023. long
  1024. typebitor(long a, long b)
  1025. {
  1026. long c;
  1027. c = a | b;
  1028. if(a & b)
  1029. if((a & b) == BLONG)
  1030. c |= BVLONG; /* long long => vlong */
  1031. else
  1032. warn(Z, "once is enough: %Q", a & b);
  1033. return c;
  1034. }
  1035. void
  1036. diag(Node *n, char *fmt, ...)
  1037. {
  1038. char buf[STRINGSZ];
  1039. va_list arg;
  1040. va_start(arg, fmt);
  1041. vseprint(buf, buf+sizeof(buf), fmt, arg);
  1042. va_end(arg);
  1043. print("%L %s\n", (n==Z)? nearln: n->lineno, buf);
  1044. if(debug['X'])
  1045. abort();
  1046. if(n != Z)
  1047. if(debug['v'])
  1048. prtree(n, "diagnostic");
  1049. nerrors++;
  1050. if(nerrors > 10) {
  1051. print("too many errors\n");
  1052. errorexit();
  1053. }
  1054. }
  1055. void
  1056. warn(Node *n, char *fmt, ...)
  1057. {
  1058. char buf[STRINGSZ];
  1059. va_list arg;
  1060. if(debug['w']) {
  1061. print("warning: ");
  1062. va_start(arg, fmt);
  1063. vseprint(buf, buf+sizeof(buf), fmt, arg);
  1064. va_end(arg);
  1065. print("%L %s\n", (n==Z)? nearln: n->lineno, buf);
  1066. if(n != Z)
  1067. if(debug['v'])
  1068. prtree(n, "warning");
  1069. }
  1070. }
  1071. void
  1072. yyerror(char *fmt, ...)
  1073. {
  1074. char buf[STRINGSZ];
  1075. va_list arg;
  1076. /*
  1077. * hack to intercept message from yaccpar
  1078. */
  1079. if(strcmp(fmt, "syntax error") == 0) {
  1080. yyerror("syntax error, last name: %s", symb);
  1081. return;
  1082. }
  1083. va_start(arg, fmt);
  1084. vseprint(buf, buf+sizeof(buf), fmt, arg);
  1085. va_end(arg);
  1086. print("%L %s\n", lineno, buf);
  1087. nerrors++;
  1088. if(nerrors > 10) {
  1089. print("too many errors\n");
  1090. errorexit();
  1091. }
  1092. }
  1093. void
  1094. fatal(Node *n, char *fmt, ...)
  1095. {
  1096. char buf[STRINGSZ];
  1097. va_list arg;
  1098. va_start(arg, fmt);
  1099. vseprint(buf, buf+sizeof(buf), fmt, arg);
  1100. va_end(arg);
  1101. print("%L %s\n", (n==Z)? nearln: n->lineno, buf);
  1102. if(debug['X'])
  1103. abort();
  1104. if(n != Z)
  1105. if(debug['v'])
  1106. prtree(n, "diagnostic");
  1107. nerrors++;
  1108. errorexit();
  1109. }
  1110. ulong thash1 = 0x2edab8c9;
  1111. ulong thash2 = 0x1dc74fb8;
  1112. ulong thash3 = 0x1f241331;
  1113. ulong thash[NALLTYPES];
  1114. Init thashinit[] =
  1115. {
  1116. TXXX, 0x17527bbd, 0,
  1117. TCHAR, 0x5cedd32b, 0,
  1118. TUCHAR, 0x552c4454, 0,
  1119. TSHORT, 0x63040b4b, 0,
  1120. TUSHORT, 0x32a45878, 0,
  1121. TINT, 0x4151d5bd, 0,
  1122. TUINT, 0x5ae707d6, 0,
  1123. TLONG, 0x5ef20f47, 0,
  1124. TULONG, 0x36d8eb8f, 0,
  1125. TVLONG, 0x6e5e9590, 0,
  1126. TUVLONG, 0x75910105, 0,
  1127. TFLOAT, 0x25fd7af1, 0,
  1128. TDOUBLE, 0x7c40a1b2, 0,
  1129. TIND, 0x1b832357, 0,
  1130. TFUNC, 0x6babc9cb, 0,
  1131. TARRAY, 0x7c50986d, 0,
  1132. TVOID, 0x44112eff, 0,
  1133. TSTRUCT, 0x7c2da3bf, 0,
  1134. TUNION, 0x3eb25e98, 0,
  1135. TENUM, 0x44b54f61, 0,
  1136. TFILE, 0x19242ac3, 0,
  1137. TOLD, 0x22b15988, 0,
  1138. TDOT, 0x0204f6b3, 0,
  1139. -1, 0, 0,
  1140. };
  1141. char* bnames[NALIGN];
  1142. Init bnamesinit[] =
  1143. {
  1144. Axxx, 0, "Axxx",
  1145. Ael1, 0, "el1",
  1146. Ael2, 0, "el2",
  1147. Asu2, 0, "su2",
  1148. Aarg0, 0, "arg0",
  1149. Aarg1, 0, "arg1",
  1150. Aarg2, 0, "arg2",
  1151. Aaut3, 0, "aut3",
  1152. -1, 0, 0,
  1153. };
  1154. char* tnames[NALLTYPES];
  1155. Init tnamesinit[] =
  1156. {
  1157. TXXX, 0, "TXXX",
  1158. TCHAR, 0, "CHAR",
  1159. TUCHAR, 0, "UCHAR",
  1160. TSHORT, 0, "SHORT",
  1161. TUSHORT, 0, "USHORT",
  1162. TINT, 0, "INT",
  1163. TUINT, 0, "UINT",
  1164. TLONG, 0, "LONG",
  1165. TULONG, 0, "ULONG",
  1166. TVLONG, 0, "VLONG",
  1167. TUVLONG, 0, "UVLONG",
  1168. TFLOAT, 0, "FLOAT",
  1169. TDOUBLE, 0, "DOUBLE",
  1170. TIND, 0, "IND",
  1171. TFUNC, 0, "FUNC",
  1172. TARRAY, 0, "ARRAY",
  1173. TVOID, 0, "VOID",
  1174. TSTRUCT, 0, "STRUCT",
  1175. TUNION, 0, "UNION",
  1176. TENUM, 0, "ENUM",
  1177. TFILE, 0, "FILE",
  1178. TOLD, 0, "OLD",
  1179. TDOT, 0, "DOT",
  1180. -1, 0, 0,
  1181. };
  1182. char* gnames[NGTYPES];
  1183. Init gnamesinit[] =
  1184. {
  1185. GXXX, 0, "GXXX",
  1186. GCONSTNT, 0, "CONST",
  1187. GVOLATILE, 0, "VOLATILE",
  1188. GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE",
  1189. -1, 0, 0,
  1190. };
  1191. char* qnames[NALLTYPES];
  1192. Init qnamesinit[] =
  1193. {
  1194. TXXX, 0, "TXXX",
  1195. TCHAR, 0, "CHAR",
  1196. TUCHAR, 0, "UCHAR",
  1197. TSHORT, 0, "SHORT",
  1198. TUSHORT, 0, "USHORT",
  1199. TINT, 0, "INT",
  1200. TUINT, 0, "UINT",
  1201. TLONG, 0, "LONG",
  1202. TULONG, 0, "ULONG",
  1203. TVLONG, 0, "VLONG",
  1204. TUVLONG, 0, "UVLONG",
  1205. TFLOAT, 0, "FLOAT",
  1206. TDOUBLE, 0, "DOUBLE",
  1207. TIND, 0, "IND",
  1208. TFUNC, 0, "FUNC",
  1209. TARRAY, 0, "ARRAY",
  1210. TVOID, 0, "VOID",
  1211. TSTRUCT, 0, "STRUCT",
  1212. TUNION, 0, "UNION",
  1213. TENUM, 0, "ENUM",
  1214. TAUTO, 0, "AUTO",
  1215. TEXTERN, 0, "EXTERN",
  1216. TSTATIC, 0, "STATIC",
  1217. TTYPEDEF, 0, "TYPEDEF",
  1218. TTYPESTR, 0, "TYPESTR",
  1219. TREGISTER, 0, "REGISTER",
  1220. TCONSTNT, 0, "CONSTNT",
  1221. TVOLATILE, 0, "VOLATILE",
  1222. TUNSIGNED, 0, "UNSIGNED",
  1223. TSIGNED, 0, "SIGNED",
  1224. TDOT, 0, "DOT",
  1225. TFILE, 0, "FILE",
  1226. TOLD, 0, "OLD",
  1227. -1, 0, 0,
  1228. };
  1229. char* cnames[NCTYPES];
  1230. Init cnamesinit[] =
  1231. {
  1232. CXXX, 0, "CXXX",
  1233. CAUTO, 0, "AUTO",
  1234. CEXTERN, 0, "EXTERN",
  1235. CGLOBL, 0, "GLOBL",
  1236. CSTATIC, 0, "STATIC",
  1237. CLOCAL, 0, "LOCAL",
  1238. CTYPEDEF, 0, "TYPEDEF",
  1239. CTYPESTR, 0, "TYPESTR",
  1240. CPARAM, 0, "PARAM",
  1241. CSELEM, 0, "SELEM",
  1242. CLABEL, 0, "LABEL",
  1243. CEXREG, 0, "EXREG",
  1244. -1, 0, 0,
  1245. };
  1246. char* onames[OEND+1];
  1247. Init onamesinit[] =
  1248. {
  1249. OXXX, 0, "OXXX",
  1250. OADD, 0, "ADD",
  1251. OADDR, 0, "ADDR",
  1252. OAND, 0, "AND",
  1253. OANDAND, 0, "ANDAND",
  1254. OARRAY, 0, "ARRAY",
  1255. OAS, 0, "AS",
  1256. OASI, 0, "ASI",
  1257. OASADD, 0, "ASADD",
  1258. OASAND, 0, "ASAND",
  1259. OASASHL, 0, "ASASHL",
  1260. OASASHR, 0, "ASASHR",
  1261. OASDIV, 0, "ASDIV",
  1262. OASHL, 0, "ASHL",
  1263. OASHR, 0, "ASHR",
  1264. OASLDIV, 0, "ASLDIV",
  1265. OASLMOD, 0, "ASLMOD",
  1266. OASLMUL, 0, "ASLMUL",
  1267. OASLSHR, 0, "ASLSHR",
  1268. OASMOD, 0, "ASMOD",
  1269. OASMUL, 0, "ASMUL",
  1270. OASOR, 0, "ASOR",
  1271. OASSUB, 0, "ASSUB",
  1272. OASXOR, 0, "ASXOR",
  1273. OBIT, 0, "BIT",
  1274. OBREAK, 0, "BREAK",
  1275. OCASE, 0, "CASE",
  1276. OCAST, 0, "CAST",
  1277. OCOMMA, 0, "COMMA",
  1278. OCOND, 0, "COND",
  1279. OCONST, 0, "CONST",
  1280. OCONTINUE, 0, "CONTINUE",
  1281. ODIV, 0, "DIV",
  1282. ODOT, 0, "DOT",
  1283. ODOTDOT, 0, "DOTDOT",
  1284. ODWHILE, 0, "DWHILE",
  1285. OENUM, 0, "ENUM",
  1286. OEQ, 0, "EQ",
  1287. OFOR, 0, "FOR",
  1288. OFUNC, 0, "FUNC",
  1289. OGE, 0, "GE",
  1290. OGOTO, 0, "GOTO",
  1291. OGT, 0, "GT",
  1292. OHI, 0, "HI",
  1293. OHS, 0, "HS",
  1294. OIF, 0, "IF",
  1295. OIND, 0, "IND",
  1296. OINDREG, 0, "INDREG",
  1297. OINIT, 0, "INIT",
  1298. OLABEL, 0, "LABEL",
  1299. OLDIV, 0, "LDIV",
  1300. OLE, 0, "LE",
  1301. OLIST, 0, "LIST",
  1302. OLMOD, 0, "LMOD",
  1303. OLMUL, 0, "LMUL",
  1304. OLO, 0, "LO",
  1305. OLS, 0, "LS",
  1306. OLSHR, 0, "LSHR",
  1307. OLT, 0, "LT",
  1308. OMOD, 0, "MOD",
  1309. OMUL, 0, "MUL",
  1310. ONAME, 0, "NAME",
  1311. ONE, 0, "NE",
  1312. ONOT, 0, "NOT",
  1313. OOR, 0, "OR",
  1314. OOROR, 0, "OROR",
  1315. OPOSTDEC, 0, "POSTDEC",
  1316. OPOSTINC, 0, "POSTINC",
  1317. OPREDEC, 0, "PREDEC",
  1318. OPREINC, 0, "PREINC",
  1319. OPROTO, 0, "PROTO",
  1320. OREGISTER, 0, "REGISTER",
  1321. ORETURN, 0, "RETURN",
  1322. OSET, 0, "SET",
  1323. OSIGN, 0, "SIGN",
  1324. OSIZE, 0, "SIZE",
  1325. OSTRING, 0, "STRING",
  1326. OLSTRING, 0, "LSTRING",
  1327. OSTRUCT, 0, "STRUCT",
  1328. OSUB, 0, "SUB",
  1329. OSWITCH, 0, "SWITCH",
  1330. OUNION, 0, "UNION",
  1331. OUSED, 0, "USED",
  1332. OWHILE, 0, "WHILE",
  1333. OXOR, 0, "XOR",
  1334. OPOS, 0, "POS",
  1335. ONEG, 0, "NEG",
  1336. OCOM, 0, "COM",
  1337. OELEM, 0, "ELEM",
  1338. OTST, 0, "TST",
  1339. OINDEX, 0, "INDEX",
  1340. OFAS, 0, "FAS",
  1341. OREGPAIR, 0, "REGPAIR",
  1342. OEND, 0, "END",
  1343. -1, 0, 0,
  1344. };
  1345. char comrel[12] =
  1346. {
  1347. ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
  1348. };
  1349. char invrel[12] =
  1350. {
  1351. OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
  1352. };
  1353. char logrel[12] =
  1354. {
  1355. OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
  1356. };
  1357. char typei[NTYPE];
  1358. int typeiinit[] =
  1359. {
  1360. TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
  1361. };
  1362. char typeu[NTYPE];
  1363. int typeuinit[] =
  1364. {
  1365. TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
  1366. };
  1367. char typesuv[NTYPE];
  1368. int typesuvinit[] =
  1369. {
  1370. TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
  1371. };
  1372. char typeilp[NTYPE];
  1373. int typeilpinit[] =
  1374. {
  1375. TINT, TUINT, TLONG, TULONG, TIND, -1
  1376. };
  1377. char typechl[NTYPE];
  1378. char typechlv[NTYPE];
  1379. int typechlinit[] =
  1380. {
  1381. TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
  1382. };
  1383. char typechlp[NTYPE];
  1384. int typechlpinit[] =
  1385. {
  1386. TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
  1387. };
  1388. char typechlpfd[NTYPE];
  1389. int typechlpfdinit[] =
  1390. {
  1391. TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
  1392. };
  1393. char typec[NTYPE];
  1394. int typecinit[] =
  1395. {
  1396. TCHAR, TUCHAR, -1
  1397. };
  1398. char typeh[NTYPE];
  1399. int typehinit[] =
  1400. {
  1401. TSHORT, TUSHORT, -1,
  1402. };
  1403. char typeil[NTYPE];
  1404. int typeilinit[] =
  1405. {
  1406. TINT, TUINT, TLONG, TULONG, -1,
  1407. };
  1408. char typev[NTYPE];
  1409. int typevinit[] =
  1410. {
  1411. TVLONG, TUVLONG, -1,
  1412. };
  1413. char typefd[NTYPE];
  1414. int typefdinit[] =
  1415. {
  1416. TFLOAT, TDOUBLE, -1,
  1417. };
  1418. char typeaf[NTYPE];
  1419. int typeafinit[] =
  1420. {
  1421. TFUNC, TARRAY, -1,
  1422. };
  1423. char typesu[NTYPE];
  1424. int typesuinit[] =
  1425. {
  1426. TSTRUCT, TUNION, -1,
  1427. };
  1428. long tasign[NTYPE];
  1429. Init tasigninit[] =
  1430. {
  1431. TCHAR, BNUMBER, 0,
  1432. TUCHAR, BNUMBER, 0,
  1433. TSHORT, BNUMBER, 0,
  1434. TUSHORT, BNUMBER, 0,
  1435. TINT, BNUMBER, 0,
  1436. TUINT, BNUMBER, 0,
  1437. TLONG, BNUMBER, 0,
  1438. TULONG, BNUMBER, 0,
  1439. TVLONG, BNUMBER, 0,
  1440. TUVLONG, BNUMBER, 0,
  1441. TFLOAT, BNUMBER, 0,
  1442. TDOUBLE, BNUMBER, 0,
  1443. TIND, BIND, 0,
  1444. TSTRUCT, BSTRUCT, 0,
  1445. TUNION, BUNION, 0,
  1446. -1, 0, 0,
  1447. };
  1448. long tasadd[NTYPE];
  1449. Init tasaddinit[] =
  1450. {
  1451. TCHAR, BNUMBER, 0,
  1452. TUCHAR, BNUMBER, 0,
  1453. TSHORT, BNUMBER, 0,
  1454. TUSHORT, BNUMBER, 0,
  1455. TINT, BNUMBER, 0,
  1456. TUINT, BNUMBER, 0,
  1457. TLONG, BNUMBER, 0,
  1458. TULONG, BNUMBER, 0,
  1459. TVLONG, BNUMBER, 0,
  1460. TUVLONG, BNUMBER, 0,
  1461. TFLOAT, BNUMBER, 0,
  1462. TDOUBLE, BNUMBER, 0,
  1463. TIND, BINTEGER, 0,
  1464. -1, 0, 0,
  1465. };
  1466. long tcast[NTYPE];
  1467. Init tcastinit[] =
  1468. {
  1469. TCHAR, BNUMBER|BIND|BVOID, 0,
  1470. TUCHAR, BNUMBER|BIND|BVOID, 0,
  1471. TSHORT, BNUMBER|BIND|BVOID, 0,
  1472. TUSHORT, BNUMBER|BIND|BVOID, 0,
  1473. TINT, BNUMBER|BIND|BVOID, 0,
  1474. TUINT, BNUMBER|BIND|BVOID, 0,
  1475. TLONG, BNUMBER|BIND|BVOID, 0,
  1476. TULONG, BNUMBER|BIND|BVOID, 0,
  1477. TVLONG, BNUMBER|BIND|BVOID, 0,
  1478. TUVLONG, BNUMBER|BIND|BVOID, 0,
  1479. TFLOAT, BNUMBER|BVOID, 0,
  1480. TDOUBLE, BNUMBER|BVOID, 0,
  1481. TIND, BINTEGER|BIND|BVOID, 0,
  1482. TVOID, BVOID, 0,
  1483. TSTRUCT, BSTRUCT|BVOID, 0,
  1484. TUNION, BUNION|BVOID, 0,
  1485. -1, 0, 0,
  1486. };
  1487. long tadd[NTYPE];
  1488. Init taddinit[] =
  1489. {
  1490. TCHAR, BNUMBER|BIND, 0,
  1491. TUCHAR, BNUMBER|BIND, 0,
  1492. TSHORT, BNUMBER|BIND, 0,
  1493. TUSHORT, BNUMBER|BIND, 0,
  1494. TINT, BNUMBER|BIND, 0,
  1495. TUINT, BNUMBER|BIND, 0,
  1496. TLONG, BNUMBER|BIND, 0,
  1497. TULONG, BNUMBER|BIND, 0,
  1498. TVLONG, BNUMBER|BIND, 0,
  1499. TUVLONG, BNUMBER|BIND, 0,
  1500. TFLOAT, BNUMBER, 0,
  1501. TDOUBLE, BNUMBER, 0,
  1502. TIND, BINTEGER, 0,
  1503. -1, 0, 0,
  1504. };
  1505. long tsub[NTYPE];
  1506. Init tsubinit[] =
  1507. {
  1508. TCHAR, BNUMBER, 0,
  1509. TUCHAR, BNUMBER, 0,
  1510. TSHORT, BNUMBER, 0,
  1511. TUSHORT, BNUMBER, 0,
  1512. TINT, BNUMBER, 0,
  1513. TUINT, BNUMBER, 0,
  1514. TLONG, BNUMBER, 0,
  1515. TULONG, BNUMBER, 0,
  1516. TVLONG, BNUMBER, 0,
  1517. TUVLONG, BNUMBER, 0,
  1518. TFLOAT, BNUMBER, 0,
  1519. TDOUBLE, BNUMBER, 0,
  1520. TIND, BINTEGER|BIND, 0,
  1521. -1, 0, 0,
  1522. };
  1523. long tmul[NTYPE];
  1524. Init tmulinit[] =
  1525. {
  1526. TCHAR, BNUMBER, 0,
  1527. TUCHAR, BNUMBER, 0,
  1528. TSHORT, BNUMBER, 0,
  1529. TUSHORT, BNUMBER, 0,
  1530. TINT, BNUMBER, 0,
  1531. TUINT, BNUMBER, 0,
  1532. TLONG, BNUMBER, 0,
  1533. TULONG, BNUMBER, 0,
  1534. TVLONG, BNUMBER, 0,
  1535. TUVLONG, BNUMBER, 0,
  1536. TFLOAT, BNUMBER, 0,
  1537. TDOUBLE, BNUMBER, 0,
  1538. -1, 0, 0,
  1539. };
  1540. long tand[NTYPE];
  1541. Init tandinit[] =
  1542. {
  1543. TCHAR, BINTEGER, 0,
  1544. TUCHAR, BINTEGER, 0,
  1545. TSHORT, BINTEGER, 0,
  1546. TUSHORT, BINTEGER, 0,
  1547. TINT, BNUMBER, 0,
  1548. TUINT, BNUMBER, 0,
  1549. TLONG, BINTEGER, 0,
  1550. TULONG, BINTEGER, 0,
  1551. TVLONG, BINTEGER, 0,
  1552. TUVLONG, BINTEGER, 0,
  1553. -1, 0, 0,
  1554. };
  1555. long trel[NTYPE];
  1556. Init trelinit[] =
  1557. {
  1558. TCHAR, BNUMBER, 0,
  1559. TUCHAR, BNUMBER, 0,
  1560. TSHORT, BNUMBER, 0,
  1561. TUSHORT, BNUMBER, 0,
  1562. TINT, BNUMBER, 0,
  1563. TUINT, BNUMBER, 0,
  1564. TLONG, BNUMBER, 0,
  1565. TULONG, BNUMBER, 0,
  1566. TVLONG, BNUMBER, 0,
  1567. TUVLONG, BNUMBER, 0,
  1568. TFLOAT, BNUMBER, 0,
  1569. TDOUBLE, BNUMBER, 0,
  1570. TIND, BIND, 0,
  1571. -1, 0, 0,
  1572. };
  1573. long tfunct[1] =
  1574. {
  1575. BFUNC,
  1576. };
  1577. long tindir[1] =
  1578. {
  1579. BIND,
  1580. };
  1581. long tdot[1] =
  1582. {
  1583. BSTRUCT|BUNION,
  1584. };
  1585. long tnot[1] =
  1586. {
  1587. BNUMBER|BIND,
  1588. };
  1589. long targ[1] =
  1590. {
  1591. BNUMBER|BIND|BSTRUCT|BUNION,
  1592. };
  1593. char tab[NTYPE][NTYPE] =
  1594. {
  1595. /*TXXX*/ { 0,
  1596. },
  1597. /*TCHAR*/ { 0, TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
  1598. TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1599. },
  1600. /*TUCHAR*/ { 0, TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
  1601. TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1602. },
  1603. /*TSHORT*/ { 0, TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
  1604. TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1605. },
  1606. /*TUSHORT*/ { 0, TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
  1607. TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1608. },
  1609. /*TINT*/ { 0, TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
  1610. TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1611. },
  1612. /*TUINT*/ { 0, TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
  1613. TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1614. },
  1615. /*TLONG*/ { 0, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
  1616. TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1617. },
  1618. /*TULONG*/ { 0, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
  1619. TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1620. },
  1621. /*TVLONG*/ { 0, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
  1622. TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1623. },
  1624. /*TUVLONG*/ { 0, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
  1625. TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1626. },
  1627. /*TFLOAT*/ { 0, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
  1628. TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
  1629. },
  1630. /*TDOUBLE*/ { 0, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
  1631. TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
  1632. },
  1633. /*TIND*/ { 0, TIND, TIND, TIND, TIND, TIND, TIND, TIND,
  1634. TIND, TIND, TIND, TIND, TIND, TIND,
  1635. },
  1636. };
  1637. void
  1638. urk(char *name, int max, int i)
  1639. {
  1640. if(i >= max) {
  1641. fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
  1642. exits("init");
  1643. }
  1644. }
  1645. void
  1646. tinit(void)
  1647. {
  1648. int i;
  1649. Init *p;
  1650. for(p=thashinit; p->code >= 0; p++) {
  1651. urk("thash", nelem(thash), p->code);
  1652. thash[p->code] = p->value;
  1653. }
  1654. for(p=bnamesinit; p->code >= 0; p++) {
  1655. urk("bnames", nelem(bnames), p->code);
  1656. bnames[p->code] = p->s;
  1657. }
  1658. for(p=tnamesinit; p->code >= 0; p++) {
  1659. urk("tnames", nelem(tnames), p->code);
  1660. tnames[p->code] = p->s;
  1661. }
  1662. for(p=gnamesinit; p->code >= 0; p++) {
  1663. urk("gnames", nelem(gnames), p->code);
  1664. gnames[p->code] = p->s;
  1665. }
  1666. for(p=qnamesinit; p->code >= 0; p++) {
  1667. urk("qnames", nelem(qnames), p->code);
  1668. qnames[p->code] = p->s;
  1669. }
  1670. for(p=cnamesinit; p->code >= 0; p++) {
  1671. urk("cnames", nelem(cnames), p->code);
  1672. cnames[p->code] = p->s;
  1673. }
  1674. for(p=onamesinit; p->code >= 0; p++) {
  1675. urk("onames", nelem(onames), p->code);
  1676. onames[p->code] = p->s;
  1677. }
  1678. for(i=0; typeiinit[i] >= 0; i++) {
  1679. urk("typei", nelem(typei), typeiinit[i]);
  1680. typei[typeiinit[i]] = 1;
  1681. }
  1682. for(i=0; typeuinit[i] >= 0; i++) {
  1683. urk("typeu", nelem(typeu), typeuinit[i]);
  1684. typeu[typeuinit[i]] = 1;
  1685. }
  1686. for(i=0; typesuvinit[i] >= 0; i++) {
  1687. urk("typesuv", nelem(typesuv), typesuvinit[i]);
  1688. typesuv[typesuvinit[i]] = 1;
  1689. }
  1690. for(i=0; typeilpinit[i] >= 0; i++) {
  1691. urk("typeilp", nelem(typeilp), typeilpinit[i]);
  1692. typeilp[typeilpinit[i]] = 1;
  1693. }
  1694. for(i=0; typechlinit[i] >= 0; i++) {
  1695. urk("typechl", nelem(typechl), typechlinit[i]);
  1696. typechl[typechlinit[i]] = 1;
  1697. typechlv[typechlinit[i]] = 1;
  1698. }
  1699. for(i=0; typechlpinit[i] >= 0; i++) {
  1700. urk("typechlp", nelem(typechlp), typechlpinit[i]);
  1701. typechlp[typechlpinit[i]] = 1;
  1702. }
  1703. for(i=0; typechlpfdinit[i] >= 0; i++) {
  1704. urk("typechlpfd", nelem(typechlpfd), typechlpfdinit[i]);
  1705. typechlpfd[typechlpfdinit[i]] = 1;
  1706. }
  1707. for(i=0; typecinit[i] >= 0; i++) {
  1708. urk("typec", nelem(typec), typecinit[i]);
  1709. typec[typecinit[i]] = 1;
  1710. }
  1711. for(i=0; typehinit[i] >= 0; i++) {
  1712. urk("typeh", nelem(typeh), typehinit[i]);
  1713. typeh[typehinit[i]] = 1;
  1714. }
  1715. for(i=0; typeilinit[i] >= 0; i++) {
  1716. urk("typeil", nelem(typeil), typeilinit[i]);
  1717. typeil[typeilinit[i]] = 1;
  1718. }
  1719. for(i=0; typevinit[i] >= 0; i++) {
  1720. urk("typev", nelem(typev), typevinit[i]);
  1721. typev[typevinit[i]] = 1;
  1722. typechlv[typevinit[i]] = 1;
  1723. }
  1724. for(i=0; typefdinit[i] >= 0; i++) {
  1725. urk("typefd", nelem(typefd), typefdinit[i]);
  1726. typefd[typefdinit[i]] = 1;
  1727. }
  1728. for(i=0; typeafinit[i] >= 0; i++) {
  1729. urk("typeaf", nelem(typeaf), typeafinit[i]);
  1730. typeaf[typeafinit[i]] = 1;
  1731. }
  1732. for(i=0; typesuinit[i] >= 0; i++) {
  1733. urk("typesu", nelem(typesu), typesuinit[i]);
  1734. typesu[typesuinit[i]] = 1;
  1735. }
  1736. for(p=tasigninit; p->code >= 0; p++) {
  1737. urk("tasign", nelem(tasign), p->code);
  1738. tasign[p->code] = p->value;
  1739. }
  1740. for(p=tasaddinit; p->code >= 0; p++) {
  1741. urk("tasadd", nelem(tasadd), p->code);
  1742. tasadd[p->code] = p->value;
  1743. }
  1744. for(p=tcastinit; p->code >= 0; p++) {
  1745. urk("tcast", nelem(tcast), p->code);
  1746. tcast[p->code] = p->value;
  1747. }
  1748. for(p=taddinit; p->code >= 0; p++) {
  1749. urk("tadd", nelem(tadd), p->code);
  1750. tadd[p->code] = p->value;
  1751. }
  1752. for(p=tsubinit; p->code >= 0; p++) {
  1753. urk("tsub", nelem(tsub), p->code);
  1754. tsub[p->code] = p->value;
  1755. }
  1756. for(p=tmulinit; p->code >= 0; p++) {
  1757. urk("tmul", nelem(tmul), p->code);
  1758. tmul[p->code] = p->value;
  1759. }
  1760. for(p=tandinit; p->code >= 0; p++) {
  1761. urk("tand", nelem(tand), p->code);
  1762. tand[p->code] = p->value;
  1763. }
  1764. for(p=trelinit; p->code >= 0; p++) {
  1765. urk("trel", nelem(trel), p->code);
  1766. trel[p->code] = p->value;
  1767. }
  1768. }
  1769. static int
  1770. deadhead(Node *n, int caseok)
  1771. {
  1772. loop:
  1773. if(n == Z)
  1774. return 1;
  1775. switch(n->op) {
  1776. case OLIST:
  1777. if(!deadhead(n->left, caseok))
  1778. return 0;
  1779. rloop:
  1780. n = n->right;
  1781. goto loop;
  1782. case ORETURN:
  1783. break;
  1784. case OLABEL:
  1785. return 0;
  1786. case OGOTO:
  1787. break;
  1788. case OCASE:
  1789. if(!caseok)
  1790. return 0;
  1791. goto rloop;
  1792. case OSWITCH:
  1793. return deadhead(n->right, 1);
  1794. case OWHILE:
  1795. case ODWHILE:
  1796. goto rloop;
  1797. case OFOR:
  1798. goto rloop;
  1799. case OCONTINUE:
  1800. break;
  1801. case OBREAK:
  1802. break;
  1803. case OIF:
  1804. return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
  1805. case OSET:
  1806. case OUSED:
  1807. break;
  1808. }
  1809. return 1;
  1810. }
  1811. int
  1812. deadheads(Node *c)
  1813. {
  1814. return deadhead(c->left, 0) && deadhead(c->right, 0);
  1815. }
  1816. int
  1817. mixedasop(Type *l, Type *r)
  1818. {
  1819. return !typefd[l->etype] && typefd[r->etype];
  1820. }