LCC编译器的源程序分析(57)不同目标代码生成的接口结构

LCC为了生成不同机器的目标代码,它提供了一个接口给后端的代码生成,以便可以只修改后端,就可以达到生成不同的机器代码。它的接口如下:
#001 //后端代码生成接口,可以写生成不同的目标代码。
#002 //
#003 //蔡军生 2007/07/20 QQ: 9073204
#004 //
#005 typedef struct {
#006     //对齐方式的最大字节。
#007     unsigned char max_unaligned_load;
#008 
#009     //根据数据类型选择寄存器类型。
#010     Symbol (*rmap)(int);
#011 
#012     //给定单元取数到寄存器的代码。
#013     void (*blkfetch)(int size, int off, int reg, int tmp);
#014 
#015     //将给出寄存器内容保存到单元里。
#016     void (*blkstore)(int size, int off, int reg, int tmp);
#017 
#018     //生成一个循环来复制内存里的内容。
#019     void (*blkloop)(int dreg, int doff,
#020                      int sreg, int soff,
#021                      int size, int tmps[]);
#022 
#023     //每个节点的指令选择
#024     void (*_label)(Node);
#025 
#026     //获取指令编码。
#027     int (*_rule)(void*, int);
#028 
#029     short **_nts;
#030 
#031     //根据指令模板保存子节点到kids中
#032     void (*_kids)(Node, int, Node*);
#033 
#034     //指令模板字符串数组。
#035     char **_string;
#036 
#037     //指令模板数组.
#038     char **_templates;
#039 
#040     //是指令还是参数的标记数组。
#041     char *_isinstruction;
#042 
#043     //分类名称。
#044     char **_ntname;
#045 
#046     //复杂的指令生成函数。
#047     void (*emit2)(Node);
#048 
#049     //计算下一个参数的寄存器或者内存单元。
#050     void (*doarg)(Node);
#051 
#052     //计算那些需要放到特定寄存器的树节点。
#053     void (*target)(Node);
#054 
#055     //寄存器溢出后,重新加载内存单元数据到寄存器。
#056     void (*clobber)(Node);
#057 
#058 } Xinterface;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值