用于C ++输入的LLVM中的FunctionPass

时间:2013-08-05 07:42:40

标签: compiler-construction llvm llvm-clang

我试图通过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程序正常工作

任何人都可以解决此问题吗?

1 个答案:

答案 0 :(得分:5)

欢迎来到C++ name mangling精彩的世界:)

你的前端(Clang,我假设)已经重命名了这些函数,这个过程叫做 mangling 。如果您想要恢复原始函数名称,则需要 demangle 受损的名称。您可以阅读链接的文章,以了解更多关于为何以及如何进行修剪和消除处理的信息。

据我所知,LLVM中没有内置的C ++ demangler,但你可以使用外部的{+ 3}}。