sub.c 34 KB

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