【问题标题】:How do I get the mangled name of a NamedDecl in Clang?如何在 Clang 中获取 NamedDecl 的错位名称?
【发布时间】: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


【解决方案1】:

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

在最简单的版本中,您只需调用mangleName,传入一个您要修改其名称的NamedDecl,以及一个写入修改名称的raw_ostream

对于更复杂的东西,比如 lambda,您可能还需要在适当的时候调用 startNewFunction,因为它们的修饰取决于它们所在的函数。

【讨论】:

  • 此外,这里和那里还有很多小细节:构造函数和析构函数的几个变体,虚拟方法的 thunk。 clang::index::CodegenNameGenerator 可以在这里作为参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
相关资源
最近更新 更多