GCC后端指令生成分析(2)

本文深入分析GCC后端的指令生成过程,包括gencodes和gengenrtl两个阶段。gencodes从机器描述文件读取数据,生成insn_code枚举类型;gengenrtl则根据rtl.def文件生成genrtl.h,定义gen_rtx_fmt_xxx_stat函数,处理RTL表达式RTX。文章详细介绍了这两个阶段涉及的关键函数和宏定义。
摘要由CSDN通过智能技术生成

gencodes

gencodes的功能是读取机器描述文件,选择其中为define_insn和define_expand的条目,生成insn_code枚举类型。枚举类型定义如下。
enum insn_code{
CODE_FOR_nothing = 0,
CODE_FOR_%s,
……
}
类型定义中的%s代表define_insn或者define_expand中的名字。
程序主要包括两个函数。
init_rtx_reader_args,从md文件中读取条目,组成insn。
gen_insn,获取第一步生成的insn的名字。只处理define_insn和define_expand两种类型的,条目,为它们分配一个CODE_FOR_…枚举值。

gengenrtl

本程序的主要功能是读取rtl.def文件,生成genrtl.h文件。生成的genrtl.h文件又被include进rtl.h文件中。genrtl.h文件中定义了返回值为rtx表达式的、形式为gen_rtx_fmt_xxx_stat形式的函数,这些函数以rtl.def中的宏定义条目中包含的信息为依据来定义。
rtl.def文件主要使用宏DEF_RTX_EXPR定义了RTL语言中的表达式RTX(Register Transfer Expression)。宏的一个示例如下。
DEF_RTL_EXPR(INSN_LIST, “insn_list”, “ue”, RTX_EXTRA)
宏定义的括号中,主要包括以下几个域。

  1. 内部名字。用于C代码源文件中的,是rtl.h文件中枚举类型rtx_code的成员。常用大写字母,例如例子中的INSN_LIST。
  2. 外部名字,为ASCII字母形式&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值