c++ - 如何在 Clang 中获取 NamedDecl 的错位名称?

标签 c++ clang llvm name-mangling

我正在使用 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;
};

最佳答案

错位的名称不是 AST 的一部分,因为它取决于 ABI。要获得一个错位的名称,您需要创建一个适当的 clang::MangleContext 子类(来自 clang/AST/Mangle.h)。目前,MicrosoftMangleContext 用于 Visual Studio 兼容的重整,ItaniumMangleContext 用于常见的 C++ ABI 重整。

在最简单的版本中,您随后只需调用 mangleName,传入一个您要修改其名称的 NamedDecl 和一个 raw_ostream将损坏的名称写入。

对于像 lambdas 这样更复杂的东西,您可能还必须在适当的时候调用 startNewFunction,因为它们的重整取决于它们所在的函数。

关于c++ - 如何在 Clang 中获取 NamedDecl 的错位名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40740604/

相关文章:

c++ - Clang 真的有这么聪明吗?

c++ - 有什么方法可以在抽象基类中使用模板函数?

c++ - 如何使用addrinfo初始化sockaddr_in

c++ - 如何修复类函数 "prototype does not match"和 "cadidate is"错误

c++ - GCC/Clang 未优化静态全局变量

c - 有没有办法告诉 gcc/clang 将一些代码块放在一起?

c++ - 按值或引用 const 传递 std::chrono::duration?

c++ - 如何将 XCode 的 libc++ 与 top-of-trunk clang 一起使用?

c++ - 编译 clang-llvm 示例

c++ - LLVM-clang 编译器优化器以一种非常奇怪的方式重新排列代码,怎么办?