【发布时间】:2017-04-06 01:18:08
【问题描述】:
我正在使用 Clang 来解析一些 C++ 代码。我想为遇到的每个FunctionDecl 打印名称和错误名称。
通过将其添加到我的RecursiveASTVisitor,我可以相当轻松地打印函数名称:
bool VisitFunctionDecl(FunctionDecl* f) {
auto declName = f->getNameInfo().getName();
auto functionName = declName.getAsString();
std::cout << functionName << std::endl;
return true;
}
我怎样才能打印损坏的名称?
我按照 Sebastian 的指示生成的工作代码:
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;
};
【问题讨论】:
-
我知道这已经很久了,但是如果提前返回,你的工作代码会泄露 mangle 上下文。您应该在智能指针中捕获它。
标签: c++ clang llvm name-mangling