switch-case指令匹配.docVIP

  • 8
  • 0
  • 约4.53千字
  • 约 7页
  • 2018-04-01 发布于浙江
  • 举报
switch-case指令匹配

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 *parent; /* Parent of node in binary tree */ tree low; /* Lowest index value for this label */ tree high; /* Highest index value for this label */ tree code_label; /* Label to jump to when node matches */ ; 每一个case_node结构体表示一个switch分支,每一个分支有可能对应着多个case,low和high表示的是这些case中的最小值和最大值,如果只有一个case,则二者相同;code_label是该分支对应的标号,以便跳转时使用;left, right和parent存贮的是前后分支的信息。 在switch-case语句中,是用一个包含多个case_node的向量来储存所有的分支信息的,default分支在最后一个,前面的按顺序排列,每一个node的right成员表示下一个分支。 Switch-case 语句的输出格式有三种: 以位测试和分支的形式输出,这种形式很少见; 以比较和跳转的形式输出; 先产生一个包含分支标号列表的标号,再以该标号+偏移的方式跳转,这种形式与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 中的分支信息,通过宏SWITCH_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,用两个变量minval 和 maxval 来记录所有case中的最大值和最小值, 通过相减得到range,并且在该过程中也得到count 和uniq 的值: 在这个for循环中,首先将第一个分支的最小值和最大值分别赋给minval 和 maxval,然后对于每一个分支,都将minval和其最小值比较,如果其最小值比minval还要小,就将改值赋给minval;同样也对maxval进行这样的处理,这样到最后minval和maxval的值就是所有case 中的最小值和最大值,通过maxval - minval得到range值;uniq的值较为简单,表示的就是独立分支的个数,而与case的数目无关;count的值计算稍微复杂些,如果每个分支都有一个case, 则count相应的加1,而如果分支对应着有两个及两个以上的case, 则count就要加2,可以理解为,count表示是否存在多个case对应着一个标号的情况,如果c

文档评论(0)

1亿VIP精品文档

相关文档