如何确定编译的哪些阶段?

How to determine which stages of compilation?

我已经尝试了plugin.def列表中定义的所有register_callback。现在我需要确定在哪个编译阶段使用哪个插件。以下是我的问题:

1)请问生成RTL树相关的源码有哪些 2) 是否可以让我的插件在 GIMPLE 或 RTL 阶段之间进行拦截? 谢谢。 谢谢

您可以考虑使用 MELT which has some few documentation regarding your question. The MELT documentation 页面对 GCC 扩展进行编码,该页面有多个指向内部和外部资源的链接,并且有一些关于如何使用 MELT 扩展 GCC 的教程。所以它也是一个路线图(阅读数周)。

GCC 运行 数百个 优化 passes". Most of them are transforming some form of Gimple into some other form of Gimple, and very probably you also want to do that (I probably don't recommend working at the RTL level). You should look at David Malcom's table of passes.

这个问题 "where to insert my pass" 很难回答,并且在很大程度上取决于您为什么(以及为什么)要自定义 GCC(直觉上,支持 Gimple 优化而不是 RTL 优化)。 运行 一些带有 -fdump-tree-all 的相关示例源代码可以帮助您理解正在发生的事情(注意转储文件的编号没有意义)。

无论您在扩展 GCC 时使用什么方法(例如,用 C++ 编写的 GCC 插件,为 GCC Python 插件编码的 GCC 扩展,用 MELT 编码的 GCC 扩展),这都很困难,因为您需要了解很多关于 GCC internal 行为的信息。你可能需要几个星期的工作,即使是一件非常简单的事情。

FWIW,GCC 内部的寄存器分配非常复杂,已经重写了好几次。您将需要数年时间才能了解它的细节(而且我当然对寄存器分配器一无所知)。也许你只是想在你的通行证中添加一些 explicit reg vars....(可能 before gimplification,或者在一些高级 gimple 上)。

您可能会认为您的需求是为 GCC 编写一些新的后端(如果您是 GCC 新手,可能需要几个月或一年的工作),利用 现有 注册分配器。你最好修补你自己的 GCC,而不是仅仅添加插件。然后一定要与 GCC 社区互动,例如详细描述您在 gcc@gcc.gnu.org 上的项目以及您目前所做的尝试。在你工作的同时发布你的 GCC 分支(至少在 github 上)(并为此预算几个月的全职工作,可能超过一年)。

为 GCC 编写一个有竞争力的寄存器分配器(设计用于许多目标处理器!)几乎是一生的工作(当然需要多年的全职工作)。