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

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

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License