3

我试图通过 LLVM 解析代码来在我的 C/C++ 代码中打印所有函数的名称。我参考了此处给出的示例http://llvm.org/docs/WritingAnLLVMPass.html#basic-code-required 该示例适用于 C 代码输入,但对于 C++ 输入,它在一个简单的 Hello World 程序中显示以下函数名称

__cxx_global_var_init

主要的

全球_I_a

然后我发现 LLVM 与 iostream 存在一定的问题,如下所述:http: //llvm.org/docs/FAQ.html#what-is-this-llvm-global-ctors-and-global-ia-stuff-that -happens-when-i-include-iostream

我从我的代码中删除了 iostream,然后我只得到了“main”作为输出。

但是对于可以说包含以下函数的多功能 C++ 程序:convertperm、findType 和 main(没有 iostream),我得到以下输出

_Z11convertpermSs

_Z8findtypeSs

主要的

多功能C程序正常工作

任何人都可以提供解决此问题的方法吗?

4

1 回答 1

6

欢迎来到C++ 名称修改的美妙世界:)

你的前端(我假设是 Clang)已经重命名了这些函数,一个名为mangling的过程。如果要取回原始函数名称,则需要对损坏的名称进行分解。您可以阅读链接的文章以了解更多关于为什么以及如何进行重整和拆解的信息。

据我所知,LLVM 中没有内置的 C++ 解码器,但您可以使用外部的,例如libstdc++ 的abi::__cxa_demangle.

于 2013-08-05T08:20:46.497 回答