[Lldb-commits] [lldb] r236443 - Add language command and LanguageRuntime plugin changes to allow vending of command objects.

Colin Riley colin at codeplay.com
Mon May 4 11:39:39 PDT 2015


Author: domipheus
Date: Mon May  4 13:39:38 2015
New Revision: 236443

URL: http://llvm.org/viewvc/llvm-project?rev=236443&view=rev
Log:
Add language command and LanguageRuntime plugin changes to allow vending of command objects.

Differential Revision: http://reviews.llvm.org/D9402

Added:
    lldb/trunk/source/Commands/CommandObjectLanguage.cpp
    lldb/trunk/source/Commands/CommandObjectLanguage.h
Modified:
    lldb/trunk/include/lldb/Core/PluginManager.h
    lldb/trunk/include/lldb/Target/LanguageRuntime.h
    lldb/trunk/include/lldb/lldb-private-interfaces.h
    lldb/trunk/source/Commands/CMakeLists.txt
    lldb/trunk/source/Core/PluginManager.cpp
    lldb/trunk/source/Interpreter/CommandInterpreter.cpp
    lldb/trunk/source/Target/LanguageRuntime.cpp

Modified: lldb/trunk/include/lldb/Core/PluginManager.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/PluginManager.h?rev=236443&r1=236442&r2=236443&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/PluginManager.h (original)
+++ lldb/trunk/include/lldb/Core/PluginManager.h Mon May  4 13:39:38 2015
@@ -137,7 +137,8 @@ public:
     static bool
     RegisterPlugin (const ConstString &name,
                     const char *description,
-                    LanguageRuntimeCreateInstance create_callback);
+                    LanguageRuntimeCreateInstance create_callback,
+                    LanguageRuntimeGetCommandObject command_callback = nullptr);
 
     static bool
     UnregisterPlugin (LanguageRuntimeCreateInstance create_callback);
@@ -145,6 +146,9 @@ public:
     static LanguageRuntimeCreateInstance
     GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx);
 
+    static LanguageRuntimeGetCommandObject
+    GetLanguageRuntimeGetCommandObjectAtIndex (uint32_t idx);
+
     static LanguageRuntimeCreateInstance
     GetLanguageRuntimeCreateCallbackForPluginName (const ConstString &name);
 

Modified: lldb/trunk/include/lldb/Target/LanguageRuntime.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/LanguageRuntime.h?rev=236443&r1=236442&r2=236443&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/LanguageRuntime.h (original)
+++ lldb/trunk/include/lldb/Target/LanguageRuntime.h Mon May  4 13:39:38 2015
@@ -34,6 +34,9 @@ public:
     
     static LanguageRuntime* 
     FindPlugin (Process *process, lldb::LanguageType language);
+
+    static void
+    InitializeCommands (CommandObject* parent);
     
     virtual lldb::LanguageType
     GetLanguageType () const = 0;

Modified: lldb/trunk/include/lldb/lldb-private-interfaces.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=236443&r1=236442&r2=236443&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-private-interfaces.h (original)
+++ lldb/trunk/include/lldb/lldb-private-interfaces.h Mon May  4 13:39:38 2015
@@ -29,6 +29,7 @@ namespace lldb_private
     typedef EmulateInstruction * (*EmulateInstructionCreateInstance) (const ArchSpec &arch, InstructionType inst_type);
     typedef OperatingSystem* (*OperatingSystemCreateInstance) (Process *process, bool force);
     typedef LanguageRuntime *(*LanguageRuntimeCreateInstance) (Process *process, lldb::LanguageType language);
+    typedef lldb::CommandObjectSP (*LanguageRuntimeGetCommandObject) (CommandInterpreter& interpreter);
     typedef SystemRuntime *(*SystemRuntimeCreateInstance) (Process *process);
     typedef lldb::PlatformSP (*PlatformCreateInstance) (bool force, const ArchSpec *arch);
     typedef lldb::ProcessSP (*ProcessCreateInstance) (Target &target, Listener &listener, const FileSpec *crash_file_path);

Modified: lldb/trunk/source/Commands/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CMakeLists.txt?rev=236443&r1=236442&r2=236443&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CMakeLists.txt (original)
+++ lldb/trunk/source/Commands/CMakeLists.txt Mon May  4 13:39:38 2015
@@ -29,4 +29,5 @@ add_lldb_library(lldbCommands
   CommandObjectVersion.cpp
   CommandObjectWatchpoint.cpp
   CommandObjectWatchpointCommand.cpp
+  CommandObjectLanguage.cpp
   )

Added: lldb/trunk/source/Commands/CommandObjectLanguage.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectLanguage.cpp?rev=236443&view=auto
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectLanguage.cpp (added)
+++ lldb/trunk/source/Commands/CommandObjectLanguage.cpp Mon May  4 13:39:38 2015
@@ -0,0 +1,46 @@
+//===-- 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;
+
+CommandObjectLanguage::CommandObjectLanguage (CommandInterpreter &interpreter) :
+CommandObjectMultiword (interpreter,
+                        "language",
+                        "A set of commands for managing language-specific functionality.'.",
+                        "language <language-name> <subcommand> [<subcommand-options>]"
+                        )
+{
+    //Let the LanguageRuntime populates this command with subcommands
+    LanguageRuntime::InitializeCommands(this);
+}
+
+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 ()
+{
+}

Added: lldb/trunk/source/Commands/CommandObjectLanguage.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectLanguage.h?rev=236443&view=auto
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectLanguage.h (added)
+++ lldb/trunk/source/Commands/CommandObjectLanguage.h Mon May  4 13:39:38 2015
@@ -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_

Modified: lldb/trunk/source/Core/PluginManager.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/PluginManager.cpp?rev=236443&r1=236442&r2=236443&view=diff
==============================================================================
--- lldb/trunk/source/Core/PluginManager.cpp (original)
+++ lldb/trunk/source/Core/PluginManager.cpp Mon May  4 13:39:38 2015
@@ -885,6 +885,7 @@ struct LanguageRuntimeInstance
     ConstString name;
     std::string description;
     LanguageRuntimeCreateInstance create_callback;
+    LanguageRuntimeGetCommandObject command_callback;
 };
 
 typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
@@ -908,7 +909,8 @@ PluginManager::RegisterPlugin
 (
     const ConstString &name,
     const char *description,
-    LanguageRuntimeCreateInstance create_callback
+    LanguageRuntimeCreateInstance create_callback,
+    LanguageRuntimeGetCommandObject command_callback
 )
 {
     if (create_callback)
@@ -919,6 +921,7 @@ PluginManager::RegisterPlugin
         if (description && description[0])
             instance.description = description;
         instance.create_callback = create_callback;
+        instance.command_callback = command_callback;
         Mutex::Locker locker (GetLanguageRuntimeMutex ());
         GetLanguageRuntimeInstances ().push_back (instance);
     }
@@ -956,6 +959,16 @@ PluginManager::GetLanguageRuntimeCreateC
     return NULL;
 }
 
+LanguageRuntimeGetCommandObject
+PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex (uint32_t idx)
+{
+    Mutex::Locker locker (GetLanguageRuntimeMutex ());
+    LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
+    if (idx < instances.size())
+        return instances[idx].command_callback;
+    return NULL;
+}
+
 LanguageRuntimeCreateInstance
 PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const ConstString &name)
 {

Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=236443&r1=236442&r2=236443&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original)
+++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Mon May  4 13:39:38 2015
@@ -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 @@ CommandInterpreter::LoadCommandDictionar
     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'"},

Modified: lldb/trunk/source/Target/LanguageRuntime.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/LanguageRuntime.cpp?rev=236443&r1=236442&r2=236443&view=diff
==============================================================================
--- lldb/trunk/source/Target/LanguageRuntime.cpp (original)
+++ lldb/trunk/source/Target/LanguageRuntime.cpp Mon May  4 13:39:38 2015
@@ -12,6 +12,7 @@
 #include "lldb/Target/Target.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/SearchFilter.h"
+#include "lldb/Interpreter/CommandInterpreter.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -418,6 +419,33 @@ LanguageRuntime::LanguageIsCPlusPlus (La
     }
 }
 
+void
+LanguageRuntime::InitializeCommands (CommandObject* parent)
+{
+    if (!parent)
+        return;
+
+    if (!parent->IsMultiwordObject())
+        return;
+
+    LanguageRuntimeCreateInstance create_callback;
+
+    for (uint32_t idx = 0;
+         (create_callback = PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(idx)) != nullptr;
+         ++idx)
+    {
+        if (LanguageRuntimeGetCommandObject command_callback = 
+                PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex(idx))
+        {
+            CommandObjectSP command = command_callback(parent->GetCommandInterpreter());
+            if (command)
+            {
+                parent->LoadSubCommand(command->GetCommandName(), command);
+            }
+        }
+    }
+}
+
 lldb::SearchFilterSP
 LanguageRuntime::CreateExceptionSearchFilter ()
 {





More information about the lldb-commits mailing list