cc.h 12 KB

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