admin 管理员组文章数量: 1086019
2024年4月28日发(作者:导航菜单是什么意思)
GCC中对
switch-case语句的处理方法
GCC中对switch-case语句的处理主要是在stmt.c中的expand_case (tree exp) 函数
中进行的。参数为一个tree变量,其tree_code为SWITCH_EXPR.
用到的主要数据结构为:
struct case_node
{
struct case_node *left; /* Left son in binary tree */
struct case_node *right; /* Right son in binary tree; also node chain */
struct case_node
tree
tree
tree
};
每一个case_node结构体表示一个switch分支,每一个分支有可能对应着多个ca
se,low和high表示的是这些case中的最小值和最大值,如果只有一个case,则
二者相同;code_label是该分支对应的标号,以便跳转时使用;left, right和parent
存贮的是前后分支的信息。
在switch-case语句中,是用一个包含多个case_node的向量来储存所有的分
*parent; /* Parent of node in binary tree */
/* Lowest index value for this label */
/* Highest index value for this label */
low;
high;
code_label; /* Label to jump to when node matches */
支信息的,default分支在最后一个,前面的按顺序排列,每一个node的right成
员表示下一个分支。
Switch-case 语句的输出格式有三种:
a. 以位测试和分支的形式输出,这种形式很少见;
b. 以比较和跳转的形式输出;
c. 先产生一个包含分支标号列表的标号,再以该标号
这种形式与b相比代码量会少一些;
+偏移的方式跳转,
expand_case (tree exp) 函数通过一个“range” 变量来控制语句用以上哪
种方式进行输出,range 表示的是所有分支的所有case中,最大值和最小值
的范围,也就是差值。另外还有两个变量 count 和 uniq 与range一起配合
控制输出。函数expand_case (tree exp) 可以分为两大部分,第一大部分是计
算得到count、uniq 以及 range 的值;第二大部分是根据这几个值来绝对用
a, b, c哪种方式来输出以及具体的处理方法。
首先,我们来看一下函数的第一大部分,count、uniq 以及 range 的值是
如何得到的。expand_case会读取exp 中的分支信息,通过宏SW
ITCH_LABELS (exp) 可以获得该switch-case 语句中所有的分支信息,返回
的结果为一个向量,令
vec = SWITCH_LABELS (exp);
vec为一个CASE_LABEL_EXPR的向量树,每一个向量成员都表示一
个分支,通过 TREE_VEC_LENGTH (vec) 可以获得分支的个数,
TREE_VEC_ELT (vec, i) 可以访问每一个分支,CASE_LOW 和CASE_HIGH
可以分别得到每一个分支的最小和最大的case 值。首先逐个读取vec,通过
add_case_node ( )函数将所有分支以链表的形式储存在一个case_node * case_
list的向量链表中, 前一个分支的right成员指向后一个分支;接下来通过一
个for 循环读取case_list 中所有分支, 为了计算range,用两个变量minva
l 和 maxval 来记录所有case中的最大值和最小值, 通过相减得到range,并
且在该过程中也得到count 和uniq 的值:
在这个for循环中,首先将第一个分支的最小值和最大值分别赋给minva
l 和 maxval,然后对于每一个分支,都将minval和其最小值比较,如果其最
小值比minval还要小,就将改值赋给minval;同样也对maxval进行这样的
处理,这样到最后minval和maxval的值就是所有case 中的最小值和最大值,
通过maxval - minval得到range值;uniq的值较为简单,表示的就是独立分支
的个数,而与case的数目无关;count的值计算稍微复杂些,如果每个分支都
有一个case, 则count相应的加1,而如果分支对应着有两个及两个以上的
case, 则count就要加2,可以理解为,count表示是否存在多个case对应着
一个标号的情况,如果count > uniq, 则说明该情况存在。
版权声明:本文标题:switch-case指令匹配 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1714256044a672033.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论