2016-11-22 8 views
2

Я использую Clang для анализа кода на C++. Я хотел бы напечатать имя и искаженное имя для каждых FunctionDecl, с которыми я сталкиваюсь.Как получить искаженное имя NamedDecl в Clang?

я могу напечатать имя функции достаточно легко, добавив в моей 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

искореженного имя не является частью AST, так как это зависит от ABI. Чтобы получить искаженное имя, вам необходимо создать соответствующий подкласс clang::MangleContext (от clang/AST/Mangle.h). В настоящее время существует MicrosoftMangleContext для управления, совместимого с Visual Studio, и ItaniumMangleContext для общего использования C++ ABI.

В самом простом варианте, то вы просто звоните mangleName, переходящая в NamedDecl, имя которого вы хотите калечить, и raw_ostream, что искаженное имя записывается в. .

Для более сложных вещей, как лямбды, вы можете также позвонить startNewFunction в соответствующих точках, так как их коверкание зависит от того, какие функции они в

+0

Кроме того, есть много мелких деталей здесь и там: несколько варианты для конструкторов и деструкторов, трюки для виртуальных методов. clang :: index :: CodegenNameGenerator может использоваться здесь как ссылка. –