Index: include/lldb/Target/LanguageRuntime.h =================================================================== --- include/lldb/Target/LanguageRuntime.h +++ include/lldb/Target/LanguageRuntime.h @@ -132,6 +132,12 @@ { return; } + + virtual lldb::CommandObjectSP + GetCommandObject () + { + return nullptr; + } protected: //------------------------------------------------------------------ Index: source/Commands/CMakeLists.txt =================================================================== --- source/Commands/CMakeLists.txt +++ source/Commands/CMakeLists.txt @@ -29,4 +29,5 @@ CommandObjectVersion.cpp CommandObjectWatchpoint.cpp CommandObjectWatchpointCommand.cpp + CommandObjectLanguage.cpp ) Index: source/Commands/CommandObjectLanguage.h =================================================================== --- source/Commands/CommandObjectLanguage.h +++ source/Commands/CommandObjectLanguage.h @@ -0,0 +1,41 @@ +//===-- CommandObjectLanguage.h ---------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_CommandObjectLanguage_h_ +#define liblldb_CommandObjectLanguage_h_ + +// C Includes +// C++ Includes + + +// Other libraries and framework includes +// Project includes + +#include "lldb/lldb-types.h" +#include "lldb/Interpreter/CommandObjectMultiword.h" + +namespace lldb_private { + class CommandObjectLanguage : public CommandObjectMultiword + { + public: + CommandObjectLanguage (CommandInterpreter &interpreter); + + virtual + ~CommandObjectLanguage (); + + virtual void + GenerateHelpText (Stream &output_stream); + + protected: + bool + DoExecute (Args& command, CommandReturnObject &result); + }; +} // namespace lldb_private + +#endif // liblldb_CommandObjectLanguage_h_ Index: source/Commands/CommandObjectLanguage.cpp =================================================================== --- source/Commands/CommandObjectLanguage.cpp +++ source/Commands/CommandObjectLanguage.cpp @@ -0,0 +1,123 @@ +//===-- CommandObjectLanguage.cpp -------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/lldb-python.h" + +#include "CommandObjectLanguage.h" + +#include "lldb/Host/Host.h" + +#include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/CommandReturnObject.h" + +#include "lldb/Target/LanguageRuntime.h" + +using namespace lldb; +using namespace lldb_private; + +class CommandObjectLanguageLoad : public CommandObjectParsed +{ +private: +public: + CommandObjectLanguageLoad (CommandInterpreter &interpreter) : + CommandObjectParsed (interpreter, + "language load", + "loads language-specific command modules. Language list available via 'help language'", + "language load ", + eFlagRequiresProcess) + { + } + + ~CommandObjectLanguageLoad () + { + } + + +protected: + bool + DoExecute (Args& command, CommandReturnObject &result) + { + size_t argc = command.GetArgumentCount(); + + if (argc == 0) + { + result.AppendError ("'language load' requires language name"); + result.SetStatus (eReturnStatusFailed); + return false; + } + + const char* language_name = command.GetArgumentAtIndex(0); + + LanguageType language = LanguageRuntime::GetLanguageTypeFromString(language_name); + + if (language == eLanguageTypeUnknown) + { + result.AppendErrorWithFormat ("'%s' unknown. Refer to 'help language' for supported languages.", language_name); + result.SetStatus (eReturnStatusFailed); + return false; + } + + Process* process = m_exe_ctx.GetProcessPtr(); + LanguageRuntime *language_runtime = process->GetLanguageRuntime(language); + if (!language_runtime) + { + result.AppendErrorWithFormat ("'%s' is not valid in the current process.", language_name); + result.SetStatus (eReturnStatusFailed); + return false; + } + + CommandObjectSP command_obj = language_runtime->GetCommandObject(); + CommandObject* language_obj = m_interpreter.GetCommandObject("language"); + + if (language_obj && command_obj) + { + if (language_obj->LoadSubCommand(language_name, command_obj)) + { + result.SetStatus (eReturnStatusSuccessFinishResult); + } + else + { + result.AppendErrorWithFormat ("'%s' commands already loaded.", language_name); + result.SetStatus (eReturnStatusFailed); + } + } + else + { + result.AppendErrorWithFormat ("'%s' does not expose any additional language commands.", language_name); + result.SetStatus (eReturnStatusFailed); + } + + return result.Succeeded(); + } +}; + + +CommandObjectLanguage::CommandObjectLanguage (CommandInterpreter &interpreter) : +CommandObjectMultiword (interpreter, + "language", + "A set of commands for managing language-specific functionality. Load plugins first with 'language load '.", + "language []", + eFlagRequiresProcess) +{ + LoadSubCommand("load", CommandObjectSP( new CommandObjectLanguageLoad(interpreter))); +} + +void +CommandObjectLanguage::GenerateHelpText (Stream &output_stream) { + CommandObjectMultiword::GenerateHelpText(output_stream); + + output_stream << "\nlanguage name can be one of the following:\n"; + + LanguageRuntime::PrintAllLanguages(output_stream, " ", "\n"); +} + + +CommandObjectLanguage::~CommandObjectLanguage () +{ +} Index: source/Interpreter/CommandInterpreter.cpp =================================================================== --- source/Interpreter/CommandInterpreter.cpp +++ source/Interpreter/CommandInterpreter.cpp @@ -40,6 +40,7 @@ #include "../Commands/CommandObjectType.h" #include "../Commands/CommandObjectVersion.h" #include "../Commands/CommandObjectWatchpoint.h" +#include "../Commands/CommandObjectLanguage.h" #include "lldb/Core/Debugger.h" @@ -443,6 +444,7 @@ m_command_dict["type"] = CommandObjectSP (new CommandObjectType (*this)); m_command_dict["version"] = CommandObjectSP (new CommandObjectVersion (*this)); m_command_dict["watchpoint"]= CommandObjectSP (new CommandObjectMultiwordWatchpoint (*this)); + m_command_dict["language"] = CommandObjectSP (new CommandObjectLanguage(*this)); const char *break_regexes[][2] = {{"^(.*[^[:space:]])[[:space:]]*:[[:space:]]*([[:digit:]]+)[[:space:]]*$", "breakpoint set --file '%1' --line %2"}, {"^/([^/]+)/$", "breakpoint set --source-pattern-regexp '%1'"},