Annotation of researchv10no/cmd/lcc/gen2/gen.h, revision 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.