📄 cmm.h
字号:
#ifndef CMM_H#define CMM_H#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include "cstring.h"#include "list.h"#include "alloc.h"#ifndef _POSIX_ARG_MAX# define _POSIX_ARG_MAX 4096#endifenum {#define xx(a,b,c,d,e,f,g) a=b,#define yy(a,b,c,d,e,f,g)#include "token.h"};#define roundup(x,n) (((x)+((n)-1))&(~((n)-1))) #define NELEMS(a) (int)(sizeof(a) / sizeof((a)[0]))#define isfunc(t) ((t)->op == FUNCTION)#define isptr(t) ((t)->op == POINTER)#define ischar(t) ((t)->op == CHAR)#define isint(t) ((t)->op == INT)#define isarray(t) ((t)->op == ARRAY)#define isvoid(t) ((t)->op == VOID)#define isunsigned(t) ((t)->op == UNSIGNED)#define isarith(t) (isint(t)||ischar(t)|| isunsigned(t))#define istypename(op) ((op) == CHAR || (op) == INT || (op) == VOID)#define isvoidptype(t) (isptr(t) && (t)->type == voidtype)#define isscalar(t) ((t)->op <= POINTER)#ifdef NDEBUG#define DEBUG(x) #else#define DEBUG(x) fprint(2,"%s %d:",__FUNCTION__,__LINE__),(x)#endiftypedef struct symbol *Symbol;typedef struct type *Type;typedef struct table *Table;typedef struct code *Code;typedef struct node *Node;typedef struct tree *Tree;typedef union value{ /*保存常量的值*/ char c; int i; unsigned u; void *p; }Value;typedef struct { /*文件位置坐标*/ char *file; int x; int y;}Coordinate;struct type{ /*标示符的类型*/ int op; Type type; int align; int size; Type *proto; /*函数的参数类型列表*/};#include "config.h"enum {AUTO=0,REGISTER=1}; /*标示符的存储类别*/struct symbol { char *name; /*标示符的名字*/ int scope; /*作用域*/ int sclass; /*存储类型*/ Coordinate src; /*坐标位置*/ Symbol up; /*符号表中的上一个元素*/ Type type; /*标示符的类型*/ List use; float ref; /*引用的频率*/ unsigned defined:1; /*标示符已定义的标志*/ unsigned generated:1; /*生成标示符的标志*/ unsigned addressed:1; /*地址变量用于指示后端不能将其做为寄存器变量*/ unsigned temporary:1; /*临时变量*/ union { struct { Value v; /*常量*/ Symbol loc; }c; int seg; /*数据所在的段*/ struct { int label; /*标号的内部值*/ Symbol equatedto;/*连接等价的标号*/ }l; /*标号*/ struct { int label; Symbol *callee; /*函数的参数列表*/ }f; /*函数*/ }u; Xsymbol x;};struct node { /*dag的结点*/ int op; /*操作符*/ int count; /*引用计数*/ Symbol syms[3]; Node kids[2]; /*子结点*/ Node link; Xnode x;};struct tree { /*抽象语法树*/ int op; Type type; /*结果类型*/ Tree kids[2]; /*子树*/ Node node; union { Value v; /*常量*/ Symbol sym; /*标示符的符号表入口*/ }u; };enum { CODE=1, BSS, DATA};enum { C=CHAR, I=INT, V=VOID, P=POINTER, A=ARRAY, U=UNSIGNED};enum { /*操作符*/ CNST=1<<3, CNSTC=CNST+C, CNSTI=CNST+I, CNSTP=CNST+P, ARG=2<<3, ARGI=ARG+I, ARGP=ARG+P, ASGN=3<<3, ASGNC=ASGN+C, ASGNI=ASGN+I, ASGNP=ASGN+P, ASGNA=ASGN+A, INDIR=4<<3, INDIRC=INDIR+C, INDIRI=INDIR+I, INDIRP=INDIR+P, CVC=5<<3, CVCI=CVC+I, CVI=6<<3, CVIC=CVI+C, CVIU=CVI+U, CVP=7<<3, CVPU=CVP+U, CALL=8<<3, CALLI=CALL+I, CALLV=CALL+V, RET=9<<3, RETI=RET+I, ADDRG=10<<3, ADDRGP=ADDRG+P, ADDRL=11<<3, ADDRLP=ADDRL+P, ADD=12<<3, ADDI=ADD+I, ADDP=ADD+P, SUB=13<<3, SUBI=SUB+I, SUBP=SUB+P, MOD=14<<3, MODI=MOD+I, DIV=15<<3, DIVI=DIV+I, MUL=16<<3, MULI=MUL+I, EQ=17<<3, EQI=EQ+I, EQU=EQ+U, GE=18<<3, GEI=GE+I, GEU=GE+U, GT=19<<3, GTI=GT+I, GTU=GT+U, LE=20<<3, LEI=LE+I, LEU=LE+U, LT=21<<3, LTI=LT+I, LTU=LT+U, NE=22<<3, NEI=NE+I, NEU=NE+U, JUMP=23<<3, JUMPV=JUMP+V, LABEL=24<<3, LABELV=LABEL+V, NOT=25<<3, NOTI=NOT+I, NEG=26<<3, NEGI=NEG+I, CVU=27<<3, CVUI=CVU+I, CVUP=CVU+P, LOAD=28<<3, LOADC=LOAD+C, LOADI=LOAD+I, LOADU=LOAD+U, LOADP=LOAD+P,};struct code { /*代码表*/ enum { Blockbeg, Blockend, Label, Start, Gen, Jump}kind; Code prev, next; union { struct { int level; /*块的作用域*/ Symbol *locals; /*保存块开始处声明的局部变量列表*/ Env x; }block; Code begin; Symbol var; Node forest; }u;};#define isaddrop(op) (generic(op) == ADDRG || generic(op) == ADDRL)#define generic(op) ((op)&(~0<<3))#define index(op) ((op)>>3)#define optype(op) ((op)&0x7)#include "error.h"#include "output.h"typedef struct interface { /*后端的接口*/void (*blockbeg)(Env *);void (*blockend)(Env *);void (*defaddress)(Symbol);void (*defconst)(int ty, Value v);void (*defstring)(int n, char *s);void (*defsymbol)(Symbol);void (*export)(Symbol);void (*function)(Symbol, Symbol[], Symbol[]);void (*gen)(Node);void (*global)(Symbol);void (*import)(Symbol);void (*local)(Symbol);void (*progbeg)(void);void (*progend)(void);void (*segment)(int);void (*space)(int);Xinterface x;} Interface;extern Interface *IR;extern Interface x86IR;/*input.c*/extern void inputInit(void);extern void nexline(void);extern unsigned char *cp,*limit;extern char *line;extern int infd;extern int lineno;extern char *file;extern int t;/*decl.c*/extern Symbol cfunc;extern void program(void);extern void compound(int loop, int lev);extern void finalize();extern Type type_name(void);/*init.c*/extern Type initializer(Type ty, int lev);/*stmt.c*/extern struct code codehead;extern Code codelist;extern Code code(int kind);extern void statement(int loop, int lev);extern void definelab(int lab);extern void equatelab(Symbol old, Symbol new);extern Node jump(int lab);extern void branch(int lab);/*expr.c*/;extern float refinc;extern Tree expr(int tok);extern Tree idtree(Symbol p);extern Tree rvalue(Tree p);extern Tree lvalue(Tree p);extern Tree retype(Tree p, Type ty);extern Tree pointer(Tree p);extern Tree cond(Tree p);extern Tree cast(Tree p, Type ty);extern char *funcname(Tree f);/*enode.c*/extern Tree (*optree[])(int op, Tree l, Tree r);extern Tree call(Tree f, Type fty, Coordinate *src);extern Tree consttree(int n, Type ty);extern Tree eqtree(int op, Tree l, Tree r);extern Type assign(Type xty, Tree e);extern Tree asgntree(int op, Tree l, Tree r);extern Tree asgn(Symbol p, Tree e);extern void typeerror(int op, Tree l, Tree r);/*simp.c*/extern Tree constexpr(int tok);extern int intexpr(int tok);extern Tree simplify(int op, Type ty, Tree l, Tree r);/*dag.c*/extern int reg_var_count;extern Node newnode(int op, Node l, Node r, Symbol sym);extern void walk(Tree e, int tlab, int flab);extern void gencode(Symbol caller[], Symbol callee[]);/*tree.c*/extern Tree tree(int op, Type type, Tree left, Tree right);extern void printtree(Tree e);extern void print_dag(Node p);extern Tree texpr(Tree (*f)(int tok),int tok, int arena);/*lex.c*/extern char *token;extern Symbol tsym;extern Coordinate src;extern int gettoken(void);/*sym.c*/enum{CONSTANT = 1, /*常量的符号表*/ LABELS, /*标号的符号表*/ GLOBAL, /*全局的符号表*/ LOCALS /*局部及参数的符号表*/ };extern int level;extern Table constants;extern Table identifiers;extern Table globals;extern Table labels;extern void init_sym(void);extern Table table(Table tp, int level);extern void foreach(Table tp, int lev,void (*apply)(Symbol, void*),void*c1);extern void enterscope(void);extern void exitscope(void);extern Symbol install(char *name,Table *tpp,int lev,unsigned arena);extern Symbol lookup(char *name, Table tp);extern int genlabel(int n);extern Symbol findlabel(int lab);extern Symbol constant(Type ty,Value v);extern Symbol intconst(int n);extern Symbol genident(Type ty, int lev);extern Symbol temporary(int sclass, Type ty, int lev);extern Symbol newtemp(int reg,int tc);/*type.c*/extern Type chartype;extern Type inttype;extern Type voidtype;extern Type unsignedtype;extern Type voidptype;extern Type ptr(Type ty);extern Type deref(Type ty);extern Type array(Type ty, int n, int aling);extern Type atop(Type ty);extern Type func(Type ty, Type *proto);extern Type freturn(Type ty);extern int ttob(Type ty);extern int eqtype(Type ty1, Type ty2);extern Type promote(Type ty);extern Type binary(Type xty, Type yty);extern void outtype(Type ty);extern Type btot(int op);/*gen.c*/extern Symbol mkreg(char *fmt, int n);extern int askregvar(Symbol, Symbol);extern int mkactual(int, int);extern void mkauto(Symbol);extern Symbol mkreg(char *, int);extern Symbol mkwildcard(Symbol *);extern void rtarget(Node, int, Symbol);extern void setreg(Node, Symbol);extern int getregnum(Node p);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -