2013-08-05 18 views
2

我試圖通過LLVM解析代碼在我的C/C++代碼中打印所有函數的名稱。我提到這裏http://llvm.org/docs/WritingAnLLVMPass.html#basic-code-required 給出的示例中的示例工作正常,C代碼輸入,但是對於C++輸入時,它會顯示以下一個簡單的Hello World程序LLVM中的FunctionPass for C++輸入

__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和主(沒有的iostream),我得到了下面的輸出

_Z11convertpermSs

_Z8findtypeSs

主要

多功能C程序正常工作

任何人都可以提供自動對焦九,這個問題?

+0

使用'C++ filt'工具來轉換mangled名稱。如果您只想打印來自源文件(不是包含的頭文件)的聲明,請使用調試元數據。 –

回答

4

歡迎C++ name mangling :)

您的前端(鐺,我假設)的精彩世界已更名爲這些功能,這個過程被稱爲重整。如果你想獲得原始函數名稱,你需要demangle這個破損的名字。您可以閱讀鏈接的文章以瞭解更多關於爲什麼以及如何完成整理和去除處理的信息。

據我所知,LLVM中沒有內置的C++ demangler,但可以使用外部函數,例如libstdc++'s abi::__cxa_demangle

+0

有沒有什麼辦法可以阻止編譯器進行修改?我的編譯器是clang ++。 –

+0

@RohanBhalla是的,[在你的函數中使用'extern「C」'](http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c) 。 – Oak