sub.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826
  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. int
  679. side(Node *n)
  680. {
  681. loop:
  682. if(n != Z)
  683. switch(n->op) {
  684. case OCAST:
  685. case ONOT:
  686. case OADDR:
  687. case OIND:
  688. n = n->left;
  689. goto loop;
  690. case OCOND:
  691. if(side(n->left))
  692. break;
  693. n = n->right;
  694. case OEQ:
  695. case ONE:
  696. case OLT:
  697. case OGE:
  698. case OGT:
  699. case OLE:
  700. case OADD:
  701. case OSUB:
  702. case OMUL:
  703. case OLMUL:
  704. case ODIV:
  705. case OLDIV:
  706. case OLSHR:
  707. case OASHL:
  708. case OASHR:
  709. case OAND:
  710. case OOR:
  711. case OXOR:
  712. case OMOD:
  713. case OLMOD:
  714. case OANDAND:
  715. case OOROR:
  716. case OCOMMA:
  717. case ODOT:
  718. if(side(n->left))
  719. break;
  720. n = n->right;
  721. goto loop;
  722. case OSIGN:
  723. case OSIZE:
  724. case OCONST:
  725. case OSTRING:
  726. case OLSTRING:
  727. case ONAME:
  728. return 0;
  729. }
  730. return 1;
  731. }
  732. int
  733. vconst(Node *n)
  734. {
  735. int i;
  736. if(n == Z)
  737. goto no;
  738. if(n->op != OCONST)
  739. goto no;
  740. if(n->type == T)
  741. goto no;
  742. switch(n->type->etype)
  743. {
  744. case TFLOAT:
  745. case TDOUBLE:
  746. i = 100;
  747. if(n->fconst > i || n->fconst < -i)
  748. goto no;
  749. i = n->fconst;
  750. if(i != n->fconst)
  751. goto no;
  752. return i;
  753. case TVLONG:
  754. case TUVLONG:
  755. i = n->vconst;
  756. if(i != n->vconst)
  757. goto no;
  758. return i;
  759. case TCHAR:
  760. case TUCHAR:
  761. case TSHORT:
  762. case TUSHORT:
  763. case TINT:
  764. case TUINT:
  765. case TLONG:
  766. case TULONG:
  767. case TIND:
  768. i = n->vconst;
  769. if(i != n->vconst)
  770. goto no;
  771. return i;
  772. }
  773. no:
  774. return -159; /* first uninteresting constant */
  775. }
  776. /*
  777. * return log(n) if n is a power of 2 constant
  778. */
  779. int
  780. vlog(Node *n)
  781. {
  782. int s, i;
  783. uvlong m, v;
  784. if(n->op != OCONST)
  785. goto bad;
  786. if(typefd[n->type->etype])
  787. goto bad;
  788. v = n->vconst;
  789. s = 0;
  790. m = MASK(8*sizeof(uvlong));
  791. for(i=32; i; i>>=1) {
  792. m >>= i;
  793. if(!(v & m)) {
  794. v >>= i;
  795. s += i;
  796. }
  797. }
  798. if(v == 1)
  799. return s;
  800. bad:
  801. return -1;
  802. }
  803. int
  804. topbit(ulong v)
  805. {
  806. int i;
  807. for(i = -1; v; i++)
  808. v >>= 1;
  809. return i;
  810. }
  811. /*
  812. * try to cast a constant down
  813. * rather than cast a variable up
  814. * example:
  815. * if(c == 'a')
  816. */
  817. void
  818. relcon(Node *l, Node *r)
  819. {
  820. vlong v;
  821. if(l->op != OCONST)
  822. return;
  823. if(r->op != OCAST)
  824. return;
  825. if(!nilcast(r->left->type, r->type))
  826. return;
  827. switch(r->type->etype) {
  828. default:
  829. return;
  830. case TCHAR:
  831. case TUCHAR:
  832. case TSHORT:
  833. case TUSHORT:
  834. v = convvtox(l->vconst, r->type->etype);
  835. if(v != l->vconst)
  836. return;
  837. break;
  838. }
  839. l->type = r->left->type;
  840. *r = *r->left;
  841. }
  842. int
  843. relindex(int o)
  844. {
  845. switch(o) {
  846. default:
  847. diag(Z, "bad in relindex: %O", o);
  848. case OEQ: return 0;
  849. case ONE: return 1;
  850. case OLE: return 2;
  851. case OLS: return 3;
  852. case OLT: return 4;
  853. case OLO: return 5;
  854. case OGE: return 6;
  855. case OHS: return 7;
  856. case OGT: return 8;
  857. case OHI: return 9;
  858. }
  859. }
  860. Node*
  861. invert(Node *n)
  862. {
  863. Node *i;
  864. if(n == Z || n->op != OLIST)
  865. return n;
  866. i = n;
  867. for(n = n->left; n != Z; n = n->left) {
  868. if(n->op != OLIST)
  869. break;
  870. i->left = n->right;
  871. n->right = i;
  872. i = n;
  873. }
  874. i->left = n;
  875. return i;
  876. }
  877. int
  878. bitno(long b)
  879. {
  880. int i;
  881. for(i=0; i<32; i++)
  882. if(b & (1L<<i))
  883. return i;
  884. diag(Z, "bad in bitno");
  885. return 0;
  886. }
  887. long
  888. typebitor(long a, long b)
  889. {
  890. long c;
  891. c = a | b;
  892. if(a & b)
  893. if((a & b) == BLONG)
  894. c |= BVLONG; /* long long => vlong */
  895. else
  896. warn(Z, "once is enough: %Q", a & b);
  897. return c;
  898. }
  899. void
  900. diag(Node *n, char *fmt, ...)
  901. {
  902. char buf[STRINGSZ];
  903. va_list arg;
  904. va_start(arg, fmt);
  905. vseprint(buf, buf+sizeof(buf), fmt, arg);
  906. va_end(arg);
  907. print("%L %s\n", (n==Z)? nearln: n->lineno, buf);
  908. if(debug['X'])
  909. abort();
  910. if(n != Z)
  911. if(debug['v'])
  912. prtree(n, "diagnostic");
  913. nerrors++;
  914. if(nerrors > 10) {
  915. print("too many errors\n");
  916. errorexit();
  917. }
  918. }
  919. void
  920. warn(Node *n, char *fmt, ...)
  921. {
  922. char buf[STRINGSZ];
  923. va_list arg;
  924. if(debug['w']) {
  925. print("warning: ");
  926. va_start(arg, fmt);
  927. vseprint(buf, buf+sizeof(buf), fmt, arg);
  928. va_end(arg);
  929. print("%L %s\n", (n==Z)? nearln: n->lineno, buf);
  930. if(n != Z)
  931. if(debug['v'])
  932. prtree(n, "warning");
  933. }
  934. }
  935. void
  936. yyerror(char *fmt, ...)
  937. {
  938. char buf[STRINGSZ];
  939. va_list arg;
  940. /*
  941. * hack to intercept message from yaccpar
  942. */
  943. if(strcmp(fmt, "syntax error") == 0) {
  944. yyerror("syntax error, last name: %s", symb);
  945. return;
  946. }
  947. va_start(arg, fmt);
  948. vseprint(buf, buf+sizeof(buf), fmt, arg);
  949. va_end(arg);
  950. print("%L %s\n", lineno, buf);
  951. nerrors++;
  952. if(nerrors > 10) {
  953. print("too many errors\n");
  954. errorexit();
  955. }
  956. }
  957. ulong thash1 = 0x2edab8c9;
  958. ulong thash2 = 0x1dc74fb8;
  959. ulong thash3 = 0x1f241331;
  960. ulong thash[NALLTYPES];
  961. Init thashinit[] =
  962. {
  963. TXXX, 0x17527bbd, 0,
  964. TCHAR, 0x5cedd32b, 0,
  965. TUCHAR, 0x552c4454, 0,
  966. TSHORT, 0x63040b4b, 0,
  967. TUSHORT, 0x32a45878, 0,
  968. TINT, 0x4151d5bd, 0,
  969. TUINT, 0x5ae707d6, 0,
  970. TLONG, 0x5ef20f47, 0,
  971. TULONG, 0x36d8eb8f, 0,
  972. TVLONG, 0x6e5e9590, 0,
  973. TUVLONG, 0x75910105, 0,
  974. TFLOAT, 0x25fd7af1, 0,
  975. TDOUBLE, 0x7c40a1b2, 0,
  976. TIND, 0x1b832357, 0,
  977. TFUNC, 0x6babc9cb, 0,
  978. TARRAY, 0x7c50986d, 0,
  979. TVOID, 0x44112eff, 0,
  980. TSTRUCT, 0x7c2da3bf, 0,
  981. TUNION, 0x3eb25e98, 0,
  982. TENUM, 0x44b54f61, 0,
  983. TFILE, 0x19242ac3, 0,
  984. TOLD, 0x22b15988, 0,
  985. TDOT, 0x0204f6b3, 0,
  986. -1, 0, 0,
  987. };
  988. char* bnames[NALIGN];
  989. Init bnamesinit[] =
  990. {
  991. Axxx, 0, "Axxx",
  992. Ael1, 0, "el1",
  993. Ael2, 0, "el2",
  994. Asu2, 0, "su2",
  995. Aarg0, 0, "arg0",
  996. Aarg1, 0, "arg1",
  997. Aarg2, 0, "arg2",
  998. Aaut3, 0, "aut3",
  999. -1, 0, 0,
  1000. };
  1001. char* tnames[NALLTYPES];
  1002. Init tnamesinit[] =
  1003. {
  1004. TXXX, 0, "TXXX",
  1005. TCHAR, 0, "CHAR",
  1006. TUCHAR, 0, "UCHAR",
  1007. TSHORT, 0, "SHORT",
  1008. TUSHORT, 0, "USHORT",
  1009. TINT, 0, "INT",
  1010. TUINT, 0, "UINT",
  1011. TLONG, 0, "LONG",
  1012. TULONG, 0, "ULONG",
  1013. TVLONG, 0, "VLONG",
  1014. TUVLONG, 0, "UVLONG",
  1015. TFLOAT, 0, "FLOAT",
  1016. TDOUBLE, 0, "DOUBLE",
  1017. TIND, 0, "IND",
  1018. TFUNC, 0, "FUNC",
  1019. TARRAY, 0, "ARRAY",
  1020. TVOID, 0, "VOID",
  1021. TSTRUCT, 0, "STRUCT",
  1022. TUNION, 0, "UNION",
  1023. TENUM, 0, "ENUM",
  1024. TFILE, 0, "FILE",
  1025. TOLD, 0, "OLD",
  1026. TDOT, 0, "DOT",
  1027. -1, 0, 0,
  1028. };
  1029. char* gnames[NGTYPES];
  1030. Init gnamesinit[] =
  1031. {
  1032. GXXX, 0, "GXXX",
  1033. GCONSTNT, 0, "CONST",
  1034. GVOLATILE, 0, "VOLATILE",
  1035. GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE",
  1036. -1, 0, 0,
  1037. };
  1038. char* qnames[NALLTYPES];
  1039. Init qnamesinit[] =
  1040. {
  1041. TXXX, 0, "TXXX",
  1042. TCHAR, 0, "CHAR",
  1043. TUCHAR, 0, "UCHAR",
  1044. TSHORT, 0, "SHORT",
  1045. TUSHORT, 0, "USHORT",
  1046. TINT, 0, "INT",
  1047. TUINT, 0, "UINT",
  1048. TLONG, 0, "LONG",
  1049. TULONG, 0, "ULONG",
  1050. TVLONG, 0, "VLONG",
  1051. TUVLONG, 0, "UVLONG",
  1052. TFLOAT, 0, "FLOAT",
  1053. TDOUBLE, 0, "DOUBLE",
  1054. TIND, 0, "IND",
  1055. TFUNC, 0, "FUNC",
  1056. TARRAY, 0, "ARRAY",
  1057. TVOID, 0, "VOID",
  1058. TSTRUCT, 0, "STRUCT",
  1059. TUNION, 0, "UNION",
  1060. TENUM, 0, "ENUM",
  1061. TAUTO, 0, "AUTO",
  1062. TEXTERN, 0, "EXTERN",
  1063. TSTATIC, 0, "STATIC",
  1064. TTYPEDEF, 0, "TYPEDEF",
  1065. TTYPESTR, 0, "TYPESTR",
  1066. TREGISTER, 0, "REGISTER",
  1067. TCONSTNT, 0, "CONSTNT",
  1068. TVOLATILE, 0, "VOLATILE",
  1069. TUNSIGNED, 0, "UNSIGNED",
  1070. TSIGNED, 0, "SIGNED",
  1071. TDOT, 0, "DOT",
  1072. TFILE, 0, "FILE",
  1073. TOLD, 0, "OLD",
  1074. -1, 0, 0,
  1075. };
  1076. char* cnames[NCTYPES];
  1077. Init cnamesinit[] =
  1078. {
  1079. CXXX, 0, "CXXX",
  1080. CAUTO, 0, "AUTO",
  1081. CEXTERN, 0, "EXTERN",
  1082. CGLOBL, 0, "GLOBL",
  1083. CSTATIC, 0, "STATIC",
  1084. CLOCAL, 0, "LOCAL",
  1085. CTYPEDEF, 0, "TYPEDEF",
  1086. CTYPESTR, 0, "TYPESTR",
  1087. CPARAM, 0, "PARAM",
  1088. CSELEM, 0, "SELEM",
  1089. CLABEL, 0, "LABEL",
  1090. CEXREG, 0, "EXREG",
  1091. -1, 0, 0,
  1092. };
  1093. char* onames[OEND+1];
  1094. Init onamesinit[] =
  1095. {
  1096. OXXX, 0, "OXXX",
  1097. OADD, 0, "ADD",
  1098. OADDR, 0, "ADDR",
  1099. OAND, 0, "AND",
  1100. OANDAND, 0, "ANDAND",
  1101. OARRAY, 0, "ARRAY",
  1102. OAS, 0, "AS",
  1103. OASI, 0, "ASI",
  1104. OASADD, 0, "ASADD",
  1105. OASAND, 0, "ASAND",
  1106. OASASHL, 0, "ASASHL",
  1107. OASASHR, 0, "ASASHR",
  1108. OASDIV, 0, "ASDIV",
  1109. OASHL, 0, "ASHL",
  1110. OASHR, 0, "ASHR",
  1111. OASLDIV, 0, "ASLDIV",
  1112. OASLMOD, 0, "ASLMOD",
  1113. OASLMUL, 0, "ASLMUL",
  1114. OASLSHR, 0, "ASLSHR",
  1115. OASMOD, 0, "ASMOD",
  1116. OASMUL, 0, "ASMUL",
  1117. OASOR, 0, "ASOR",
  1118. OASSUB, 0, "ASSUB",
  1119. OASXOR, 0, "ASXOR",
  1120. OBIT, 0, "BIT",
  1121. OBREAK, 0, "BREAK",
  1122. OCASE, 0, "CASE",
  1123. OCAST, 0, "CAST",
  1124. OCOMMA, 0, "COMMA",
  1125. OCOND, 0, "COND",
  1126. OCONST, 0, "CONST",
  1127. OCONTINUE, 0, "CONTINUE",
  1128. ODIV, 0, "DIV",
  1129. ODOT, 0, "DOT",
  1130. ODOTDOT, 0, "DOTDOT",
  1131. ODWHILE, 0, "DWHILE",
  1132. OENUM, 0, "ENUM",
  1133. OEQ, 0, "EQ",
  1134. OFOR, 0, "FOR",
  1135. OFUNC, 0, "FUNC",
  1136. OGE, 0, "GE",
  1137. OGOTO, 0, "GOTO",
  1138. OGT, 0, "GT",
  1139. OHI, 0, "HI",
  1140. OHS, 0, "HS",
  1141. OIF, 0, "IF",
  1142. OIND, 0, "IND",
  1143. OINDREG, 0, "INDREG",
  1144. OINIT, 0, "INIT",
  1145. OLABEL, 0, "LABEL",
  1146. OLDIV, 0, "LDIV",
  1147. OLE, 0, "LE",
  1148. OLIST, 0, "LIST",
  1149. OLMOD, 0, "LMOD",
  1150. OLMUL, 0, "LMUL",
  1151. OLO, 0, "LO",
  1152. OLS, 0, "LS",
  1153. OLSHR, 0, "LSHR",
  1154. OLT, 0, "LT",
  1155. OMOD, 0, "MOD",
  1156. OMUL, 0, "MUL",
  1157. ONAME, 0, "NAME",
  1158. ONE, 0, "NE",
  1159. ONOT, 0, "NOT",
  1160. OOR, 0, "OR",
  1161. OOROR, 0, "OROR",
  1162. OPOSTDEC, 0, "POSTDEC",
  1163. OPOSTINC, 0, "POSTINC",
  1164. OPREDEC, 0, "PREDEC",
  1165. OPREINC, 0, "PREINC",
  1166. OPROTO, 0, "PROTO",
  1167. OREGISTER, 0, "REGISTER",
  1168. ORETURN, 0, "RETURN",
  1169. OSET, 0, "SET",
  1170. OSIGN, 0, "SIGN",
  1171. OSIZE, 0, "SIZE",
  1172. OSTRING, 0, "STRING",
  1173. OLSTRING, 0, "LSTRING",
  1174. OSTRUCT, 0, "STRUCT",
  1175. OSUB, 0, "SUB",
  1176. OSWITCH, 0, "SWITCH",
  1177. OUNION, 0, "UNION",
  1178. OUSED, 0, "USED",
  1179. OWHILE, 0, "WHILE",
  1180. OXOR, 0, "XOR",
  1181. OPOS, 0, "POS",
  1182. ONEG, 0, "NEG",
  1183. OCOM, 0, "COM",
  1184. OELEM, 0, "ELEM",
  1185. OTST, 0, "TST",
  1186. OINDEX, 0, "INDEX",
  1187. OFAS, 0, "FAS",
  1188. OEND, 0, "END",
  1189. -1, 0, 0,
  1190. };
  1191. char comrel[12] =
  1192. {
  1193. ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
  1194. };
  1195. char invrel[12] =
  1196. {
  1197. OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
  1198. };
  1199. char logrel[12] =
  1200. {
  1201. OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
  1202. };
  1203. char typei[NTYPE];
  1204. int typeiinit[] =
  1205. {
  1206. TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
  1207. };
  1208. char typeu[NTYPE];
  1209. int typeuinit[] =
  1210. {
  1211. TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
  1212. };
  1213. char typesuv[NTYPE];
  1214. int typesuvinit[] =
  1215. {
  1216. TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
  1217. };
  1218. char typeilp[NTYPE];
  1219. int typeilpinit[] =
  1220. {
  1221. TINT, TUINT, TLONG, TULONG, TIND, -1
  1222. };
  1223. char typechl[NTYPE];
  1224. int typechlinit[] =
  1225. {
  1226. TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
  1227. };
  1228. char typechlp[NTYPE];
  1229. int typechlpinit[] =
  1230. {
  1231. TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
  1232. };
  1233. char typechlpfd[NTYPE];
  1234. int typechlpfdinit[] =
  1235. {
  1236. TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
  1237. };
  1238. char typec[NTYPE];
  1239. int typecinit[] =
  1240. {
  1241. TCHAR, TUCHAR, -1
  1242. };
  1243. char typeh[NTYPE];
  1244. int typehinit[] =
  1245. {
  1246. TSHORT, TUSHORT, -1,
  1247. };
  1248. char typeil[NTYPE];
  1249. int typeilinit[] =
  1250. {
  1251. TINT, TUINT, TLONG, TULONG, -1,
  1252. };
  1253. char typev[NTYPE];
  1254. int typevinit[] =
  1255. {
  1256. TVLONG, TUVLONG, -1,
  1257. };
  1258. char typefd[NTYPE];
  1259. int typefdinit[] =
  1260. {
  1261. TFLOAT, TDOUBLE, -1,
  1262. };
  1263. char typeaf[NTYPE];
  1264. int typeafinit[] =
  1265. {
  1266. TFUNC, TARRAY, -1,
  1267. };
  1268. char typesu[NTYPE];
  1269. int typesuinit[] =
  1270. {
  1271. TSTRUCT, TUNION, -1,
  1272. };
  1273. long tasign[NTYPE];
  1274. Init tasigninit[] =
  1275. {
  1276. TCHAR, BNUMBER, 0,
  1277. TUCHAR, BNUMBER, 0,
  1278. TSHORT, BNUMBER, 0,
  1279. TUSHORT, BNUMBER, 0,
  1280. TINT, BNUMBER, 0,
  1281. TUINT, BNUMBER, 0,
  1282. TLONG, BNUMBER, 0,
  1283. TULONG, BNUMBER, 0,
  1284. TVLONG, BNUMBER, 0,
  1285. TUVLONG, BNUMBER, 0,
  1286. TFLOAT, BNUMBER, 0,
  1287. TDOUBLE, BNUMBER, 0,
  1288. TIND, BIND, 0,
  1289. TSTRUCT, BSTRUCT, 0,
  1290. TUNION, BUNION, 0,
  1291. -1, 0, 0,
  1292. };
  1293. long tasadd[NTYPE];
  1294. Init tasaddinit[] =
  1295. {
  1296. TCHAR, BNUMBER, 0,
  1297. TUCHAR, BNUMBER, 0,
  1298. TSHORT, BNUMBER, 0,
  1299. TUSHORT, BNUMBER, 0,
  1300. TINT, BNUMBER, 0,
  1301. TUINT, BNUMBER, 0,
  1302. TLONG, BNUMBER, 0,
  1303. TULONG, BNUMBER, 0,
  1304. TVLONG, BNUMBER, 0,
  1305. TUVLONG, BNUMBER, 0,
  1306. TFLOAT, BNUMBER, 0,
  1307. TDOUBLE, BNUMBER, 0,
  1308. TIND, BINTEGER, 0,
  1309. -1, 0, 0,
  1310. };
  1311. long tcast[NTYPE];
  1312. Init tcastinit[] =
  1313. {
  1314. TCHAR, BNUMBER|BIND|BVOID, 0,
  1315. TUCHAR, BNUMBER|BIND|BVOID, 0,
  1316. TSHORT, BNUMBER|BIND|BVOID, 0,
  1317. TUSHORT, BNUMBER|BIND|BVOID, 0,
  1318. TINT, BNUMBER|BIND|BVOID, 0,
  1319. TUINT, BNUMBER|BIND|BVOID, 0,
  1320. TLONG, BNUMBER|BIND|BVOID, 0,
  1321. TULONG, BNUMBER|BIND|BVOID, 0,
  1322. TVLONG, BNUMBER|BIND|BVOID, 0,
  1323. TUVLONG, BNUMBER|BIND|BVOID, 0,
  1324. TFLOAT, BNUMBER|BVOID, 0,
  1325. TDOUBLE, BNUMBER|BVOID, 0,
  1326. TIND, BINTEGER|BIND|BVOID, 0,
  1327. TVOID, BVOID, 0,
  1328. TSTRUCT, BSTRUCT|BVOID, 0,
  1329. TUNION, BUNION|BVOID, 0,
  1330. -1, 0, 0,
  1331. };
  1332. long tadd[NTYPE];
  1333. Init taddinit[] =
  1334. {
  1335. TCHAR, BNUMBER|BIND, 0,
  1336. TUCHAR, BNUMBER|BIND, 0,
  1337. TSHORT, BNUMBER|BIND, 0,
  1338. TUSHORT, BNUMBER|BIND, 0,
  1339. TINT, BNUMBER|BIND, 0,
  1340. TUINT, BNUMBER|BIND, 0,
  1341. TLONG, BNUMBER|BIND, 0,
  1342. TULONG, BNUMBER|BIND, 0,
  1343. TVLONG, BNUMBER|BIND, 0,
  1344. TUVLONG, BNUMBER|BIND, 0,
  1345. TFLOAT, BNUMBER, 0,
  1346. TDOUBLE, BNUMBER, 0,
  1347. TIND, BINTEGER, 0,
  1348. -1, 0, 0,
  1349. };
  1350. long tsub[NTYPE];
  1351. Init tsubinit[] =
  1352. {
  1353. TCHAR, BNUMBER, 0,
  1354. TUCHAR, BNUMBER, 0,
  1355. TSHORT, BNUMBER, 0,
  1356. TUSHORT, BNUMBER, 0,
  1357. TINT, BNUMBER, 0,
  1358. TUINT, BNUMBER, 0,
  1359. TLONG, BNUMBER, 0,
  1360. TULONG, BNUMBER, 0,
  1361. TVLONG, BNUMBER, 0,
  1362. TUVLONG, BNUMBER, 0,
  1363. TFLOAT, BNUMBER, 0,
  1364. TDOUBLE, BNUMBER, 0,
  1365. TIND, BINTEGER|BIND, 0,
  1366. -1, 0, 0,
  1367. };
  1368. long tmul[NTYPE];
  1369. Init tmulinit[] =
  1370. {
  1371. TCHAR, BNUMBER, 0,
  1372. TUCHAR, BNUMBER, 0,
  1373. TSHORT, BNUMBER, 0,
  1374. TUSHORT, BNUMBER, 0,
  1375. TINT, BNUMBER, 0,
  1376. TUINT, BNUMBER, 0,
  1377. TLONG, BNUMBER, 0,
  1378. TULONG, BNUMBER, 0,
  1379. TVLONG, BNUMBER, 0,
  1380. TUVLONG, BNUMBER, 0,
  1381. TFLOAT, BNUMBER, 0,
  1382. TDOUBLE, BNUMBER, 0,
  1383. -1, 0, 0,
  1384. };
  1385. long tand[NTYPE];
  1386. Init tandinit[] =
  1387. {
  1388. TCHAR, BINTEGER, 0,
  1389. TUCHAR, BINTEGER, 0,
  1390. TSHORT, BINTEGER, 0,
  1391. TUSHORT, BINTEGER, 0,
  1392. TINT, BNUMBER, 0,
  1393. TUINT, BNUMBER, 0,
  1394. TLONG, BINTEGER, 0,
  1395. TULONG, BINTEGER, 0,
  1396. TVLONG, BINTEGER, 0,
  1397. TUVLONG, BINTEGER, 0,
  1398. -1, 0, 0,
  1399. };
  1400. long trel[NTYPE];
  1401. Init trelinit[] =
  1402. {
  1403. TCHAR, BNUMBER, 0,
  1404. TUCHAR, BNUMBER, 0,
  1405. TSHORT, BNUMBER, 0,
  1406. TUSHORT, BNUMBER, 0,
  1407. TINT, BNUMBER, 0,
  1408. TUINT, BNUMBER, 0,
  1409. TLONG, BNUMBER, 0,
  1410. TULONG, BNUMBER, 0,
  1411. TVLONG, BNUMBER, 0,
  1412. TUVLONG, BNUMBER, 0,
  1413. TFLOAT, BNUMBER, 0,
  1414. TDOUBLE, BNUMBER, 0,
  1415. TIND, BIND, 0,
  1416. -1, 0, 0,
  1417. };
  1418. long tfunct[1] =
  1419. {
  1420. BFUNC,
  1421. };
  1422. long tindir[1] =
  1423. {
  1424. BIND,
  1425. };
  1426. long tdot[1] =
  1427. {
  1428. BSTRUCT|BUNION,
  1429. };
  1430. long tnot[1] =
  1431. {
  1432. BNUMBER|BIND,
  1433. };
  1434. long targ[1] =
  1435. {
  1436. BNUMBER|BIND|BSTRUCT|BUNION,
  1437. };
  1438. char tab[NTYPE][NTYPE] =
  1439. {
  1440. /*TXXX*/ { 0,
  1441. },
  1442. /*TCHAR*/ { 0, TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
  1443. TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1444. },
  1445. /*TUCHAR*/ { 0, TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
  1446. TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1447. },
  1448. /*TSHORT*/ { 0, TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
  1449. TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1450. },
  1451. /*TUSHORT*/ { 0, TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
  1452. TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1453. },
  1454. /*TINT*/ { 0, TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
  1455. TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1456. },
  1457. /*TUINT*/ { 0, TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
  1458. TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1459. },
  1460. /*TLONG*/ { 0, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
  1461. TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1462. },
  1463. /*TULONG*/ { 0, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
  1464. TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1465. },
  1466. /*TVLONG*/ { 0, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
  1467. TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1468. },
  1469. /*TUVLONG*/ { 0, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
  1470. TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
  1471. },
  1472. /*TFLOAT*/ { 0, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
  1473. TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
  1474. },
  1475. /*TDOUBLE*/ { 0, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
  1476. TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
  1477. },
  1478. /*TIND*/ { 0, TIND, TIND, TIND, TIND, TIND, TIND, TIND,
  1479. TIND, TIND, TIND, TIND, TIND, TIND,
  1480. },
  1481. };
  1482. void
  1483. urk(char *name, int max, int i)
  1484. {
  1485. if(i >= max) {
  1486. fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
  1487. exits("init");
  1488. }
  1489. }
  1490. void
  1491. tinit(void)
  1492. {
  1493. int i;
  1494. Init *p;
  1495. for(p=thashinit; p->code >= 0; p++) {
  1496. urk("thash", nelem(thash), p->code);
  1497. thash[p->code] = p->value;
  1498. }
  1499. for(p=bnamesinit; p->code >= 0; p++) {
  1500. urk("bnames", nelem(bnames), p->code);
  1501. bnames[p->code] = p->s;
  1502. }
  1503. for(p=tnamesinit; p->code >= 0; p++) {
  1504. urk("tnames", nelem(tnames), p->code);
  1505. tnames[p->code] = p->s;
  1506. }
  1507. for(p=gnamesinit; p->code >= 0; p++) {
  1508. urk("gnames", nelem(gnames), p->code);
  1509. gnames[p->code] = p->s;
  1510. }
  1511. for(p=qnamesinit; p->code >= 0; p++) {
  1512. urk("qnames", nelem(qnames), p->code);
  1513. qnames[p->code] = p->s;
  1514. }
  1515. for(p=cnamesinit; p->code >= 0; p++) {
  1516. urk("cnames", nelem(cnames), p->code);
  1517. cnames[p->code] = p->s;
  1518. }
  1519. for(p=onamesinit; p->code >= 0; p++) {
  1520. urk("onames", nelem(onames), p->code);
  1521. onames[p->code] = p->s;
  1522. }
  1523. for(i=0; typeiinit[i] >= 0; i++) {
  1524. urk("typei", nelem(typei), typeiinit[i]);
  1525. typei[typeiinit[i]] = 1;
  1526. }
  1527. for(i=0; typeuinit[i] >= 0; i++) {
  1528. urk("typeu", nelem(typeu), typeuinit[i]);
  1529. typeu[typeuinit[i]] = 1;
  1530. }
  1531. for(i=0; typesuvinit[i] >= 0; i++) {
  1532. urk("typesuv", nelem(typesuv), typesuvinit[i]);
  1533. typesuv[typesuvinit[i]] = 1;
  1534. }
  1535. for(i=0; typeilpinit[i] >= 0; i++) {
  1536. urk("typeilp", nelem(typeilp), typeilpinit[i]);
  1537. typeilp[typeilpinit[i]] = 1;
  1538. }
  1539. for(i=0; typechlinit[i] >= 0; i++) {
  1540. urk("typechl", nelem(typechl), typechlinit[i]);
  1541. typechl[typechlinit[i]] = 1;
  1542. }
  1543. for(i=0; typechlpinit[i] >= 0; i++) {
  1544. urk("typechlp", nelem(typechlp), typechlpinit[i]);
  1545. typechlp[typechlpinit[i]] = 1;
  1546. }
  1547. for(i=0; typechlpfdinit[i] >= 0; i++) {
  1548. urk("typechlpfd", nelem(typechlpfd), typechlpfdinit[i]);
  1549. typechlpfd[typechlpfdinit[i]] = 1;
  1550. }
  1551. for(i=0; typecinit[i] >= 0; i++) {
  1552. urk("typec", nelem(typec), typecinit[i]);
  1553. typec[typecinit[i]] = 1;
  1554. }
  1555. for(i=0; typehinit[i] >= 0; i++) {
  1556. urk("typeh", nelem(typeh), typehinit[i]);
  1557. typeh[typehinit[i]] = 1;
  1558. }
  1559. for(i=0; typeilinit[i] >= 0; i++) {
  1560. urk("typeil", nelem(typeil), typeilinit[i]);
  1561. typeil[typeilinit[i]] = 1;
  1562. }
  1563. for(i=0; typevinit[i] >= 0; i++) {
  1564. urk("typev", nelem(typev), typevinit[i]);
  1565. typev[typevinit[i]] = 1;
  1566. }
  1567. for(i=0; typefdinit[i] >= 0; i++) {
  1568. urk("typefd", nelem(typefd), typefdinit[i]);
  1569. typefd[typefdinit[i]] = 1;
  1570. }
  1571. for(i=0; typeafinit[i] >= 0; i++) {
  1572. urk("typeaf", nelem(typeaf), typeafinit[i]);
  1573. typeaf[typeafinit[i]] = 1;
  1574. }
  1575. for(i=0; typesuinit[i] >= 0; i++) {
  1576. urk("typesu", nelem(typesu), typesuinit[i]);
  1577. typesu[typesuinit[i]] = 1;
  1578. }
  1579. for(p=tasigninit; p->code >= 0; p++) {
  1580. urk("tasign", nelem(tasign), p->code);
  1581. tasign[p->code] = p->value;
  1582. }
  1583. for(p=tasaddinit; p->code >= 0; p++) {
  1584. urk("tasadd", nelem(tasadd), p->code);
  1585. tasadd[p->code] = p->value;
  1586. }
  1587. for(p=tcastinit; p->code >= 0; p++) {
  1588. urk("tcast", nelem(tcast), p->code);
  1589. tcast[p->code] = p->value;
  1590. }
  1591. for(p=taddinit; p->code >= 0; p++) {
  1592. urk("tadd", nelem(tadd), p->code);
  1593. tadd[p->code] = p->value;
  1594. }
  1595. for(p=tsubinit; p->code >= 0; p++) {
  1596. urk("tsub", nelem(tsub), p->code);
  1597. tsub[p->code] = p->value;
  1598. }
  1599. for(p=tmulinit; p->code >= 0; p++) {
  1600. urk("tmul", nelem(tmul), p->code);
  1601. tmul[p->code] = p->value;
  1602. }
  1603. for(p=tandinit; p->code >= 0; p++) {
  1604. urk("tand", nelem(tand), p->code);
  1605. tand[p->code] = p->value;
  1606. }
  1607. for(p=trelinit; p->code >= 0; p++) {
  1608. urk("trel", nelem(trel), p->code);
  1609. trel[p->code] = p->value;
  1610. }
  1611. }
  1612. static int
  1613. deadhead(Node *n, int caseok)
  1614. {
  1615. loop:
  1616. if(n == Z)
  1617. return 1;
  1618. switch(n->op) {
  1619. case OLIST:
  1620. if(!deadhead(n->left, caseok))
  1621. return 0;
  1622. rloop:
  1623. n = n->right;
  1624. goto loop;
  1625. case ORETURN:
  1626. break;
  1627. case OLABEL:
  1628. return 0;
  1629. case OGOTO:
  1630. break;
  1631. case OCASE:
  1632. if(!caseok)
  1633. return 0;
  1634. goto rloop;
  1635. case OSWITCH:
  1636. return deadhead(n->right, 1);
  1637. case OWHILE:
  1638. case ODWHILE:
  1639. goto rloop;
  1640. case OFOR:
  1641. goto rloop;
  1642. case OCONTINUE:
  1643. break;
  1644. case OBREAK:
  1645. break;
  1646. case OIF:
  1647. return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
  1648. case OSET:
  1649. case OUSED:
  1650. break;
  1651. }
  1652. return 1;
  1653. }
  1654. int
  1655. deadheads(Node *c)
  1656. {
  1657. return deadhead(c->left, 0) && deadhead(c->right, 0);
  1658. }
  1659. int
  1660. mixedasop(Type *l, Type *r)
  1661. {
  1662. return !typefd[l->etype] && typefd[r->etype];
  1663. }