//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// #include "CommandObjectCPlusPlus.h" #include "lldb/Core/Mangled.h" #include "lldb/Interpreter/CommandReturnObject.h" using namespace lldb; using namespace lldb_private; CommandObjectCPlusPlusDemangle::CommandObjectCPlusPlusDemangle( CommandInterpreter &interpreter) : CommandObjectParsed(interpreter, "demangle", "Demangle a C++ mangled name.", "language cplusplus demangle [ ...]") { AddSimpleArgumentList(eArgTypeSymbol, eArgRepeatPlus); } void CommandObjectCPlusPlusDemangle::DoExecute(Args &command, CommandReturnObject &result) { bool demangled_any = false; bool error_any = false; for (auto &entry : command.entries()) { if (entry.ref().empty()) continue; // the actual Mangled class should be strict about this, but on the // command line if you're copying mangled names out of 'nm' on Darwin, // they will come out with an extra underscore - be willing to strip this // on behalf of the user. This is the moral equivalent of the -_/-n // options to c++filt auto name = entry.ref(); if (name.starts_with("__Z")) name = name.drop_front(); Mangled mangled(name); if (mangled.GuessLanguage() == lldb::eLanguageTypeC_plus_plus) { ConstString demangled(mangled.GetDisplayDemangledName()); demangled_any = true; result.AppendMessageWithFormatv("{0} ---> {1}", entry.c_str(), demangled.GetCString()); } else { error_any = true; result.AppendErrorWithFormat("%s is not a valid C++ mangled name\n", entry.ref().str().c_str()); } } result.SetStatus( error_any ? lldb::eReturnStatusFailed : (demangled_any ? lldb::eReturnStatusSuccessFinishResult : lldb::eReturnStatusSuccessFinishNoResult)); } CommandObjectCPlusPlus::CommandObjectCPlusPlus(CommandInterpreter &interpreter) : CommandObjectMultiword( interpreter, "cplusplus", "Commands for operating on the C++ language runtime.", "cplusplus []") { LoadSubCommand("demangle", CommandObjectSP(new CommandObjectCPlusPlusDemangle( interpreter))); }