我试图通过LLVM解析代码,在我的C / C ++代码中打印所有函数的名称。我参考了这里给出的例子http://llvm.org/docs/WritingAnLLVMPass.html#basic-code-required 该示例适用于C代码输入,但对于C ++输入,它在简单的Hello World程序中显示以下函数名称
__ cxx_global_var_init
主
GLOBAL _I_a
然后我发现LLVM与iostream有一定的问题,如下所述:http://llvm.org/docs/FAQ.html#what-is-this-llvm-global-ctors-and-global-i-a-stuff-that-happens-when-i-include-iostream
我从代码中删除了iostream,然后我只将“main”作为输出。
但对于一个多功能的C ++程序,让我们说包含以下函数:convertperm,findType和main(没有iostream),我得到以下输出
_Z11convertpermSs
_Z8findtypeSs
主
多功能C程序正常工作
任何人都可以解决此问题吗?
答案 0 :(得分:5)
欢迎来到C++ name mangling精彩的世界:)
你的前端(Clang,我假设)已经重命名了这些函数,这个过程叫做 mangling 。如果您想要恢复原始函数名称,则需要 demangle 受损的名称。您可以阅读链接的文章,以了解更多关于为何以及如何进行修剪和消除处理的信息。
据我所知,LLVM中没有内置的C ++ demangler,但你可以使用外部的{+ 3}}。