LCC编译器的源程序分析(65)后端接口的结构注释
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;
相关文章
- java基础知识回顾之抽象类和接口的区别
- Java类集--认识类集、Collection接口
- Thinkphp内核百度小程序输出接口
- [NM]打开NetworkManager和wpa_supplicant的DEBUG接口
- 初探设计:Java接口和抽象类何时用?怎么用?
- API接口设计 注意问题
- H7-TOOL的CANFD/CAN接口脱机烧写操作说明, 已经更新(2022-07-12)
- was集群下基于接口分布式架构和开发经验谈
- ASP.NET Core微服务(四)——【静态vue使用axios解析接口】
- SAP 金税接口增强 BADI
- android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
- 接口测试学习路线图 (下)
- 【看完就懂系列】一文6000字教你从0到1实现接口自动化
- flask,gunicorn,supervisor,nginx配置服务器接口
- JDK源码详解之List接口
- ASP.NET Core微服务(五)——【vue脚手架解析接口】
- PostwomanApi接口测试工具