目录

LCC编译器的源程序分析58后端使用的节点结构

目录

LCC编译器的源程序分析(58)后端使用的节点结构

在LCC编译器后端,主要使用下面的节点结构来标识代码属性。

#001

#002 //节点注释的扩展,主要是代码生成使用。

#003 //

#004 //蔡军生 2007/07/21 QQ: 9073204

#005 //

#006 typedef struct {

#007     unsigned listed:1; //标记这是树的根节点。

#008     unsigned registered:1; //寄存器是否分配

#009     unsigned emitted:1; //标识已经输出指令。

#010     unsigned copy:1; //标记寄存器之间的复制。

#011     unsigned equatable:1; //标记存放公共表达式的临时单元的指令

#012     unsigned spills:1; //寄存器溢出标志。

#013     unsigned mayrecalc:1; //可以重新计算公共表达式的节点。

#014     void *state; //保存指令选择的结果。

#015     short inst; //标记节点是否使用指令实现。

#016     Node kids[3]; //后端编译的指令树。

#017     Node prev, next; //指令链表。

#018     Node prevuse;

#019     short argno; //参数数目。

#020 } Xnode;

#021

#022

#023 typedef struct {

#024     char *name; //编译器后端产生的名称.

#025     unsigned int eaddr; /* omit */

#026     int offset; //表示变量所在的栈位置。

#027     Node lastuse; //最后使用寄存器的节点。

#028     int usecount; //节点的使用次数。

#029     Regnode regnode; //寄存分配相关属性。

#030     Symbol *wildcard; //保存寄存器列表。

#031 } Xsymbol;

#032

后端生成代码,主要就是计算上面结构的属性,只要把上面的结构全部填充,就可以生成最终的代码。