Annotation of researchv10no/cmd/lcc/c/c.h, revision 1.1.1.1

1.1       root        1: #ifndef C_H_INCLUDED
                      2: #define C_H_INCLUDED
                      3: /* C compiler: definitions */
                      4: 
                      5: /* default sizes */
                      6: #define MAXLINE   512          /* maximum input/output line length */
                      7: #define MAXTOKEN   32          /* maximum token length */
                      8: #define        BUFSIZE  4096           /* input buffer size */
                      9: #define HASHSIZE  128          /* default hash table size */
                     10: #define MEMINCR    10          /* blocks (1kb) allocated per arena */
                     11: 
                     12: #ifdef __LCC__
                     13: #ifndef __STDC__
                     14: #define __STDC__
                     15: #endif
                     16: #endif
                     17: 
                     18: #include "ops.h"
                     19: 
                     20: #ifdef __STDC__
                     21: #include <stdarg.h>
                     22: #define va_init va_start
                     23: 
                     24: typedef enum tokencode {
                     25: #define xx(a,b,c,d,e,f,g) a=b,
                     26: #define yy(a,b,c,d,e,f,g)
                     27: #include "token.h"
                     28:        NTOKENS
                     29: } Typeop;                      /* type operators are a subset of tokens */
                     30: 
                     31: #define dclproto(func,args) func args
                     32: typedef void *Generic;
                     33: #else
                     34: #include <varargs.h>
                     35: #define va_init(a,b) va_start(a)
                     36: 
                     37: #define xx(a,b,c,d,e,f,g)
                     38: #include "token.h"
                     39: typedef int Typeop;
                     40: 
                     41: #define dclproto(func,args) func()
                     42: typedef char *Generic;
                     43: #endif
                     44: 
                     45: typedef struct list {          /* lists: */
                     46:        Generic x;                      /* element */
                     47:        struct list *link;              /* next node */
                     48: } *List;
                     49: 
                     50: typedef struct coord { /* source coordinates: */
                     51:        char *file;             /* file name */
                     52:        unsigned short x, y;    /* x,y position in file */
                     53: } Coordinate;
                     54: typedef union value {  /* constant values: */
                     55:        char sc;                /* signed */
                     56:        short ss;               /* signed */
                     57:        int i;                  /* signed */
                     58:        unsigned char uc;
                     59:        unsigned short us;
                     60:        unsigned int u;
                     61:        float f;
                     62:        double d;
                     63:        char *p;                /* pointer to anything */
                     64: } Value;
                     65: 
                     66: typedef struct symbol *Symbol; /* symbol table entries */
                     67: typedef struct table *Table;   /* symbol tables */
                     68: typedef struct tynode *Type;   /* type nodes */
                     69: typedef struct node *Node;     /* dag nodes */
                     70: typedef struct tree *Tree;     /* tree nodes */
                     71: typedef struct field *Field;   /* struct/union fields */
                     72: typedef struct swtch *Swtch;   /* switch data */
                     73: 
                     74: typedef struct metrics {
                     75:        unsigned char size, align, inline;
                     76: } Metrics;
                     77: 
                     78: #include "config.h"
                     79: typedef struct interface {
                     80:        char *target;
                     81:        Metrics charmetric;
                     82:        Metrics shortmetric;
                     83:        Metrics intmetric;
                     84:        Metrics floatmetric;
                     85:        Metrics doublemetric;
                     86:        Metrics ptrmetric;
                     87:        Metrics structmetric;
                     88:        unsigned left_to_right:1;
                     89:        unsigned little_endian:1;
                     90:        unsigned jump_on_return:1;
                     91:        unsigned mulops_are_calls:1;
                     92:        unsigned compl_band:1;
                     93:        unsigned no_argb:1;
                     94:        unsigned no_dag:1;
                     95:        dclproto(void (*address),(Symbol, Symbol, int));
                     96:        dclproto(void (*blockbeg),(Env *));
                     97:        dclproto(void (*blockend),(Env *));
                     98:        dclproto(void (*defaddress),(Symbol));
                     99:        dclproto(void (*defconst),(int, Value));
                    100:        dclproto(void (*defstring),(int, char *));
                    101:        dclproto(void (*defsymbol),(Symbol));
                    102:        dclproto(void (*emit),(Node));
                    103:        dclproto(void (*export),(Symbol));
                    104:        dclproto(void (*function),(Symbol, Symbol [], Symbol [], int));
                    105:        dclproto(Node (*gen),(Node));
                    106:        dclproto(void (*global),(Symbol));
                    107:        dclproto(void (*import),(Symbol));
                    108:        dclproto(void (*local),(Symbol));
                    109:        dclproto(void (*progbeg),(int, char **));
                    110:        dclproto(void (*progend),(void));
                    111:        dclproto(void (*segment),(int));
                    112:        dclproto(void (*space),(int));
                    113: 
                    114:        dclproto(void (*stabblock),(int, int, Symbol*));
                    115:        dclproto(void (*stabend),(Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *));
                    116:        dclproto(void (*stabfend),(Symbol, int));
                    117:        dclproto(void (*stabinit),(char *, int, char *[]));
                    118:        dclproto(void (*stabline),(Coordinate *));
                    119:        dclproto(void (*stabsym),(Symbol));
                    120:        dclproto(void (*stabtype),(Symbol));
                    121:        Xinterface x;
                    122: }  Interface;
                    123: extern Interface *interfaces[], *IR;
                    124: 
                    125: #ifndef MAXKIDS
                    126: #define MAXKIDS 2
                    127: #endif
                    128: #ifndef MAXSYMS
                    129: #define MAXSYMS 3
                    130: #endif
                    131: 
                    132: struct node {          /* dag nodes: */
                    133:        Opcode op;              /* operator */
                    134:        short count;            /* reference count */
                    135:        Symbol syms[MAXSYMS];   /* symbols */
                    136:        Node kids[MAXKIDS];     /* operands */
                    137:        Node link;              /* next dag in the forest */
                    138:        Xnode x;                /* back-end's type extension */
                    139: };
                    140: struct tree {          /* tree nodes: */
                    141:        Opcode op;              /* operator */
                    142:        Type type;              /* type of result */
                    143:        Tree kids[2];           /* operands */
                    144:        Node node;              /* associated dag node */
                    145:        union {
                    146:                Symbol sym;     /* associated symbol */
                    147:                Value v;        /* associated value */
                    148:                Field field;    /* associated struct/union bit field */
                    149:        } u;
                    150: };
                    151: typedef struct code *Code;
                    152: struct code {          /* code list entries: */
                    153: #ifdef __STDC__
                    154:        enum {
                    155:                Blockbeg, Blockend, Local, Address, Defpoint,
                    156:                Label, Start, Asm, Gen, Jump, Switch } kind;
                    157: #else
                    158:        int kind;
                    159: #define Blockbeg       0
                    160: #define Blockend       1
                    161: #define Local          2
                    162: #define Address                3
                    163: #define Defpoint       4
                    164: #define Label          5
                    165: #define Start          6
                    166: #define Asm            7
                    167: #define Gen            8
                    168: #define Jump           9
                    169: #define Switch         10
                    170: #endif
                    171:        Code prev;                      /* previous code node */
                    172:        Code next;                      /* next code node */
                    173:        union {
                    174:                struct {                /* Asm: assembly language */
                    175:                        char *code;             /* assembly code */
                    176:                        Symbol *argv;           /* %name arguments */
                    177:                } acode;
                    178:                struct {                /* Blockbeg: */
                    179:                        Code prev;              /* previous Blockbeg */
                    180:                        short bnumber;          /* block number */
                    181:                        short level;            /* block level */
                    182:                        Symbol *locals;         /* locals */
                    183:                        Table identifiers, types;/* symbol tables; used for -g */
                    184:                        Env x;                  /* value filled in by blockbeg() */
                    185:                } block;
                    186:                Symbol var;             /* Local: local variable */
                    187:                struct {                /* Address: */
                    188:                        Symbol sym;             /* created symbol */
                    189:                        Symbol base;            /* local or parameter */
                    190:                        int offset;             /* offset from sym */
                    191:                } addr;
                    192:                struct {                /* Defpoint: execution point */
                    193:                        Coordinate src;         /* source location */
                    194:                        int point;              /* execution point number */
                    195:                } point;
                    196:                Node node;              /* Label, Gen, Jump: a dag node */
                    197:                struct swselect {       /* Switch: swselect data */
                    198:                        Symbol sym;             /* temporary holding value */
                    199:                        Symbol table;           /* branch table */
                    200:                        Symbol deflab;          /* default label */
                    201:                        int size;               /* size of value & label arrays */
                    202:                        int *values;            /* value, label pairs */
                    203:                        Symbol *labels;
                    204:                } swtch;
                    205:        } u;
                    206: };
                    207: typedef struct arena *Arena;
                    208: struct arena {                 /* storage allocation arena: */
                    209:        int m;                          /* size of current allocation request */
                    210:        char *avail;                    /* next available location */
                    211:        char *limit;                    /* address 1 past end of arena */
                    212:        Arena first;                    /* pointer to first arena */
                    213:        Arena next;                     /* link to next arena */
                    214: };
                    215: struct symbol {                /* symbol structures: */
                    216:        Xsymbol x;              /* back-end's type extension */
                    217:        char *name;             /* name */
                    218:        unsigned short scope;   /* scope level */
                    219:        unsigned char sclass;   /* storage class */
                    220:        unsigned defined:1;     /* 1 if defined */
                    221:        unsigned temporary:1;   /* 1 if a temporary */
                    222:        unsigned generated:1;   /* 1 if a generated identifier */
                    223:        unsigned computed:1;    /* 1 if an address computation identifier */
                    224:        unsigned addressed:1;   /* 1 if its address is taken */
                    225:        unsigned structarg:1;   /* 1 if parameter is a struct */
                    226:        float ref;              /* # of references */
                    227:        Type type;              /* data type */
                    228:        Coordinate src;         /* definition coordinate */
                    229:        Coordinate **uses;      /* array of Coordinate *'s for uses (omit) */
                    230:        Symbol up;              /* next symbol in this or outer scope */
                    231:        union {
                    232:                struct {                /* labels: */
                    233:                        int label;              /* label number */
                    234:                        Symbol equatedto;       /* equivalent label */
                    235:                } l;
                    236:                struct {        /* struct/union types: */
                    237:                        unsigned cfields:1;     /* 1 if >= 1 const fields */
                    238:                        unsigned vfields:1;     /* 1 if >= 1 volatile fields */
                    239:                        Table ftab;             /* if xref != 0, table of field names */
                    240:                        Field flist;            /* field list */
                    241:                } s;
                    242:                int value;      /* enumeration identifiers: value */
                    243:                Symbol *idlist; /* enumeration types: identifiers */
                    244:                struct {        /* constants: */
                    245:                        Value v;        /* value */
                    246:                        Symbol loc;     /* out-of-line location */
                    247:                } c;
                    248:                struct {        /* functions: */
                    249:                        Coordinate pt[3];/* source code coordinates */
                    250:                        int label;      /* exit label */
                    251:                        int ncalls;     /* # calls in this function */
                    252:                        Symbol *callee; /* parameter symbols */
                    253:                } f;
                    254:                int seg;        /* globals, statics: definition segment */
                    255:        } u;
                    256: #ifdef Ysymbol
                    257:                Ysymbol y;
                    258: #endif
                    259: };
                    260: #ifdef __STDC__
                    261: enum { CONSTANTS=1, LABELS, GLOBAL, PARAM, LOCAL };
                    262: #else
                    263: #define CONSTANTS 1
                    264: #define LABELS 2
                    265: #define GLOBAL 3
                    266: #define PARAM  4
                    267: #define LOCAL  5
                    268: #endif
                    269: typedef struct {
                    270:        unsigned printed:1;
                    271:        unsigned marked:1;
                    272:        unsigned short typeno;
                    273: } Xtype;
                    274: 
                    275: struct tynode {                /* type nodes: */
                    276:        Typeop op;              /* operator */
                    277:        short align;            /* alignment in storage units */
                    278:        int size;               /* size in storage units */
                    279:        Type type;              /* operand */
                    280:        union {
                    281:                Symbol sym;             /* associated symbol */
                    282:                struct {                /* function types */
                    283:                        unsigned oldstyle:1;    /* 1 if an old-style function type */
                    284:                        Type *proto;            /* prototype */
                    285:                } f;
                    286:        } u;
                    287:        Xtype x;                /* symbol table information */
                    288: #ifdef Ytype
                    289:        Ytype y;
                    290: #endif
                    291: };
                    292: struct field {         /* struct/union fields: */
                    293:        char *name;             /* field name */
                    294:        Type type;              /* data type */
                    295:        int offset;             /* field offset */
                    296:        short bitsize;          /* field size in bits */
                    297:        short lsb;              /* lsb bit of the field; rightmost bit is bit 1 */
                    298:        Field link;             /* next field in this type */
                    299: };
                    300: 
                    301: /* limits */
                    302: #ifdef __LCC__
                    303: #include <limits.h>
                    304: #include <float.h>
                    305: #else
                    306: /*
                    307:  * The magnitudes of the values below are greater than or equal to the minimum
                    308:  * permitted by the standard (see Appendix D) and are typical for byte-addressed
                    309:  * machines with 32-bit integers. These values are suitable for bootstrapping.
                    310:  */
                    311: #define CHAR_BIT       8
                    312: #define MB_LEN_MAX     1
                    313: 
                    314: #define UCHAR_MAX      0xff
                    315: #define USHRT_MAX      0xffff
                    316: #define UINT_MAX       0xffffffff
                    317: #define ULONG_MAX      0xffffffffL
                    318: 
                    319: #define CHAR_MAX       SCHAR_MAX
                    320: #define SCHAR_MAX      0x7f
                    321: #define SHRT_MAX       0x7fff
                    322: #define INT_MAX                0x7fffffff
                    323: #define LONG_MAX       0x7fffffffL
                    324: 
                    325: #define CHAR_MIN       SCHAR_MIN
                    326: #define SCHAR_MIN      (-SCHAR_MAX-1)
                    327: #define SHRT_MIN       (-SHRT_MAX-1)
                    328: #define INT_MIN                (-INT_MAX-1)
                    329: #define LONG_MIN       (-LONG_MAX-1)
                    330: 
                    331: #define FLT_MAX                1e37
                    332: #define DBL_MAX                1e37
                    333: #endif
                    334: 
                    335: #ifdef __STDC__
                    336: enum { CODE=1, BSS, DATA, LIT, SYM };  /* logical segments */
                    337: #else
                    338: #define CODE   1
                    339: #define BSS    2
                    340: #define DATA   3
                    341: #define LIT    4
                    342: #define SYM    5
                    343: #define CONSTANTS 1
                    344: #define LABELS 2
                    345: #define GLOBAL 3
                    346: #define PARAM  4
                    347: #define LOCAL  5
                    348: #endif
                    349: 
                    350: /* misc. macros */
                    351: #define roundup(x,n) (((x)+((n)-1))&(~((n)-1)))
                    352: #define utod(x)        (2.*(int)((unsigned)(x)>>1)+(int)((x)&1))
                    353: #ifdef NDEBUG
                    354: #define assert(c)
                    355: #else
                    356: #define assert(c) ((c) || fatal(__FILE__,"assertion failure at line %d\n",\
                    357:        __LINE__))
                    358: #endif
                    359: 
                    360: /* C library */
                    361: #ifndef strtod
                    362: dclproto(extern double strtod,(char *, char **));
                    363: #endif
                    364: dclproto(extern int atoi,(char *));
                    365: dclproto(extern int close,(int));
                    366: dclproto(extern int creat,(char *, int));
                    367: dclproto(extern void exit,(int));
                    368: dclproto(extern Generic malloc,(unsigned));
                    369: dclproto(extern int open,(char *, int));
                    370: dclproto(extern int read,(int, char *, int));
                    371: dclproto(extern long strtol,(char *, char **, int));
                    372: dclproto(extern int sprintf,(char *, const char *, ...));
                    373: dclproto(extern char *strchr,(const char *, int));
                    374: dclproto(extern int strcmp,(const char *, const char *));
                    375: dclproto(extern unsigned strlen,(const char *));
                    376: dclproto(extern char *strncmp,(const char *, const char *, unsigned));
                    377: dclproto(extern char *strncpy,(char *, const char *, unsigned));
                    378: dclproto(extern int write,(int, char *, int));
                    379: 
                    380: extern int bnumber;
                    381: extern Table constants;
                    382: extern Table externals;
                    383: extern Table globals;
                    384: extern Table identifiers;
                    385: extern Table labels[2];
                    386: /*G*/extern Table types;
                    387: extern int level;
                    388: extern List symbols;
                    389: #define islabel(p) ((p) && (p)->op == LABEL+V && (p)->syms[0])
                    390: #define yyalloc(n,ap) (ap->m = roundup(n,sizeof(double)), \
                    391:        ap->avail + ap->m >= ap->limit ? allocate(ap->m, &ap) : \
                    392:        (ap->avail += ap->m, ap->avail - ap->m))
                    393: #define alloc(n)  yyalloc(n, permanent)
                    394: #define talloc(n) yyalloc(n, transient)
                    395: #define BZERO(p,t) \
                    396:        { unsigned *q1 = (unsigned *)(p), *q2 = q1 + ((sizeof (t)/sizeof (unsigned))&~(8-1)); \
                    397:        for ( ; q1 < q2; q1 += 8) \
                    398:                q1[0] = q1[1] = q1[2] = q1[3] = q1[4] = q1[5] = q1[6] = q1[7] = 0; \
                    399:        sizeof (t)/sizeof (unsigned)%8 >= 1 ? q1[0] = 0 : 0; \
                    400:        sizeof (t)/sizeof (unsigned)%8 >= 2 ? q1[1] = 0 : 0; \
                    401:        sizeof (t)/sizeof (unsigned)%8 >= 3 ? q1[2] = 0 : 0; \
                    402:        sizeof (t)/sizeof (unsigned)%8 >= 4 ? q1[3] = 0 : 0; \
                    403:        sizeof (t)/sizeof (unsigned)%8 >= 5 ? q1[4] = 0 : 0; \
                    404:        sizeof (t)/sizeof (unsigned)%8 >= 6 ? q1[5] = 0 : 0; \
                    405:        sizeof (t)/sizeof (unsigned)%8 >= 7 ? q1[6] = 0 : 0; \
                    406:        sizeof (t)%sizeof (unsigned) >= 1 ? ((char *)(q1 + sizeof (t)/sizeof (unsigned)%8))[0] = 0 : 0; \
                    407:        sizeof (t)%sizeof (unsigned) >= 2 ? ((char *)(q1 + sizeof (t)/sizeof (unsigned)%8))[1] = 0 : 0; \
                    408:        sizeof (t)%sizeof (unsigned) >= 3 ? ((char *)(q1 + sizeof (t)/sizeof (unsigned)%8))[2] = 0 : 0; \
                    409:        }
                    410: #define fieldsize(p) (p)->bitsize
                    411: #define fieldright(p) ((p)->lsb - 1)
                    412: #define fieldmask(p) (~(~(unsigned)0<<fieldsize(p)))
                    413: #define fieldleft(p) (8*(p)->type->size - fieldsize(p) - fieldright(p))
                    414: /*
                    415:  * type-checking macros.
                    416:  * the operator codes are defined in token.h
                    417:  * to permit the range tests below; don't change them.
                    418:  */
                    419: #define isqual(t)      ((t)->op >= CONST)
                    420: #define isvolatile(t)  ((t)->op == VOLATILE || (t)->op == CONST+VOLATILE)
                    421: #define isconst(t)     ((t)->op == CONST    || (t)->op == CONST+VOLATILE)
                    422: #define unqual(t)      (isqual(t) ? (t)->type : t)
                    423: #define        isarray(t)      (unqual(t)->op == ARRAY)
                    424: #define        isstruct(t)     (unqual(t)->op == STRUCT || unqual(t)->op == UNION)
                    425: #define isunion(t)     (unqual(t)->op == UNION)
                    426: #define        isfunc(t)       (unqual(t)->op == FUNCTION)
                    427: #define        isptr(t)        (unqual(t)->op == POINTER)
                    428: #define ischar(t)      (unqual(t)->op == CHAR)
                    429: #define isint(t)       (unqual(t)->op >= CHAR && unqual(t)->op <= UNSIGNED)
                    430: #define isfloat(t)     (unqual(t)->op <= DOUBLE)
                    431: #define isarith(t)     (unqual(t)->op <= UNSIGNED)
                    432: #define isunsigned(t)  (unqual(t)->op == UNSIGNED)
                    433: #define isdouble(t)    (unqual(t)->op == DOUBLE)
                    434: #define isscalar(t)    (unqual(t)->op <= POINTER || unqual(t)->op == ENUM)
                    435: #define isenum(t)      (unqual(t)->op == ENUM)
                    436: #define widen(t)       (isint(t) || isenum(t) ? INT : ttob(t))
                    437: dclproto(extern List append,(Generic, List));
                    438: dclproto(extern int length,(List));
                    439: dclproto(extern Generic *ltoa,(List, Generic []));
                    440: /*G*/dclproto(extern char *string,(char *));
                    441: /*G*/dclproto(extern char *stringd,(int));
                    442: dclproto(extern char *stringn,(char *, int));
                    443: 
                    444: dclproto(extern Symbol constant,(Type, Value));
                    445: dclproto(extern void enterscope,(void));
                    446: dclproto(extern void exitscope,(void));
                    447: dclproto(extern void fielduses,(Symbol, Generic));
                    448: dclproto(extern Symbol findlabel,(int));
                    449: dclproto(extern Symbol findtype,(Type));
                    450: /*G*/dclproto(extern void foreach,(Table, int, void (*)(Symbol, Generic), Generic));
                    451: dclproto(extern Symbol genident,(int, Type, int));
                    452: /*G*/dclproto(extern int genlabel,(int));
                    453: dclproto(extern Symbol install,(char *, Table *, int));
                    454: dclproto(extern Symbol intconst,(int));
                    455: dclproto(extern void locus,(Table, Coordinate *));
                    456: dclproto(extern Symbol lookup,(char *, Table));
                    457: /*G*/dclproto(extern Symbol newtemp,(int, int));
                    458: dclproto(extern void rmtemps,(int, int));
                    459: dclproto(extern void release,(Symbol));
                    460: dclproto(extern void setuses,(Table));
                    461: dclproto(extern Table table,(Table, int));
                    462: dclproto(extern Symbol temporary,(int, Type));
                    463: dclproto(extern void use,(Symbol, Coordinate));
                    464: 
                    465: dclproto(extern void addlocal,(Symbol));
                    466: dclproto(extern Type btot,(int));
                    467: dclproto(extern Code code,(int));
                    468: /*G*/dclproto(extern void emitcode,(void));
                    469: /*G*/dclproto(extern void gencode,(Symbol [], Symbol []));
                    470: dclproto(extern Node listnodes,(Tree, int, int));
                    471: dclproto(extern Node jump,(int));
                    472: /*G*/dclproto(extern Node newnode,(int, Node, Node, Symbol));
                    473: dclproto(extern Node node,(int, Node, Node, Symbol));
                    474: dclproto(extern void printdag,(Node, int));
                    475: dclproto(extern void walk,(Tree, int, int));
                    476: extern struct code codehead;
                    477: extern Code codelist;
                    478: extern int nodecount;
                    479: dclproto(extern void compound,(int, Swtch, int));
                    480: dclproto(extern void finalize,(void));
                    481: dclproto(extern void program,(void));
                    482: dclproto(extern Type typename,(void));
                    483: extern Symbol cfunc;
                    484: extern char *fname;
                    485: extern Symbol retv;
                    486: dclproto(extern int genconst,(Tree, int));
                    487: dclproto(extern int hascall,(Tree));
                    488: dclproto(extern int nodeid,(Tree));
                    489: dclproto(extern char *opname,(int));
                    490: dclproto(extern int *printed,(int));
                    491: dclproto(extern void printtree,(Tree, int));
                    492: dclproto(extern Tree retype,(Tree, Type));
                    493: dclproto(extern Tree root,(Tree));
                    494: dclproto(extern Tree texpr,(Tree (*)(int), int));
                    495: dclproto(extern void tfree,(void));
                    496: dclproto(extern Tree tree,(int, Type, Tree, Tree));
                    497: extern int ntree;
                    498: dclproto(extern Tree addrof,(Tree));
                    499: dclproto(extern Tree asgn,(Symbol, Tree));
                    500: dclproto(extern Type assign,(Type, Tree));
                    501: dclproto(extern Tree cast,(Tree, Type));
                    502: dclproto(extern Tree cond,(Tree));
                    503: dclproto(extern Tree conditional,(int));
                    504: dclproto(extern Tree constexpr,(int));
                    505: dclproto(extern Tree expr0,(int));
                    506: dclproto(extern Tree expr,(int));
                    507: dclproto(extern Tree expr1,(int));
                    508: dclproto(extern Tree field,(Tree, char *));
                    509: dclproto(extern char *funcname,(Tree));
                    510: dclproto(extern Tree idnode,(Symbol));
                    511: dclproto(extern Tree incr,(int, Tree, Tree));
                    512: dclproto(extern int intexpr,(int, int));
                    513: dclproto(extern Tree lvalue,(Tree));
                    514: dclproto(extern Tree pointer,(Tree));
                    515: dclproto(extern Type promote,(Type));
                    516: dclproto(extern Tree right,(Tree, Tree));
                    517: dclproto(extern Tree rvalue,(Tree));
                    518: dclproto(extern Tree cvtconst,(Tree));
                    519: dclproto(extern void defglobal,(Symbol, int));
                    520: dclproto(extern void defpointer,(Symbol));
                    521: dclproto(extern void doconst,(Symbol, Generic));
                    522: dclproto(extern int genconst,(Tree, int));
                    523: dclproto(extern void initglobal,(Symbol, int));
                    524: dclproto(extern Type initializer,(Type, int));
                    525: dclproto(extern Tree structexp,(Type, Symbol));
                    526: dclproto(extern void swtoseg,(int));
                    527: dclproto(extern void inputInit,(int));
                    528: dclproto(extern void inputstring,(char *));
                    529: dclproto(extern void fillbuf,(void));
                    530: dclproto(extern void nextline,(void));
                    531: extern unsigned char *cp;
                    532: extern char *file;
                    533: extern char *firstfile;
                    534: extern unsigned char *limit;
                    535: extern char *line;
                    536: extern int lineno;
                    537: dclproto(extern int getchr,(void));
                    538: dclproto(extern int gettok,(void));
                    539: extern char kind[];
                    540: extern Coordinate src;
                    541: #ifdef __STDC__
                    542: extern enum tokencode t;
                    543: #else
                    544: extern int t;
                    545: #endif
                    546: extern char *token;
                    547: extern Symbol tsym;
                    548: dclproto(extern int main,(int, char **));
                    549: dclproto(extern Symbol mkstr,(char *));
                    550: dclproto(extern Symbol mksymbol,(int, char *,Type));
                    551: extern int Aflag;
                    552: extern int Pflag;
                    553: extern Symbol YYnull;
                    554: /*G*/extern int glevel;
                    555: extern int xref;
                    556: dclproto(void bbinit,(char *));
                    557: extern int ncalled;
                    558: extern int npoints;
                    559: dclproto(void traceinit,(char *));
                    560: typedef struct {
                    561:        List entry;
                    562:        List exit;
                    563:        List returns;
                    564:        List points;
                    565:        List calls;
                    566:        List end;
                    567: } Events;
                    568: extern Events events;
                    569: dclproto(typedef void (*Apply),(Generic, Generic, Generic));
                    570: dclproto(extern void attach,(Apply, Generic, List *));
                    571: dclproto(extern void apply,(List, Generic, Generic));
                    572: /*G*/dclproto(extern void fprint,(int, char *, ...));
                    573: /*G*/dclproto(extern void print,(char *, ...));
                    574: /*G*/dclproto(extern char *stringf,(char *, ...));
                    575: /*G*/dclproto(extern void outflush,(void));
                    576: dclproto(extern void outputInit,(int));
                    577: /*G*/dclproto(extern void outs,(char *));
                    578: dclproto(extern void vfprint,(int, char *, va_list));
                    579: dclproto(extern void vprint,(char *, va_list));
                    580: /*G*/extern char *bp;
                    581: dclproto(extern void error,(char *, ...));
                    582: /*G*/dclproto(extern int fatal,(char *, char *, int));
                    583: dclproto(extern void warning,(char *, ...));
                    584: dclproto(extern int expect,(int));
                    585: dclproto(extern void skipto,(int, char *));
                    586: dclproto(extern void test,(int, char *));
                    587: extern int errcnt;
                    588: extern int errlimit;
                    589: extern int wflag;
                    590: dclproto(extern int process,(char *));
                    591: dclproto(extern int findfunc,(char *, char *));
                    592: dclproto(extern int findcount,(char *, int, int));
                    593: dclproto(extern Tree asgnnode,(int, Tree, Tree));
                    594: dclproto(extern Tree bitnode,(int, Tree, Tree));
                    595: dclproto(extern Tree callnode,(Tree, Type, Tree));
                    596: dclproto(extern Tree condnode,(Tree, Tree, Tree));
                    597: dclproto(extern Tree constnode,(unsigned int, Type));
                    598: dclproto(extern Tree eqnode,(int, Tree, Tree));
                    599: dclproto(extern Tree shnode,(int, Tree, Tree));
                    600: dclproto(extern void typeerror,(int, Tree, Tree));
                    601: dclproto(extern Tree (*opnode[]),(int, Tree, Tree));
                    602: dclproto(extern Tree simplify,(int, Type, Tree, Tree));
                    603: dclproto(extern int ispow2,(unsigned u));
                    604: dclproto(extern char *vtoa,(Type, Value));
                    605: extern int needconst;
                    606: dclproto(extern void definelab,(int));
                    607: dclproto(extern Code definept,(Coordinate *));
                    608: dclproto(extern void equatelab,(Symbol, Symbol));
                    609: dclproto(extern void flushequ,(void));
                    610: dclproto(extern void retcode,(Tree, int));
                    611: dclproto(extern void statement,(int, Swtch, int));
                    612: extern float density;
                    613: extern float refinc;
                    614: /*G*/dclproto(extern char *allocate,(int, Arena *));
                    615: dclproto(extern void deallocate,(Arena *));
                    616: /*G*/extern Arena permanent;
                    617: /*G*/extern Arena transient;
                    618: dclproto(extern void typeInit,(void));
                    619: dclproto(extern Type array,(Type, int, int));
                    620: dclproto(extern Type atop,(Type));
                    621: dclproto(extern void checkfields,(Type));
                    622: dclproto(extern Type composite,(Type, Type));
                    623: dclproto(extern Symbol deftype,(char *, Type, Coordinate *));
                    624: dclproto(extern Type deref,(Type));
                    625: dclproto(extern int eqtype,(Type, Type, int));
                    626: dclproto(extern Field extends,(Type, Type));
                    627: /*G*/dclproto(extern Field fieldlist,(Type));
                    628: dclproto(extern Field fieldref,(char *, Type));
                    629: /*G*/dclproto(extern Type freturn,(Type));
                    630: dclproto(extern Type func,(Type, Type *, int));
                    631: dclproto(extern int hasproto,(Type));
                    632: dclproto(extern Field newfield,(char *, Type, Type));
                    633: dclproto(extern Type newstruct,(int, char *));
                    634: dclproto(extern void outtype,(Type));
                    635: dclproto(extern void printdecl,(Symbol, Type));
                    636: dclproto(extern void printproto,(Symbol, Symbol *));
                    637: dclproto(extern void printtype,(Type, int));
                    638: dclproto(extern Type ptr,(Type));
                    639: dclproto(extern Type qual,(int, Type));
                    640: dclproto(extern void rmtypes,(void));
                    641: /*G*/dclproto(extern int ttob,(Type));
                    642: dclproto(extern char *typestring,(Type, char *));
                    643: /*G*/dclproto(extern int variadic,(Type));
                    644: /*G*/extern Type chartype;
                    645: extern Type doubletype;
                    646: extern Type floattype;
                    647: /*G*/extern Type inttype;
                    648: extern Type longdouble;
                    649: extern Type longtype;
                    650: extern Type shorttype;
                    651: extern Type signedchar;
                    652: /*G*/extern Type unsignedchar;
                    653: extern Type unsignedlong;
                    654: /*G*/extern Type unsignedshort;
                    655: extern Type unsignedtype;
                    656: extern Type voidptype;
                    657: extern Type voidtype;
                    658: #endif

unix.superglobalmegacorp.com

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