cc.h 12 KB

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