- 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
您可能关注的文档
- MSSQL 2000的安装方法.doc
- MSSQL 2005数据库和登陆名创建教程.doc
- MSSQL GUID Identity.doc
- MSSQL2000数据库软件安装.doc
- MSSQL2000集群.doc
- KK2011FP指纹读卡器使用说明书(含软件).doc
- MSSQL2005安装说明.doc
- MSSQL_2000数据库详细安装教程.doc
- mssqlserver2000企业版安装教程.doc
- MSSQL与Oracle函数区别.doc
- 2025-2026学年天津市和平区高三(上)期末数学试卷(含解析).pdf
- 2025-2026学年云南省楚雄州高三(上)期末数学试卷(含答案).pdf
- 2025-2026学年甘肃省天水市张家川实验中学高三(上)期末数学试卷(含答案).docx
- 2025-2026学年福建省厦门市松柏中学高二(上)期末数学试卷(含答案).docx
- 2025-2026学年广西钦州市高一(上)期末物理试卷(含答案).docx
- 2025-2026学年河北省邯郸市临漳县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省石家庄二十三中七年级(上)期末历史试卷(含答案).docx
- 2025-2026学年海南省五指山市九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省唐山市玉田县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省邢台市市区九年级(上)期末化学试卷(含答案).docx
最近下载
- 罗伯特·S.平狄克-微观经济学(第九版)PindyckPPT_Ch.6.pptx VIP
- 罗伯特·S.平狄克-微观经济学(第九版)PindyckPPT_Ch.5.pptx VIP
- DB14T 1098-2024奶牛规模养殖技术规程.pdf VIP
- 《卫生微生物学检验》课件——04-化妆品中铜绿假单胞菌的检测.pptx VIP
- 2025年春顶尖课课练八年级物理下册沪科版答案.pdf VIP
- 罗伯特·S.平狄克-微观经济学(第九版)PindyckPPT_Ch.4.pptx VIP
- 青岛酒店管理职业技术学院单招《数学》模拟试题附答案详解【预热题】.docx VIP
- 古诗江上渔者.pptx VIP
- 罗伯特·S.平狄克-微观经济学(第九版)PindyckPPT_Ch.3.pptx VIP
- (2026春新版)人教版三年级数学下册全册教案.pdf
原创力文档

文档评论(0)