#include "CommandObjectType.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/IOHandler.h"
#include "lldb/DataFormatters/DataVisualization.h"
#include "lldb/DataFormatters/FormatClasses.h"
#include "lldb/Host/Config.h"
#include "lldb/Host/OptionParser.h"
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Interpreter/CommandObject.h"
#include "lldb/Interpreter/CommandOptionArgumentTable.h"
#include "lldb/Interpreter/CommandReturnObject.h"
#include "lldb/Interpreter/OptionArgParser.h"
#include "lldb/Interpreter/OptionGroupFormat.h"
#include "lldb/Interpreter/OptionValueBoolean.h"
#include "lldb/Interpreter/OptionValueLanguage.h"
#include "lldb/Interpreter/OptionValueString.h"
#include "lldb/Interpreter/Options.h"
#include "lldb/Symbol/Symbol.h"
#include "lldb/Target/Language.h"
#include "lldb/Target/StackFrame.h"
#include "lldb/Target/Target.h"
#include "lldb/Target/Thread.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/Utility/RegularExpression.h"
#include "lldb/Utility/StringList.h"
#include "llvm/ADT/STLExtras.h"
#include <algorithm>
#include <functional>
#include <memory>
usingnamespacelldb;
usingnamespacelldb_private;
class ScriptAddOptions { … };
class SynthAddOptions { … };
static bool WarnOnPotentialUnquotedUnsignedType(Args &command,
CommandReturnObject &result) { … }
const char *FormatCategoryToString(FormatCategoryItem item, bool long_name) { … }
#define LLDB_OPTIONS_type_summary_add
#include "CommandOptions.inc"
class CommandObjectTypeSummaryAdd : public CommandObjectParsed,
public IOHandlerDelegateMultiline { … };
static const char *g_synth_addreader_instructions = …;
#define LLDB_OPTIONS_type_synth_add
#include "CommandOptions.inc"
class CommandObjectTypeSynthAdd : public CommandObjectParsed,
public IOHandlerDelegateMultiline { … };
#define LLDB_OPTIONS_type_format_add
#include "CommandOptions.inc"
class CommandObjectTypeFormatAdd : public CommandObjectParsed { … };
#define LLDB_OPTIONS_type_formatter_delete
#include "CommandOptions.inc"
class CommandObjectTypeFormatterDelete : public CommandObjectParsed { … };
#define LLDB_OPTIONS_type_formatter_clear
#include "CommandOptions.inc"
class CommandObjectTypeFormatterClear : public CommandObjectParsed { … };
class CommandObjectTypeFormatDelete : public CommandObjectTypeFormatterDelete { … };
class CommandObjectTypeFormatClear : public CommandObjectTypeFormatterClear { … };
#define LLDB_OPTIONS_type_formatter_list
#include "CommandOptions.inc"
template <typename FormatterType>
class CommandObjectTypeFormatterList : public CommandObjectParsed { … };
class CommandObjectTypeFormatList
: public CommandObjectTypeFormatterList<TypeFormatImpl> { … };
Status CommandObjectTypeSummaryAdd::CommandOptions::SetOptionValue(
uint32_t option_idx, llvm::StringRef option_arg,
ExecutionContext *execution_context) { … }
void CommandObjectTypeSummaryAdd::CommandOptions::OptionParsingStarting(
ExecutionContext *execution_context) { … }
#if LLDB_ENABLE_PYTHON
bool CommandObjectTypeSummaryAdd::Execute_ScriptSummary(
Args &command, CommandReturnObject &result) {
const size_t argc = command.GetArgumentCount();
if (argc < 1 && !m_options.m_name) {
result.AppendErrorWithFormat("%s takes one or more args.\n",
m_cmd_name.c_str());
return false;
}
TypeSummaryImplSP script_format;
if (!m_options.m_python_function
.empty())
{
const char *funct_name = m_options.m_python_function.c_str();
if (!funct_name || !funct_name[0]) {
result.AppendError("function name empty.\n");
return false;
}
std::string code =
(" " + m_options.m_python_function + "(valobj,internal_dict)");
script_format = std::make_shared<ScriptSummaryFormat>(
m_options.m_flags, funct_name, code.c_str());
ScriptInterpreter *interpreter = GetDebugger().GetScriptInterpreter();
if (interpreter && !interpreter->CheckObjectExists(funct_name))
result.AppendWarningWithFormat(
"The provided function \"%s\" does not exist - "
"please define it before attempting to use this summary.\n",
funct_name);
} else if (!m_options.m_python_script
.empty())
{
ScriptInterpreter *interpreter = GetDebugger().GetScriptInterpreter();
if (!interpreter) {
result.AppendError("script interpreter missing - unable to generate "
"function wrapper.\n");
return false;
}
StringList funct_sl;
funct_sl << m_options.m_python_script.c_str();
std::string funct_name_str;
if (!interpreter->GenerateTypeScriptFunction(funct_sl, funct_name_str)) {
result.AppendError("unable to generate function wrapper.\n");
return false;
}
if (funct_name_str.empty()) {
result.AppendError(
"script interpreter failed to generate a valid function name.\n");
return false;
}
std::string code = " " + m_options.m_python_script;
script_format = std::make_shared<ScriptSummaryFormat>(
m_options.m_flags, funct_name_str.c_str(), code.c_str());
} else {
auto options = std::make_unique<ScriptAddOptions>(
m_options.m_flags, m_options.m_match_type, m_options.m_name,
m_options.m_category);
for (auto &entry : command.entries()) {
if (entry.ref().empty()) {
result.AppendError("empty typenames not allowed");
return false;
}
options->m_target_types << std::string(entry.ref());
}
m_interpreter.GetPythonCommandsFromIOHandler(
" ",
*this,
options.release());
result.SetStatus(eReturnStatusSuccessFinishNoResult);
return result.Succeeded();
}
Status error;
for (auto &entry : command.entries()) {
AddSummary(ConstString(entry.ref()), script_format, m_options.m_match_type,
m_options.m_category, &error);
if (error.Fail()) {
result.AppendError(error.AsCString());
return false;
}
}
if (m_options.m_name) {
AddNamedSummary(m_options.m_name, script_format, &error);
if (error.Fail()) {
result.AppendError(error.AsCString());
result.AppendError("added to types, but not given a name");
return false;
}
}
return result.Succeeded();
}
#endif
bool CommandObjectTypeSummaryAdd::Execute_StringSummary(
Args &command, CommandReturnObject &result) { … }
CommandObjectTypeSummaryAdd::CommandObjectTypeSummaryAdd(
CommandInterpreter &interpreter)
: … { … }
void CommandObjectTypeSummaryAdd::DoExecute(Args &command,
CommandReturnObject &result) { … }
static bool FixArrayTypeNameWithRegex(ConstString &type_name) { … }
bool CommandObjectTypeSummaryAdd::AddNamedSummary(ConstString summary_name,
TypeSummaryImplSP entry,
Status *error) { … }
bool CommandObjectTypeSummaryAdd::AddSummary(ConstString type_name,
TypeSummaryImplSP entry,
FormatterMatchType match_type,
std::string category_name,
Status *error) { … }
class CommandObjectTypeSummaryDelete : public CommandObjectTypeFormatterDelete { … };
class CommandObjectTypeSummaryClear : public CommandObjectTypeFormatterClear { … };
class CommandObjectTypeSummaryList
: public CommandObjectTypeFormatterList<TypeSummaryImpl> { … };
#define LLDB_OPTIONS_type_category_define
#include "CommandOptions.inc"
class CommandObjectTypeCategoryDefine : public CommandObjectParsed { … };
#define LLDB_OPTIONS_type_category_enable
#include "CommandOptions.inc"
class CommandObjectTypeCategoryEnable : public CommandObjectParsed { … };
class CommandObjectTypeCategoryDelete : public CommandObjectParsed { … };
#define LLDB_OPTIONS_type_category_disable
#include "CommandOptions.inc"
class CommandObjectTypeCategoryDisable : public CommandObjectParsed { … };
class CommandObjectTypeCategoryList : public CommandObjectParsed { … };
class CommandObjectTypeFilterList
: public CommandObjectTypeFormatterList<TypeFilterImpl> { … };
class CommandObjectTypeSynthList
: public CommandObjectTypeFormatterList<SyntheticChildren> { … };
class CommandObjectTypeFilterDelete : public CommandObjectTypeFormatterDelete { … };
class CommandObjectTypeSynthDelete : public CommandObjectTypeFormatterDelete { … };
class CommandObjectTypeFilterClear : public CommandObjectTypeFormatterClear { … };
class CommandObjectTypeSynthClear : public CommandObjectTypeFormatterClear { … };
bool CommandObjectTypeSynthAdd::Execute_HandwritePython(
Args &command, CommandReturnObject &result) { … }
bool CommandObjectTypeSynthAdd::Execute_PythonClass(
Args &command, CommandReturnObject &result) { … }
CommandObjectTypeSynthAdd::CommandObjectTypeSynthAdd(
CommandInterpreter &interpreter)
: … { … }
bool CommandObjectTypeSynthAdd::AddSynth(ConstString type_name,
SyntheticChildrenSP entry,
FormatterMatchType match_type,
std::string category_name,
Status *error) { … }
#define LLDB_OPTIONS_type_filter_add
#include "CommandOptions.inc"
class CommandObjectTypeFilterAdd : public CommandObjectParsed { … };
#define LLDB_OPTIONS_type_lookup
#include "CommandOptions.inc"
class CommandObjectTypeLookup : public CommandObjectRaw { … };
template <typename FormatterType>
class CommandObjectFormatterInfo : public CommandObjectRaw { … };
class CommandObjectTypeFormat : public CommandObjectMultiword { … };
class CommandObjectTypeSynth : public CommandObjectMultiword { … };
class CommandObjectTypeFilter : public CommandObjectMultiword { … };
class CommandObjectTypeCategory : public CommandObjectMultiword { … };
class CommandObjectTypeSummary : public CommandObjectMultiword { … };
CommandObjectType::CommandObjectType(CommandInterpreter &interpreter)
: … { … }
CommandObjectType::~CommandObjectType() = default;