2016-11-22 10 views
2

私はClangを使っていくつかのC++コードを解析しています。私が遭遇するすべてのFunctionDeclの名前と難解な名前を印刷したいと思います。ClangでNamedDeclの名前を変更するにはどうすればよいですか?

私は私のRecursiveASTVisitorにこれを追加することによって、比較的簡単に関数名を印刷することができます。

bool VisitFunctionDecl(FunctionDecl* f) { 

    auto declName = f->getNameInfo().getName(); 
    auto functionName = declName.getAsString(); 

    std::cout << functionName << std::endl; 

    return true; 
} 

どのようにしても、マングルされた名前を印刷することができますか?


私はセバスチャンのポインタを次後に生成の作業コード:

const auto getMangledName = [&](FunctionDecl* decl) { 

    auto mangleContext = context.createMangleContext(); 

    if (!mangleContext->shouldMangleDeclName(decl)) { 
    return decl->getNameInfo().getName().getAsString(); 
    } 

    std::string mangledName; 
    llvm::raw_string_ostream ostream(mangledName); 

    mangleContext->mangleName(decl, ostream); 

    ostream.flush(); 

    delete mangleContext; 

    return mangledName; 
}; 

答えて

4

それはABIに依存するため、マングルされた名前は、ASTの一部ではありません。変更された名前を取得するには、適切なclang::MangleContextサブクラス(clang/AST/Mangle.h)を作成する必要があります。現在、Visual Studio互換のマングリングにはMicrosoftMangleContext、一般的なC++ ABIマングリングにはItaniumMangleContextがあります。

最も単純なバージョンでは、を呼び出して、名前を変更するNamedDeclと、変更した名前が書き込まれるraw_ostreamを渡します。ラムダのような、より複雑なもののため

彼らのマングリングは、彼らがしている何の機能に依存するため、あなたはまた、適切なポイントでstartNewFunctionを呼び出す必要があり

+0

また、細部の多くがあちこちあります。いくつかのコンストラクタとデストラクタのバリエーション、仮想メソッドのサンクス。 clang :: index :: CodegenNameGeneratorはここで参照として使用できます。 –

関連する問題