因为
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;