理论教育 RTL概述-深入解析编译器设计之路

RTL概述-深入解析编译器设计之路

时间:2023-11-04 理论教育 版权反馈
【摘要】:与GIMPLE相比,即将介绍的RTL名气要大得多。在GCC中,大多数工作都是基于RTL完成的。囿于篇幅,笔者并没有给出该源程序的完整RTL形式。相对于GIMPLE而言,RTL的形式似乎比较复杂。事实上,对于有志于研究GCC内核的读者而言,熟练阅读RTL是必不可少的。关于本例RTL的含义,暂不作解释。RTL在可变目标方面的表现是令人满意的,这恐怕是最有力的例证。不过,RTL的字符串是不会为空值的。完整的RTL就是由这5种对象组合而成的。

RTL概述-深入解析编译器设计之路

与GIMPLE相比,即将介绍的RTL名气要大得多。在GCC中,大多数工作都是基于RTL完成的。在GIMPLE被引入GCC之前,所有的优化工作都集中在RTL上进行。因此,GCC内核中最重要的RTL是值得读者深入学习的。

RTL是一种线性结构的IR,但并不是人们所想象的三地址码形式。RTL的灵感源于Lisp的lists结构,它也有两种形式,即内部形式与文本形式。其中,内部形式是以结构、指针数据结构存储的,主要用于GCC内部使用与管理。而文本形式则是专门用于屏幕输出的形式。这与GIMPLE是一样的,只不过GIMPLE的文本形式是一种类似C程序而己。笔者先举一个例子,以便读者对RTL有感性认识。在GCC中,读者可以使用“-fdump-rtl-all”参数输出所有的RTL。注意,参数中的“all”是一个粒度选项,也可以根据实际需要设置,详细的选项说明请参考GCC网站。

例10-12 RTL实侈0。

囿于篇幅,笔者并没有给出该源程序的完整RTL形式。相对于GIMPLE而言,RTL的形式似乎比较复杂。的确,从形式上而言,即使是文本形式输出的RTL也不太直观。当然,主要原因还是初次见面,稍显生疏。相信稍加练习后,这一切将变得非常简单。事实上,对于有志于研究GCC内核的读者而言,熟练阅读RTL是必不可少的。关于本例RTL的含义,暂不作解释。当阅读完本书后,理解本例中的RTL应该并不困难。下面,笔者将详细阐述RTL的结构与设计。

值得注意的是,与其他IR不同,RTL是一种比较依赖于目标机的设计方案。这是一种非常重要的IR设计理念,它对传统的IR设计提出了挑战。虽然在过去的二十年中,大多数编译器设计者对于这种观点仍保持谨慎,但始终没有对RTL的能力表示怀疑。RTL在可变目标方面的表现是令人满意的,这恐怕是最有力的例证。

RTL主要使用了5种对象:表达式、整数、宽整数、字符串、向量。(www.daowen.com)

RTL表达式(简称为“RTX”)是一种类似于C语言表达式的结构,RTX内部形式就是一棵表达式树。而RTX的文本形式是以Lisp的lists输出,实际上,这种形式与数据结构中的广义表的文本形式是一脉相承的。RTX是RTL的核心,也是最复杂的部分。

整数、宽整数也就是普通的整数常量,通常用十进制形式表示。其中,整数就是C语言的int,而宽整数是一种合成对象。

字符串的内核与C语言的字符指针是一样的,或者说,RTL就是参考char*实现的。不过,RTL的字符串是不会为空值的。如果试图描述一个空字符串,它将被描述成一个空指针,而不是一个指向空字符的指针,请读者仔细琢磨其中的差异。

向量也就是用于存储指向表达式指针的一维数组,向量通常被书写为[expl…expn],当然,与数组类似,长度为0的向量是不存在的。

完整的RTL就是由这5种对象组合而成的。实际上,其中最核心的就是RTX,其他的对象并不复杂。下面,笔者将详细谈谈RTX的相关话题。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈