zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

接口编译器 分析 结构 注释 源程序 65 LCC
2023-09-14 09:10:39 时间
因为 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;