Next: , Previous: Parsing pass, Up: Passes


9.2 Gimplification过程

Gimplification是一个离奇的术语,用来表示将函数的中间表示转换为GIMPLE语言的过程。The term stuck,所以像“gimplification”, “gimplify”, “gimplifier” 等类似的单词会分布在这部分代码中。

当然,尽管前端可以选择直接生成GIMPLE,但如果这样,则处理起来可能会有些复杂,除非前端使用的中间语言非常简单。通常生成GENERIC树以及其扩展会相对容易些,并且让语言独立的gimplifier来多大部分的工作。

这个过程的主入口点是gimplify_function_tree,位于gimplify.c中。我们从这里处理整个函数,依次的对每条语句进行gimplify。这个过程的主要工作是gimplify_expr。几乎每个处理都需要经过这里一次,并且我们是从这里来调用lang_hooks.gimplify_expr回调的。

回调函数应该考虑检查表达式,并且当表达式不是一个需要注意的语言特定的结构,则返回GS_UNHANDLES。否则,应该通过某种方式修改表达式使得可以产生合法的GIMPLE。如果回调函数确定已经完全转换,并且表达式是合法的GIMPLE,则应该返回GS_ALL_DONE。否则,应该返回GS_OK,这将会使得表达式会被再次处理。如果回调函数在转换过程中遇到一个错误(因为前端依赖于gimplification处理来完成语义检测),则应该返回GS_ERROR