brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · f0f7eac Raw
75 lines · cpp
1//===-- Demangle.cpp - Common demangling functions ------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file This file contains definitions of common demangling functions.10///11//===----------------------------------------------------------------------===//12 13#include "llvm/Demangle/Demangle.h"14#include "llvm/Demangle/StringViewExtras.h"15#include <cstdlib>16#include <string_view>17 18using llvm::itanium_demangle::starts_with;19 20std::string llvm::demangle(std::string_view MangledName) {21  std::string Result;22 23  if (nonMicrosoftDemangle(MangledName, Result))24    return Result;25 26  if (starts_with(MangledName, '_') &&27      nonMicrosoftDemangle(MangledName.substr(1), Result,28                           /*CanHaveLeadingDot=*/false))29    return Result;30 31  if (char *Demangled = microsoftDemangle(MangledName, nullptr, nullptr)) {32    Result = Demangled;33    std::free(Demangled);34  } else {35    Result = MangledName;36  }37  return Result;38}39 40static bool isItaniumEncoding(std::string_view S) {41  // Itanium demangler supports prefixes with 1-4 underscores.42  const size_t Pos = S.find_first_not_of('_');43  return Pos > 0 && Pos <= 4 && S[Pos] == 'Z';44}45 46static bool isRustEncoding(std::string_view S) { return starts_with(S, "_R"); }47 48static bool isDLangEncoding(std::string_view S) { return starts_with(S, "_D"); }49 50bool llvm::nonMicrosoftDemangle(std::string_view MangledName,51                                std::string &Result, bool CanHaveLeadingDot,52                                bool ParseParams) {53  char *Demangled = nullptr;54 55  // Do not consider the dot prefix as part of the demangled symbol name.56  if (CanHaveLeadingDot && MangledName.size() > 0 && MangledName[0] == '.') {57    MangledName.remove_prefix(1);58    Result = ".";59  }60 61  if (isItaniumEncoding(MangledName))62    Demangled = itaniumDemangle(MangledName, ParseParams);63  else if (isRustEncoding(MangledName))64    Demangled = rustDemangle(MangledName);65  else if (isDLangEncoding(MangledName))66    Demangled = dlangDemangle(MangledName);67 68  if (!Demangled)69    return false;70 71  Result += Demangled;72  std::free(Demangled);73  return true;74}75