sub.c 34 KB

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