mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-20 19:42:54 +02:00
6863d97f67
Demangling Itanium symbols either consumes the whole input or fails, but Microsoft symbols can be successfully demangled with just some of the input. Add an outparam that enables clients to know how much of the input was consumed, and use this flag to give llvm-undname an opt-in warning on partially consumed symbols. Differential Revision: https://reviews.llvm.org/D80173
37 lines
1.3 KiB
C++
37 lines
1.3 KiB
C++
//===-- Demangle.cpp - Common demangling functions ------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file This file contains definitions of common demangling functions.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Demangle/Demangle.h"
|
|
#include <cstdlib>
|
|
|
|
static bool isItaniumEncoding(const std::string &MangledName) {
|
|
size_t Pos = MangledName.find_first_not_of('_');
|
|
// A valid Itanium encoding requires 1-4 leading underscores, followed by 'Z'.
|
|
return Pos > 0 && Pos <= 4 && MangledName[Pos] == 'Z';
|
|
}
|
|
|
|
std::string llvm::demangle(const std::string &MangledName) {
|
|
char *Demangled;
|
|
if (isItaniumEncoding(MangledName))
|
|
Demangled = itaniumDemangle(MangledName.c_str(), nullptr, nullptr, nullptr);
|
|
else
|
|
Demangled = microsoftDemangle(MangledName.c_str(), nullptr, nullptr,
|
|
nullptr, nullptr);
|
|
|
|
if (!Demangled)
|
|
return MangledName;
|
|
|
|
std::string Ret = Demangled;
|
|
free(Demangled);
|
|
return Ret;
|
|
}
|