2016-11-22 62 views
2

我使用Clang來解析一些C++代碼。我想打印我遇到的每個FunctionDecl的名稱和重名。如何在Clang中獲得NamedDecl的名稱?

bool VisitFunctionDecl(FunctionDecl* f) { 

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

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

    return true; 
} 

我怎樣才能同時打印錯位的名字:

我可以通過添加這個我RecursiveASTVisitor相當輕鬆打印功能的名稱?


工作代碼,我下面塞巴斯蒂安的指針後產生:

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

錯位的名稱不是AST的一部分,因爲它取決於ABI。要得到重名的名稱,您需要創建一個合適的clang::MangleContext子類(從clang/AST/Mangle.h)。目前有MicrosoftMangleContext爲Visual Studio兼容mangling和ItaniumMangleContext爲常見的C++ ABI mangling。

在最簡單的版本中,您只需撥打mangleName,傳入您要破解名稱的NamedDecl以及寫入損壞名稱的raw_ostream。 。

對於像lambda表達式更加複雜的事情,你也可能有在適當的點調用startNewFunction,因爲他們的忙玲取決於他們在什麼功能

+0

還有,這裏有很多的小細節:幾個構造函數和析構函數的變體,虛擬方法的thunk。 clang :: index :: CodegenNameGenerator可能在這裏用作參考。 –