GCC如何进出GIMPLE中间表示
GIMPLE中间表示,是GCC中机器无关的中间表示,机器无关的优化基本都在这个层次上做。
本文先来看看GCC是如何进、出GIMPLE中间表示的。
Table of Contents
1 从 GENERIC 到GIMPLE
GENERIC是GCC最顶层的语言无关中间表示。
GCC 利用 “gimplifier” 将 GENERIC 中间表示转换为 GIMPLE中间表示。
因为GENERIC 是语法树形式的,所以这个转换过程是递归的。
对于一个函数,GENERIC中间表示将其存储在FUNCTION_DECL树节点中的DECL_SAVED_TREE域中。
然后通过调用函数gimplify_function_tree将其转换为GIMPLE.
具体的转换过程一般是 gimplify.c: gimplify_function_tree -> gimplify_body -> gimplify_stmt -> gimplify_expr .
GIMPLE中有一个lower的动作,用于将高层次的GIMPLE表示,解析成低层次的,这个lower动作在pass_lower_cf中完成。
比如,嵌套的作用域和表达式。 可以使用选项 -fdump-tree-gimple得到类C的GIMPLE表达形式
如下面程序:
int main() { int a; if (a) { int b; b = 2 + a + b; } return 0; }
使用该选项得到的转换成C语言形式的GIMPLE中间表示为:
main () { int D.1593; int D.1594; int a; if (a != 0) goto <D.1591>; else goto <D.1592>; <D.1591>: { int b; D.1593 = a + 2; b = D.1593 + b; } <D.1592>: D.1594 = 0; return D.1594; }
2 从 GIMPLE 到 RTL
做完机器无关优化之后,GCC会将GIMPLE转换为RTL中间表示。
在RTL上,基本都是机器相关的优化,以及寄存器分配,指令调度等功能。
从GIMPLE到RTL中间表示,则是在expr.c:expand_expr_real中,
3 参考
- http://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html#GIMPLE
- http://stackoverflow.com/questions/4917756/need-help-on-gcc-gimple
- http://stackoverflow.com/questions/731639/adding-a-pass-to-gcc
- http://gcc.gnu.org/wiki/GIMPLE
- http://www.cse.iitb.ac.in/~uday/courses/cs715-09/gcc-gimple.pdf
- http://www.public.asu.edu/~kbai3/docs/Gimple.pdf
浙公网安备 33010602011771号