cc.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. #include <lib9.h>
  2. #include <bio.h>
  3. #include <ctype.h>
  4. #ifndef EXTERN
  5. #define EXTERN extern
  6. #endif
  7. typedef struct Node Node;
  8. typedef struct Sym Sym;
  9. typedef struct Type Type;
  10. typedef struct Funct Funct;
  11. typedef struct Decl Decl;
  12. typedef struct Io Io;
  13. typedef struct Hist Hist;
  14. typedef struct Term Term;
  15. typedef struct Init Init;
  16. typedef struct Bits Bits;
  17. typedef Rune TRune; /* target system type */
  18. #define NHUNK 50000L
  19. #define BUFSIZ 8192
  20. #define NSYMB 1500
  21. #define NHASH 1024
  22. #define STRINGSZ 200
  23. #define HISTSZ 20
  24. #define YYMAXDEPTH 1500
  25. #define NTERM 10
  26. #define MAXALIGN 7
  27. #define SIGN(n) ((uvlong)1<<(n-1))
  28. #define MASK(n) (SIGN(n)|(SIGN(n)-1))
  29. #define BITS 5
  30. #define NVAR (BITS*sizeof(ulong)*8)
  31. struct Bits
  32. {
  33. ulong b[BITS];
  34. };
  35. struct Node
  36. {
  37. Node* left;
  38. Node* right;
  39. void* label;
  40. long pc;
  41. int reg;
  42. long xoffset;
  43. double fconst; /* fp constant */
  44. vlong vconst; /* non fp const */
  45. char* cstring; /* character string */
  46. TRune* rstring; /* rune string */
  47. Sym* sym;
  48. Type* type;
  49. long lineno;
  50. char op;
  51. char oldop;
  52. char xcast;
  53. char class;
  54. char etype;
  55. char complex;
  56. char addable;
  57. char scale;
  58. char garb;
  59. };
  60. #define Z ((Node*)0)
  61. struct Sym
  62. {
  63. Sym* link;
  64. Type* type;
  65. Type* suetag;
  66. Type* tenum;
  67. char* macro;
  68. long varlineno;
  69. long offset;
  70. vlong vconst;
  71. double fconst;
  72. Node* label;
  73. ushort lexical;
  74. char *name;
  75. ushort block;
  76. ushort sueblock;
  77. char class;
  78. char sym;
  79. char aused;
  80. char sig;
  81. };
  82. #define S ((Sym*)0)
  83. enum{
  84. SIGNONE = 0,
  85. SIGDONE = 1,
  86. SIGINTERN = 2,
  87. SIGNINTERN = 1729*325*1729,
  88. };
  89. struct Decl
  90. {
  91. Decl* link;
  92. Sym* sym;
  93. Type* type;
  94. long varlineno;
  95. long offset;
  96. short val;
  97. ushort block;
  98. char class;
  99. char aused;
  100. };
  101. #define D ((Decl*)0)
  102. struct Type
  103. {
  104. Sym* sym;
  105. Sym* tag;
  106. Funct* funct;
  107. Type* link;
  108. Type* down;
  109. long width;
  110. long offset;
  111. long lineno;
  112. schar shift;
  113. char nbits;
  114. char etype;
  115. char garb;
  116. };
  117. #define T ((Type*)0)
  118. #define NODECL ((void(*)(int, Type*, Sym*))0)
  119. struct Init /* general purpose initialization */
  120. {
  121. int code;
  122. ulong value;
  123. char* s;
  124. };
  125. EXTERN struct
  126. {
  127. char* p;
  128. int c;
  129. } fi;
  130. struct Io
  131. {
  132. Io* link;
  133. char* p;
  134. char b[BUFSIZ];
  135. short c;
  136. short f;
  137. };
  138. #define I ((Io*)0)
  139. struct Hist
  140. {
  141. Hist* link;
  142. char* name;
  143. long line;
  144. long offset;
  145. };
  146. #define H ((Hist*)0)
  147. EXTERN Hist* hist;
  148. struct Term
  149. {
  150. vlong mult;
  151. Node *node;
  152. };
  153. enum
  154. {
  155. Axxx,
  156. Ael1,
  157. Ael2,
  158. Asu2,
  159. Aarg0,
  160. Aarg1,
  161. Aarg2,
  162. Aaut3,
  163. NALIGN,
  164. };
  165. enum /* also in ../{8a,0a}.h */
  166. {
  167. Plan9 = 1<<0,
  168. Unix = 1<<1,
  169. Windows = 1<<2,
  170. };
  171. enum
  172. {
  173. DMARK,
  174. DAUTO,
  175. DSUE,
  176. DLABEL,
  177. };
  178. enum
  179. {
  180. OXXX,
  181. OADD,
  182. OADDR,
  183. OAND,
  184. OANDAND,
  185. OARRAY,
  186. OAS,
  187. OASI,
  188. OASADD,
  189. OASAND,
  190. OASASHL,
  191. OASASHR,
  192. OASDIV,
  193. OASHL,
  194. OASHR,
  195. OASLDIV,
  196. OASLMOD,
  197. OASLMUL,
  198. OASLSHR,
  199. OASMOD,
  200. OASMUL,
  201. OASOR,
  202. OASSUB,
  203. OASXOR,
  204. OBIT,
  205. OBREAK,
  206. OCASE,
  207. OCAST,
  208. OCOMMA,
  209. OCOND,
  210. OCONST,
  211. OCONTINUE,
  212. ODIV,
  213. ODOT,
  214. ODOTDOT,
  215. ODWHILE,
  216. OENUM,
  217. OEQ,
  218. OFOR,
  219. OFUNC,
  220. OGE,
  221. OGOTO,
  222. OGT,
  223. OHI,
  224. OHS,
  225. OIF,
  226. OIND,
  227. OINDREG,
  228. OINIT,
  229. OLABEL,
  230. OLDIV,
  231. OLE,
  232. OLIST,
  233. OLMOD,
  234. OLMUL,
  235. OLO,
  236. OLS,
  237. OLSHR,
  238. OLT,
  239. OMOD,
  240. OMUL,
  241. ONAME,
  242. ONE,
  243. ONOT,
  244. OOR,
  245. OOROR,
  246. OPOSTDEC,
  247. OPOSTINC,
  248. OPREDEC,
  249. OPREINC,
  250. OPROTO,
  251. OREGISTER,
  252. ORETURN,
  253. OSET,
  254. OSIGN,
  255. OSIZE,
  256. OSTRING,
  257. OLSTRING,
  258. OSTRUCT,
  259. OSUB,
  260. OSWITCH,
  261. OUNION,
  262. OUSED,
  263. OWHILE,
  264. OXOR,
  265. ONEG,
  266. OCOM,
  267. OPOS,
  268. OELEM,
  269. OTST, /* used in some compilers */
  270. OINDEX,
  271. OFAS,
  272. OREGPAIR,
  273. OEXREG,
  274. OEND
  275. };
  276. enum
  277. {
  278. TXXX,
  279. TCHAR,
  280. TUCHAR,
  281. TSHORT,
  282. TUSHORT,
  283. TINT,
  284. TUINT,
  285. TLONG,
  286. TULONG,
  287. TVLONG,
  288. TUVLONG,
  289. TFLOAT,
  290. TDOUBLE,
  291. TIND,
  292. TFUNC,
  293. TARRAY,
  294. TVOID,
  295. TSTRUCT,
  296. TUNION,
  297. TENUM,
  298. TDOT,
  299. NTYPE,
  300. TAUTO = NTYPE,
  301. TEXTERN,
  302. TSTATIC,
  303. TTYPEDEF,
  304. TTYPESTR,
  305. TREGISTER,
  306. TCONSTNT,
  307. TVOLATILE,
  308. TUNSIGNED,
  309. TSIGNED,
  310. TFILE,
  311. TOLD,
  312. NALLTYPES,
  313. /* adapt size of Rune to target system's size */
  314. TRUNE = sizeof(TRune)==4? TUINT: TUSHORT,
  315. };
  316. enum
  317. {
  318. CXXX,
  319. CAUTO,
  320. CEXTERN,
  321. CGLOBL,
  322. CSTATIC,
  323. CLOCAL,
  324. CTYPEDEF,
  325. CTYPESTR,
  326. CPARAM,
  327. CSELEM,
  328. CLABEL,
  329. CEXREG,
  330. NCTYPES,
  331. };
  332. enum
  333. {
  334. GXXX = 0,
  335. GCONSTNT = 1<<0,
  336. GVOLATILE = 1<<1,
  337. NGTYPES = 1<<2,
  338. GINCOMPLETE = 1<<2,
  339. };
  340. enum
  341. {
  342. BCHAR = 1L<<TCHAR,
  343. BUCHAR = 1L<<TUCHAR,
  344. BSHORT = 1L<<TSHORT,
  345. BUSHORT = 1L<<TUSHORT,
  346. BINT = 1L<<TINT,
  347. BUINT = 1L<<TUINT,
  348. BLONG = 1L<<TLONG,
  349. BULONG = 1L<<TULONG,
  350. BVLONG = 1L<<TVLONG,
  351. BUVLONG = 1L<<TUVLONG,
  352. BFLOAT = 1L<<TFLOAT,
  353. BDOUBLE = 1L<<TDOUBLE,
  354. BIND = 1L<<TIND,
  355. BFUNC = 1L<<TFUNC,
  356. BARRAY = 1L<<TARRAY,
  357. BVOID = 1L<<TVOID,
  358. BSTRUCT = 1L<<TSTRUCT,
  359. BUNION = 1L<<TUNION,
  360. BENUM = 1L<<TENUM,
  361. BFILE = 1L<<TFILE,
  362. BDOT = 1L<<TDOT,
  363. BCONSTNT = 1L<<TCONSTNT,
  364. BVOLATILE = 1L<<TVOLATILE,
  365. BUNSIGNED = 1L<<TUNSIGNED,
  366. BSIGNED = 1L<<TSIGNED,
  367. BAUTO = 1L<<TAUTO,
  368. BEXTERN = 1L<<TEXTERN,
  369. BSTATIC = 1L<<TSTATIC,
  370. BTYPEDEF = 1L<<TTYPEDEF,
  371. BTYPESTR = 1L<<TTYPESTR,
  372. BREGISTER = 1L<<TREGISTER,
  373. BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
  374. BLONG|BULONG|BVLONG|BUVLONG,
  375. BNUMBER = BINTEGER|BFLOAT|BDOUBLE,
  376. /* these can be overloaded with complex types */
  377. BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
  378. BGARB = BCONSTNT|BVOLATILE,
  379. };
  380. struct Funct
  381. {
  382. Sym* sym[OEND];
  383. Sym* castto[NTYPE];
  384. Sym* castfr[NTYPE];
  385. };
  386. EXTERN struct
  387. {
  388. Type* tenum; /* type of entire enum */
  389. Type* cenum; /* type of current enum run */
  390. vlong lastenum; /* value of current enum */
  391. double floatenum; /* value of current enum */
  392. } en;
  393. EXTERN int autobn;
  394. EXTERN long autoffset;
  395. EXTERN int blockno;
  396. EXTERN Decl* dclstack;
  397. EXTERN char debug[256];
  398. EXTERN Hist* ehist;
  399. EXTERN long firstbit;
  400. EXTERN Sym* firstarg;
  401. EXTERN Type* firstargtype;
  402. EXTERN Decl* firstdcl;
  403. EXTERN int fperror;
  404. EXTERN Sym* hash[NHASH];
  405. EXTERN int hasdoubled;
  406. EXTERN char* hunk;
  407. EXTERN char* include[20];
  408. EXTERN Io* iofree;
  409. EXTERN Io* ionext;
  410. EXTERN Io* iostack;
  411. EXTERN long lastbit;
  412. EXTERN char lastclass;
  413. EXTERN Type* lastdcl;
  414. EXTERN long lastfield;
  415. EXTERN Type* lasttype;
  416. EXTERN long lineno;
  417. EXTERN long nearln;
  418. EXTERN int nerrors;
  419. EXTERN int newflag;
  420. EXTERN long nhunk;
  421. EXTERN int ninclude;
  422. EXTERN Node* nodproto;
  423. EXTERN Node* nodcast;
  424. EXTERN Biobuf outbuf;
  425. EXTERN Biobuf diagbuf;
  426. EXTERN char* outfile;
  427. EXTERN char* pathname;
  428. EXTERN int peekc;
  429. EXTERN long stkoff;
  430. EXTERN Type* strf;
  431. EXTERN Type* strl;
  432. EXTERN char symb[NSYMB];
  433. EXTERN Sym* symstring;
  434. EXTERN int taggen;
  435. EXTERN Type* tfield;
  436. EXTERN Type* tufield;
  437. EXTERN int thechar;
  438. EXTERN char* thestring;
  439. EXTERN Type* thisfn;
  440. EXTERN long thunk;
  441. EXTERN Type* types[NTYPE];
  442. EXTERN Type* fntypes[NTYPE];
  443. EXTERN Node* initlist;
  444. EXTERN Term term[NTERM];
  445. EXTERN int nterm;
  446. EXTERN int packflg;
  447. EXTERN int fproundflg;
  448. EXTERN int profileflg;
  449. EXTERN int ncontin;
  450. EXTERN int newvlongcode;
  451. EXTERN int canreach;
  452. EXTERN int warnreach;
  453. EXTERN Bits zbits;
  454. extern char *onames[], *tnames[], *gnames[];
  455. extern char *cnames[], *qnames[], *bnames[];
  456. extern char tab[NTYPE][NTYPE];
  457. extern char comrel[], invrel[], logrel[];
  458. extern long ncast[], tadd[], tand[];
  459. extern long targ[], tasadd[], tasign[], tcast[];
  460. extern long tdot[], tfunct[], tindir[], tmul[];
  461. extern long tnot[], trel[], tsub[];
  462. extern char typeaf[];
  463. extern char typefd[];
  464. extern char typei[];
  465. extern char typesu[];
  466. extern char typesuv[];
  467. extern char typeu[];
  468. extern char typev[];
  469. extern char typec[];
  470. extern char typeh[];
  471. extern char typeil[];
  472. extern char typeilp[];
  473. extern char typechl[];
  474. extern char typechlv[];
  475. extern char typechlvp[];
  476. extern char typechlp[];
  477. extern char typechlpfd[];
  478. EXTERN char* typeswitch;
  479. EXTERN char* typeword;
  480. EXTERN char* typecmplx;
  481. extern ulong thash1;
  482. extern ulong thash2;
  483. extern ulong thash3;
  484. extern ulong thash[];
  485. /*
  486. * Inferno.c/Posix.c/Nt.c
  487. */
  488. int mywait(int*);
  489. int mycreat(char*, int);
  490. int systemtype(int);
  491. int pathchar(void);
  492. int myaccess(char*);
  493. char* mygetwd(char*, int);
  494. int myexec(char*, char*[]);
  495. int mydup(int, int);
  496. int myfork(void);
  497. int mypipe(int*);
  498. void* mysbrk(ulong);
  499. /*
  500. * parser
  501. */
  502. int yyparse(void);
  503. int mpatof(char*, double*);
  504. int mpatov(char*, vlong*);
  505. /*
  506. * lex.c
  507. */
  508. void* allocn(void*, long, long);
  509. void* alloc(long);
  510. void cinit(void);
  511. int compile(char*, char**, int);
  512. void errorexit(void);
  513. int filbuf(void);
  514. int getc(void);
  515. long getr(void);
  516. int getnsc(void);
  517. Sym* lookup(void);
  518. void main(int, char*[]);
  519. void newfile(char*, int);
  520. void newio(void);
  521. void pushio(void);
  522. long escchar(long, int, int);
  523. Sym* slookup(char*);
  524. void syminit(Sym*);
  525. void unget(int);
  526. long yylex(void);
  527. int Lconv(Fmt*);
  528. int Tconv(Fmt*);
  529. int FNconv(Fmt*);
  530. int Oconv(Fmt*);
  531. int Qconv(Fmt*);
  532. int VBconv(Fmt*);
  533. void setinclude(char*);
  534. /*
  535. * mac.c
  536. */
  537. void dodefine(char*);
  538. void domacro(void);
  539. Sym* getsym(void);
  540. long getnsn(void);
  541. void linehist(char*, int);
  542. void macdef(void);
  543. void macprag(void);
  544. void macend(void);
  545. void macexpand(Sym*, char*);
  546. void macif(int);
  547. void macinc(void);
  548. void maclin(void);
  549. void macund(void);
  550. /*
  551. * dcl.c
  552. */
  553. Node* doinit(Sym*, Type*, long, Node*);
  554. Type* tcopy(Type*);
  555. Node* init1(Sym*, Type*, long, int);
  556. Node* newlist(Node*, Node*);
  557. void adecl(int, Type*, Sym*);
  558. int anyproto(Node*);
  559. void argmark(Node*, int);
  560. void dbgdecl(Sym*);
  561. Node* dcllabel(Sym*, int);
  562. Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
  563. Sym* mkstatic(Sym*);
  564. void doenum(Sym*, Node*);
  565. void snap(Type*);
  566. Type* dotag(Sym*, int, int);
  567. void edecl(int, Type*, Sym*);
  568. Type* fnproto(Node*);
  569. Type* fnproto1(Node*);
  570. void markdcl(void);
  571. Type* paramconv(Type*, int, int);
  572. void pdecl(int, Type*, Sym*);
  573. Decl* push(void);
  574. Decl* push1(Sym*);
  575. Node* revertdcl(void);
  576. #undef round
  577. #define round ccround
  578. #undef log2
  579. #define log2 cclog2
  580. long round(long, int);
  581. int rsametype(Type*, Type*, int, int);
  582. int sametype(Type*, Type*);
  583. ulong sign(Sym*);
  584. ulong signature(Type*);
  585. void sualign(Type*);
  586. void tmerge(Type*, Sym*);
  587. void walkparam(Node*, int);
  588. void xdecl(int, Type*, Sym*);
  589. Node* contig(Sym*, Node*, long);
  590. /*
  591. * com.c
  592. */
  593. void ccom(Node*);
  594. void complex(Node*);
  595. int tcom(Node*);
  596. int tcoma(Node*, Node*, Type*, int);
  597. int tcomd(Node*);
  598. int tcomo(Node*, int);
  599. int tcomx(Node*);
  600. int tlvalue(Node*);
  601. void constas(Node*, Type*, Type*);
  602. Node* uncomma(Node*);
  603. Node* uncomargs(Node*);
  604. /*
  605. * con.c
  606. */
  607. void acom(Node*);
  608. void acom1(vlong, Node*);
  609. void acom2(Node*, Type*);
  610. int acomcmp1(void*, void*);
  611. int acomcmp2(void*, void*);
  612. int addo(Node*);
  613. void evconst(Node*);
  614. /*
  615. * funct.c
  616. */
  617. int isfunct(Node*);
  618. void dclfunct(Type*, Sym*);
  619. /*
  620. * sub.c
  621. */
  622. void arith(Node*, int);
  623. int castucom(Node*);
  624. int deadheads(Node*);
  625. Type* dotsearch(Sym*, Type*, Node*, long*);
  626. long dotoffset(Type*, Type*, Node*);
  627. void gethunk(void);
  628. Node* invert(Node*);
  629. int bitno(long);
  630. void makedot(Node*, Type*, long);
  631. int mixedasop(Type*, Type*);
  632. Node* new(int, Node*, Node*);
  633. Node* new1(int, Node*, Node*);
  634. int nilcast(Type*, Type*);
  635. int nocast(Type*, Type*);
  636. void prtree(Node*, char*);
  637. void prtree1(Node*, int, int);
  638. void relcon(Node*, Node*);
  639. int relindex(int);
  640. int simpleg(long);
  641. Type* garbt(Type*, long);
  642. int simplec(long);
  643. Type* simplet(long);
  644. int stcompat(Node*, Type*, Type*, long[]);
  645. int tcompat(Node*, Type*, Type*, long[]);
  646. void tinit(void);
  647. Type* typ(int, Type*);
  648. Type* copytyp(Type*);
  649. void typeext(Type*, Node*);
  650. void typeext1(Type*, Node*);
  651. int side(Node*);
  652. int vconst(Node*);
  653. int log2(uvlong);
  654. int vlog(Node*);
  655. int topbit(ulong);
  656. void simplifyshift(Node*);
  657. long typebitor(long, long);
  658. void diag(Node*, char*, ...);
  659. void warn(Node*, char*, ...);
  660. void yyerror(char*, ...);
  661. void fatal(Node*, char*, ...);
  662. /*
  663. * acid.c
  664. */
  665. void acidtype(Type*);
  666. void acidvar(Sym*);
  667. /*
  668. * pickle.c
  669. */
  670. void pickletype(Type*);
  671. /*
  672. * bits.c
  673. */
  674. Bits bor(Bits, Bits);
  675. Bits band(Bits, Bits);
  676. Bits bnot(Bits);
  677. int bany(Bits*);
  678. int bnum(Bits);
  679. Bits blsh(uint);
  680. int beq(Bits, Bits);
  681. int bset(Bits, uint);
  682. /*
  683. * dpchk.c
  684. */
  685. void dpcheck(Node*);
  686. void arginit(void);
  687. void pragvararg(void);
  688. void pragpack(void);
  689. void pragfpround(void);
  690. void pragprofile(void);
  691. void pragincomplete(void);
  692. /*
  693. * calls to machine depend part
  694. */
  695. void codgen(Node*, Node*);
  696. void gclean(void);
  697. void gextern(Sym*, Node*, long, long);
  698. void ginit(void);
  699. long outstring(char*, long);
  700. long outlstring(TRune*, long);
  701. void xcom(Node*);
  702. long exreg(Type*);
  703. long align(long, Type*, int);
  704. long maxround(long, long);
  705. extern schar ewidth[];
  706. /*
  707. * com64
  708. */
  709. int com64(Node*);
  710. void com64init(void);
  711. void bool64(Node*);
  712. double convvtof(vlong);
  713. vlong convftov(double);
  714. double convftox(double, int);
  715. vlong convvtox(vlong, int);
  716. /*
  717. * machcap
  718. */
  719. int machcap(Node*);
  720. #pragma varargck argpos warn 2
  721. #pragma varargck argpos diag 2
  722. #pragma varargck argpos yyerror 1
  723. #pragma varargck type "F" Node*
  724. #pragma varargck type "L" long
  725. #pragma varargck type "Q" long
  726. #pragma varargck type "O" int
  727. #pragma varargck type "T" Type*
  728. #pragma varargck type "|" int
  729. #undef true
  730. #define true mytrue