我可以利用 Clang 静态库中的扩展点将元数据添加到函数中吗?

Are there extension points in the Clang static libraries that I can leverage to add metadata to functions?

我正在从事一个项目,该项目使用 Clang 静态库(不是 libclang)解析 C 头文件以进行二进制程序分析。我使用 AST,不依赖 codegen。

我希望能够通过修改它们出现的头文件来向函数添加一些额外的元数据。具体来说,我想在二进制程序中添加函数的预期地址。这可能是一种方法:

int foo(int bar) __attribute__((address(0xdeadbeef)));

属性特别方便,因为它们很容易嵌入到宏中,最终看起来像:

#define ADDRESS(x) __attribute__((address(x)))
int foo(int bar) ADDRESS(0xdeadbeef);

由于这是一个仅由我维护的开源项目,我宁愿不分叉 Clang,而只允许人们使用他们的发行版的库存 Clang 包来构建我的程序。可悲的是,这显然意味着我不能为此目的使用属性,因为属性列表似乎是硬编码到 Clang 中的,而且似乎没有任何属性可供我选择用于此目的。

我可以在 Clang 静态库中利用扩展点来实现这一点吗?

Per Eli Friedmanannotate 属性可用于此目的。一个示例用法是:

int foo(int bar) __attribute__((annotate("address:0xdeadbeef")));