【问题标题】:FunctionPass in LLVM for C++ input用于 C++ 输入的 LLVM 中的 FunctionPass
【发布时间】:2013-08-05 07:42:39
【问题描述】:

我试图通过 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-i-a-stuff-that-happens-when-i-include-iostream

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

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

_Z11convertpermSs

_Z8findtypeSs

主要

多功能C程序正常工作

谁能解决这个问题?

【问题讨论】:

  • 使用c++filt 工具转换错位名称。如果您只想打印来自源文件(而不是包含的标头)的声明,请使用调试元数据。

标签: compiler-construction llvm llvm-clang


【解决方案1】:

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

您的前端(我假设是 Clang)重命名了这些函数,一个名为 mangling 的过程。如果您想取回原来的函数名称,您需要 demangle 损坏的名称。您可以阅读链接文章,详细了解为什么以及如何进行重整和拆解。

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

【讨论】:

猜你喜欢
  • 2016-03-16
  • 2011-01-30
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多