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 に関する特定の問題があることがわかりました。 -happens-when-i-include-iostream

コードから iostream を削除したところ、出力として "main" のみが得られました。

しかし、convertperm、findType、および main (iostream を持たない) という関数が含まれている多機能 C++ プログラムの場合、次の出力が得られました。

_Z11convertpermSs

_Z8findtypeSs

主要

多機能 C プログラムが正常に動作する

誰でもこの問題を解決できますか?

4

1 に答える 1

6

C++ 名前マングリングの素晴らしい世界へようこそ:)

あなたのフロントエンド (Clang だと思います) は、これらの関数の名前を変更しました。これはmanglingと呼ばれるプロセスです。元の関数名を取り戻したい場合は、マングルされた名前をデマングルする必要があります。リンクされた記事を読んで、マングリングとデマングリングが行われる理由と方法について詳しく知ることができます。

私の知る限り、LLVM には組み込みの C++ デマングラーはありませんが、libstdc++abi::__cxa_demangleなどの外部デマングラーを使用できます。

于 2013-08-05T08:20:46.497 に答える