我已经尝试了plugin.def列表中定义的所有register_callback。现在我需要确定在哪个编译阶段使用哪个插件。以下是我的问题:
1)我可以知道与生成RTL树相关的源代码是什么 2)是否可以在GIMPLE或RTL阶段之间插入我的插件? 谢谢。 感谢
答案 0 :(得分:0)
您可以考虑使用MELT对您的GCC扩展进行编码,其中包含一些关于您的问题的文档。 MELT documentation页面有几个内部和外部资源的链接,并有一些关于如何使用MELT扩展GCC的教程。所以它也是一个路线图(几周阅读)。
GCC运行数百的"优化passes"。他们中的大多数正在将某种形式的Gimple转换为其他形式的Gimple,很可能你也想这样做(我可能不建议在RTL级别工作)。你应该看看David Malcom的table of passes。
问题"在哪里插入我的通行证"难以回答,并且很大程度上依赖于为什么(以及为什么)要自定义GCC(直观地说,优于对RTL优化的Gimple优化)。使用-fdump-tree-all
运行一些相关的示例源代码可以帮助您了解正在发生的事情(告诫转储文件的编号毫无意义)。
无论你使用什么方法扩展GCC(例如你用G ++编写的GCC插件,你的GCC扩展编码为GCC Python插件,你的GCC扩展编码在MELT中),都很难,因为你需要了解很多关于GCC < em>内部行为。你可能需要几周的工作,即使是非常简单的事情。
FWIW,GCC内部的寄存器分配非常复杂,并且已被重写多次。您需要多年才能了解其详细信息(我当然不了解寄存器分配器)。也许你只想在你的传递中添加一些explicit reg vars ....(可能在 gimplification之前,或者在一些高级别的gimple上)。
您可以考虑将自己的需求视为为GCC编写一些新的后端(如果您是GCC新手,可能是几个月,或者可能是一年的工作),并利用现有的注册分配器。您最好修补自己的GCC而不是仅添加插件。然后一定要与GCC社区互动,例如在gcc@gcc.gnu.org
上描述你的项目以及你到目前为止所尝试的内容。在你工作的时候发布你的GCC分支(至少在github上)(预算几个月的全职工作,可能超过一年)。
为GCC编写一个竞争性的寄存器分配器(旨在为许多目标处理器工作!)几乎是一生的工作(当然需要多年的全职工作)。