home *** CD-ROM | disk | FTP | other *** search
/ Total Destruction / Total_Destruction.iso / addons / Lccwin32.exe / Lccwin32 / lccpub / src / c.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-11-11  |  22.9 KB  |  931 lines

  1. #include <stdio.h>
  2. #include <io.h>
  3. #define BUILTIN_ASM
  4. #define NEW(p,a) ((p) = allocate(sizeof *(p), (a)))
  5. #define NEW0(p,a) memset(NEW((p),(a)), 0, sizeof *(p))
  6. //#define NDEBUG
  7. #ifdef NDEBUG
  8. #define assert(c)
  9. #else
  10. #define assert(c) /*lint -e506 */ \
  11.     ((void)((c) || \
  12.     fatal(__FILE__,"assertion failure at line %d\n",__LINE__))) \
  13.     /*lint -restore */
  14. #endif
  15.  
  16. #define isaddrop(op) \
  17.     ((op)==ADDRG+P || (op)==ADDRL+P || (op)==ADDRF+P)
  18.  
  19. #define    MAXLINE  512
  20. #define    BUFSIZE 4096
  21.  
  22. #define istypename(t,tsym) (kind[t] == CHAR \
  23.     || t == ID && tsym && tsym->sclass == TYPEDEF)
  24. #ifdef __LCC__
  25. #pragma pack(1)
  26. #endif
  27. #if 1
  28. #define ARGS(list) list
  29. #else
  30. #define ARGS(list) ()
  31. #endif
  32. /*#ifdef __STDC__*/
  33. #include <stdarg.h>
  34. #define va_init(a,b) va_start(a,b)
  35. #ifdef __STDC__
  36. #define VARARGS(newlist,oldlist,olddcls) newlist
  37. #else
  38. #define VARARGS(newlist,oldlist,olddcls) oldlist olddcls
  39. #endif
  40. #ifndef NULL
  41. #define NULL ((void*)0)
  42. #endif
  43. #define NELEMS(a) ((int)(sizeof (a)/sizeof ((a)[0])))
  44. #define roundup(x,n) (((x)+((n)-1))&(~((n)-1)))
  45. #define generic(op) ((op)&~15)
  46. #define opindex(op) ((op)>>4)
  47. #define optype(op) ((op)&15)
  48. #define isqual(t)     ((t)->op >= CONST)
  49. #define unqual(t)     (isqual(t) ? (t)->type : (t))
  50.  
  51. #define isvolatile(t) ((t)->op == VOLATILE \
  52.                     || (t)->op == CONST+VOLATILE)
  53. #define isconst(t)    ((t)->op == CONST \
  54.                     || (t)->op == CONST+VOLATILE)
  55. #define isarray(t)    (unqual(t)->op == ARRAY)
  56. #define isstruct(t)   (unqual(t)->op == STRUCT \
  57.                     || unqual(t)->op == UNION)
  58. #define isunion(t)    (unqual(t)->op == UNION)
  59. #define isfunc(t)     (unqual(t)->op == FUNCTION)
  60. #define isptr(t)      (unqual(t)->op == POINTER)
  61. #define ischar(t)     (unqual(t)->op == CHAR)
  62. #define isint(t)      (unqual(t)->op >= CHAR && (unqual(t)->op != LONGLONG) \
  63.                     && unqual(t)->op <= UNSIGNED)
  64. #define isfloat(t)    (unqual(t)->op <= DOUBLE)
  65. #define isarith(t)    (unqual(t)->op <= UNSIGNED)
  66. #define isunsigned(t) (unqual(t)->op == UNSIGNED)
  67. #define isdouble(t)   (unqual(t)->op == DOUBLE)
  68. #define isscalar(t)   (unqual(t)->op <= POINTER \
  69.                     || unqual(t)->op == ENUM)
  70. #define isenum(t)     (unqual(t)->op == ENUM)
  71. #define fieldsize(p)  (p)->bitsize
  72. #define fieldright(p) ((p)->lsb - 1)
  73. #define fieldleft(p)  (8*(p)->type->size - \
  74.                         fieldsize(p) - fieldright(p))
  75. #define fieldmask(p)  (~(~(unsigned)0<<fieldsize(p)))
  76. #define widen(t) (isint(t) || isenum(t) ? INT : ttob(t))
  77. typedef struct node *Node;
  78.  
  79. typedef struct list *List;
  80.  
  81. typedef struct code *Code;
  82.  
  83. typedef struct swtch *Swtch;
  84.  
  85. typedef struct symbol *Symbol;
  86.  
  87. typedef struct coord {
  88.     char *file;
  89.     unsigned x, y;
  90. } Coordinate;
  91. typedef struct table *Table;
  92.  
  93. extern void asmcode(char *, Symbol []);   
  94. #ifndef asmH
  95. typedef union value {
  96.     /* signed */ char sc;
  97.     short ss;
  98.     int i;
  99.     unsigned char uc;
  100.     unsigned short us;
  101.     unsigned int u;
  102.     float f;
  103.     double d;
  104.     void *p;
  105. //    __int64 ll;
  106. } Value;
  107. #endif
  108.  
  109. typedef struct tree *Tree;
  110.  
  111. typedef struct type *Type;
  112.  
  113. typedef struct field *Field;
  114.  
  115. typedef struct {
  116.     unsigned printed:1;
  117.     unsigned marked:1;
  118.     unsigned pointerEmitted:1;
  119.     unsigned short typeno;
  120.     unsigned short pointerIndex;
  121. } Xtype;
  122.  
  123. #include "config.h"
  124. typedef struct metrics {
  125.     unsigned char size, align, outofline;
  126. } Metrics;
  127. typedef struct interface {
  128.     Metrics charmetric;
  129.     Metrics shortmetric;
  130.     Metrics intmetric;
  131.     Metrics floatmetric;
  132.     Metrics doublemetric;
  133.     Metrics ptrmetric;
  134.     Metrics structmetric;
  135.     unsigned little_endian:1;
  136.     unsigned mulops_calls:1;
  137.     unsigned wants_callb:1;
  138.     unsigned wants_argb:1;
  139.     unsigned left_to_right:1;
  140.     unsigned wants_dag:1;
  141.  
  142. void (*address) ARGS((Symbol p, Symbol q, int n));
  143. void (*blockbeg) ARGS((Env *));
  144. void (*blockend) ARGS((Env *));
  145. void (*defaddress) ARGS((Symbol));
  146. void (*defconst)   ARGS((int ty, Value v));
  147. void (*defstring) ARGS((int n, char *s));
  148. void (*defsymbol) ARGS((Symbol));
  149. void (*emit)     ARGS((Node));
  150. void (*export) ARGS((Symbol));
  151. void (*function) ARGS((Symbol, Symbol[], Symbol[], int));
  152. Node (*gen)      ARGS((Node));
  153. void (*global) ARGS((Symbol));
  154. void (*import) ARGS((Symbol));
  155. void (*local) ARGS((Symbol));
  156. void (*progbeg) ARGS((int argc, char *argv[]));
  157. void (*progend) ARGS((void));
  158. void (*segment) ARGS((int));
  159. void (*space) ARGS((int));
  160. void (*stabblock) ARGS((int, int, Symbol*));
  161. void (*stabend)   ARGS((Coordinate *, Symbol, Coordinate **,Symbol *, Symbol *));
  162. void (*stabfend)  ARGS((Symbol, int));
  163. void (*stabinit)  ARGS((char *, int, char *[]));
  164. void (*stabline)  ARGS((Coordinate *));
  165. void (*stabsym)   ARGS((Symbol));
  166. void (*stabtype)  ARGS((Symbol));
  167.     Xinterface x;
  168. } Interface;
  169. typedef struct binding {
  170.     char *name;
  171.     Interface *ir;
  172. } Binding;
  173.  
  174. extern Binding bindings[];
  175. extern Interface *IR;
  176. typedef struct {
  177.     List entry;
  178.     List exit;
  179.     List returns;
  180.     List points;
  181.     List calls;
  182.     List end;
  183. } Events;
  184.  
  185. enum {
  186. #define xx(a,b,c,d,e,f,g) a=b,
  187. #define yy(a,b,c,d,e,f,g)
  188. #include "token.h"
  189.     LAST
  190. };
  191. struct node {
  192.     short op;
  193.     short count;
  194.      Symbol syms[3];
  195.     Node kids[2];
  196.     Node link;
  197.     Xnode x;
  198. };
  199. enum {
  200.     F=FLOAT,
  201.     D=DOUBLE,
  202.     C=CHAR,
  203.     S=SHORT,
  204.     I=INT,
  205.     U=UNSIGNED,
  206.     P=POINTER,
  207.     V=VOID,
  208.     B=STRUCT,
  209.     L=LONGLONG
  210. };
  211. enum { CNST=1<<4,
  212.            CNSTC=CNST+C,
  213.            CNSTD=CNST+D,
  214.            CNSTF=CNST+F,
  215.            CNSTI=CNST+I,
  216.            CNSTP=CNST+P,
  217.            CNSTS=CNST+S,
  218.            CNSTU=CNST+U,
  219.         CNSTL=CNST+L,
  220.        ARG=2<<4,
  221.            ARGB=ARG+B,
  222.            ARGD=ARG+D,
  223.            ARGF=ARG+F,
  224.            ARGI=ARG+I,
  225.            ARGP=ARG+P,
  226.         ARGL=ARG+L,
  227.        ASGN=3<<4,
  228.            ASGNB=ASGN+B,
  229.            ASGNC=ASGN+C,
  230.            ASGND=ASGN+D,
  231.            ASGNF=ASGN+F,
  232.            ASGNI=ASGN+I,
  233.            ASGNS=ASGN+S,
  234.            ASGNP=ASGN+P,
  235.         ASGNL=ASGN+L,
  236.        INDIR=4<<4,
  237.            INDIRB=INDIR+B,
  238.            INDIRC=INDIR+C,
  239.            INDIRD=INDIR+D,
  240.            INDIRF=INDIR+F,
  241.            INDIRI=INDIR+I,
  242.            INDIRS=INDIR+S,
  243.            INDIRP=INDIR+P,
  244.         INDIRL=INDIR+L,
  245.        CVC=5<<4,
  246.            CVCI=CVC+I,
  247.            CVCU=CVC+U,
  248.        CVD=6<<4,
  249.            CVDF=CVD+F,
  250.            CVDI=CVD+I,
  251.         CVDL=CVD+L,
  252.        CVF=7<<4,
  253.            CVFD=CVF+D,
  254.        CVI=8<<4,
  255.            CVIC=CVI+C,
  256.            CVID=CVI+D,
  257.            CVIS=CVI+S,
  258.            CVIU=CVI+U,
  259.         CVIL=CVI+L,
  260.        CVP=9<<4,
  261.            CVPU=CVP+U,
  262.        CVS=10<<4,
  263.            CVSI=CVS+I,
  264.            CVSU=CVS+U,
  265.        CVU=11<<4,
  266.            CVUC=CVU+C,
  267.            CVUI=CVU+I,
  268.            CVUP=CVU+P,
  269.            CVUS=CVU+S,
  270.        NEG=12<<4,
  271.            NEGD=NEG+D,
  272.            NEGF=NEG+F,
  273.            NEGI=NEG+I,
  274.         NEGL=NEG+L,
  275.        CALL=13<<4,
  276.            CALLB=CALL+B,
  277.            CALLD=CALL+D,
  278.            CALLF=CALL+F,
  279.            CALLI=CALL+I,
  280.            CALLV=CALL+V,
  281.         CALLL=CALL+L,
  282.        LOAD=14<<4,
  283.            LOADB=LOAD+B,
  284.            LOADC=LOAD+C,
  285.            LOADD=LOAD+D,
  286.            LOADF=LOAD+F,
  287.            LOADI=LOAD+I,
  288.            LOADP=LOAD+P,
  289.            LOADS=LOAD+S,
  290.            LOADU=LOAD+U,
  291.        RET=15<<4,
  292.            RETD=RET+D,
  293.            RETF=RET+F,
  294.            RETI=RET+I,
  295.         RETL=RET+L,
  296.        ADDRG=16<<4,
  297.            ADDRGP=ADDRG+P,
  298.        ADDRF=17<<4,
  299.            ADDRFP=ADDRF+P,
  300.        ADDRL=18<<4,
  301.            ADDRLP=ADDRL+P,
  302.        ADD=19<<4,
  303.            ADDD=ADD+D,
  304.            ADDF=ADD+F,
  305.            ADDI=ADD+I,
  306.            ADDP=ADD+P,
  307.            ADDU=ADD+U,
  308.         ADDL=ADD+L,
  309.        SUB=20<<4,
  310.            SUBD=SUB+D,
  311.            SUBF=SUB+F,
  312.            SUBI=SUB+I,
  313.            SUBP=SUB+P,
  314.            SUBU=SUB+U,
  315.         SUBL=SUB+L,
  316.        LSH=21<<4,
  317.            LSHI=LSH+I,
  318.            LSHU=LSH+U,
  319.         LSHL=LSH+L,
  320.        MOD=22<<4,
  321.            MODI=MOD+I,
  322.            MODU=MOD+U,
  323.         MODL=MOD+L,
  324.        RSH=23<<4,
  325.            RSHI=RSH+I,
  326.            RSHU=RSH+U,
  327.         RSHL=RSH+L,
  328.        BAND=24<<4,
  329.            BANDU=BAND+U,
  330.         BANDL=BAND+L,
  331.        BCOM=25<<4,
  332.            BCOMU=BCOM+U,
  333.         BCOML=BCOM+L,
  334.        BOR=26<<4,
  335.            BORU=BOR+U,
  336.         BORL=BOR+L,
  337.        BXOR=27<<4,
  338.            BXORU=BXOR+U,
  339.         BXORL=BXOR+L,
  340.        DIV=28<<4,
  341.            DIVD=DIV+D,
  342.            DIVF=DIV+F,
  343.            DIVI=DIV+I,
  344.            DIVU=DIV+U,
  345.         DIVL=DIV+L,
  346.        MUL=29<<4,
  347.            MULD=MUL+D,
  348.            MULF=MUL+F,
  349.            MULI=MUL+I,
  350.            MULU=MUL+U,
  351.         MULL=MUL+L,
  352.        EQ=30<<4,
  353.            EQD=EQ+D,
  354.            EQF=EQ+F,
  355.            EQI=EQ+I,
  356.         EQLO=EQ+L,
  357.        GE=31<<4,
  358.            GED=GE+D,
  359.            GEF=GE+F,
  360.            GEI=GE+I,
  361.            GEU=GE+U,
  362.         GEL=GE+L,
  363.        GT=32<<4,
  364.            GTD=GT+D,
  365.            GTF=GT+F,
  366.            GTI=GT+I,
  367.            GTU=GT+U,
  368.         GTL=GT+L,
  369.        LE=33<<4,
  370.            LED=LE+D,
  371.            LEF=LE+F,
  372.            LEI=LE+I,
  373.            LEU=LE+U,
  374.         LEL=LE+L,
  375.        LT=34<<4,
  376.            LTD=LT+D,
  377.            LTF=LT+F,
  378.            LTI=LT+I,
  379.            LTU=LT+U,
  380.         LTL=LT+L,
  381.        NE=35<<4,
  382.            NED=NE+D,
  383.            NEF=NE+F,
  384.            NEI=NE+I,
  385.         NEL=NE+L,
  386.        JUMP=36<<4,
  387.            JUMPV=JUMP+V,
  388.        LABEL=37<<4,
  389.            LABELV=LABEL+V,
  390.         CVL=38 << 4,
  391.         CVLD=CVL+D,
  392.         CVLI=CVL+I,
  393.         CVLU=CVL+U
  394. };
  395.  
  396. enum { CODE=1, BSS, DATA, LIT };
  397. enum { PERM=0, FUNC, STMT };
  398. struct list {
  399.     void *x;
  400.     List link;
  401. };
  402.  
  403. struct code {
  404.     enum codekind { Blockbeg, Blockend, Local, Address, Defpoint,
  405.            Label,    Start,    Gen,   Jump,    Switch,    Asm
  406.     } kind;
  407.     Code prev, next;
  408.     union {
  409. #ifdef BUILTIN_ASM
  410.         struct {                /* Asm: assembly language */
  411.             char *code;             /* assembly code */
  412.             Symbol *argv;           /* %name arguments */
  413.         } acode;
  414. #endif
  415.         struct {
  416.             int level;
  417.             Symbol *locals;
  418.             Table identifiers, types;
  419.             Env x;
  420.         } block;
  421.         Code begin;
  422.         Symbol var;
  423.  
  424.         struct {
  425.             Symbol sym;
  426.             Symbol base;
  427.             int offset;
  428.         } addr;
  429.         struct {
  430.             Coordinate src;
  431.             int point;
  432.         } point;
  433.         Node forest;
  434.         struct {
  435.             Symbol sym;
  436.             Symbol table;
  437.             Symbol deflab;
  438.             int size;
  439.             int *values;
  440.             Symbol *labels;
  441.         } swtch;
  442.  
  443.     } u;
  444. };
  445. struct symbol {
  446.     char *name;
  447.     int scope;
  448.     Coordinate src;
  449.     Symbol up;
  450.     List uses;
  451.     int sclass;
  452.     unsigned structarg:1;
  453.  
  454.     unsigned addressed:1;
  455.     unsigned computed:1;
  456.     unsigned temporary:1;
  457.     unsigned generated:1;
  458.     unsigned defined:1;
  459.     unsigned assigned:1;
  460.     unsigned islabel:1;
  461.     unsigned isconstant:1;
  462.     unsigned char Flags;
  463.     Type type;
  464.     float ref;
  465.     unsigned short references;
  466.     unsigned short firstuse;
  467.     unsigned short lastuse;
  468.     union {
  469.         struct {
  470.             int label;
  471.             Symbol equatedto;
  472.         } l;
  473.         struct {
  474.             unsigned cfields:1;
  475.             unsigned vfields:1;
  476.             Table ftab;        /* omit */
  477.             Field flist;
  478.         } s;
  479.         int value;
  480.         Symbol *idlist;
  481.         struct {
  482.             Value v;
  483.             Symbol loc;
  484.         } c;
  485.         struct {
  486.             Coordinate pt;
  487.             int label;
  488.             int ncalls;
  489.             Symbol *callee;
  490.         } f;
  491.         int seg;
  492.         struct {
  493.             Node cse;
  494.         } t;
  495.     } u;
  496.     Xsymbol x;
  497. #ifdef Ysymbol
  498.         Ysymbol y;
  499. #endif
  500.  
  501. };
  502. enum { CONSTANTS=1, LABELS, GLOBAL, PARAM, LOCAL };
  503. struct tree {
  504.     int op;
  505.     Type type;
  506.     Tree kids[2];
  507.     Node node;
  508.     struct {
  509.         Value v;
  510.         Symbol sym;
  511.  
  512.         Field field;
  513.     } u;
  514.     short Flags;
  515.     unsigned fieldaccess:1;
  516.     unsigned nestedCall:1;
  517.     int intrinsic;
  518.     int intrinsicArg;
  519. };
  520. enum {
  521.     AND=39<<4,
  522.     NOT=40<<4,
  523.     OR=41<<4,
  524.     COND=42<<4,
  525.     RIGHT=43<<4,
  526.     FIELD=44<<4
  527. };
  528. struct type {
  529.     int op;
  530.     Type type;
  531.     int align;
  532.     int size;
  533.     union {
  534.         Symbol sym;
  535.         struct {
  536.             unsigned oldstyle:1;
  537.             Type *proto;
  538.             char isStdCall;
  539.         } f;
  540.     } u;
  541.     Xtype x;
  542. #ifdef Ytype        /* omit */
  543.     Ytype y;    /* omit */
  544. #endif            /* omit */
  545. };
  546. struct field {
  547.     char *name;
  548.     Type type;
  549.     int offset;
  550.     short bitsize;
  551.     short lsb;
  552.     char Flags;
  553.     Field link;
  554. };
  555. #define CC_CDECL    0
  556. #define CC_PASCAL    1
  557. #define CC_STDCALL    2
  558. #define CC_OPTLINK    3
  559.  
  560. extern int nodecount;
  561. extern Symbol cfunc;
  562. extern Symbol retv;
  563. extern Tree (*optree[]) ARGS((int, Tree, Tree));
  564.  
  565. extern char *fname;
  566. extern char kind[];
  567. extern int errcnt;
  568. extern int errlimit;
  569. extern int wflag;
  570. extern Events events;
  571. extern float refinc;
  572.  
  573. extern unsigned char *cp;
  574. extern unsigned char *limit;
  575. extern int infd;
  576. extern char *firstfile;
  577. extern char *file;
  578. extern char *line;
  579. extern int lineno;
  580. extern int t;
  581. extern char *token;
  582. extern Symbol tsym;
  583. extern Coordinate src;
  584. extern char *bp;
  585. extern int Aflag;
  586. extern int Pflag;
  587. extern int Xflag;
  588. extern Symbol YYnull;
  589. extern Symbol YYcheck;
  590. extern int glevel;
  591. extern int xref;
  592.  
  593. extern int outfd;
  594. extern int errfd;
  595.  
  596. extern int ncalled;
  597. extern int npoints;
  598.  
  599. extern int needconst;
  600. extern struct code codehead;
  601. extern Code codelist;
  602. extern Table stmtlabs;
  603. extern float density;
  604. extern Table constants;
  605. extern Table externals;
  606. extern Table globals;
  607. extern Table identifiers;
  608. extern Table labels;
  609. extern Table types;
  610. extern int level;
  611.  
  612. extern List loci, symbols;
  613.  
  614. extern List symbols;
  615.  
  616. extern Type chartype;
  617. extern Type doubletype;
  618. extern Type floattype;
  619. extern Type inttype;
  620. extern Type longdouble;
  621. extern Type longtype;
  622. extern Type longlongtype;
  623. extern Type ulonglongtype;
  624. extern Type shorttype;
  625. extern Type signedchar;
  626. extern Type unsignedchar;
  627. extern Type unsignedlong;
  628. extern Type unsignedshort;
  629. extern Type unsignedtype;
  630. extern Type voidptype;
  631. extern Type voidtype;
  632. extern int DefaultAlignment;
  633. extern void  *allocate ARGS((unsigned long n, unsigned a));
  634. extern void deallocate ARGS((unsigned a));
  635. extern void *newarray
  636.     ARGS((unsigned long m, unsigned long n, unsigned a));
  637. extern void walk      ARGS((Tree e, int tlab, int flab));
  638. extern Node listnodes ARGS((Tree e, int tlab, int flab));
  639. extern Node newnode   ARGS((int op, Node left, Node right,
  640.                               Symbol p));
  641. extern Tree cvtconst ARGS((Tree));
  642. extern void printdag ARGS((Node, int));
  643. extern Code compound ARGS((int, Swtch, int));
  644. extern void defglobal ARGS((Symbol, int));
  645. extern void finalize ARGS((void));
  646. extern void program ARGS((void));
  647.  
  648. extern Tree addrof ARGS((Tree));
  649. extern Tree asgn ARGS((Symbol, Tree));
  650. extern Tree asgntree ARGS((int, Tree, Tree));
  651. extern Type assign ARGS((Type, Tree));
  652. extern Tree bittree ARGS((int, Tree, Tree));
  653. extern Tree call ARGS((Tree, Type, Coordinate));
  654. extern Tree calltree ARGS((Tree, Type, Tree, Symbol));
  655. extern Tree condtree ARGS((Tree, Tree, Tree));
  656. extern Tree consttree ARGS((unsigned int, Type));
  657. extern Tree eqtree ARGS((int, Tree, Tree));
  658. extern int iscallb ARGS((Tree));
  659. extern Tree shtree ARGS((int, Tree, Tree));
  660. extern void typeerror ARGS((int, Tree, Tree));
  661.  
  662. extern void test ARGS((int tok, char set[]));
  663. extern void expect ARGS((int tok));
  664. extern void skipto ARGS((int tok, char set[]));
  665. extern void error (char *, ...);
  666. extern int fatal ARGS((char *, char *, int));
  667. extern void warning (char *, ...);
  668.  
  669. typedef void (*Apply) ARGS((void *, void *, void *));
  670. extern void attach ARGS((Apply, void *, List *));
  671.  
  672. extern void apply ARGS((List, void *, void *));
  673.  
  674. extern Tree retype ARGS((Tree p, Type ty));
  675. extern Tree rightkid ARGS((Tree p));
  676. extern int hascall ARGS((Tree p));
  677. extern Type binary ARGS((Type, Type));
  678. extern Tree cast ARGS((Tree, Type));
  679. extern Tree cond ARGS((Tree));
  680. extern Tree expr0 ARGS((int));
  681. extern Tree expr ARGS((int));
  682. extern Tree expr1 ARGS((int));
  683. extern Tree field ARGS((Tree, char *));
  684. extern char *funcname ARGS((Tree));
  685. extern Tree idtree ARGS((Symbol));
  686. extern Tree incr ARGS((int, Tree, Tree));
  687. extern Tree lvalue ARGS((Tree));
  688. extern Tree nullcall ARGS((Type, Symbol, Tree, Tree));
  689. extern Tree pointer ARGS((Tree));
  690. extern Tree rvalue ARGS((Tree));
  691. extern Tree value ARGS((Tree));
  692.  
  693. extern void defpointer ARGS((Symbol));
  694. extern Type initializer ARGS((Type, int));
  695. extern Tree structexp ARGS((Type, Symbol));
  696. extern void swtoseg ARGS((int));
  697.  
  698. extern void inputInit ARGS((void));
  699. extern void inputstring ARGS((char *));
  700. extern void fillbuf ARGS((void));
  701. extern void nextline ARGS((void));
  702.  
  703. extern int getchr ARGS((void));
  704. extern int gettok ARGS((void));
  705.  
  706. extern void outs ARGS((char *));
  707.  
  708. extern void print (char *, ...);
  709.  
  710. extern void emitcode ARGS((void));
  711. extern void gencode  ARGS((Symbol[], Symbol[]));
  712. extern void fprint (int fd, char *fmt, ...);
  713. extern void outflush ARGS((void));
  714. extern char *stringf (char *, ...);
  715. extern List append ARGS((void *x, List list));
  716. extern int  length ARGS((List list));
  717. extern void *ltov  ARGS((List *list, unsigned a));
  718. extern Type typename ARGS((void));
  719. extern void checklab ARGS((Symbol p, void *cl));
  720. extern Type enumdcl ARGS((void));
  721. extern int main ARGS((int, char *[]));
  722. extern Symbol mkstr ARGS((char *));
  723. extern Symbol mksymbol ARGS((int, char *,Type));
  724.  
  725. extern void outflush ARGS((void));
  726. extern void outputInit ARGS((void));
  727. extern void vfprint ARGS((int, char *, va_list));
  728. extern void vprint ARGS((char *, va_list));
  729.  
  730. void profInit ARGS((char *));
  731.  
  732. extern int process ARGS((char *));
  733. extern int findfunc ARGS((char *, char *));
  734. extern int findcount ARGS((char *, int, int));
  735.  
  736. extern Tree constexpr ARGS((int));
  737. extern int intexpr ARGS((int, int));
  738. extern Tree simplify ARGS((int, Type, Tree, Tree));
  739. extern int ispow2 ARGS((unsigned u));
  740.  
  741. extern void addlocal ARGS((Symbol));
  742. extern Code code ARGS((int));
  743. extern void definelab ARGS((int));
  744. extern void definept ARGS((Coordinate *));
  745. extern void equatelab ARGS((Symbol, Symbol));
  746. extern Node jump ARGS((int));
  747. extern void retcode ARGS((Tree));
  748. extern void statement ARGS((int, Swtch, int));
  749.  
  750. extern char * string ARGS((char *str));
  751. extern char *stringn ARGS((char *str, int len));
  752. extern char *stringd ARGS((int n));
  753. extern void use ARGS((Symbol p, Coordinate src));
  754. extern void locus ARGS((Table tp, Coordinate *cp));
  755. extern Symbol constant ARGS((Type, Value));
  756. extern void enterscope ARGS((void));
  757. extern void exitscope ARGS((void));
  758. extern Symbol findlabel ARGS((int));
  759. extern Symbol findtype ARGS((Type));
  760. extern void foreach ARGS((Table, int, void (*)(Symbol, void *), void *));
  761. extern Symbol genident ARGS((int, Type, int));
  762. extern int genlabel ARGS((int));
  763. extern Symbol install ARGS((char *, Table *, int, int));
  764. extern Symbol intconst ARGS((int));
  765. extern Symbol lookup ARGS((char *, Table));
  766. extern Symbol mkstr ARGS((char *));
  767. extern Symbol mksymbol ARGS((int, char *, Type));
  768. extern Symbol newtemp ARGS((int, int));
  769. extern Table table ARGS((Table, int));
  770. extern Symbol temporary ARGS((int, Type, int));
  771. extern char *vtoa ARGS((Type, Value));
  772.  
  773. void traceInit ARGS((char *));
  774.  
  775. extern int nodeid ARGS((Tree));
  776. extern char *opname ARGS((int));
  777. extern int *printed ARGS((int));
  778. extern void printtree ARGS((Tree, int));
  779. extern Tree right ARGS((Tree, Tree));
  780. extern Tree root ARGS((Tree));
  781. extern Tree texpr ARGS((Tree (*)(int), int, int));
  782. extern Tree tree ARGS((int, Type, Tree, Tree));
  783.  
  784. extern int hasproto ARGS((Type));
  785. extern void outtype ARGS((Type));
  786. extern void printdecl  ARGS((Symbol p, Type ty));
  787. extern void printproto ARGS((Symbol p, Symbol args[]));
  788. extern char *typestring ARGS((Type ty, char *id));
  789. extern Field fieldref ARGS((char *name, Type ty));
  790. extern Type array ARGS((Type, int, int));
  791. extern Type atop ARGS((Type));
  792. extern Type btot ARGS((int));
  793. extern void checkfields ARGS((Type));
  794. extern Type compose ARGS((Type, Type));
  795. extern Type deref ARGS((Type));
  796. extern int eqtype ARGS((Type, Type, int));
  797. extern Field extends ARGS((Type, Type));
  798. extern Field fieldlist ARGS((Type));
  799. extern Type freturn ARGS((Type));
  800. extern Type ftype ARGS((Type, Type));
  801. extern Type func ARGS((Type, Type *, int));
  802. extern Field newfield ARGS((char *, Type, Type));
  803. extern Type newstruct ARGS((int, char *));
  804. extern void printtype ARGS((Type, int));
  805. extern Type promote ARGS((Type));
  806. extern Type ptr ARGS((Type));
  807. extern Type qual ARGS((int, Type));
  808. extern void rmtypes ARGS((int));
  809. extern int ttob ARGS((Type));
  810. extern void typeInit ARGS((void));
  811. extern int variadic ARGS((Type));
  812.  
  813. /* limits */
  814. #ifdef __STDC__
  815. #include <limits.h>
  816. #include <float.h>
  817. #else
  818. /*
  819.  * The magnitudes of the values below are greater than or equal to the minimum
  820.  * permitted by the standard (see Appendix D) and are typical for byte-addressed
  821.  * machines with 32-bit integers. These values are suitable for bootstrapping.
  822.  */
  823. #define CHAR_BIT        8
  824. #define MB_LEN_MAX      1
  825.  
  826. #define UCHAR_MAX       0xff
  827. #define USHRT_MAX       0xffff
  828. #define UINT_MAX        0xffffffff
  829. #define ULONG_MAX       0xffffffffL
  830.  
  831. #define CHAR_MAX        SCHAR_MAX
  832. #define SCHAR_MAX       0x7f
  833. #define SHRT_MAX        0x7fff
  834. #define INT_MAX         0x7fffffff
  835. #define LONG_MAX        0x7fffffffL
  836.  
  837. #define CHAR_MIN        SCHAR_MIN
  838. #define SCHAR_MIN       (-SCHAR_MAX-1)
  839. #define SHRT_MIN        (-SHRT_MAX-1)
  840. #define INT_MIN         (-INT_MAX-1)
  841. #define LONG_MIN        (-LONG_MAX-1)
  842.  
  843. #define FLT_MAX         1e37
  844. #define DBL_MAX         1e37
  845. #endif
  846.  
  847. extern void exit ARGS((int));
  848. extern void free ARGS((void *));
  849. extern void *malloc ARGS((unsigned));
  850. extern void *memset ARGS((void *, int, unsigned));
  851.  
  852. extern double strtod (char *, char **);
  853. extern void *memcpy (void *, void *, unsigned);
  854. extern long strtol (char *, char **, int);
  855. extern char *strchr (const char *, int);
  856. extern char *strrchr(char *,int);
  857. extern char *strcpy(char *,char *);
  858. extern char *strcat(char *,char *);
  859. extern int strcmp (const char *, const char *);
  860. extern int memcmp(void *,void *,int);
  861. extern unsigned strlen (char *);
  862. extern int strncmp ARGS((const char *, const char *, unsigned));
  863. extern char *strncpy ARGS((char *, const char *, unsigned));
  864. extern int AsmInit(char *fname);
  865. void AsmReadBuffer(char *buffer,int len);
  866. int IsWithinSpecialSection(void);
  867. int WriteCoffFile(void);
  868. int CppInit(void);
  869. int StartCpp(char *filename);
  870. int ReadFromCpp(unsigned char *buf,int siz);
  871. void ProcessPragmaPack(void);
  872. int SetForestFlags(int f);
  873. void DumpDefines(void);
  874. void ResetExceptions(void);
  875. void DumpDefinedFunctions(void);
  876. void ProcessSection(void);
  877. void ProcessOptimize(void);
  878.  
  879. extern int warningCount;
  880. extern int OptimizeFlag;
  881.  
  882. #pragma warning(disable:4100)
  883. #pragma warning(disable:4244)
  884. extern int FunctionHasCalls;
  885. int SendToOptimizer(void);
  886. void CheckStaticUses(void);
  887. #define PEEPHOLE
  888. extern FILE *xrefFile;
  889. extern void AddToFileTable(char *);
  890. extern int memused;
  891. typedef struct tagfnInfo {
  892.     unsigned hasCalls:1;
  893.     unsigned hasDiv:1;
  894.     unsigned hasBlockMove:1;
  895.     unsigned hasFloatingPoint:1;
  896.     unsigned leafFunction:1;
  897.     unsigned hasRegisterVars:1;
  898.     unsigned NestedCalls:1;
  899.     unsigned mmxCalls:1;
  900.     unsigned memmove:1;
  901.     unsigned hasgotos:1;
  902.     Code cp;
  903. } FunctionDescriptor;
  904.  
  905. extern FunctionDescriptor FunctionInfo;
  906. void SetRegistersMasks(void);
  907. int BuildBasicBlocks(void);
  908. int GetFileNumber(char *fname);
  909. void AnalyzeSecondPass(void);
  910. void SetupRegisterVariables(void);
  911. int GetType(Symbol p);
  912. int ChangeBlock(unsigned char *buffer,int len);
  913. void linearize(Node p,Node next);
  914. #define INDEXPTR 613
  915. #define BOOLEANVAL 613
  916. extern int GenerateAsm;
  917. int IsIntrinsic(char *name);
  918. void IntrinsicArg(Node kid,int n);
  919. void Intrinsic(Node p);
  920. void InstallIntrinsics(void);
  921. Symbol AssignIntrinsicArg(Node p);
  922. extern int IntermediateLanguageFile;
  923. extern FILE *ilFile;
  924. extern void ildumpcover(Node p,int nt,int in);
  925. extern int nrOfIntrinsicArgs(int idx);
  926. extern int mmx;
  927. extern int StatementCount;
  928. void ExtendDomain(int lev,int start);
  929. void IncrementReferences(Symbol sym);
  930. void Initreferences(Symbol sym);
  931.