Demangle.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  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-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. ///
  9. /// \file This file contains definitions of common demangling functions.
  10. ///
  11. //===----------------------------------------------------------------------===//
  12. #include "llvm/Demangle/Demangle.h"
  13. #include <cstdlib>
  14. static bool isItaniumEncoding(const std::string &MangledName) {
  15. size_t Pos = MangledName.find_first_not_of('_');
  16. // A valid Itanium encoding requires 1-4 leading underscores, followed by 'Z'.
  17. return Pos > 0 && Pos <= 4 && MangledName[Pos] == 'Z';
  18. }
  19. std::string llvm::demangle(const std::string &MangledName) {
  20. char *Demangled;
  21. if (isItaniumEncoding(MangledName))
  22. Demangled = itaniumDemangle(MangledName.c_str(), nullptr, nullptr, nullptr);
  23. else
  24. Demangled = microsoftDemangle(MangledName.c_str(), nullptr, nullptr,
  25. nullptr, nullptr);
  26. if (!Demangled)
  27. return MangledName;
  28. std::string Ret = Demangled;
  29. std::free(Demangled);
  30. return Ret;
  31. }