Is there anyway I can add some custom information to the AST?

Hi, all.
I’m writing some tools to convert a C++ class to something else, and I want to add some custom information to the AST.

At first, I decided to add some comments to mark some classes, but I found that the AST does not contain comments.

Secondly, I want to customize an attribute, but I found that it needs to recompile the Clang, I didn’t find a “plug-in” way. Since my tools are designed for public usage, a customized compiler is not very considerable.

Currently I have to force the user to declare their class names and field names with some special rules, but this is not very acceptable to me.

So anyone knows if there’s a better way to add some custom information to the AST?

Hi Yafei,

You can use the Attribute system to decorate AST nodes, they can also
be loaded via plugins. See `clang/examples/Attrbiute/` to see how they
are created and registered.

Then you can add an attribute to the class decl, for example

class [[convert]] MyVector {};

Hope this helps,
Nathan James

Hi Nathan, I found that this example is based on clang11, my clang10 libraries do not have corresponding classes. I read the clang11 release note, which is in progressing, and found that in https://clang.llvm.org/docs/ReleaseNotes.html#attribute-changes-in-clang, attribute plugin is a new feature.

So does it mean:

  1. Even if I implemented an attribute plugin (with the code on master branch), I have to wait until Clang11 has released?
  2. Or, the attribute plugin can be used in older versions of Clang?

By means " I have to wait until Clang11 has released", I mean I have to wait for Clang11 to make my plugin a public use (used by others).

You might be able to use the annotate attribute, as that's one of the
purposes it serves: https://godbolt.org/z/_Ggr6e

~Aaron

Consider using the attribute ‘annotate’. It doesn’t seem to be documented on our page unfortunately, but it applies to a declaration and takes an arbitrary string: [[clang::annotate(“asdf”)]]

OR: attribute((annotate(“asdf”)))