我试图编写一个插件来clang或gcc来解释自定义[[cxx11 :: attributes]]并根据它生成一些代码。
从4.5版开始,gcc支持几乎每个编译步骤都可以挂钩的插件。但是,我认为gcc并不十分清楚如何修改它的AST并在其中导航(至少我在尝试时间很糟糕......)。
然后我记得clang被设计为扩展并用作库,我试了一下。在挖掘后我发现一些主题说clang不支持自定义属性。我哭了。
我的主要目标是根据用户可以在代码中使用的任何类型的注释生成代码。我想使用c ++ 11属性,因为它们非常清晰。语用库也是一种选择,但它们有一些限制。
以下是问题:
1)在clang中是否真的(目前)不可能拥有自定义属性? 2)学习gcc内部的最佳方法是什么? (我读了很多文档,但他们还没说出我想要的内容) 3)gcc是否有一些转储功能来打印它的AST就像clang一样?探索它的树会有很大的帮助。
谢谢!任何信息/提示将不胜感激!
答案 0 :(得分:3)
GCC插件特定于GCC,甚至(原则上)特定版本的GCC(不能保证为GCC 4.8编码的插件可以在GCC 4.9上运行)。
您可以考虑使用MELT扩展GCC,这是一种扩展GCC的lispy域特定语言,实现为GCC(元)插件。
但是,您需要了解GCC的内部表示(Gimple,Trees,传递管理器......)。首先阅读GCC plugins thru the MELT example上的幻灯片(Linux协作峰会,2014年3月)
您可以轻松添加GCC attributes插件和MELT,也可能添加C ++ 11属性。
是的,GCC有很多可能的转储(尝试使用-fdump-tree-all
)。
您最好使用最新版本的GCC(例如4.9.1)和MELT(例如1.1.2或更高版本;我可能会在一两周内发布MELT 1.1.3)