8
#define NEW(p,a) ((p) = allocate(sizeof *(p), (a)))
9
#define NEW0(p,a) memset(NEW((p),(a)), 0, sizeof *(p))
10
#define isaddrop(op) (specific(op)==ADDRG+P || specific(op)==ADDRL+P \
11
|| specific(op)==ADDRF+P)
16
#define istypename(t,tsym) (kind[t] == CHAR \
17
|| (t == ID && tsym && tsym->sclass == TYPEDEF))
18
#define sizeop(n) ((n)<<10)
19
#define generic(op) ((op)&0x3F0)
20
#define specific(op) ((op)&0x3FF)
21
#define opindex(op) (((op)>>4)&0x3F)
22
#define opkind(op) ((op)&~0x3F0)
23
#define opsize(op) ((op)>>10)
24
#define optype(op) ((op)&0xF)
30
#define NELEMS(a) ((int)(sizeof (a)/sizeof ((a)[0])))
32
#define roundup(x,n) (((x)+((n)-1))&(~((n)-1)))
33
#define mkop(op,ty) (specific((op) + ttob(ty)))
35
#define extend(x,ty) ((x)&(1<<(8*(ty)->size-1)) ? (x)|((~0UL)<<(8*(ty)->size-1)) : (x)&ones(8*(ty)->size))
36
#define ones(n) ((n)>=8*sizeof (unsigned long) ? ~0UL : ~((~0UL)<<(n)))
38
#define isqual(t) ((t)->op >= CONST)
39
#define unqual(t) (isqual(t) ? (t)->type : (t))
41
#define isvolatile(t) ((t)->op == VOLATILE \
42
|| (t)->op == CONST+VOLATILE)
43
#define isconst(t) ((t)->op == CONST \
44
|| (t)->op == CONST+VOLATILE)
45
#define isarray(t) (unqual(t)->op == ARRAY)
46
#define isstruct(t) (unqual(t)->op == STRUCT \
47
|| unqual(t)->op == UNION)
48
#define isunion(t) (unqual(t)->op == UNION)
49
#define isfunc(t) (unqual(t)->op == FUNCTION)
50
#define isptr(t) (unqual(t)->op == POINTER)
51
#define ischar(t) ((t)->size == 1 && isint(t))
52
#define isint(t) (unqual(t)->op == INT \
53
|| unqual(t)->op == UNSIGNED)
54
#define isfloat(t) (unqual(t)->op == FLOAT)
55
#define isarith(t) (unqual(t)->op <= UNSIGNED)
56
#define isunsigned(t) (unqual(t)->op == UNSIGNED)
57
#define isscalar(t) (unqual(t)->op <= POINTER \
58
|| unqual(t)->op == ENUM)
59
#define isenum(t) (unqual(t)->op == ENUM)
60
#define fieldsize(p) (p)->bitsize
61
#define fieldright(p) ((p)->lsb - 1)
62
#define fieldleft(p) (8*(p)->type->size - \
63
fieldsize(p) - fieldright(p))
64
#define fieldmask(p) (~(~(unsigned)0<<fieldsize(p)))
65
typedef struct node *Node;
67
typedef struct list *List;
69
typedef struct code *Code;
71
typedef struct swtch *Swtch;
73
typedef struct symbol *Symbol;
75
typedef struct coord {
79
typedef struct table *Table;
88
typedef struct tree *Tree;
90
typedef struct type *Type;
92
typedef struct field *Field;
97
unsigned short typeno;
102
typedef struct metrics {
103
unsigned char size, align, outofline;
105
typedef struct interface {
110
Metrics longlongmetric;
112
Metrics doublemetric;
113
Metrics longdoublemetric;
115
Metrics structmetric;
116
unsigned little_endian:1;
117
unsigned mulops_calls:1;
118
unsigned wants_callb:1;
119
unsigned wants_argb:1;
120
unsigned left_to_right:1;
121
unsigned wants_dag:1;
122
unsigned unsigned_char:1;
123
void (*address)(Symbol p, Symbol q, long n);
124
void (*blockbeg)(Env *);
125
void (*blockend)(Env *);
126
void (*defaddress)(Symbol);
127
void (*defconst) (int suffix, int size, Value v);
128
void (*defstring)(int n, char *s);
129
void (*defsymbol)(Symbol);
131
void (*export)(Symbol);
132
void (*function)(Symbol, Symbol[], Symbol[], int);
134
void (*global)(Symbol);
135
void (*import)(Symbol);
136
void (*local)(Symbol);
137
void (*progbeg)(int argc, char *argv[]);
138
void (*progend)(void);
139
void (*segment)(int);
141
void (*stabblock)(int, int, Symbol*);
142
void (*stabend) (Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *);
143
void (*stabfend) (Symbol, int);
144
void (*stabinit) (char *, int, char *[]);
145
void (*stabline) (Coordinate *);
146
void (*stabsym) (Symbol);
147
void (*stabtype) (Symbol);
150
typedef struct binding {
155
extern Binding bindings[];
156
extern Interface *IR;
169
#define xx(a,b,c,d,e,f,g) a=b,
170
#define yy(a,b,c,d,e,f,g)
190
#define gop(name,value) name=value<<4,
191
#define op(name,type,sizes)
323
op(LOAD,U,csilhp) LASTOP };
327
enum { CODE=1, BSS, DATA, LIT };
328
enum { PERM=0, FUNC, STMT };
335
enum { Blockbeg, Blockend, Local, Address, Defpoint,
336
Label, Start, Gen, Jump, Switch
343
Table identifiers, types;
386
unsigned structarg:1;
388
unsigned addressed:1;
390
unsigned temporary:1;
391
unsigned generated:1;
403
Table ftab; /* omit */
431
enum { CONSTANTS=1, LABELS, GLOBAL, PARAM, LOCAL };
474
extern int assignargs;
475
extern int prunetemps;
476
extern int nodecount;
479
extern Tree (*optree[])(int, Tree, Tree);
485
extern Events events;
488
extern unsigned char *cp;
489
extern unsigned char *limit;
490
extern char *firstfile;
497
extern Coordinate src;
500
extern Symbol YYnull;
501
extern Symbol YYcheck;
508
extern int needconst;
509
extern int explicitCast;
510
extern struct code codehead;
511
extern Code codelist;
512
extern Table stmtlabs;
513
extern float density;
514
extern Table constants;
515
extern Table externals;
516
extern Table globals;
517
extern Table identifiers;
522
extern List loci, symbols;
527
extern Type chartype;
528
extern Type doubletype;
529
extern Type floattype;
531
extern Type longdouble;
532
extern Type longtype;
533
extern Type longlong;
534
extern Type shorttype;
535
extern Type signedchar;
536
extern Type unsignedchar;
537
extern Type unsignedlonglong;
538
extern Type unsignedlong;
539
extern Type unsignedshort;
540
extern Type unsignedtype;
541
extern Type charptype;
542
extern Type funcptype;
543
extern Type voidptype;
544
extern Type voidtype;
545
extern Type unsignedptr;
546
extern Type signedptr;
547
extern Type widechar;
548
extern void *allocate(unsigned long n, unsigned a);
549
extern void deallocate(unsigned a);
550
extern void *newarray(unsigned long m, unsigned long n, unsigned a);
551
extern void walk(Tree e, int tlab, int flab);
552
extern Node listnodes(Tree e, int tlab, int flab);
553
extern Node newnode(int op, Node left, Node right, Symbol p);
554
extern Tree cvtconst(Tree);
555
extern void printdag(Node, int);
556
extern void compound(int, Swtch, int);
557
extern void defglobal(Symbol, int);
558
extern void finalize(void);
559
extern void program(void);
561
extern Tree vcall(Symbol func, Type ty, ...);
562
extern Tree addrof(Tree);
563
extern Tree asgn(Symbol, Tree);
564
extern Tree asgntree(int, Tree, Tree);
565
extern Type assign(Type, Tree);
566
extern Tree bittree(int, Tree, Tree);
567
extern Tree call(Tree, Type, Coordinate);
568
extern Tree calltree(Tree, Type, Tree, Symbol);
569
extern Tree condtree(Tree, Tree, Tree);
570
extern Tree cnsttree(Type, ...);
571
extern Tree consttree(unsigned int, Type);
572
extern Tree eqtree(int, Tree, Tree);
573
extern int iscallb(Tree);
574
extern Tree shtree(int, Tree, Tree);
575
extern void typeerror(int, Tree, Tree);
577
extern void test(int tok, char set[]);
578
extern void expect(int tok);
579
extern void skipto(int tok, char set[]);
580
extern void error(const char *, ...);
581
extern int fatal(const char *, const char *, int);
582
extern void warning(const char *, ...);
584
typedef void (*Apply)(void *, void *, void *);
585
extern void attach(Apply, void *, List *);
586
extern void apply(List event, void *arg1, void *arg2);
587
extern Tree retype(Tree p, Type ty);
588
extern Tree rightkid(Tree p);
589
extern int hascall(Tree p);
590
extern Type binary(Type, Type);
591
extern Tree cast(Tree, Type);
592
extern Tree cond(Tree);
593
extern Tree expr0(int);
594
extern Tree expr(int);
595
extern Tree expr1(int);
596
extern Tree field(Tree, const char *);
597
extern char *funcname(Tree);
598
extern Tree idtree(Symbol);
599
extern Tree incr(int, Tree, Tree);
600
extern Tree lvalue(Tree);
601
extern Tree nullcall(Type, Symbol, Tree, Tree);
602
extern Tree pointer(Tree);
603
extern Tree rvalue(Tree);
604
extern Tree value(Tree);
606
extern void defpointer(Symbol);
607
extern Type initializer(Type, int);
608
extern void swtoseg(int);
610
extern void input_init(int, char *[]);
611
extern void fillbuf(void);
612
extern void nextline(void);
614
extern int getchr(void);
615
extern int gettok(void);
617
extern void emitcode(void);
618
extern void gencode (Symbol[], Symbol[]);
619
extern void fprint(FILE *f, const char *fmt, ...);
620
extern char *stringf(const char *, ...);
621
extern void check(Node);
622
extern void print(const char *, ...);
624
extern List append(void *x, List list);
625
extern int length(List list);
626
extern void *ltov (List *list, unsigned a);
627
extern void init(int, char *[]);
629
extern Type typename(void);
630
extern void checklab(Symbol p, void *cl);
631
extern Type enumdcl(void);
632
extern void main_init(int, char *[]);
633
extern int main(int, char *[]);
635
extern void vfprint(FILE *, char *, const char *, va_list);
637
extern int process(char *);
638
extern int findfunc(char *, char *);
639
extern int findcount(char *, int, int);
641
extern Tree constexpr(int);
642
extern int intexpr(int, int);
643
extern Tree simplify(int, Type, Tree, Tree);
644
extern int ispow2(unsigned long u);
646
extern int reachable(int);
648
extern void addlocal(Symbol);
649
extern void branch(int);
650
extern Code code(int);
651
extern void definelab(int);
652
extern void definept(Coordinate *);
653
extern void equatelab(Symbol, Symbol);
654
extern Node jump(int);
655
extern void retcode(Tree);
656
extern void statement(int, Swtch, int);
657
extern void swcode(Swtch, int *, int, int);
658
extern void swgen(Swtch);
660
extern char * string(const char *str);
661
extern char *stringn(const char *str, int len);
662
extern char *stringd(long n);
663
extern Symbol relocate(const char *name, Table src, Table dst);
664
extern void use(Symbol p, Coordinate src);
665
extern void locus(Table tp, Coordinate *cp);
666
extern Symbol allsymbols(Table);
668
extern Symbol constant(Type, Value);
669
extern void enterscope(void);
670
extern void exitscope(void);
671
extern Symbol findlabel(int);
672
extern Symbol findtype(Type);
673
extern void foreach(Table, int, void (*)(Symbol, void *), void *);
674
extern Symbol genident(int, Type, int);
675
extern int genlabel(int);
676
extern Symbol install(const char *, Table *, int, int);
677
extern Symbol intconst(int);
678
extern Symbol lookup(const char *, Table);
679
extern Symbol mkstr(char *);
680
extern Symbol mksymbol(int, const char *, Type);
681
extern Symbol newtemp(int, int, int);
682
extern Table table(Table, int);
683
extern Symbol temporary(int, Type);
684
extern char *vtoa(Type, Value);
686
extern int nodeid(Tree);
687
extern char *opname(int);
688
extern int *printed(int);
689
extern void printtree(Tree, int);
690
extern Tree root(Tree);
691
extern Tree texpr(Tree (*)(int), int, int);
692
extern Tree tree(int, Type, Tree, Tree);
694
extern void type_init(int, char *[]);
696
extern Type signedint(Type);
698
extern int hasproto(Type);
699
extern void outtype(Type, FILE *);
700
extern void printdecl (Symbol p, Type ty);
701
extern void printproto(Symbol p, Symbol args[]);
702
extern char *typestring(Type ty, char *id);
703
extern Field fieldref(const char *name, Type ty);
704
extern Type array(Type, int, int);
705
extern Type atop(Type);
706
extern Type btot(int, int);
707
extern Type compose(Type, Type);
708
extern Type deref(Type);
709
extern int eqtype(Type, Type, int);
710
extern Field fieldlist(Type);
711
extern Type freturn(Type);
712
extern Type ftype(Type, Type);
713
extern Type func(Type, Type *, int);
714
extern Field newfield(char *, Type, Type);
715
extern Type newstruct(int, char *);
716
extern void printtype(Type, int);
717
extern Type promote(Type);
718
extern Type ptr(Type);
719
extern Type qual(int, Type);
720
extern void rmtypes(int);
721
extern int ttob(Type);
722
extern int variadic(Type);