cc.h 12 KB

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