用于解释自定义 c++11 属性的 Clang/GCC 插件

Posted

技术标签:

【中文标题】用于解释自定义 c++11 属性的 Clang/GCC 插件【英文标题】:Clang/GCC plugin to interpret custom c++11 attributes 【发布时间】:2014-10-12 15:39:30 【问题描述】:

我正在尝试为 clang 或 gcc 编写一个插件来解释自定义 [[cxx11::attributes]] 并基于此生成一些代码。

从 4.5 版开始,gcc 支持几乎每个编译步骤都可以挂接的插件。但是,我认为 gcc 不太清楚如何修改其 AST 并通过它导航(至少我在尝试时遇到了麻烦......)。

然后我记得 clang 被设计为扩展并用作库,我试了一下。在挖掘之后,我发现一些主题说 clang 不支持自定义属性。我哭了。

我的主要目标是根据用户可以在代码中使用的任何类型的注释生成代码。我想使用 c++11 属性,因为它们非常清晰。编译指示也是一种选择,但它们有一些限制。

以下是问题:

1) 真的(目前)不可能在 clang 中拥有自定义属性吗? 2)学习gcc内部的最好方法是什么? (我阅读了很多页的文档,但他们仍然没有说出我想要的) 3) gcc 是否有一些转储功能来像 clang 一样打印它的 AST?探索它的树会有很大帮助。

谢谢!任何信息/提示将不胜感激!

【问题讨论】:

clang 中的自定义属性只需要您自己修改clang。这不是很困难,但文档很少。 Here's a tutorial 我已经阅读了该文档,但我有点失望......普通用户必须下载自定义的 clang 才能使用我的插件,这不是重点。 您想到了哪些附加注释?干什么用的? 我在考虑序列化的东西。就像标记将被序列化的类的字段(可选或强制)。记录信息,将对象写入数据库。自动将包装器写入python等。我有很多想法,我什至不知道从哪里开始哈哈。但在此之前,我需要操纵 AST。我需要先解决这个问题。简而言之,我想为通常的样板代码创建一个快捷方式。 @MasterId:有趣的目标。你最好编辑你的问题告诉他们。 【参考方案1】:

GCC 插件特定于 GCC,甚至(原则上)特定于 GCC 的特定版本(无法保证为 GCC 4.8 编码的插件可以在 GCC 4.9 上运行)。

您可以考虑使用 MELT 扩展 GCC,这是一种扩展 GCC 的 lispy 域特定语言,实现为 GCC(元)插件。

但是,您需要了解 GCC 的内部表示(Gimple、Trees、pass manager 等)。首先阅读我在GCC plugins thru the MELT example 上的幻灯片(Linux 协作峰会,2014 年 3 月)

您可以使用插件和 MELT 轻松添加 GCC attributes,可能还可以添加 C++11 属性。

是的,GCC 有很多可能的转储(尝试使用-fdump-tree-all)。

您最好使用最新版本的 GCC(例如 4.9.1)和 MELT(例如 1.1.2 或更高版本;我可能会在一两周内发布 MELT 1.1.3)

【讨论】:

我会看看 MELT。但是像 LISP 这样的语言对我来说听起来不太好……不过我在你的幻灯片中发现了一些有趣的东西!谢谢! 你能解释一下为什么像 LISP 这样的语言听起来不好吗?我很乐意聊天(或者你可以给我发电子邮件)。 你好 Basile,我已经给你发邮件了!

以上是关于用于解释自定义 c++11 属性的 Clang/GCC 插件的主要内容,如果未能解决你的问题,请参考以下文章

用于深层嵌套对象的自定义Json Serializer

C入门11自定义数据类型

自定义验证属性 - 有效整数

vue常用属性解释。

jquery:获取自定义属性的值

Ellipsize 不适用于自定义 listView 中的 textView