Annotation of researchv10no/cmd/lcc/gen2/gen.h, revision 1.1.1.1

1.1       root        1: /* C compiler: back-end structures */
                      2: 
                      3: #define NODAG 0
                      4: #define RX             2               /* symbol holding target register */
                      5: #define MAXSYMS        4               /* symbols/node */
                      6: #define MAXINTS        5               /* codes/node */
                      7: #define MAXKIDS        6               /* children/node */
                      8: 
                      9: #ifdef DEBUG
                     10: #define dumptree(x,y) dumptree1(x,y,-1,0)
                     11: #else
                     12: #define dumptree(x,y)
                     13: #endif
                     14: 
                     15: typedef struct regnode *Regnode;
                     16: 
                     17: typedef struct {               /* back end's block record */
                     18:        int off;                        /* offset for locals */
                     19:        unsigned freemask[3];           /* free registers */
                     20: } Env;
                     21: 
                     22: typedef struct {
                     23:        char *exportfmt;
                     24:        unsigned twoop:1;
                     25:        unsigned char maxunalignedload;
                     26:        char *segnames[5];
                     27:        dclproto(void (*doarg),(Node));
                     28:        dclproto(void (*docall),(Node));
                     29:        dclproto(void (*blkfetch),(int, int, int, int));
                     30:        dclproto(void (*blkloop),(int, int, int, int, int, int[]));
                     31:        dclproto(void (*blkstore),(int, int, int, int));
                     32:        dclproto(void (*final),(Node));
                     33:        dclproto(void (*rewrite),(Node));
                     34:        dclproto(void (*emitspecial),(Node));
                     35: } Xinterface;
                     36: 
                     37: struct real {                  /* canonical real */
                     38:        unsigned sign;
                     39:        unsigned exp;                   /* unbiased exponent */
                     40:        unsigned msb;                   /* most significant fraction bits */
                     41:        unsigned lsb;                   /* least significant fraction bits */
                     42: };
                     43: 
                     44: struct regnode {               /* register */
                     45:        unsigned char regtype;          /* type extension for loads */
                     46:        unsigned char regset;           /* register set */
                     47:        unsigned char regnum;           /* register number */
                     48:        int count;                      /* number of uses left; zero if free; negative if register vbl */
                     49:        unsigned mask;                  /* underlying basic registers */
                     50:        Node node;                      /* node assigned to this register */
                     51:        Symbol link;                    /* next register in this class */
                     52:        Symbol next;                    /* next register in any class */
                     53: };
                     54: 
                     55: typedef struct {               /* back end's node fields */
                     56:        unsigned loadaddr:1;
                     57:        unsigned sideeffect:1;
                     58:        unsigned unavailable:1;
                     59:        unsigned zap0:1;
                     60:        unsigned linearized:1;
                     61:        unsigned linfrontier:1;
                     62:        unsigned lininterior:1;
                     63:        unsigned registered:1;
                     64:        unsigned listed:1;
                     65:        unsigned iscall:1;
                     66:        unsigned isarg:1;
                     67:        unsigned isvararg:1;
                     68:        unsigned frontier:1;
                     69:        unsigned char ints[MAXINTS];    /* target-specific function, type and addressing codes */
                     70:        char perm[MAXKIDS];
                     71:        unsigned char delay;
                     72:        Symbol rtarget;
                     73:        Node args;
                     74:        Node next;                      /* next node in output order */
                     75: } Xnode;
                     76: 
                     77: typedef struct {               /* back end's symbol fields */
                     78:        char *name;                     /* name for back end */
                     79:        int offset;                     /* offset for locals, formals */
                     80:        Symbol regvar;                  /* register allocated to this symbol, if any */
                     81:        Symbol nextregvar;              /* links function's register variables */
                     82:        Regnode regnode;                /* mkregs's register id, if any */
                     83:        unsigned int eaddr;     /* effective address of symbol */
                     84: } Xsymbol;
                     85: 
                     86: #define atst(p) ((p)->x.loadaddr)
                     87: #define isregvar(p) ((p)->sclass == REGISTER)
                     88: #define setreg(p,r) ((p)->syms[RX]=r)
                     89: #define symeaddr(s) ((s)->x.eaddr)
                     90: 
                     91: /* gen.c */
                     92: dclproto(extern void blockbeg,(Env *));
                     93: dclproto(extern void blockend,(Env *));
                     94: dclproto(extern void export,(Symbol));
                     95: dclproto(extern Node gen,(Node));
                     96: dclproto(extern void progend,(void));
                     97: 
                     98: dclproto(extern int aset,(Node, int));
                     99: dclproto(extern int bitcount,(unsigned));
                    100: dclproto(extern void blkcopy,(int, int, int, int, int, int[]));
                    101: dclproto(extern void blkunroll,(int, int, int, int, int, int, int[]));
                    102: dclproto(extern void docall,(Node));
                    103: dclproto(extern void dumpregs,(char *, char *, char *));
                    104: dclproto(extern void dumptree1,(Node, int, int, int));
                    105: dclproto(extern void freeregvars,(void));
                    106: dclproto(extern void genascii,(char*, char*, int, char*));
                    107: dclproto(extern int getint,(Symbol));
                    108: dclproto(extern Regnode getregnode,(Symbol));
                    109: dclproto(extern int getregset,(Symbol));
                    110: dclproto(extern int getregvar,(Symbol, Symbol));
                    111: dclproto(extern unsigned getunsigned,(Symbol));
                    112: dclproto(extern void initfunc,(int, int, int));
                    113: dclproto(extern int lop,(Node, int, int));
                    114: dclproto(extern int mkactual,(int, int, int));
                    115: dclproto(extern int mkauto,(Symbol, int));
                    116: dclproto(extern Symbol mkregs,(char *, int, int, int, int, int, int, Symbol));
                    117: dclproto(extern void mvregvars,(void));
                    118: dclproto(extern void parseflags,(int, char **));
                    119: dclproto(extern int range,(int, int));
                    120: dclproto(extern int regchain,(Node));
                    121: dclproto(extern unsigned regloc,(Symbol));
                    122: dclproto(extern int rmcopy,(Node));
                    123: dclproto(extern void rtarget,(Node, int, Symbol));
                    124: dclproto(extern void setseg,(int));
                    125: dclproto(extern void spacen,(int, char *));
                    126: dclproto(extern void spill,(unsigned, int, Node));
                    127: extern int argbuildsize;
                    128: extern int argoffset;
                    129: extern char **asmstr[MAXINTS];
                    130: extern unsigned eemask[];
                    131: extern unsigned freemask[];
                    132: extern Node last;
                    133: extern int maxoffset;
                    134: extern int ncalls;
                    135: extern int offset;
                    136: extern int bflag, dflag, kflag, pflag, rflag;
                    137: extern int nregsets;
                    138: extern char **opcodes;
                    139: extern Symbol regs;
                    140: extern Symbol regvars;
                    141: extern Symbol rmap[];
                    142: extern int savebase[];
                    143: extern unsigned savemask[];
                    144: extern unsigned tempmask[];
                    145: extern unsigned tmask[];
                    146: extern unsigned usedmask[];
                    147: extern unsigned vmask[];
                    148: extern int dalign, salign;
                    149: extern int genx;
                    150: /* decode.c */
                    151: dclproto(struct real decode,(int, double));
                    152: #ifdef DEBUG
                    153: #define debug(f,x) if(f)x
                    154: #else
                    155: #define debug(f,x)
                    156: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.