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)
宏定义的括号中,主要包括以下几个域。

  1. 内部名字。用于C代码源文件中的,是rtl.h文件中枚举类型rtx_code的成员。常用大写字母,例如例子中的INSN_LIST。
  2. 外部名字,为ASCII字母形式,是read_rtx函数读取时得到的值,也是print_rtx打印出的值。常用小写字母。
  3. 格式。格式定义域rtl.c文件中,例如i表示整数类型,s表示字符串指针等。genrtl.h文件中所定义的gen_rtx_fmt_xxx_stat函数中的xxx就代表某些宏定义中的格式。(因为不是所有的宏定义都有对应的生成函数,后文中将描述什么类型的宏定义有对应的函数)
  4. rtx的类型,也就是gen_rtx_fmt_xxx_stat函数的返回值的类型。主要包括以下几种。
    1. RTX_CONST_OBJ:常量对象,例如rtx code为CONST_INT。
    2. RTX_OBJ:表示对象的rtx,例如rtx code为REG, MEM。
    3. RTX_COMPARE:表示比较操作,例如rtx code为LT, GT。
    4. RTX_COMM_COMPARE:表示可交换的比较操作,例如rtx code为EQ, NE, ORDERED。
    5. RTX_UNARY:表示一元数学运算的表达式,例如rtx code为NEG, NOT。
    6. RTX_COMM_ARITH:表示可交换的二元数学运算,例如rtx code为PLUS, MULT。
    7. RTX_TERNARY:非位运算的三输入操作,例如rtx code为IF_THEN_ELSE。
    8. RTX_BIN_ARITH:不可交换的二元操作,例如rtx code为MINUS, DIV。
    9. RTX_BITFIELD_OPS:位运算操作,例如rtx code为ZERO_EXTRACT, SIGN_EXTRACT。
    10. RTX_INSN:表示机器指令(INSN, JUMP_INSN, CALL_INSN)或者用作汇编中伪操作的数据(DEBUG_INSN)。
    11. RTX_MATCH:匹配insn的rtx类型, 例如rtx code为MATCH_DUP。
    12. RTX_AUTOINC:表示自加,例如rtx code为POST_DEC。
    13. RTX_EXTRA:其他。

本程序的主要步骤由以下几个函数组成。

  1. 通过使用一个宏定义#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)     { #ENUM, NAME, FORMAT },并结合rtl.def中的宏定义来生成数组defs,把rtl.def中所有的条目转换为一个数组。
  2. 调用find_formats函数。该函数收集rtl.def中宏定义条目中的格式,组成formats数组。formats中的元素不重复,并且某些特殊类型的格式不被纳入到formats中,特殊类型是包括“*VSn”中任一字符的格式串。
  3. 调用genheader函数。这是本程序的主体函数,包括两个部分。
    1. 调用gendef,为formats中的每个格式串生成一个形如gen_rtx_fmt_xxx_stat的函数。其中xxx代表格式串,格式串中的每个字符对应于生成函数中的一个同类型的形参。成的函数的主要任务是为rtx分配空间,并且,按照形参的顺序指定rtx中不同arg的类型。在完成输出gen_rtx_fmt_xxx_stat函数之后,再生成宏定义建立函数和宏gen_rtx_fmt_xxx之间的对应关系。
    2. 调用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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一本书120页小明 一边打电话一边被侵犯中文字幕 被维修空调的工人侵犯 中交字幕78页小明 儿子曰他妈免费视频 夏目彩春中文字幕父 被儿子不良的同学侵犯中文字幕 夏目彩春不速之客中文字幕 上司侵犯夏目彩春下载链接 健身教练夏目彩春 边打电话边被侵犯中文字幕 一个女的在厨房被水电工侵犯 中文字幕侵犯上司影音先锋 希岛爱理视频水电工侵犯 夏日彩春经典作品视频 被水电工掠夺的妻子 多爱井野再次被水电工 维修工强家庭主妇 满员电车大腿颤抖3 公交汉痴未删减版 弟弟的妻子在线播放 妻子被修空调的白玩了一下午 pz505被水电工侵 中文字幕侵犯妻子 妻子被楼下修理工白玩 边打电话边骗她老公在跑步 中山理莉 中文字幕 在线播放 白石利奈 在线 20岁女孩被四个强壮男电影 边打电话边做女客服中文版 电车侵扰bd 被夫侵犯bd 中文字幕边打电话边做 白石茉利奈star-782 在丈夫面前被别人犯侵天翼电影 中文版丈夫的上司连续浸七天 吉尺明步110部连接 吉g明教师步中文字迅雷下载 吉次明涉作品 被丈夫好友侵犯有感觉了中文3 侵犯新娘在丈夫面前被侵先锋