cc.h 11 KB

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