cc.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  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. char 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. NTYPE,
  299. TAUTO = NTYPE,
  300. TEXTERN,
  301. TSTATIC,
  302. TTYPEDEF,
  303. TTYPESTR,
  304. TREGISTER,
  305. TCONSTNT,
  306. TVOLATILE,
  307. TUNSIGNED,
  308. TSIGNED,
  309. TDOT,
  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 char* hunk;
  404. EXTERN char* include[20];
  405. EXTERN Io* iofree;
  406. EXTERN Io* ionext;
  407. EXTERN Io* iostack;
  408. EXTERN long lastbit;
  409. EXTERN char lastclass;
  410. EXTERN Type* lastdcl;
  411. EXTERN long lastfield;
  412. EXTERN Type* lasttype;
  413. EXTERN long lineno;
  414. EXTERN long nearln;
  415. EXTERN int nerrors;
  416. EXTERN int newflag;
  417. EXTERN long nhunk;
  418. EXTERN int ninclude;
  419. EXTERN Node* nodproto;
  420. EXTERN Node* nodcast;
  421. EXTERN Biobuf outbuf;
  422. EXTERN Biobuf diagbuf;
  423. EXTERN char* outfile;
  424. EXTERN char* pathname;
  425. EXTERN int peekc;
  426. EXTERN long stkoff;
  427. EXTERN Type* strf;
  428. EXTERN Type* strl;
  429. EXTERN char symb[NSYMB];
  430. EXTERN Sym* symstring;
  431. EXTERN int taggen;
  432. EXTERN Type* tfield;
  433. EXTERN Type* tufield;
  434. EXTERN int thechar;
  435. EXTERN char* thestring;
  436. EXTERN Type* thisfn;
  437. EXTERN long thunk;
  438. EXTERN Type* types[NTYPE];
  439. EXTERN Type* fntypes[NTYPE];
  440. EXTERN Node* initlist;
  441. EXTERN Term term[NTERM];
  442. EXTERN int nterm;
  443. EXTERN int packflg;
  444. EXTERN int fproundflg;
  445. EXTERN int profileflg;
  446. EXTERN Bits zbits;
  447. extern char *onames[], *tnames[], *gnames[];
  448. extern char *cnames[], *qnames[], *bnames[];
  449. extern char tab[NTYPE][NTYPE];
  450. extern char comrel[], invrel[], logrel[];
  451. extern long ncast[], tadd[], tand[];
  452. extern long targ[], tasadd[], tasign[], tcast[];
  453. extern long tdot[], tfunct[], tindir[], tmul[];
  454. extern long tnot[], trel[], tsub[];
  455. extern char typeaf[];
  456. extern char typefd[];
  457. extern char typei[];
  458. extern char typesu[];
  459. extern char typesuv[];
  460. extern char typeu[];
  461. extern char typev[];
  462. extern char typec[];
  463. extern char typeh[];
  464. extern char typeil[];
  465. extern char typeilp[];
  466. extern char typechl[];
  467. extern char typechlv[];
  468. extern char typechlvp[];
  469. extern char typechlp[];
  470. extern char typechlpfd[];
  471. EXTERN char* typeword;
  472. EXTERN char* typecmplx;
  473. extern ulong thash1;
  474. extern ulong thash2;
  475. extern ulong thash3;
  476. extern ulong thash[];
  477. /*
  478. * compat.c/unix.c/windows.c
  479. */
  480. int mywait(int*);
  481. int mycreat(char*, int);
  482. int systemtype(int);
  483. int pathchar(void);
  484. int myaccess(char*);
  485. char* mygetwd(char*, int);
  486. int myexec(char*, char*[]);
  487. int mydup(int, int);
  488. int myfork(void);
  489. int mypipe(int*);
  490. void* mysbrk(ulong);
  491. /*
  492. * parser
  493. */
  494. int yyparse(void);
  495. int mpatov(char*, vlong*);
  496. /*
  497. * lex.c
  498. */
  499. void* allocn(void*, long, long);
  500. void* alloc(long);
  501. void cinit(void);
  502. int compile(char*, char**, int);
  503. void errorexit(void);
  504. int filbuf(void);
  505. int getc(void);
  506. long getr(void);
  507. int getnsc(void);
  508. Sym* lookup(void);
  509. void main(int, char*[]);
  510. void newfile(char*, int);
  511. void newio(void);
  512. void pushio(void);
  513. long escchar(long, int, int);
  514. Sym* slookup(char*);
  515. void syminit(Sym*);
  516. void unget(int);
  517. long yylex(void);
  518. int Lconv(Fmt*);
  519. int Tconv(Fmt*);
  520. int FNconv(Fmt*);
  521. int Oconv(Fmt*);
  522. int Qconv(Fmt*);
  523. int VBconv(Fmt*);
  524. void setinclude(char*);
  525. /*
  526. * mac.c
  527. */
  528. void dodefine(char*);
  529. void domacro(void);
  530. Sym* getsym(void);
  531. long getnsn(void);
  532. void linehist(char*, int);
  533. void macdef(void);
  534. void macprag(void);
  535. void macend(void);
  536. void macexpand(Sym*, char*);
  537. void macif(int);
  538. void macinc(void);
  539. void maclin(void);
  540. void macund(void);
  541. /*
  542. * dcl.c
  543. */
  544. Node* doinit(Sym*, Type*, long, Node*);
  545. Type* tcopy(Type*);
  546. Node* init1(Sym*, Type*, long, int);
  547. Node* newlist(Node*, Node*);
  548. void adecl(int, Type*, Sym*);
  549. int anyproto(Node*);
  550. void argmark(Node*, int);
  551. void dbgdecl(Sym*);
  552. Node* dcllabel(Sym*, int);
  553. Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
  554. Sym* mkstatic(Sym*);
  555. void doenum(Sym*, Node*);
  556. void snap(Type*);
  557. Type* dotag(Sym*, int, int);
  558. void edecl(int, Type*, Sym*);
  559. Type* fnproto(Node*);
  560. Type* fnproto1(Node*);
  561. void markdcl(void);
  562. Type* paramconv(Type*, int);
  563. void pdecl(int, Type*, Sym*);
  564. Decl* push(void);
  565. Decl* push1(Sym*);
  566. Node* revertdcl(void);
  567. long round(long, int);
  568. int rsametype(Type*, Type*, int, int);
  569. int sametype(Type*, Type*);
  570. ulong sign(Sym*);
  571. ulong signature(Type*);
  572. void suallign(Type*);
  573. void tmerge(Type*, Sym*);
  574. void walkparam(Node*, int);
  575. void xdecl(int, Type*, Sym*);
  576. Node* contig(Sym*, Node*, long);
  577. /*
  578. * com.c
  579. */
  580. void ccom(Node*);
  581. void complex(Node*);
  582. int tcom(Node*);
  583. int tcoma(Node*, Node*, Type*, int);
  584. int tcomd(Node*);
  585. int tcomo(Node*, int);
  586. int tcomx(Node*);
  587. int tlvalue(Node*);
  588. void constas(Node*, Type*, Type*);
  589. /*
  590. * con.c
  591. */
  592. void acom(Node*);
  593. void acom1(vlong, Node*);
  594. void acom2(Node*, Type*);
  595. int acomcmp1(const void*, const void*);
  596. int acomcmp2(const void*, const void*);
  597. int addo(Node*);
  598. void evconst(Node*);
  599. /*
  600. * funct.c
  601. */
  602. int isfunct(Node*);
  603. void dclfunct(Type*, Sym*);
  604. /*
  605. * sub.c
  606. */
  607. void arith(Node*, int);
  608. int deadheads(Node*);
  609. Type* dotsearch(Sym*, Type*, Node*, long*);
  610. long dotoffset(Type*, Type*, Node*);
  611. void gethunk(void);
  612. Node* invert(Node*);
  613. int bitno(long);
  614. void makedot(Node*, Type*, long);
  615. int mixedasop(Type*, Type*);
  616. Node* new(int, Node*, Node*);
  617. Node* new1(int, Node*, Node*);
  618. int nilcast(Type*, Type*);
  619. int nocast(Type*, Type*);
  620. void prtree(Node*, char*);
  621. void prtree1(Node*, int, int);
  622. void relcon(Node*, Node*);
  623. int relindex(int);
  624. int simpleg(long);
  625. Type* garbt(Type*, long);
  626. int simplec(long);
  627. Type* simplet(long);
  628. int stcompat(Node*, Type*, Type*, long[]);
  629. int tcompat(Node*, Type*, Type*, long[]);
  630. void tinit(void);
  631. Type* typ(int, Type*);
  632. Type* copytyp(Type*);
  633. void typeext(Type*, Node*);
  634. void typeext1(Type*, Node*);
  635. int side(Node*);
  636. int vconst(Node*);
  637. int log2(uvlong);
  638. int vlog(Node*);
  639. int topbit(ulong);
  640. void simplifyshift(Node*);
  641. long typebitor(long, long);
  642. void diag(Node*, char*, ...);
  643. void warn(Node*, char*, ...);
  644. void yyerror(char*, ...);
  645. void fatal(Node*, char*, ...);
  646. /*
  647. * acid.c
  648. */
  649. void acidtype(Type*);
  650. void acidvar(Sym*);
  651. /*
  652. * pickle.c
  653. */
  654. void pickletype(Type*);
  655. /*
  656. * bits.c
  657. */
  658. Bits bor(Bits, Bits);
  659. Bits band(Bits, Bits);
  660. Bits bnot(Bits);
  661. int bany(Bits*);
  662. int bnum(Bits);
  663. Bits blsh(uint);
  664. int beq(Bits, Bits);
  665. int bset(Bits, uint);
  666. /*
  667. * dpchk.c
  668. */
  669. void dpcheck(Node*);
  670. void arginit(void);
  671. void pragvararg(void);
  672. void pragpack(void);
  673. void pragfpround(void);
  674. void pragprofile(void);
  675. void pragincomplete(void);
  676. /*
  677. * calls to machine depend part
  678. */
  679. void codgen(Node*, Node*);
  680. void gclean(void);
  681. void gextern(Sym*, Node*, long, long);
  682. void ginit(void);
  683. long outstring(char*, long);
  684. long outlstring(ushort*, long);
  685. void sextern(Sym*, Node*, long, long);
  686. void xcom(Node*);
  687. long exreg(Type*);
  688. long align(long, Type*, int);
  689. long maxround(long, long);
  690. extern schar ewidth[];
  691. /*
  692. * com64
  693. */
  694. int com64(Node*);
  695. void com64init(void);
  696. void bool64(Node*);
  697. double convvtof(vlong);
  698. vlong convftov(double);
  699. double convftox(double, int);
  700. vlong convvtox(vlong, int);
  701. /*
  702. * machcap
  703. */
  704. int machcap(Node*);
  705. #pragma varargck argpos warn 2
  706. #pragma varargck argpos diag 2
  707. #pragma varargck argpos yyerror 1
  708. #pragma varargck type "F" Node*
  709. #pragma varargck type "L" long
  710. #pragma varargck type "Q" long
  711. #pragma varargck type "O" int
  712. #pragma varargck type "T" Type*
  713. #pragma varargck type "|" int