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

sdg*_*sdh 4 c++ llvm clang 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;
}
Run Code Online (Sandbox Code Playgroud)

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


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

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;
};
Run Code Online (Sandbox Code Playgroud)

Seb*_*edl 5

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

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

对于像lambdas这样的更复杂的东西,你可能还需要startNewFunction在适当的位置调用,因为它们的重整取决于它们所处的功能.