LCC编译器的源程序分析(65)后端接口的结构注释

来源:互联网 发布:党支部的软件建设 编辑:程序博客网 时间:2024/05/06 06:06
因为LCC后端可以生成不同机器结构的代码,所以需要定义后端的接口结构,当不同的模块实现这些接口时,就可以实现不同的机器代码生成。下面就是这个接口的结构定义注释。
 
#001 //后端代码生成的接口.
#002  typedef struct interface
#003 {
#004  //数据类型.
#005  Metrics charmetric;
#006  Metrics shortmetric;
#007  Metrics intmetric;
#008  Metrics longmetric;
#009  Metrics longlongmetric;
#010  Metrics floatmetric;
#011  Metrics doublemetric;
#012  Metrics longdoublemetric;
#013  Metrics ptrmetric;
#014  Metrics structmetric;
#015 
#016  //
#017  unsigned little_endian:1; //小端格式,还是大端格式. 1是小端格式.
#018  unsigned mulops_calls:1; //硬件实现乘法,除法和取余数为1.
#019  unsigned wants_callb:1; //设置为1,要求前端生成CALL+B节点,否则后端自己实现.
#020  unsigned wants_argb:1;//设置为1,要求前端生成ARG+B节点.
#021  unsigned left_to_right:1;//设置为1,传递参数的顺序为从左到右,否则为从右到左.
#022  unsigned wants_dag:1; //设置为1,后端自己处理DAG节点.否则前端改引用次数大于1的节点.
#023  unsigned unsigned_char:1;//设置为1,char类型为无符号数,否则char为有符号数.
#024 
#025 //生成地址符号.
#026 void (*address)(Symbol p, Symbol q, long n);
#027 
#028 //块初始化.
#029 void (*blockbeg)(Env *);
#030 
#031 //块结束处理.
#032 void (*blockend)(Env *);
#033 
#034 //定义指针地址.
#035 void (*defaddress)(Symbol);
#036 
#037 //定义常量.
#038 void (*defconst) (int suffix, int size, Value v);
#039 
#040 //定义字符串.
#041 void (*defstring)(int n, char *s);
#042 
#043 //定义常量,标号,全局变量,或者静态变量的符号.
#044 void (*defsymbol)(Symbol);
#045 
#046 //从中间代码生成最终代码.
#047 void (*emit)    (Node);
#048 
#049 //输出处理函数.
#050 void (*Export)(Symbol);
#051 
#052 //生成函数的代码.
#053 void (*Function)(Symbol, Symbol[], Symbol[], int);
#054 
#055 //生成代码.
#056 Node (*gen)     (Node);
#057 
#058 //生成全局变量的代码.
#059 void (*global)(Symbol);
#060 
#061 //输入处理函数.
#062 void (*import)(Symbol);
#063 
#064 //局部变量声明.
#065 void (*local)(Symbol);
#066 
#067 //整个编译开始。
#068 void (*progbeg)(int argc, char *argv[]);
#069 
#070 //编译结束.
#071 void (*progend)(void);
#072 
#073 //设置到相应的段代码.
#074 void (*segment)(int);
#075 
#076 //按子节分配储存空间.
#077 void (*space)(int);
#078 
#079 //
#080 void (*stabblock)(int, int, Symbol*);
#081 void (*stabend) (Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *);
#082 void (*stabfend) (Symbol, int);
#083 void (*stabinit) (char *, int, char *[]);
#084 void (*stabline) (Coordinate *);
#085 void (*stabsym) (Symbol);
#086 void (*stabtype) (Symbol);
#087 
#088  //后端代码生成接口,可以写生成不同的目标代码。
#089  Xinterface x;
#090 } Interface;
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1738376