GCC后端指令生成分析(2)
来源:互联网 发布:怎么自学编程 编辑:程序博客网 时间:2024/04/28 13:07
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)
宏定义的括号中,主要包括以下几个域。
- 内部名字。用于C代码源文件中的,是rtl.h文件中枚举类型rtx_code的成员。常用大写字母,例如例子中的INSN_LIST。
- 外部名字,为ASCII字母形式,是read_rtx函数读取时得到的值,也是print_rtx打印出的值。常用小写字母。
- 格式。格式定义域rtl.c文件中,例如i表示整数类型,s表示字符串指针等。genrtl.h文件中所定义的gen_rtx_fmt_xxx_stat函数中的xxx就代表某些宏定义中的格式。(因为不是所有的宏定义都有对应的生成函数,后文中将描述什么类型的宏定义有对应的函数)
- rtx的类型,也就是gen_rtx_fmt_xxx_stat函数的返回值的类型。主要包括以下几种。
- RTX_CONST_OBJ:常量对象,例如rtx code为CONST_INT。
- RTX_OBJ:表示对象的rtx,例如rtx code为REG, MEM。
- RTX_COMPARE:表示比较操作,例如rtx code为LT, GT。
- RTX_COMM_COMPARE:表示可交换的比较操作,例如rtx code为EQ, NE, ORDERED。
- RTX_UNARY:表示一元数学运算的表达式,例如rtx code为NEG, NOT。
- RTX_COMM_ARITH:表示可交换的二元数学运算,例如rtx code为PLUS, MULT。
- RTX_TERNARY:非位运算的三输入操作,例如rtx code为IF_THEN_ELSE。
- RTX_BIN_ARITH:不可交换的二元操作,例如rtx code为MINUS, DIV。
- RTX_BITFIELD_OPS:位运算操作,例如rtx code为ZERO_EXTRACT, SIGN_EXTRACT。
- RTX_INSN:表示机器指令(INSN, JUMP_INSN, CALL_INSN)或者用作汇编中伪操作的数据(DEBUG_INSN)。
- RTX_MATCH:匹配insn的rtx类型, 例如rtx code为MATCH_DUP。
- RTX_AUTOINC:表示自加,例如rtx code为POST_DEC。
- RTX_EXTRA:其他。
本程序的主要步骤由以下几个函数组成。
- 通过使用一个宏定义#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)
- 调用find_formats函数。该函数收集rtl.def中宏定义条目中的格式,组成formats数组。formats中的元素不重复,并且某些特殊类型的格式不被纳入到formats中,特殊类型是包括“*VSn”中任一字符的格式串。
- 调用genheader函数。这是本程序的主体函数,包括两个部分。
- 调用gendef,为formats中的每个格式串生成一个形如gen_rtx_fmt_xxx_stat的函数。其中xxx代表格式串,格式串中的每个字符对应于生成函数中的一个同类型的形参。成的函数的主要任务是为rtx分配空间,并且,按照形参的顺序指定rtx中不同arg的类型。在完成输出gen_rtx_fmt_xxx_stat函数之后,再生成宏定义建立函数和宏gen_rtx_fmt_xxx之间的对应关系。
- 调用genmacro,为数组defs中的元素生成宏定义,元素格式字符串中包含特殊类型的除外,而且元素的内部名字为VAR_LOCATION、CONST_DOUBLE、CONST_WIDE_INT和CONST_FIXED的也除外。主要是建立宏gen_rtx_%s1enumname和函数gen_rtx_fmt_%s2之间的关系,也就是以enumname为名字的函数与与genrtl.h文件中定义的函数之间的关系。若enumname是EXPR_LIST、INSN_LIST、INSN、CONST_INT、REG、SUBREG、MEM、PC、CC0、RETURN、SIMPLE_RETURN或者CONST_VECTOR,则s1为”raw_”,否则为空,s2就是数组defs中对应元素的格式字符串。
0 0
- GCC后端指令生成分析(2)
- GCC后端指令生成分析(1)
- GCC源码分析(五)——指令生成
- GCC源码分析(五)——指令生成
- GCC后端及汇编发布(2)
- GCC指令
- GCC指令
- gcc指令
- GCC移植--后端流程
- GCC -fpie选项生成文件分析
- gcc编译器---前端和后端
- GCC Coverage代码分析-GCC如何编译生成gcov/gcov-dump程序及其bug分析
- SSE 指令 gcc编译
- GCC指令详解
- GCC汇编指令格式
- GCC的简单指令
- gcc编译指令详解
- vim 及gcc 指令
- Mac OS X 10.11 El Capitan -XCode7&XCode8 -unable to boot the simulator
- CCPC杭州B题 HDU5934 Bomb Tarjan缩点
- 如何保证服务可用性
- 电脑、手机、投影仪、智能电视相互投屏
- 手把手教你反编译别人的app
- GCC后端指令生成分析(2)
- unable to boot the simulator xcode8
- linuxep笔记 -- 20161101
- 关于“从第一字符串中删除第二个字符串中所有的字符”方法学习
- 类的赋值构造函数和复制构造函数
- 51nod-1246:罐子和硬币
- 将UltraEdit添加到右键菜单
- POJ 3070 Fibonacci【矩阵快速幂取模】【模板题】
- 表达式型计算器