sub.c 33 KB

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