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

时间:2016-11-22 11:24:10

标签: 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;
}

我怎样才能打印受损的名字?

我按照塞巴斯蒂安的指示制作了我的工作代码:

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;
};

1 个答案:

答案 0 :(得分:5)

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

在最简单的版本中,您只需调用mangleName,传入要修改其名称的NamedDecl,并将raw_ostream写入已修改的名称。< / p>

对于像lambdas这样的更复杂的事情,你可能还必须在适当的位置调用startNewFunction,因为它们的重整取决于它们所处的功能。