Я использую 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;
};
Кроме того, есть много мелких деталей здесь и там: несколько варианты для конструкторов и деструкторов, трюки для виртуальных методов. clang :: index :: CodegenNameGenerator может использоваться здесь как ссылка. –