如何在 Clang 中获取 NamedDecl 的错位名称?
How do I get the mangled name of a NamedDecl in Clang?
我正在使用 Clang 来解析一些 C++ 代码。我想打印我遇到的每个 FunctionDecl
的名称和损坏的名称。
通过将此添加到我的 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;
};
损坏的名称不是 AST 的一部分,因为它取决于 ABI。要获得一个错位的名称,您需要创建一个适当的 clang::MangleContext
子类(来自 clang/AST/Mangle.h
)。目前 MicrosoftMangleContext
用于 Visual Studio 兼容的重整,ItaniumMangleContext
用于常见的 C++ ABI 重整。
在最简单的版本中,您只需调用 mangleName
,传入一个您要对其名称进行修饰的 NamedDecl
,以及一个将被修饰的名称写入的 raw_ostream
.
对于 lambda 等更复杂的东西,您可能还必须在适当的时候调用 startNewFunction
,因为它们的处理取决于它们所在的函数。
我正在使用 Clang 来解析一些 C++ 代码。我想打印我遇到的每个 FunctionDecl
的名称和损坏的名称。
通过将此添加到我的 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;
};
损坏的名称不是 AST 的一部分,因为它取决于 ABI。要获得一个错位的名称,您需要创建一个适当的 clang::MangleContext
子类(来自 clang/AST/Mangle.h
)。目前 MicrosoftMangleContext
用于 Visual Studio 兼容的重整,ItaniumMangleContext
用于常见的 C++ ABI 重整。
在最简单的版本中,您只需调用 mangleName
,传入一个您要对其名称进行修饰的 NamedDecl
,以及一个将被修饰的名称写入的 raw_ostream
.
对于 lambda 等更复杂的东西,您可能还必须在适当的时候调用 startNewFunction
,因为它们的处理取决于它们所在的函数。