[Lldb-commits] [lldb] r138228 - in /lldb/trunk: include/lldb/ include/lldb/Core/ include/lldb/Target/ lldb.xcodeproj/ source/ source/Core/ source/Plugins/ABI/MacOSX-arm/ source/Plugins/ABI/MacOSX-i386/ source/Plugins/ABI/SysV-x86_64/ source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/ source/Plugins/OperatingSystem/ source/Plugins/OperatingSystem/MacOSX-Kernel/ source/Plugins/Process/MacOSX-Kernel/ source/Plugins/Process/Utility/ source/Plugins/Process/gdb-remote/ source/Target/

Greg Clayton gclayton at apple.com
Sun Aug 21 19:49:39 PDT 2011


Author: gclayton
Date: Sun Aug 21 21:49:39 2011
New Revision: 138228

URL: http://llvm.org/viewvc/llvm-project?rev=138228&view=rev
Log:
Added a new plug-in type: lldb_private::OperatingSystem. The operating system 
plug-ins are add on plug-ins for the lldb_private::Process class that can add
thread contexts that are read from memory. It is common in kernels to have
a lot of threads that are not currently executing on any cores (JTAG debugging
also follows this sort of thing) and are context switched out whose state is
stored in memory data structures. Clients can now subclass the OperatingSystem
plug-ins and then make sure their Create functions correcltly only enable 
themselves when the right binary/target triple are being debugged. The 
operating system plug-ins get a chance to attach themselves to processes just
after launching or attaching and are given a lldb_private::Process object 
pointer which can be inspected to see if the main executable, target triple,
or any shared  libraries match a case where the OS plug-in should be used.
Currently the OS plug-ins can create new threads, define the register contexts
for these threads (which can all be different if desired), and populate and
manage the thread info (stop reason, registers in the register context) as
the debug session goes on.


Added:
    lldb/trunk/include/lldb/Target/OperatingSystem.h
    lldb/trunk/source/Plugins/OperatingSystem/
    lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/
    lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.cpp
    lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.h
    lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp
    lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.h
    lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.cpp
    lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.h
    lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp
    lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h
    lldb/trunk/source/Target/OperatingSystem.cpp
Modified:
    lldb/trunk/include/lldb/Core/DataExtractor.h
    lldb/trunk/include/lldb/Core/PluginManager.h
    lldb/trunk/include/lldb/Core/ValueObject.h
    lldb/trunk/include/lldb/Target/ABI.h
    lldb/trunk/include/lldb/Target/Process.h
    lldb/trunk/include/lldb/Target/Thread.h
    lldb/trunk/include/lldb/Target/ThreadList.h
    lldb/trunk/include/lldb/lldb-forward.h
    lldb/trunk/include/lldb/lldb-private-interfaces.h
    lldb/trunk/lldb.xcodeproj/project.pbxproj
    lldb/trunk/source/Core/FormatClasses.cpp
    lldb/trunk/source/Core/PluginManager.cpp
    lldb/trunk/source/Core/Section.cpp
    lldb/trunk/source/Core/ValueObject.cpp
    lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp
    lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h
    lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp
    lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h
    lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp
    lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h
    lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h
    lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
    lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
    lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp
    lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h
    lldb/trunk/source/Target/ABI.cpp
    lldb/trunk/source/Target/Process.cpp
    lldb/trunk/source/Target/Thread.cpp
    lldb/trunk/source/Target/ThreadList.cpp
    lldb/trunk/source/lldb.cpp

Modified: lldb/trunk/include/lldb/Core/DataExtractor.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/DataExtractor.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/DataExtractor.h (original)
+++ lldb/trunk/include/lldb/Core/DataExtractor.h Sun Aug 21 21:49:39 2011
@@ -999,6 +999,12 @@
     uint64_t
     GetULEB128 (uint32_t *offset_ptr) const;
 
+    lldb::DataBufferSP &
+    GetSharedDataBuffer ()
+    {
+        return m_data_sp;
+    }
+
     //------------------------------------------------------------------
     /// Peek at a C string at \a offset.
     ///

Modified: lldb/trunk/include/lldb/Core/PluginManager.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/PluginManager.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/PluginManager.h (original)
+++ lldb/trunk/include/lldb/Core/PluginManager.h Sun Aug 21 21:49:39 2011
@@ -97,6 +97,23 @@
     GetEmulateInstructionCreateCallbackForPluginName (const char *name);
 
     //------------------------------------------------------------------
+    // OperatingSystem
+    //------------------------------------------------------------------
+    static bool
+    RegisterPlugin (const char *name,
+                    const char *description,
+                    OperatingSystemCreateInstance create_callback);
+    
+    static bool
+    UnregisterPlugin (OperatingSystemCreateInstance create_callback);
+    
+    static OperatingSystemCreateInstance
+    GetOperatingSystemCreateCallbackAtIndex (uint32_t idx);
+    
+    static OperatingSystemCreateInstance
+    GetOperatingSystemCreateCallbackForPluginName (const char *name);
+
+    //------------------------------------------------------------------
     // LanguageRuntime
     //------------------------------------------------------------------
     static bool

Modified: lldb/trunk/include/lldb/Core/ValueObject.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObject.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/ValueObject.h (original)
+++ lldb/trunk/include/lldb/Core/ValueObject.h Sun Aug 21 21:49:39 2011
@@ -598,8 +598,8 @@
     virtual const char *
     GetValueAsCString ();
     
-    virtual unsigned long long
-    GetValueAsUnsigned();
+    virtual uint64_t
+    GetValueAsUnsigned (uint64_t fail_value);
 
     virtual bool
     SetValueFromCString (const char *value_str);

Modified: lldb/trunk/include/lldb/Target/ABI.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ABI.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/ABI.h (original)
+++ lldb/trunk/include/lldb/Target/ABI.h Sun Aug 21 21:49:39 2011
@@ -67,6 +67,19 @@
     virtual bool
     CodeAddressIsValid (lldb::addr_t pc) = 0;    
 
+    virtual const RegisterInfo *
+    GetRegisterInfoArray (uint32_t &count) = 0;
+
+    
+    
+    bool
+    GetRegisterInfoByName (const ConstString &name, RegisterInfo &info);
+
+    bool
+    GetRegisterInfoByKind (lldb::RegisterKind reg_kind, 
+                           uint32_t reg_num, 
+                           RegisterInfo &info);
+
     static lldb::ABISP
     FindPlugin (const ArchSpec &arch);
     

Added: lldb/trunk/include/lldb/Target/OperatingSystem.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/OperatingSystem.h?rev=138228&view=auto
==============================================================================
--- lldb/trunk/include/lldb/Target/OperatingSystem.h (added)
+++ lldb/trunk/include/lldb/Target/OperatingSystem.h Sun Aug 21 21:49:39 2011
@@ -0,0 +1,90 @@
+//===-- OperatingSystem.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_OperatingSystem_h_
+#define liblldb_OperatingSystem_h_
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+
+#include "lldb/lldb-private.h"
+#include "lldb/Core/PluginInterface.h"
+
+namespace lldb_private {
+    
+//----------------------------------------------------------------------
+/// @class OperatingSystem OperatingSystem.h "lldb/Target/OperatingSystem.h"
+/// @brief A plug-in interface definition class for halted OS helpers.
+///
+/// Halted OS plug-ins can be used by any process to locate and create 
+/// OS objects, like threads, during the lifetime of a debug session. 
+/// This is commonly used when attaching to an operating system that is
+/// halted, such as when debugging over JTAG or connecting to low level
+/// kernel debug services.
+//----------------------------------------------------------------------
+
+class OperatingSystem :
+    public PluginInterface
+
+{
+public:
+    //------------------------------------------------------------------
+    /// Find a halted OS plugin for a given process.
+    ///
+    /// Scans the installed OperatingSystem plug-ins and tries to find
+    /// an instance that matches the current target triple and 
+    /// executable.
+    ///
+    /// @param[in] process
+    ///     The process for which to try and locate a halted OS
+    ///     plug-in instance.
+    ///
+    /// @param[in] plugin_name
+    ///     An optional name of a specific halted OS plug-in that
+    ///     should be used. If NULL, pick the best plug-in.
+    //------------------------------------------------------------------
+    static OperatingSystem*
+    FindPlugin (Process *process, const char *plugin_name);
+
+    //------------------------------------------------------------------
+    // Class Methods
+    //------------------------------------------------------------------
+    OperatingSystem (Process *process);
+    
+    virtual 
+    ~OperatingSystem();
+    
+    //------------------------------------------------------------------
+    // Plug-in Methods
+    //------------------------------------------------------------------
+    virtual uint32_t
+    UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) = 0;
+    
+    virtual void
+    ThreadWasSelected (Thread *thread) = 0;
+    
+    virtual lldb::RegisterContextSP
+    CreateRegisterContextForThread (Thread *thread) = 0;
+
+    virtual lldb::StopInfoSP
+    CreateThreadStopReason (Thread *thread) = 0;
+
+protected:
+    //------------------------------------------------------------------
+    // Member variables.
+    //------------------------------------------------------------------
+    Process* m_process; ///< The process that this dynamic loader plug-in is tracking.
+private:
+    DISALLOW_COPY_AND_ASSIGN (OperatingSystem);
+};
+
+} // namespace lldb_private
+
+#endif // #ifndef liblldb_OperatingSystem_h_

Modified: lldb/trunk/include/lldb/Target/Process.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Process.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Process.h (original)
+++ lldb/trunk/include/lldb/Target/Process.h Sun Aug 21 21:49:39 2011
@@ -2515,7 +2515,10 @@
     // Thread Queries
     //------------------------------------------------------------------
     virtual uint32_t
-    UpdateThreadListIfNeeded () = 0;
+    UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) = 0;
+
+    void
+    UpdateThreadListIfNeeded ();
 
     ThreadList &
     GetThreadList ()
@@ -2523,11 +2526,6 @@
         return m_thread_list;
     }
 
-    const ThreadList &
-    GetThreadList () const
-    {
-        return m_thread_list;
-    }
 
     uint32_t
     GetNextThreadIndexID ();
@@ -2620,6 +2618,13 @@
         return m_dyld_ap.get();
     }
 
+    OperatingSystem *
+    GetOperatingSystem ()
+    {
+        return m_os_ap.get();
+    }
+    
+
     virtual LanguageRuntime *
     GetLanguageRuntime (lldb::LanguageType language);
 
@@ -2796,6 +2801,7 @@
                                                         ///< to insert in the target.
     std::auto_ptr<DynamicLoader> m_dyld_ap;
     std::auto_ptr<DynamicCheckerFunctions>  m_dynamic_checkers_ap; ///< The functions used by the expression parser to validate data that expressions use.
+    std::auto_ptr<OperatingSystem>     m_os_ap;
     UnixSignals                 m_unix_signals;         /// This is the current signal set for this process.
     lldb::ABISP                 m_abi_sp;
     lldb::InputReaderSP         m_process_input_reader;

Modified: lldb/trunk/include/lldb/Target/Thread.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Thread.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Thread.h (original)
+++ lldb/trunk/include/lldb/Target/Thread.h Sun Aug 21 21:49:39 2011
@@ -206,10 +206,16 @@
     virtual ~Thread();
 
     Process &
-    GetProcess() { return m_process; }
+    GetProcess() 
+    {
+        return m_process; 
+    }
 
     const Process &
-    GetProcess() const { return m_process; }
+    GetProcess() const 
+    {
+        return m_process; 
+    }
 
     int
     GetResumeSignal () const
@@ -302,7 +308,10 @@
     StopReasonAsCString (lldb::StopReason reason);
 
     virtual const char *
-    GetInfo () = 0;
+    GetInfo ()
+    {
+        return NULL;
+    }
 
     virtual const char *
     GetName ()
@@ -757,7 +766,7 @@
     RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint);
 
     virtual lldb_private::Unwind *
-    GetUnwinder () = 0;
+    GetUnwinder ();
 
     StackFrameList &
     GetStackFrameList ();

Modified: lldb/trunk/include/lldb/Target/ThreadList.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ThreadList.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/ThreadList.h (original)
+++ lldb/trunk/include/lldb/Target/ThreadList.h Sun Aug 21 21:49:39 2011
@@ -105,6 +105,9 @@
         return m_threads_mutex;
     }
     
+    void
+    Update (ThreadList &rhs);
+    
 protected:
 
     typedef std::vector<lldb::ThreadSP> collection;

Modified: lldb/trunk/include/lldb/lldb-forward.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-forward.h (original)
+++ lldb/trunk/include/lldb/lldb-forward.h Sun Aug 21 21:49:39 2011
@@ -98,6 +98,7 @@
 class   ObjCLanguageRuntime;
 class   ObjectContainer;
 class   ObjectFile;
+class   OperatingSystem;
 class   Options;
 class   OptionValue;
 class   NamedOption;

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=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-private-interfaces.h (original)
+++ lldb/trunk/include/lldb/lldb-private-interfaces.h Sun Aug 21 21:49:39 2011
@@ -23,6 +23,7 @@
     typedef ObjectFile* (*ObjectFileCreateInstance) (Module* module, lldb::DataBufferSP& dataSP, const FileSpec* file, lldb::addr_t offset, lldb::addr_t length);
     typedef LogChannel* (*LogChannelCreateInstance) ();
     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 Platform* (*PlatformCreateInstance) ();
     typedef Process* (*ProcessCreateInstance) (Target &target, Listener &listener);

Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
+++ lldb/trunk/lldb.xcodeproj/project.pbxproj Sun Aug 21 21:49:39 2011
@@ -14,6 +14,7 @@
 		2617447A11685869005ADD65 /* SBType.h in Headers */ = {isa = PBXBuildFile; fileRef = 2617447911685869005ADD65 /* SBType.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		2628A4D513D4977900F5487A /* ThreadKDP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2628A4D313D4977900F5487A /* ThreadKDP.cpp */; };
 		262CFC7711A4510000946C6C /* debugserver in Resources */ = {isa = PBXBuildFile; fileRef = 26CE05A0115C31E50022F371 /* debugserver */; };
+		262D24E613FB8710002D1960 /* RegisterContextMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 262D24E413FB8710002D1960 /* RegisterContextMemory.cpp */; };
 		26368A3C126B697600E8659F /* darwin-debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26368A3B126B697600E8659F /* darwin-debug.cpp */; };
 		26368AF7126B960500E8659F /* darwin-debug in Resources */ = {isa = PBXBuildFile; fileRef = 26579F68126A25920007C5CB /* darwin-debug */; };
 		263E949F13661AEA00E7D1CE /* UnwindAssembly-x86.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 263E949D13661AE400E7D1CE /* UnwindAssembly-x86.cpp */; };
@@ -70,6 +71,8 @@
 		26680336116005EF008E1FE4 /* SBBreakpointLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9AF16CC7114086A1007A7B3F /* SBBreakpointLocation.cpp */; };
 		26680337116005F1008E1FE4 /* SBBreakpoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9AF16A9C11402D5B007A7B3F /* SBBreakpoint.cpp */; };
 		2668035C11601108008E1FE4 /* LLDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26680207115FD0ED008E1FE4 /* LLDB.framework */; };
+		266DFE9413FD64D200D0C574 /* OperatingSystemMacOSXKernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266DFE9213FD64D200D0C574 /* OperatingSystemMacOSXKernel.cpp */; };
+		266DFE9713FD656E00D0C574 /* OperatingSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266DFE9613FD656E00D0C574 /* OperatingSystem.cpp */; };
 		266E8C6A13528ABC000C2042 /* lldb-platform in Resources */ = {isa = PBXBuildFile; fileRef = 26DC6A101337FE6900FF7998 /* lldb-platform */; };
 		2671A0D013482601003A87BB /* ConnectionMachPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2671A0CF13482601003A87BB /* ConnectionMachPort.cpp */; };
 		26744EF11338317700EF765A /* GDBRemoteCommunicationClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26744EED1338317700EF765A /* GDBRemoteCommunicationClient.cpp */; };
@@ -330,6 +333,7 @@
 		268F9D55123AA16600B91E9B /* SBSymbolContextList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268F9D54123AA16600B91E9B /* SBSymbolContextList.cpp */; };
 		2690B3711381D5C300ECFBAE /* Memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2690B3701381D5C300ECFBAE /* Memory.cpp */; };
 		2692BA15136610C100F9E14D /* UnwindAssemblyInstEmulation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2692BA13136610C100F9E14D /* UnwindAssemblyInstEmulation.cpp */; };
+		26954EBE1401EE8B00294D09 /* DynamicRegisterInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26954EBC1401EE8B00294D09 /* DynamicRegisterInfo.cpp */; };
 		26957D9813D381C900670048 /* RegisterContextDarwin_arm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26957D9213D381C900670048 /* RegisterContextDarwin_arm.cpp */; };
 		26957D9A13D381C900670048 /* RegisterContextDarwin_i386.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26957D9413D381C900670048 /* RegisterContextDarwin_i386.cpp */; };
 		26957D9C13D381C900670048 /* RegisterContextDarwin_x86_64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26957D9613D381C900670048 /* RegisterContextDarwin_x86_64.cpp */; };
@@ -380,6 +384,7 @@
 		26ECA04313665FED008D1F18 /* ARM_DWARF_Registers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26ECA04213665FED008D1F18 /* ARM_DWARF_Registers.cpp */; };
 		26ED3D6D13C563810017D45E /* OptionGroupVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26ED3D6C13C563810017D45E /* OptionGroupVariable.cpp */; };
 		26F4214413C6515B00E04E5E /* DynamicLoaderMacOSXKernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F4214113C6515B00E04E5E /* DynamicLoaderMacOSXKernel.cpp */; };
+		26F4A21C13FBA31A0064B613 /* ThreadMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F4A21A13FBA31A0064B613 /* ThreadMemory.cpp */; };
 		26F5C27710F3D9E4009D5894 /* Driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F5C27310F3D9E4009D5894 /* Driver.cpp */; };
 		26F5C27810F3D9E4009D5894 /* IOChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F5C27510F3D9E4009D5894 /* IOChannel.cpp */; };
 		26F5C32510F3DF23009D5894 /* libpython.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 26F5C32410F3DF23009D5894 /* libpython.dylib */; };
@@ -388,7 +393,6 @@
 		26F5C37510F3F61B009D5894 /* libobjc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 26F5C37410F3F61B009D5894 /* libobjc.dylib */; };
 		26F5C39110F3FA26009D5894 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26F5C39010F3FA26009D5894 /* CoreFoundation.framework */; };
 		26F73062139D8FDB00FD51C7 /* History.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F73061139D8FDB00FD51C7 /* History.cpp */; };
-		49C850771384A02F007DB519 /* ProcessDataAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 49C850761384A02F007DB519 /* ProcessDataAllocator.h */; };
 		49C8507C1384A786007DB519 /* ProcessDataAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49C850781384A0CA007DB519 /* ProcessDataAllocator.cpp */; };
 		49D8FB3913B5598F00411094 /* ClangASTImporter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49D8FB3513B558DE00411094 /* ClangASTImporter.cpp */; };
 		4C74CB6312288704006A8171 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C74CB6212288704006A8171 /* Carbon.framework */; };
@@ -603,6 +607,8 @@
 		2623096E13D0EFFB006381D9 /* StreamBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = StreamBuffer.h; path = include/lldb/Core/StreamBuffer.h; sourceTree = "<group>"; };
 		2628A4D313D4977900F5487A /* ThreadKDP.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadKDP.cpp; sourceTree = "<group>"; };
 		2628A4D413D4977900F5487A /* ThreadKDP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadKDP.h; sourceTree = "<group>"; };
+		262D24E413FB8710002D1960 /* RegisterContextMemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterContextMemory.cpp; path = Utility/RegisterContextMemory.cpp; sourceTree = "<group>"; };
+		262D24E513FB8710002D1960 /* RegisterContextMemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterContextMemory.h; path = Utility/RegisterContextMemory.h; sourceTree = "<group>"; };
 		263664921140A4930075843B /* Debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = Debugger.cpp; path = source/Core/Debugger.cpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
 		263664941140A4C10075843B /* Debugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = Debugger.h; path = include/lldb/Core/Debugger.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
 		26368A3B126B697600E8659F /* darwin-debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "darwin-debug.cpp"; path = "tools/darwin-debug/darwin-debug.cpp"; sourceTree = "<group>"; };
@@ -657,6 +663,10 @@
 		266960631199F4230075C61A /* sed-sources */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "sed-sources"; sourceTree = "<group>"; };
 		266A42D5128E3FFB0090CF7C /* ClangNamespaceDecl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ClangNamespaceDecl.cpp; path = source/Symbol/ClangNamespaceDecl.cpp; sourceTree = "<group>"; };
 		266A42D7128E40040090CF7C /* ClangNamespaceDecl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ClangNamespaceDecl.h; path = include/lldb/Symbol/ClangNamespaceDecl.h; sourceTree = "<group>"; };
+		266DFE9213FD64D200D0C574 /* OperatingSystemMacOSXKernel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OperatingSystemMacOSXKernel.cpp; sourceTree = "<group>"; };
+		266DFE9313FD64D200D0C574 /* OperatingSystemMacOSXKernel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OperatingSystemMacOSXKernel.h; sourceTree = "<group>"; };
+		266DFE9613FD656E00D0C574 /* OperatingSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OperatingSystem.cpp; path = source/Target/OperatingSystem.cpp; sourceTree = "<group>"; };
+		266DFE9813FD658300D0C574 /* OperatingSystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OperatingSystem.h; path = include/lldb/Target/OperatingSystem.h; sourceTree = "<group>"; };
 		266F5CBB12FC846200DFCE33 /* Config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Config.h; path = include/lldb/Host/Config.h; sourceTree = "<group>"; };
 		2671A0CD134825F6003A87BB /* ConnectionMachPort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConnectionMachPort.h; path = include/lldb/Core/ConnectionMachPort.h; sourceTree = "<group>"; };
 		2671A0CF13482601003A87BB /* ConnectionMachPort.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ConnectionMachPort.cpp; path = source/Core/ConnectionMachPort.cpp; sourceTree = "<group>"; };
@@ -698,6 +708,8 @@
 		2692BA14136610C100F9E14D /* UnwindAssemblyInstEmulation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnwindAssemblyInstEmulation.h; sourceTree = "<group>"; };
 		269416AD119A024800FF2715 /* CommandObjectTarget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CommandObjectTarget.cpp; path = source/Commands/CommandObjectTarget.cpp; sourceTree = "<group>"; };
 		269416AE119A024800FF2715 /* CommandObjectTarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CommandObjectTarget.h; path = source/Commands/CommandObjectTarget.h; sourceTree = "<group>"; };
+		26954EBC1401EE8B00294D09 /* DynamicRegisterInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DynamicRegisterInfo.cpp; path = Utility/DynamicRegisterInfo.cpp; sourceTree = "<group>"; };
+		26954EBD1401EE8B00294D09 /* DynamicRegisterInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DynamicRegisterInfo.h; path = Utility/DynamicRegisterInfo.h; sourceTree = "<group>"; };
 		26957D9213D381C900670048 /* RegisterContextDarwin_arm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterContextDarwin_arm.cpp; path = Utility/RegisterContextDarwin_arm.cpp; sourceTree = "<group>"; };
 		26957D9313D381C900670048 /* RegisterContextDarwin_arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterContextDarwin_arm.h; path = Utility/RegisterContextDarwin_arm.h; sourceTree = "<group>"; };
 		26957D9413D381C900670048 /* RegisterContextDarwin_i386.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterContextDarwin_i386.cpp; path = Utility/RegisterContextDarwin_i386.cpp; sourceTree = "<group>"; };
@@ -1046,6 +1058,8 @@
 		26ED3D6F13C5638A0017D45E /* OptionGroupVariable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionGroupVariable.h; path = include/lldb/Interpreter/OptionGroupVariable.h; sourceTree = "<group>"; };
 		26F4214113C6515B00E04E5E /* DynamicLoaderMacOSXKernel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DynamicLoaderMacOSXKernel.cpp; sourceTree = "<group>"; };
 		26F4214213C6515B00E04E5E /* DynamicLoaderMacOSXKernel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicLoaderMacOSXKernel.h; sourceTree = "<group>"; };
+		26F4A21A13FBA31A0064B613 /* ThreadMemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ThreadMemory.cpp; path = Utility/ThreadMemory.cpp; sourceTree = "<group>"; };
+		26F4A21B13FBA31A0064B613 /* ThreadMemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThreadMemory.h; path = Utility/ThreadMemory.h; sourceTree = "<group>"; };
 		26F5C26A10F3D9A4009D5894 /* lldb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lldb; sourceTree = BUILT_PRODUCTS_DIR; };
 		26F5C27210F3D9E4009D5894 /* lldb-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "lldb-Info.plist"; path = "tools/driver/lldb-Info.plist"; sourceTree = "<group>"; };
 		26F5C27310F3D9E4009D5894 /* Driver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Driver.cpp; path = tools/driver/Driver.cpp; sourceTree = "<group>"; };
@@ -1344,6 +1358,7 @@
 				26BC7E7510F1B85900F91463 /* lldb-log.cpp */,
 				26BC7C2A10F1B3BC00F91463 /* lldb-private.h */,
 				26217932133BCB850083B112 /* lldb-private-enumerations.h */,
+				26BC7C2810F1B3BC00F91463 /* lldb-private-interfaces.h */,
 				26BC7D5D10F1B77400F91463 /* lldb-private-log.h */,
 				26217930133BC8640083B112 /* lldb-private-types.h */,
 				262D3190111B4341004E6F88 /* API */,
@@ -1384,6 +1399,7 @@
 				4CCA643A13B40B82003BDF98 /* LanguageRuntime */,
 				260C897E10F57C5600BB2B04 /* ObjectContainer */,
 				260C898210F57C5600BB2B04 /* ObjectFile */,
+				266DFE9013FD64D200D0C574 /* OperatingSystem */,
 				26C5577E132575B6008FD8FE /* Platform */,
 				260C898A10F57C5600BB2B04 /* Process */,
 				260C89B110F57C5600BB2B04 /* SymbolFile */,
@@ -1424,8 +1440,8 @@
 		260C897910F57C5600BB2B04 /* MacOSX-DYLD */ = {
 			isa = PBXGroup;
 			children = (
-				260C897B10F57C5600BB2B04 /* DynamicLoaderMacOSXDYLD.h */,
 				260C897A10F57C5600BB2B04 /* DynamicLoaderMacOSXDYLD.cpp */,
+				260C897B10F57C5600BB2B04 /* DynamicLoaderMacOSXDYLD.h */,
 			);
 			path = "MacOSX-DYLD";
 			sourceTree = "<group>";
@@ -1741,6 +1757,23 @@
 			path = Python;
 			sourceTree = "<group>";
 		};
+		266DFE9013FD64D200D0C574 /* OperatingSystem */ = {
+			isa = PBXGroup;
+			children = (
+				266DFE9113FD64D200D0C574 /* MacOSX-Kernel */,
+			);
+			path = OperatingSystem;
+			sourceTree = "<group>";
+		};
+		266DFE9113FD64D200D0C574 /* MacOSX-Kernel */ = {
+			isa = PBXGroup;
+			children = (
+				266DFE9213FD64D200D0C574 /* OperatingSystemMacOSXKernel.cpp */,
+				266DFE9313FD64D200D0C574 /* OperatingSystemMacOSXKernel.h */,
+			);
+			path = "MacOSX-Kernel";
+			sourceTree = "<group>";
+		};
 		2682F168115ED9C800CCFF99 /* Utility */ = {
 			isa = PBXGroup;
 			children = (
@@ -1816,6 +1849,8 @@
 				B2D3033612EFA5C500F84EB3 /* InstructionUtils.h */,
 				B287E63E12EFAE2C00C9BEFE /* ARMDefines.h */,
 				B23DD24F12EDFAC1000C3894 /* ARMUtils.h */,
+				26954EBC1401EE8B00294D09 /* DynamicRegisterInfo.cpp */,
+				26954EBD1401EE8B00294D09 /* DynamicRegisterInfo.h */,
 				B28058A0139988B0002D96D0 /* InferiorCallPOSIX.cpp */,
 				B28058A2139988C6002D96D0 /* InferiorCallPOSIX.h */,
 				AF68D32F1255A110002FF25B /* UnwindLLDB.cpp */,
@@ -1828,10 +1863,14 @@
 				26957D9713D381C900670048 /* RegisterContextDarwin_x86_64.h */,
 				AF68D2541255416E002FF25B /* RegisterContextLLDB.cpp */,
 				AF68D2551255416E002FF25B /* RegisterContextLLDB.h */,
+				262D24E413FB8710002D1960 /* RegisterContextMemory.cpp */,
+				262D24E513FB8710002D1960 /* RegisterContextMemory.h */,
 				26E3EEF811A994E800FBADB6 /* RegisterContextMacOSXFrameBackchain.h */,
 				26E3EEF711A994E800FBADB6 /* RegisterContextMacOSXFrameBackchain.cpp */,
 				2615DBC91208B5FC0021781D /* StopInfoMachException.h */,
 				2615DBC81208B5FC0021781D /* StopInfoMachException.cpp */,
+				26F4A21A13FBA31A0064B613 /* ThreadMemory.cpp */,
+				26F4A21B13FBA31A0064B613 /* ThreadMemory.h */,
 				26E3EEE411A9901300FBADB6 /* UnwindMacOSXFrameBackchain.h */,
 				26E3EEE311A9901300FBADB6 /* UnwindMacOSXFrameBackchain.cpp */,
 			);
@@ -1922,6 +1961,8 @@
 				26BC7E8310F1B85900F91463 /* ModuleList.cpp */,
 				26651A15133BF9CC005B64B7 /* Opcode.h */,
 				26651A17133BF9DF005B64B7 /* Opcode.cpp */,
+				266DFE9813FD658300D0C574 /* OperatingSystem.h */,
+				266DFE9613FD656E00D0C574 /* OperatingSystem.cpp */,
 				26BC7D7010F1B77400F91463 /* PluginInterface.h */,
 				26BC7D7110F1B77400F91463 /* PluginManager.h */,
 				26BC7E8A10F1B85900F91463 /* PluginManager.cpp */,
@@ -2150,7 +2191,6 @@
 		26BC7DBE10F1B78200F91463 /* Expression */ = {
 			isa = PBXGroup;
 			children = (
-				26BC7C2810F1B3BC00F91463 /* lldb-private-interfaces.h */,
 				49D7072611B5AD03001AD875 /* ClangASTSource.h */,
 				49D7072811B5AD11001AD875 /* ClangASTSource.cpp */,
 				26BC7DC010F1B79500F91463 /* ClangExpression.h */,
@@ -2650,7 +2690,6 @@
 				9A357583116CFDEE00E8ED2F /* SBValueList.h in Headers */,
 				26D265A2136B40EE002EEE45 /* SharingPtr.h in Headers */,
 				26D265BC136B4269002EEE45 /* lldb-public.h in Headers */,
-				49C850771384A02F007DB519 /* ProcessDataAllocator.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3250,6 +3289,11 @@
 				26D7E45D13D5E30A007FD12B /* SocketAddress.cpp in Sources */,
 				B271B11413D6139300C3FEDB /* FormatClasses.cpp in Sources */,
 				94B6E76213D88365005F417F /* ValueObjectSyntheticFilter.cpp in Sources */,
+				262D24E613FB8710002D1960 /* RegisterContextMemory.cpp in Sources */,
+				26F4A21C13FBA31A0064B613 /* ThreadMemory.cpp in Sources */,
+				266DFE9413FD64D200D0C574 /* OperatingSystemMacOSXKernel.cpp in Sources */,
+				266DFE9713FD656E00D0C574 /* OperatingSystem.cpp in Sources */,
+				26954EBE1401EE8B00294D09 /* DynamicRegisterInfo.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: lldb/trunk/source/Core/FormatClasses.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatClasses.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Core/FormatClasses.cpp (original)
+++ lldb/trunk/source/Core/FormatClasses.cpp Sun Aug 21 21:49:39 2011
@@ -132,7 +132,7 @@
         // by the expression, but in host memory. because Python code might need to read
         // into the object memory in non-obvious ways, we need to hand it the target version
         // of the expression output
-        lldb::addr_t tgt_address = object->GetValueAsUnsigned();
+        lldb::addr_t tgt_address = object->GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
         target_object = ValueObjectConstResult::Create (object->GetExecutionContextScope(),
                                                         object->GetClangAST(),
                                                         object->GetClangType(),
@@ -208,8 +208,8 @@
 
 SyntheticScriptProvider::FrontEnd::FrontEnd(std::string pclass,
                                             lldb::ValueObjectSP be) :
-SyntheticChildrenFrontEnd(be),
-m_python_class(pclass)
+    SyntheticChildrenFrontEnd(be),
+    m_python_class(pclass)
 {
     if (be.get() == NULL)
     {
@@ -227,7 +227,7 @@
         // by the expression, but in host memory. because Python code might need to read
         // into the object memory in non-obvious ways, we need to hand it the target version
         // of the expression output
-        lldb::addr_t tgt_address = be->GetValueAsUnsigned();
+        lldb::addr_t tgt_address = be->GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
         m_backend = ValueObjectConstResult::Create (be->GetExecutionContextScope(),
                                                     be->GetClangAST(),
                                                     be->GetClangType(),

Modified: lldb/trunk/source/Core/PluginManager.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/PluginManager.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Core/PluginManager.cpp (original)
+++ lldb/trunk/source/Core/PluginManager.cpp Sun Aug 21 21:49:39 2011
@@ -640,6 +640,110 @@
     }
     return NULL;
 }
+#pragma mark OperatingSystem
+
+
+struct OperatingSystemInstance
+{
+    OperatingSystemInstance() :
+        name(),
+        description(),
+        create_callback(NULL)
+    {
+    }
+    
+    std::string name;
+    std::string description;
+    OperatingSystemCreateInstance create_callback;
+};
+
+typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
+
+static Mutex &
+GetOperatingSystemMutex ()
+{
+    static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
+    return g_instances_mutex;
+}
+
+static OperatingSystemInstances &
+GetOperatingSystemInstances ()
+{
+    static OperatingSystemInstances g_instances;
+    return g_instances;
+}
+
+bool
+PluginManager::RegisterPlugin
+(
+ const char *name,
+ const char *description,
+ OperatingSystemCreateInstance create_callback
+ )
+{
+    if (create_callback)
+    {
+        OperatingSystemInstance instance;
+        assert (name && name[0]);
+        instance.name = name;
+        if (description && description[0])
+            instance.description = description;
+        instance.create_callback = create_callback;
+        Mutex::Locker locker (GetOperatingSystemMutex ());
+        GetOperatingSystemInstances ().push_back (instance);
+    }
+    return false;
+}
+
+bool
+PluginManager::UnregisterPlugin (OperatingSystemCreateInstance create_callback)
+{
+    if (create_callback)
+    {
+        Mutex::Locker locker (GetOperatingSystemMutex ());
+        OperatingSystemInstances &instances = GetOperatingSystemInstances ();
+        
+        OperatingSystemInstances::iterator pos, end = instances.end();
+        for (pos = instances.begin(); pos != end; ++ pos)
+        {
+            if (pos->create_callback == create_callback)
+            {
+                instances.erase(pos);
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+OperatingSystemCreateInstance
+PluginManager::GetOperatingSystemCreateCallbackAtIndex (uint32_t idx)
+{
+    Mutex::Locker locker (GetOperatingSystemMutex ());
+    OperatingSystemInstances &instances = GetOperatingSystemInstances ();
+    if (idx < instances.size())
+        return instances[idx].create_callback;
+    return NULL;
+}
+
+OperatingSystemCreateInstance
+PluginManager::GetOperatingSystemCreateCallbackForPluginName (const char *name)
+{
+    if (name && name[0])
+    {
+        llvm::StringRef name_sref(name);
+        Mutex::Locker locker (GetOperatingSystemMutex ());
+        OperatingSystemInstances &instances = GetOperatingSystemInstances ();
+        
+        OperatingSystemInstances::iterator pos, end = instances.end();
+        for (pos = instances.begin(); pos != end; ++ pos)
+        {
+            if (name_sref.equals (pos->name))
+                return pos->create_callback;
+        }
+    }
+    return NULL;
+}
 
 
 #pragma mark LanguageRuntime

Modified: lldb/trunk/source/Core/Section.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Section.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Core/Section.cpp (original)
+++ lldb/trunk/source/Core/Section.cpp Sun Aug 21 21:49:39 2011
@@ -117,7 +117,9 @@
     addr_t load_base_addr = LLDB_INVALID_ADDRESS;
     if (m_linked_section)
     {
-        load_base_addr = m_linked_section->GetLoadBaseAddress(target) + m_linked_offset;
+        load_base_addr = m_linked_section->GetLoadBaseAddress(target);
+        if (load_base_addr != LLDB_INVALID_ADDRESS)
+            load_base_addr += m_linked_offset;
     }
     else
     if (m_parent)

Modified: lldb/trunk/source/Core/ValueObject.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Core/ValueObject.cpp (original)
+++ lldb/trunk/source/Core/ValueObject.cpp Sun Aug 21 21:49:39 2011
@@ -937,20 +937,17 @@
 
 // if > 8bytes, 0 is returned. this method should mostly be used
 // to read address values out of pointers
-unsigned long long
-ValueObject::GetValueAsUnsigned()
+uint64_t
+ValueObject::GetValueAsUnsigned (uint64_t fail_value)
 {
     // If our byte size is zero this is an aggregate type that has children
     if (ClangASTContext::IsAggregateType (GetClangType()) == false)
     {
-        if (UpdateValueIfNeeded(true))
-        {
-            uint32_t offset = 0;
-            return m_data.GetMaxU64(&offset,
-                                    m_data.GetByteSize());
-        }
+        Scalar scalar;
+        if (ResolveValue (scalar))
+            return scalar.GetRawBits64(fail_value);
     }
-    return 0;
+    return fail_value;
 }
 
 bool

Modified: lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp Sun Aug 21 21:49:39 2011
@@ -26,6 +26,7 @@
 #include "llvm/ADT/Triple.h"
 
 #include "Utility/ARM_DWARF_Registers.h"
+#include "Utility/ARM_GCC_Registers.h"
 #include "Plugins/Process/Utility/ARMDefines.h"
 
 #include <vector>
@@ -37,6 +38,141 @@
 static const char *pluginDesc = "Mac OS X ABI for arm targets";
 static const char *pluginShort = "abi.macosx-arm";
 
+
+static RegisterInfo g_register_infos[] = 
+{
+    //  NAME       ALT       SZ OFF ENCODING         FORMAT          COMPILER                DWARF               GENERIC                     GDB                     LLDB NATIVE
+    //  ========== =======   == === =============    ============    ======================= =================== =========================== ======================= ======================
+    {   "r0",      "arg1",    4, 0, eEncodingUint    , eFormatHex,   { gcc_r0,               dwarf_r0,           LLDB_REGNUM_GENERIC_ARG1,   gdb_arm_r0,             LLDB_INVALID_REGNUM }},
+    {   "r1",      "arg2",    4, 0, eEncodingUint    , eFormatHex,   { gcc_r1,               dwarf_r1,           LLDB_REGNUM_GENERIC_ARG2,   gdb_arm_r1,             LLDB_INVALID_REGNUM }},
+    {   "r2",      "arg3",    4, 0, eEncodingUint    , eFormatHex,   { gcc_r2,               dwarf_r2,           LLDB_REGNUM_GENERIC_ARG3,   gdb_arm_r2,             LLDB_INVALID_REGNUM }},
+    {   "r3",      "arg4",    4, 0, eEncodingUint    , eFormatHex,   { gcc_r3,               dwarf_r3,           LLDB_REGNUM_GENERIC_ARG4,   gdb_arm_r3,             LLDB_INVALID_REGNUM }},
+    {   "r4",      NULL,      4, 0, eEncodingUint    , eFormatHex,   { gcc_r4,               dwarf_r4,           LLDB_INVALID_REGNUM,        gdb_arm_r4,             LLDB_INVALID_REGNUM }},
+    {   "r5",      NULL,      4, 0, eEncodingUint    , eFormatHex,   { gcc_r5,               dwarf_r5,           LLDB_INVALID_REGNUM,        gdb_arm_r5,             LLDB_INVALID_REGNUM }},
+    {   "r6",      NULL,      4, 0, eEncodingUint    , eFormatHex,   { gcc_r6,               dwarf_r6,           LLDB_INVALID_REGNUM,        gdb_arm_r6,             LLDB_INVALID_REGNUM }},
+    {   "r7",      NULL,      4, 0, eEncodingUint    , eFormatHex,   { gcc_r7,               dwarf_r7,           LLDB_REGNUM_GENERIC_FP,     gdb_arm_r7,             LLDB_INVALID_REGNUM }},
+    {   "r8",      NULL,      4, 0, eEncodingUint    , eFormatHex,   { gcc_r8,               dwarf_r8,           LLDB_INVALID_REGNUM,        gdb_arm_r8,             LLDB_INVALID_REGNUM }},
+    {   "r9",      NULL,      4, 0, eEncodingUint    , eFormatHex,   { gcc_r9,               dwarf_r9,           LLDB_INVALID_REGNUM,        gdb_arm_r9,             LLDB_INVALID_REGNUM }},
+    {   "r10",     NULL,      4, 0, eEncodingUint    , eFormatHex,   { gcc_r10,              dwarf_r10,          LLDB_INVALID_REGNUM,        gdb_arm_r10,            LLDB_INVALID_REGNUM }},
+    {   "r11",     NULL,      4, 0, eEncodingUint    , eFormatHex,   { gcc_r11,              dwarf_r11,          LLDB_INVALID_REGNUM,        gdb_arm_r11,            LLDB_INVALID_REGNUM }},
+    {   "r12",     NULL,      4, 0, eEncodingUint    , eFormatHex,   { gcc_r12,              dwarf_r12,          LLDB_INVALID_REGNUM,        gdb_arm_r12,            LLDB_INVALID_REGNUM }},
+    {   "sp",      "r13",     4, 0, eEncodingUint    , eFormatHex,   { gcc_sp,               dwarf_sp,           LLDB_REGNUM_GENERIC_SP,     gdb_arm_sp,             LLDB_INVALID_REGNUM }},
+    {   "lr",      "r14",     4, 0, eEncodingUint    , eFormatHex,   { gcc_lr,               dwarf_lr,           LLDB_REGNUM_GENERIC_RA,     gdb_arm_lr,             LLDB_INVALID_REGNUM }},
+    {   "pc",      "r15",     4, 0, eEncodingUint    , eFormatHex,   { gcc_pc,               dwarf_pc,           LLDB_REGNUM_GENERIC_PC,     gdb_arm_pc,             LLDB_INVALID_REGNUM }},
+    {   "cpsr",    "psr",     4, 0, eEncodingUint    , eFormatHex,   { gcc_cpsr,             dwarf_cpsr,         LLDB_REGNUM_GENERIC_FLAGS,  gdb_arm_cpsr,           LLDB_INVALID_REGNUM }},
+    {   "s0",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s0,           LLDB_INVALID_REGNUM,        gdb_arm_s0,             LLDB_INVALID_REGNUM }},
+    {   "s1",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s1,           LLDB_INVALID_REGNUM,        gdb_arm_s1,             LLDB_INVALID_REGNUM }},
+    {   "s2",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s2,           LLDB_INVALID_REGNUM,        gdb_arm_s2,             LLDB_INVALID_REGNUM }},
+    {   "s3",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s3,           LLDB_INVALID_REGNUM,        gdb_arm_s3,             LLDB_INVALID_REGNUM }},
+    {   "s4",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s4,           LLDB_INVALID_REGNUM,        gdb_arm_s4,             LLDB_INVALID_REGNUM }},
+    {   "s5",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s5,           LLDB_INVALID_REGNUM,        gdb_arm_s5,             LLDB_INVALID_REGNUM }},
+    {   "s6",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s6,           LLDB_INVALID_REGNUM,        gdb_arm_s6,             LLDB_INVALID_REGNUM }},
+    {   "s7",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s7,           LLDB_INVALID_REGNUM,        gdb_arm_s7,             LLDB_INVALID_REGNUM }},
+    {   "s8",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s8,           LLDB_INVALID_REGNUM,        gdb_arm_s8,             LLDB_INVALID_REGNUM }},
+    {   "s9",      NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s9,           LLDB_INVALID_REGNUM,        gdb_arm_s9,             LLDB_INVALID_REGNUM }},
+    {   "s10",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s10,          LLDB_INVALID_REGNUM,        gdb_arm_s10,            LLDB_INVALID_REGNUM }},
+    {   "s11",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s11,          LLDB_INVALID_REGNUM,        gdb_arm_s11,            LLDB_INVALID_REGNUM }},
+    {   "s12",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s12,          LLDB_INVALID_REGNUM,        gdb_arm_s12,            LLDB_INVALID_REGNUM }},
+    {   "s13",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s13,          LLDB_INVALID_REGNUM,        gdb_arm_s13,            LLDB_INVALID_REGNUM }},
+    {   "s14",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s14,          LLDB_INVALID_REGNUM,        gdb_arm_s14,            LLDB_INVALID_REGNUM }},
+    {   "s15",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s15,          LLDB_INVALID_REGNUM,        gdb_arm_s15,            LLDB_INVALID_REGNUM }},
+    {   "s16",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s16,          LLDB_INVALID_REGNUM,        gdb_arm_s16,            LLDB_INVALID_REGNUM }},
+    {   "s17",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s17,          LLDB_INVALID_REGNUM,        gdb_arm_s17,            LLDB_INVALID_REGNUM }},
+    {   "s18",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s18,          LLDB_INVALID_REGNUM,        gdb_arm_s18,            LLDB_INVALID_REGNUM }},
+    {   "s19",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s19,          LLDB_INVALID_REGNUM,        gdb_arm_s19,            LLDB_INVALID_REGNUM }},
+    {   "s20",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s20,          LLDB_INVALID_REGNUM,        gdb_arm_s20,            LLDB_INVALID_REGNUM }},
+    {   "s21",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s21,          LLDB_INVALID_REGNUM,        gdb_arm_s21,            LLDB_INVALID_REGNUM }},
+    {   "s22",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s22,          LLDB_INVALID_REGNUM,        gdb_arm_s22,            LLDB_INVALID_REGNUM }},
+    {   "s23",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s23,          LLDB_INVALID_REGNUM,        gdb_arm_s23,            LLDB_INVALID_REGNUM }},
+    {   "s24",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s24,          LLDB_INVALID_REGNUM,        gdb_arm_s24,            LLDB_INVALID_REGNUM }},
+    {   "s25",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s25,          LLDB_INVALID_REGNUM,        gdb_arm_s25,            LLDB_INVALID_REGNUM }},
+    {   "s26",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s26,          LLDB_INVALID_REGNUM,        gdb_arm_s26,            LLDB_INVALID_REGNUM }},
+    {   "s27",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s27,          LLDB_INVALID_REGNUM,        gdb_arm_s27,            LLDB_INVALID_REGNUM }},
+    {   "s28",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s28,          LLDB_INVALID_REGNUM,        gdb_arm_s28,            LLDB_INVALID_REGNUM }},
+    {   "s29",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s29,          LLDB_INVALID_REGNUM,        gdb_arm_s29,            LLDB_INVALID_REGNUM }},
+    {   "s30",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s30,          LLDB_INVALID_REGNUM,        gdb_arm_s30,            LLDB_INVALID_REGNUM }},
+    {   "s31",     NULL,      4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_s31,          LLDB_INVALID_REGNUM,        gdb_arm_s31,            LLDB_INVALID_REGNUM }},
+    {   "fpscr",   NULL,      4, 0, eEncodingUint    , eFormatHex  , { LLDB_INVALID_REGNUM,  LLDB_INVALID_REGNUM,LLDB_INVALID_REGNUM,        gdb_arm_fpscr,          LLDB_INVALID_REGNUM }},
+    {   "d0",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d0,           LLDB_INVALID_REGNUM,        gdb_arm_d0,             LLDB_INVALID_REGNUM }},
+    {   "d1",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d1,           LLDB_INVALID_REGNUM,        gdb_arm_d1,             LLDB_INVALID_REGNUM }},
+    {   "d2",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d2,           LLDB_INVALID_REGNUM,        gdb_arm_d2,             LLDB_INVALID_REGNUM }},
+    {   "d3",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d3,           LLDB_INVALID_REGNUM,        gdb_arm_d3,             LLDB_INVALID_REGNUM }},
+    {   "d4",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d4,           LLDB_INVALID_REGNUM,        gdb_arm_d4,             LLDB_INVALID_REGNUM }},
+    {   "d5",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d5,           LLDB_INVALID_REGNUM,        gdb_arm_d5,             LLDB_INVALID_REGNUM }},
+    {   "d6",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d6,           LLDB_INVALID_REGNUM,        gdb_arm_d6,             LLDB_INVALID_REGNUM }},
+    {   "d7",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d7,           LLDB_INVALID_REGNUM,        gdb_arm_d7,             LLDB_INVALID_REGNUM }},
+    {   "d8",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d8,           LLDB_INVALID_REGNUM,        gdb_arm_d8,             LLDB_INVALID_REGNUM }},
+    {   "d9",      NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d9,           LLDB_INVALID_REGNUM,        gdb_arm_d9,             LLDB_INVALID_REGNUM }},
+    {   "d10",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d10,          LLDB_INVALID_REGNUM,        gdb_arm_d10,            LLDB_INVALID_REGNUM }},
+    {   "d11",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d11,          LLDB_INVALID_REGNUM,        gdb_arm_d11,            LLDB_INVALID_REGNUM }},
+    {   "d12",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d12,          LLDB_INVALID_REGNUM,        gdb_arm_d12,            LLDB_INVALID_REGNUM }},
+    {   "d13",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d13,          LLDB_INVALID_REGNUM,        gdb_arm_d13,            LLDB_INVALID_REGNUM }},
+    {   "d14",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d14,          LLDB_INVALID_REGNUM,        gdb_arm_d14,            LLDB_INVALID_REGNUM }},
+    {   "d15",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d15,          LLDB_INVALID_REGNUM,        gdb_arm_d15,            LLDB_INVALID_REGNUM }},
+    {   "d16",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d16,          LLDB_INVALID_REGNUM,        gdb_arm_d16,            LLDB_INVALID_REGNUM }},
+    {   "d17",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d17,          LLDB_INVALID_REGNUM,        gdb_arm_d17,            LLDB_INVALID_REGNUM }},
+    {   "d18",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d18,          LLDB_INVALID_REGNUM,        gdb_arm_d18,            LLDB_INVALID_REGNUM }},
+    {   "d19",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d19,          LLDB_INVALID_REGNUM,        gdb_arm_d19,            LLDB_INVALID_REGNUM }},
+    {   "d20",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d20,          LLDB_INVALID_REGNUM,        gdb_arm_d20,            LLDB_INVALID_REGNUM }},
+    {   "d21",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d21,          LLDB_INVALID_REGNUM,        gdb_arm_d21,            LLDB_INVALID_REGNUM }},
+    {   "d22",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d22,          LLDB_INVALID_REGNUM,        gdb_arm_d22,            LLDB_INVALID_REGNUM }},
+    {   "d23",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d23,          LLDB_INVALID_REGNUM,        gdb_arm_d23,            LLDB_INVALID_REGNUM }},
+    {   "d24",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d24,          LLDB_INVALID_REGNUM,        gdb_arm_d24,            LLDB_INVALID_REGNUM }},
+    {   "d25",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d25,          LLDB_INVALID_REGNUM,        gdb_arm_d25,            LLDB_INVALID_REGNUM }},
+    {   "d26",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d26,          LLDB_INVALID_REGNUM,        gdb_arm_d26,            LLDB_INVALID_REGNUM }},
+    {   "d27",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d27,          LLDB_INVALID_REGNUM,        gdb_arm_d27,            LLDB_INVALID_REGNUM }},
+    {   "d28",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d28,          LLDB_INVALID_REGNUM,        gdb_arm_d28,            LLDB_INVALID_REGNUM }},
+    {   "d29",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d29,          LLDB_INVALID_REGNUM,        gdb_arm_d29,            LLDB_INVALID_REGNUM }},
+    {   "d30",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d30,          LLDB_INVALID_REGNUM,        gdb_arm_d30,            LLDB_INVALID_REGNUM }},
+    {   "d31",     NULL,      8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM,  dwarf_d31,          LLDB_INVALID_REGNUM,        gdb_arm_d31,            LLDB_INVALID_REGNUM }},
+    {   "r8_usr",  NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r8_usr,       LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r9_usr",  NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r9_usr,       LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r10_usr", NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r10_usr,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r11_usr", NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r11_usr,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r12_usr", NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r12_usr,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r13_usr", "sp_usr",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r13_usr,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r14_usr", "lr_usr",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r14_usr,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r8_fiq",  NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r8_fiq,       LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r9_fiq",  NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r9_fiq,       LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r10_fiq", NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r10_fiq,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r11_fiq", NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r11_fiq,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r12_fiq", NULL,      4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r12_fiq,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r13_fiq", "sp_fiq",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r13_fiq,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r14_fiq", "lr_fiq",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r14_fiq,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r13_irq", "sp_irq",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r13_irq,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r14_irq", "lr_irq",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r14_irq,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r13_abt", "sp_abt",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r13_abt,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r14_abt", "lr_abt",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r14_abt,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r13_und", "sp_und",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r13_und,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r14_und", "lr_und",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r14_und,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r13_svc", "sp_svc",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r13_svc,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }},
+    {   "r14_svc", "lr_svc",  4, 0, eEncodingUint    , eFormatHex,   { LLDB_INVALID_REGNUM,  dwarf_r14_svc,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM }}
+};
+static const uint32_t k_num_register_infos = sizeof(g_register_infos)/sizeof(RegisterInfo);
+static bool g_register_info_names_constified = false;
+
+const lldb_private::RegisterInfo *
+ABIMacOSX_arm::GetRegisterInfoArray (uint32_t &count)
+{
+    // Make the C-string names and alt_names for the register infos into const 
+    // C-string values by having the ConstString unique the names in the global
+    // constant C-string pool.
+    if (!g_register_info_names_constified)
+    {
+        g_register_info_names_constified = true;
+        for (uint32_t i=0; i<k_num_register_infos; ++i)
+        {
+            if (g_register_infos[i].name)
+                g_register_infos[i].name = ConstString(g_register_infos[i].name).GetCString();
+            if (g_register_infos[i].alt_name)
+                g_register_infos[i].alt_name = ConstString(g_register_infos[i].alt_name).GetCString();
+        }
+    }
+    count = k_num_register_infos;
+    return g_register_infos;
+}
+
+
 size_t
 ABIMacOSX_arm::GetRedZoneSize () const
 {

Modified: lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h Sun Aug 21 21:49:39 2011
@@ -79,6 +79,9 @@
         // alignment
         return pc <= UINT32_MAX;
     }
+    
+    virtual const lldb_private::RegisterInfo *
+    GetRegisterInfoArray (uint32_t &count);
 
     //------------------------------------------------------------------
     // Static Functions

Modified: lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp Sun Aug 21 21:49:39 2011
@@ -33,6 +33,199 @@
 static const char *pluginDesc = "Mac OS X ABI for i386 targets";
 static const char *pluginShort = "abi.macosx-i386";
 
+enum
+{
+    gcc_eax = 0,
+    gcc_ecx,
+    gcc_edx,
+    gcc_ebx,
+    gcc_ebp,
+    gcc_esp,
+    gcc_esi,
+    gcc_edi,
+    gcc_eip,
+    gcc_eflags
+};
+
+enum
+{
+    dwarf_eax = 0,
+    dwarf_ecx,
+    dwarf_edx,
+    dwarf_ebx,
+    dwarf_esp,
+    dwarf_ebp,
+    dwarf_esi,
+    dwarf_edi,
+    dwarf_eip,
+    dwarf_eflags,
+    dwarf_stmm0 = 11,
+    dwarf_stmm1,
+    dwarf_stmm2,
+    dwarf_stmm3,
+    dwarf_stmm4,
+    dwarf_stmm5,
+    dwarf_stmm6,
+    dwarf_stmm7,
+    dwarf_xmm0 = 21,
+    dwarf_xmm1,
+    dwarf_xmm2,
+    dwarf_xmm3,
+    dwarf_xmm4,
+    dwarf_xmm5,
+    dwarf_xmm6,
+    dwarf_xmm7,
+    dwarf_ymm0 = dwarf_xmm0,
+    dwarf_ymm1 = dwarf_xmm1,
+    dwarf_ymm2 = dwarf_xmm2,
+    dwarf_ymm3 = dwarf_xmm3,
+    dwarf_ymm4 = dwarf_xmm4,
+    dwarf_ymm5 = dwarf_xmm5,
+    dwarf_ymm6 = dwarf_xmm6,
+    dwarf_ymm7 = dwarf_xmm7
+};
+
+enum
+{
+    gdb_eax        =  0,
+    gdb_ecx        =  1,
+    gdb_edx        =  2,
+    gdb_ebx        =  3,
+    gdb_esp        =  4,
+    gdb_ebp        =  5,
+    gdb_esi        =  6,
+    gdb_edi        =  7,
+    gdb_eip        =  8,
+    gdb_eflags     =  9,
+    gdb_cs         = 10,
+    gdb_ss         = 11,
+    gdb_ds         = 12,
+    gdb_es         = 13,
+    gdb_fs         = 14,
+    gdb_gs         = 15,
+    gdb_stmm0      = 16,
+    gdb_stmm1      = 17,
+    gdb_stmm2      = 18,
+    gdb_stmm3      = 19,
+    gdb_stmm4      = 20,
+    gdb_stmm5      = 21,
+    gdb_stmm6      = 22,
+    gdb_stmm7      = 23,
+    gdb_fctrl      = 24,    gdb_fcw     = gdb_fctrl,
+    gdb_fstat      = 25,    gdb_fsw     = gdb_fstat,
+    gdb_ftag       = 26,    gdb_ftw     = gdb_ftag,
+    gdb_fiseg      = 27,    gdb_fpu_cs  = gdb_fiseg,
+    gdb_fioff      = 28,    gdb_ip      = gdb_fioff,
+    gdb_foseg      = 29,    gdb_fpu_ds  = gdb_foseg,
+    gdb_fooff      = 30,    gdb_dp      = gdb_fooff,
+    gdb_fop        = 31,
+    gdb_xmm0       = 32,
+    gdb_xmm1       = 33,
+    gdb_xmm2       = 34,
+    gdb_xmm3       = 35,
+    gdb_xmm4       = 36,
+    gdb_xmm5       = 37,
+    gdb_xmm6       = 38,
+    gdb_xmm7       = 39,
+    gdb_mxcsr      = 40,
+    gdb_mm0        = 41,
+    gdb_mm1        = 42,
+    gdb_mm2        = 43,
+    gdb_mm3        = 44,
+    gdb_mm4        = 45,
+    gdb_mm5        = 46,
+    gdb_mm6        = 47,
+    gdb_mm7        = 48,
+    gdb_ymm0       = gdb_xmm0,
+    gdb_ymm1       = gdb_xmm1,
+    gdb_ymm2       = gdb_xmm2,
+    gdb_ymm3       = gdb_xmm3,
+    gdb_ymm4       = gdb_xmm4,
+    gdb_ymm5       = gdb_xmm5,
+    gdb_ymm6       = gdb_xmm6,
+    gdb_ymm7       = gdb_xmm7
+};
+
+
+static RegisterInfo g_register_infos[] = 
+{
+  //  NAME      ALT      SZ OFF ENCODING         FORMAT                COMPILER              DWARF                 GENERIC                      GDB                   LLDB NATIVE
+  //  ======    =======  == === =============    ============          ===================== ===================== ============================ ====================  ======================
+    { "eax",    NULL,    4,  0, eEncodingUint  , eFormatHex          , { gcc_eax             , dwarf_eax           , LLDB_INVALID_REGNUM       , gdb_eax            , LLDB_INVALID_REGNUM }},
+    { "ebx"   , NULL,    4,  0, eEncodingUint  , eFormatHex          , { gcc_ebx             , dwarf_ebx           , LLDB_INVALID_REGNUM       , gdb_ebx            , LLDB_INVALID_REGNUM }},
+    { "ecx"   , NULL,    4,  0, eEncodingUint  , eFormatHex          , { gcc_ecx             , dwarf_ecx           , LLDB_REGNUM_GENERIC_ARG4  , gdb_ecx            , LLDB_INVALID_REGNUM }},
+    { "edx"   , NULL,    4,  0, eEncodingUint  , eFormatHex          , { gcc_edx             , dwarf_edx           , LLDB_REGNUM_GENERIC_ARG3  , gdb_edx            , LLDB_INVALID_REGNUM }},
+    { "esi"   , NULL,    4,  0, eEncodingUint  , eFormatHex          , { gcc_esi             , dwarf_esi           , LLDB_REGNUM_GENERIC_ARG2  , gdb_esi            , LLDB_INVALID_REGNUM }},
+    { "edi"   , NULL,    4,  0, eEncodingUint  , eFormatHex          , { gcc_edi             , dwarf_edi           , LLDB_REGNUM_GENERIC_ARG1  , gdb_edi            , LLDB_INVALID_REGNUM }},
+    { "ebp"   , "fp",    4,  0, eEncodingUint  , eFormatHex          , { gcc_ebp             , dwarf_ebp           , LLDB_REGNUM_GENERIC_FP    , gdb_ebp            , LLDB_INVALID_REGNUM }},
+    { "esp"   , "sp",    4,  0, eEncodingUint  , eFormatHex          , { gcc_esp             , dwarf_esp           , LLDB_REGNUM_GENERIC_SP    , gdb_esp            , LLDB_INVALID_REGNUM }},
+    { "eip"   , "pc",    4,  0, eEncodingUint  , eFormatHex          , { gcc_eip             , dwarf_eip           , LLDB_REGNUM_GENERIC_PC    , gdb_eip            , LLDB_INVALID_REGNUM }},
+    { "eflags", NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_REGNUM_GENERIC_FLAGS , gdb_eflags         , LLDB_INVALID_REGNUM }},
+    { "cs"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_cs             , LLDB_INVALID_REGNUM }},
+    { "ss"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_ss             , LLDB_INVALID_REGNUM }},
+    { "ds"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_ds             , LLDB_INVALID_REGNUM }},
+    { "es"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_es             , LLDB_INVALID_REGNUM }},
+    { "fs"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fs             , LLDB_INVALID_REGNUM }},
+    { "gs"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_gs             , LLDB_INVALID_REGNUM }},
+    { "stmm0" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_stmm0         , LLDB_INVALID_REGNUM       , gdb_stmm0          , LLDB_INVALID_REGNUM }},
+    { "stmm1" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_stmm1         , LLDB_INVALID_REGNUM       , gdb_stmm1          , LLDB_INVALID_REGNUM }},
+    { "stmm2" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_stmm2         , LLDB_INVALID_REGNUM       , gdb_stmm2          , LLDB_INVALID_REGNUM }},
+    { "stmm3" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_stmm3         , LLDB_INVALID_REGNUM       , gdb_stmm3          , LLDB_INVALID_REGNUM }},
+    { "stmm4" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_stmm4         , LLDB_INVALID_REGNUM       , gdb_stmm4          , LLDB_INVALID_REGNUM }},
+    { "stmm5" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_stmm5         , LLDB_INVALID_REGNUM       , gdb_stmm5          , LLDB_INVALID_REGNUM }},
+    { "stmm6" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_stmm6         , LLDB_INVALID_REGNUM       , gdb_stmm6          , LLDB_INVALID_REGNUM }},
+    { "stmm7" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_stmm7         , LLDB_INVALID_REGNUM       , gdb_stmm7          , LLDB_INVALID_REGNUM }},
+    { "fctrl" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fctrl          , LLDB_INVALID_REGNUM }},
+    { "fstat" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fstat          , LLDB_INVALID_REGNUM }},
+    { "ftag"  , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_ftag           , LLDB_INVALID_REGNUM }},
+    { "fiseg" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fiseg          , LLDB_INVALID_REGNUM }},
+    { "fioff" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fioff          , LLDB_INVALID_REGNUM }},
+    { "foseg" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_foseg          , LLDB_INVALID_REGNUM }},
+    { "fooff" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fooff          , LLDB_INVALID_REGNUM }},
+    { "fop"   , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fop            , LLDB_INVALID_REGNUM }},
+    { "xmm0"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_xmm0          , LLDB_INVALID_REGNUM       , gdb_xmm0           , LLDB_INVALID_REGNUM }},
+    { "xmm1"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_xmm1          , LLDB_INVALID_REGNUM       , gdb_xmm1           , LLDB_INVALID_REGNUM }},
+    { "xmm2"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_xmm2          , LLDB_INVALID_REGNUM       , gdb_xmm2           , LLDB_INVALID_REGNUM }},
+    { "xmm3"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_xmm3          , LLDB_INVALID_REGNUM       , gdb_xmm3           , LLDB_INVALID_REGNUM }},
+    { "xmm4"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_xmm4          , LLDB_INVALID_REGNUM       , gdb_xmm4           , LLDB_INVALID_REGNUM }},
+    { "xmm5"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_xmm5          , LLDB_INVALID_REGNUM       , gdb_xmm5           , LLDB_INVALID_REGNUM }},
+    { "xmm6"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_xmm6          , LLDB_INVALID_REGNUM       , gdb_xmm6           , LLDB_INVALID_REGNUM }},
+    { "xmm7"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_xmm7          , LLDB_INVALID_REGNUM       , gdb_xmm7           , LLDB_INVALID_REGNUM }},
+    { "mxcsr" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_mxcsr          , LLDB_INVALID_REGNUM }},
+    { "ymm0"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_ymm0          , LLDB_INVALID_REGNUM       , gdb_ymm0           , LLDB_INVALID_REGNUM }},
+    { "ymm1"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_ymm1          , LLDB_INVALID_REGNUM       , gdb_ymm1           , LLDB_INVALID_REGNUM }},
+    { "ymm2"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_ymm2          , LLDB_INVALID_REGNUM       , gdb_ymm2           , LLDB_INVALID_REGNUM }},
+    { "ymm3"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_ymm3          , LLDB_INVALID_REGNUM       , gdb_ymm3           , LLDB_INVALID_REGNUM }},
+    { "ymm4"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_ymm4          , LLDB_INVALID_REGNUM       , gdb_ymm4           , LLDB_INVALID_REGNUM }},
+    { "ymm5"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_ymm5          , LLDB_INVALID_REGNUM       , gdb_ymm5           , LLDB_INVALID_REGNUM }},
+    { "ymm6"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_ymm6          , LLDB_INVALID_REGNUM       , gdb_ymm6           , LLDB_INVALID_REGNUM }},
+    { "ymm7"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM , dwarf_ymm7          , LLDB_INVALID_REGNUM       , gdb_ymm7           , LLDB_INVALID_REGNUM }}
+};
+
+static const uint32_t k_num_register_infos = sizeof(g_register_infos)/sizeof(RegisterInfo);
+static bool g_register_info_names_constified = false;
+
+const lldb_private::RegisterInfo *
+ABIMacOSX_i386::GetRegisterInfoArray (uint32_t &count)
+{
+    // Make the C-string names and alt_names for the register infos into const 
+    // C-string values by having the ConstString unique the names in the global
+    // constant C-string pool.
+    if (!g_register_info_names_constified)
+    {
+        g_register_info_names_constified = true;
+        for (uint32_t i=0; i<k_num_register_infos; ++i)
+        {
+            if (g_register_infos[i].name)
+                g_register_infos[i].name = ConstString(g_register_infos[i].name).GetCString();
+            if (g_register_infos[i].alt_name)
+                g_register_infos[i].alt_name = ConstString(g_register_infos[i].alt_name).GetCString();
+        }
+    }
+    count = k_num_register_infos;
+    return g_register_infos;
+}
+
 size_t
 ABIMacOSX_i386::GetRedZoneSize () const
 {

Modified: lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h Sun Aug 21 21:49:39 2011
@@ -23,119 +23,6 @@
 {
 public:
 
-    enum
-    {
-        gcc_eax = 0,
-        gcc_ecx,
-        gcc_edx,
-        gcc_ebx,
-        gcc_ebp,
-        gcc_esp,
-        gcc_esi,
-        gcc_edi,
-        gcc_eip,
-        gcc_eflags
-    };
-    
-    enum
-    {
-        dwarf_eax = 0,
-        dwarf_ecx,
-        dwarf_edx,
-        dwarf_ebx,
-        dwarf_esp,
-        dwarf_ebp,
-        dwarf_esi,
-        dwarf_edi,
-        dwarf_eip,
-        dwarf_eflags,
-        dwarf_stmm0 = 11,
-        dwarf_stmm1,
-        dwarf_stmm2,
-        dwarf_stmm3,
-        dwarf_stmm4,
-        dwarf_stmm5,
-        dwarf_stmm6,
-        dwarf_stmm7,
-        dwarf_xmm0 = 21,
-        dwarf_xmm1,
-        dwarf_xmm2,
-        dwarf_xmm3,
-        dwarf_xmm4,
-        dwarf_xmm5,
-        dwarf_xmm6,
-        dwarf_xmm7,
-        dwarf_ymm0 = dwarf_xmm0,
-        dwarf_ymm1 = dwarf_xmm1,
-        dwarf_ymm2 = dwarf_xmm2,
-        dwarf_ymm3 = dwarf_xmm3,
-        dwarf_ymm4 = dwarf_xmm4,
-        dwarf_ymm5 = dwarf_xmm5,
-        dwarf_ymm6 = dwarf_xmm6,
-        dwarf_ymm7 = dwarf_xmm7
-    };
-    
-    enum
-    {
-        gdb_eax        =  0,
-        gdb_ecx        =  1,
-        gdb_edx        =  2,
-        gdb_ebx        =  3,
-        gdb_esp        =  4,
-        gdb_ebp        =  5,
-        gdb_esi        =  6,
-        gdb_edi        =  7,
-        gdb_eip        =  8,
-        gdb_eflags     =  9,
-        gdb_cs         = 10,
-        gdb_ss         = 11,
-        gdb_ds         = 12,
-        gdb_es         = 13,
-        gdb_fs         = 14,
-        gdb_gs         = 15,
-        gdb_stmm0      = 16,
-        gdb_stmm1      = 17,
-        gdb_stmm2      = 18,
-        gdb_stmm3      = 19,
-        gdb_stmm4      = 20,
-        gdb_stmm5      = 21,
-        gdb_stmm6      = 22,
-        gdb_stmm7      = 23,
-        gdb_fctrl      = 24,    gdb_fcw     = gdb_fctrl,
-        gdb_fstat      = 25,    gdb_fsw     = gdb_fstat,
-        gdb_ftag       = 26,    gdb_ftw     = gdb_ftag,
-        gdb_fiseg      = 27,    gdb_fpu_cs  = gdb_fiseg,
-        gdb_fioff      = 28,    gdb_ip      = gdb_fioff,
-        gdb_foseg      = 29,    gdb_fpu_ds  = gdb_foseg,
-        gdb_fooff      = 30,    gdb_dp      = gdb_fooff,
-        gdb_fop        = 31,
-        gdb_xmm0       = 32,
-        gdb_xmm1       = 33,
-        gdb_xmm2       = 34,
-        gdb_xmm3       = 35,
-        gdb_xmm4       = 36,
-        gdb_xmm5       = 37,
-        gdb_xmm6       = 38,
-        gdb_xmm7       = 39,
-        gdb_mxcsr      = 40,
-        gdb_mm0        = 41,
-        gdb_mm1        = 42,
-        gdb_mm2        = 43,
-        gdb_mm3        = 44,
-        gdb_mm4        = 45,
-        gdb_mm5        = 46,
-        gdb_mm6        = 47,
-        gdb_mm7        = 48,
-        gdb_ymm0       = gdb_xmm0,
-        gdb_ymm1       = gdb_xmm1,
-        gdb_ymm2       = gdb_xmm2,
-        gdb_ymm3       = gdb_xmm3,
-        gdb_ymm4       = gdb_xmm4,
-        gdb_ymm5       = gdb_xmm5,
-        gdb_ymm6       = gdb_xmm6,
-        gdb_ymm7       = gdb_xmm7
-    };
-
     ~ABIMacOSX_i386() { }
     
     virtual size_t 
@@ -201,6 +88,8 @@
         return pc <= UINT32_MAX;
     }
     
+    virtual const lldb_private::RegisterInfo *
+    GetRegisterInfoArray (uint32_t &count);
 
     //------------------------------------------------------------------
     // Static Functions

Modified: lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp Sun Aug 21 21:49:39 2011
@@ -35,6 +35,248 @@
 static const char *pluginShort = "abi.sysv-x86_64";
 
 
+enum gcc_dwarf_regnums
+{
+    gcc_dwarf_rax = 0,
+    gcc_dwarf_rdx,
+    gcc_dwarf_rcx,
+    gcc_dwarf_rbx,
+    gcc_dwarf_rsi,
+    gcc_dwarf_rdi,
+    gcc_dwarf_rbp,
+    gcc_dwarf_rsp,
+    gcc_dwarf_r8,
+    gcc_dwarf_r9,
+    gcc_dwarf_r10,
+    gcc_dwarf_r11,
+    gcc_dwarf_r12,
+    gcc_dwarf_r13,
+    gcc_dwarf_r14,
+    gcc_dwarf_r15,
+    gcc_dwarf_rip,
+    gcc_dwarf_xmm0,
+    gcc_dwarf_xmm1,
+    gcc_dwarf_xmm2,
+    gcc_dwarf_xmm3,
+    gcc_dwarf_xmm4,
+    gcc_dwarf_xmm5,
+    gcc_dwarf_xmm6,
+    gcc_dwarf_xmm7,
+    gcc_dwarf_xmm8,
+    gcc_dwarf_xmm9,
+    gcc_dwarf_xmm10,
+    gcc_dwarf_xmm11,
+    gcc_dwarf_xmm12,
+    gcc_dwarf_xmm13,
+    gcc_dwarf_xmm14,
+    gcc_dwarf_xmm15,
+    gcc_dwarf_stmm0,
+    gcc_dwarf_stmm1,
+    gcc_dwarf_stmm2,
+    gcc_dwarf_stmm3,
+    gcc_dwarf_stmm4,
+    gcc_dwarf_stmm5,
+    gcc_dwarf_stmm6,
+    gcc_dwarf_stmm7,
+    gcc_dwarf_ymm0 = gcc_dwarf_xmm0,
+    gcc_dwarf_ymm1 = gcc_dwarf_xmm1,
+    gcc_dwarf_ymm2 = gcc_dwarf_xmm2,
+    gcc_dwarf_ymm3 = gcc_dwarf_xmm3,
+    gcc_dwarf_ymm4 = gcc_dwarf_xmm4,
+    gcc_dwarf_ymm5 = gcc_dwarf_xmm5,
+    gcc_dwarf_ymm6 = gcc_dwarf_xmm6,
+    gcc_dwarf_ymm7 = gcc_dwarf_xmm7,
+    gcc_dwarf_ymm8 = gcc_dwarf_xmm8,
+    gcc_dwarf_ymm9 = gcc_dwarf_xmm9,
+    gcc_dwarf_ymm10 = gcc_dwarf_xmm10,
+    gcc_dwarf_ymm11 = gcc_dwarf_xmm11,
+    gcc_dwarf_ymm12 = gcc_dwarf_xmm12,
+    gcc_dwarf_ymm13 = gcc_dwarf_xmm13,
+    gcc_dwarf_ymm14 = gcc_dwarf_xmm14,
+    gcc_dwarf_ymm15 = gcc_dwarf_xmm15
+};
+
+enum gdb_regnums
+{
+    gdb_rax     =   0,
+    gdb_rbx     =   1,
+    gdb_rcx     =   2,
+    gdb_rdx     =   3,
+    gdb_rsi     =   4,
+    gdb_rdi     =   5,
+    gdb_rbp     =   6,
+    gdb_rsp     =   7,
+    gdb_r8      =   8,
+    gdb_r9      =   9,
+    gdb_r10     =  10,
+    gdb_r11     =  11,
+    gdb_r12     =  12,
+    gdb_r13     =  13,
+    gdb_r14     =  14,
+    gdb_r15     =  15,
+    gdb_rip     =  16,
+    gdb_rflags  =  17,
+    gdb_cs      =  18,
+    gdb_ss      =  19,
+    gdb_ds      =  20,
+    gdb_es      =  21,
+    gdb_fs      =  22,
+    gdb_gs      =  23,
+    gdb_stmm0   =  24,
+    gdb_stmm1   =  25,
+    gdb_stmm2   =  26,
+    gdb_stmm3   =  27,
+    gdb_stmm4   =  28,
+    gdb_stmm5   =  29,
+    gdb_stmm6   =  30,
+    gdb_stmm7   =  31,
+    gdb_fctrl   =  32,  gdb_fcw = gdb_fctrl,
+    gdb_fstat   =  33,  gdb_fsw = gdb_fstat,
+    gdb_ftag    =  34,  gdb_ftw = gdb_ftag,
+    gdb_fiseg   =  35,  gdb_fpu_cs  = gdb_fiseg,
+    gdb_fioff   =  36,  gdb_ip  = gdb_fioff,
+    gdb_foseg   =  37,  gdb_fpu_ds  = gdb_foseg,
+    gdb_fooff   =  38,  gdb_dp  = gdb_fooff,
+    gdb_fop     =  39,
+    gdb_xmm0    =  40,
+    gdb_xmm1    =  41,
+    gdb_xmm2    =  42,
+    gdb_xmm3    =  43,
+    gdb_xmm4    =  44,
+    gdb_xmm5    =  45,
+    gdb_xmm6    =  46,
+    gdb_xmm7    =  47,
+    gdb_xmm8    =  48,
+    gdb_xmm9    =  49,
+    gdb_xmm10   =  50,
+    gdb_xmm11   =  51,
+    gdb_xmm12   =  52,
+    gdb_xmm13   =  53,
+    gdb_xmm14   =  54,
+    gdb_xmm15   =  55,
+    gdb_mxcsr   =  56,
+    gdb_ymm0    =  gdb_xmm0,
+    gdb_ymm1    =  gdb_xmm1,
+    gdb_ymm2    =  gdb_xmm2,
+    gdb_ymm3    =  gdb_xmm3,
+    gdb_ymm4    =  gdb_xmm4,
+    gdb_ymm5    =  gdb_xmm5,
+    gdb_ymm6    =  gdb_xmm6,
+    gdb_ymm7    =  gdb_xmm7,
+    gdb_ymm8    =  gdb_xmm8,
+    gdb_ymm9    =  gdb_xmm9,
+    gdb_ymm10   =  gdb_xmm10,
+    gdb_ymm11   =  gdb_xmm11,
+    gdb_ymm12   =  gdb_xmm12,
+    gdb_ymm13   =  gdb_xmm13,
+    gdb_ymm14   =  gdb_xmm14,
+    gdb_ymm15   =  gdb_xmm15
+};
+
+
+static RegisterInfo g_register_infos[] = 
+{
+  //  NAME      ALT      SZ OFF ENCODING         FORMAT              COMPILER                DWARF                 GENERIC                     GDB                   LLDB NATIVE
+  //  ========  =======  == === =============    =================== ======================= ===================== =========================== ===================== ======================
+    { "rax"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rax       , gcc_dwarf_rax       , LLDB_INVALID_REGNUM       , gdb_rax            , LLDB_INVALID_REGNUM }},
+    { "rbx"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rbx       , gcc_dwarf_rbx       , LLDB_INVALID_REGNUM       , gdb_rbx            , LLDB_INVALID_REGNUM }},
+    { "rcx"   , "arg4",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rcx       , gcc_dwarf_rcx       , LLDB_REGNUM_GENERIC_ARG4  , gdb_rcx            , LLDB_INVALID_REGNUM }},
+    { "rdx"   , "arg3",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rdx       , gcc_dwarf_rdx       , LLDB_REGNUM_GENERIC_ARG3  , gdb_rdx            , LLDB_INVALID_REGNUM }},
+    { "rsi"   , "arg2",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rsi       , gcc_dwarf_rsi       , LLDB_REGNUM_GENERIC_ARG2  , gdb_rsi            , LLDB_INVALID_REGNUM }},
+    { "rdi"   , "arg1",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rdi       , gcc_dwarf_rdi       , LLDB_REGNUM_GENERIC_ARG1  , gdb_rdi            , LLDB_INVALID_REGNUM }},
+    { "rbp"   , "fp",    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rbp       , gcc_dwarf_rbp       , LLDB_REGNUM_GENERIC_FP    , gdb_rbp            , LLDB_INVALID_REGNUM }},
+    { "rsp"   , "sp",    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rsp       , gcc_dwarf_rsp       , LLDB_REGNUM_GENERIC_SP    , gdb_rsp            , LLDB_INVALID_REGNUM }},
+    { "r8"    , "arg5",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r8        , gcc_dwarf_r8        , LLDB_REGNUM_GENERIC_ARG5  , gdb_r8             , LLDB_INVALID_REGNUM }},
+    { "r9"    , "arg6",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r9        , gcc_dwarf_r9        , LLDB_REGNUM_GENERIC_ARG6  , gdb_r9             , LLDB_INVALID_REGNUM }},
+    { "r10"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r10       , gcc_dwarf_r10       , LLDB_INVALID_REGNUM       , gdb_r10            , LLDB_INVALID_REGNUM }},
+    { "r11"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r11       , gcc_dwarf_r11       , LLDB_INVALID_REGNUM       , gdb_r11            , LLDB_INVALID_REGNUM }},
+    { "r12"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r12       , gcc_dwarf_r12       , LLDB_INVALID_REGNUM       , gdb_r12            , LLDB_INVALID_REGNUM }},
+    { "r13"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r13       , gcc_dwarf_r13       , LLDB_INVALID_REGNUM       , gdb_r13            , LLDB_INVALID_REGNUM }},
+    { "r14"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r14       , gcc_dwarf_r14       , LLDB_INVALID_REGNUM       , gdb_r14            , LLDB_INVALID_REGNUM }},
+    { "r15"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r15       , gcc_dwarf_r15       , LLDB_INVALID_REGNUM       , gdb_r15            , LLDB_INVALID_REGNUM }},
+    { "rip"   , "pc",    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rip       , gcc_dwarf_rip       , LLDB_REGNUM_GENERIC_PC    , gdb_rip            , LLDB_INVALID_REGNUM }},
+    { "rflags", NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_REGNUM_GENERIC_FLAGS , gdb_rflags         , LLDB_INVALID_REGNUM }},
+    { "cs"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_cs             , LLDB_INVALID_REGNUM }},
+    { "ss"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_ss             , LLDB_INVALID_REGNUM }},
+    { "ds"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_ds             , LLDB_INVALID_REGNUM }},
+    { "es"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_es             , LLDB_INVALID_REGNUM }},
+    { "fs"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fs             , LLDB_INVALID_REGNUM }},
+    { "gs"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_gs             , LLDB_INVALID_REGNUM }},
+    { "stmm0" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm0     , gcc_dwarf_stmm0     , LLDB_INVALID_REGNUM       , gdb_stmm0          , LLDB_INVALID_REGNUM }},
+    { "stmm1" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm1     , gcc_dwarf_stmm1     , LLDB_INVALID_REGNUM       , gdb_stmm1          , LLDB_INVALID_REGNUM }},
+    { "stmm2" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm2     , gcc_dwarf_stmm2     , LLDB_INVALID_REGNUM       , gdb_stmm2          , LLDB_INVALID_REGNUM }},
+    { "stmm3" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm3     , gcc_dwarf_stmm3     , LLDB_INVALID_REGNUM       , gdb_stmm3          , LLDB_INVALID_REGNUM }},
+    { "stmm4" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm4     , gcc_dwarf_stmm4     , LLDB_INVALID_REGNUM       , gdb_stmm4          , LLDB_INVALID_REGNUM }},
+    { "stmm5" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm5     , gcc_dwarf_stmm5     , LLDB_INVALID_REGNUM       , gdb_stmm5          , LLDB_INVALID_REGNUM }},
+    { "stmm6" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm6     , gcc_dwarf_stmm6     , LLDB_INVALID_REGNUM       , gdb_stmm6          , LLDB_INVALID_REGNUM }},
+    { "stmm7" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm7     , gcc_dwarf_stmm7     , LLDB_INVALID_REGNUM       , gdb_stmm7          , LLDB_INVALID_REGNUM }},
+    { "fctrl" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fctrl          , LLDB_INVALID_REGNUM }},
+    { "fstat" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fstat          , LLDB_INVALID_REGNUM }},
+    { "ftag"  , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_ftag           , LLDB_INVALID_REGNUM }},
+    { "fiseg" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fiseg          , LLDB_INVALID_REGNUM }},
+    { "fioff" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fioff          , LLDB_INVALID_REGNUM }},
+    { "foseg" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_foseg          , LLDB_INVALID_REGNUM }},
+    { "fooff" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fooff          , LLDB_INVALID_REGNUM }},
+    { "fop"   , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fop            , LLDB_INVALID_REGNUM }},
+    { "xmm0"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm0      , gcc_dwarf_xmm0      , LLDB_INVALID_REGNUM       , gdb_xmm0           , LLDB_INVALID_REGNUM }},
+    { "xmm1"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm1      , gcc_dwarf_xmm1      , LLDB_INVALID_REGNUM       , gdb_xmm1           , LLDB_INVALID_REGNUM }},
+    { "xmm2"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm2      , gcc_dwarf_xmm2      , LLDB_INVALID_REGNUM       , gdb_xmm2           , LLDB_INVALID_REGNUM }},
+    { "xmm3"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm3      , gcc_dwarf_xmm3      , LLDB_INVALID_REGNUM       , gdb_xmm3           , LLDB_INVALID_REGNUM }},
+    { "xmm4"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm4      , gcc_dwarf_xmm4      , LLDB_INVALID_REGNUM       , gdb_xmm4           , LLDB_INVALID_REGNUM }},
+    { "xmm5"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm5      , gcc_dwarf_xmm5      , LLDB_INVALID_REGNUM       , gdb_xmm5           , LLDB_INVALID_REGNUM }},
+    { "xmm6"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm6      , gcc_dwarf_xmm6      , LLDB_INVALID_REGNUM       , gdb_xmm6           , LLDB_INVALID_REGNUM }},
+    { "xmm7"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm7      , gcc_dwarf_xmm7      , LLDB_INVALID_REGNUM       , gdb_xmm7           , LLDB_INVALID_REGNUM }},
+    { "xmm8"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm8      , gcc_dwarf_xmm8      , LLDB_INVALID_REGNUM       , gdb_xmm8           , LLDB_INVALID_REGNUM }},
+    { "xmm9"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm9      , gcc_dwarf_xmm9      , LLDB_INVALID_REGNUM       , gdb_xmm9           , LLDB_INVALID_REGNUM }},
+    { "xmm10" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm10     , gcc_dwarf_xmm10     , LLDB_INVALID_REGNUM       , gdb_xmm10          , LLDB_INVALID_REGNUM }},
+    { "xmm11" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm11     , gcc_dwarf_xmm11     , LLDB_INVALID_REGNUM       , gdb_xmm11          , LLDB_INVALID_REGNUM }},
+    { "xmm12" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm12     , gcc_dwarf_xmm12     , LLDB_INVALID_REGNUM       , gdb_xmm12          , LLDB_INVALID_REGNUM }},
+    { "xmm13" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm13     , gcc_dwarf_xmm13     , LLDB_INVALID_REGNUM       , gdb_xmm13          , LLDB_INVALID_REGNUM }},
+    { "xmm14" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm14     , gcc_dwarf_xmm14     , LLDB_INVALID_REGNUM       , gdb_xmm14          , LLDB_INVALID_REGNUM }},
+    { "xmm15" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm15     , gcc_dwarf_xmm15     , LLDB_INVALID_REGNUM       , gdb_xmm15          , LLDB_INVALID_REGNUM }},
+    { "mxcsr" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_mxcsr          , LLDB_INVALID_REGNUM }},
+    { "ymm0"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm0      , gcc_dwarf_ymm0      , LLDB_INVALID_REGNUM       , gdb_ymm0           , LLDB_INVALID_REGNUM }},
+    { "ymm1"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm1      , gcc_dwarf_ymm1      , LLDB_INVALID_REGNUM       , gdb_ymm1           , LLDB_INVALID_REGNUM }},
+    { "ymm2"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm2      , gcc_dwarf_ymm2      , LLDB_INVALID_REGNUM       , gdb_ymm2           , LLDB_INVALID_REGNUM }},
+    { "ymm3"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm3      , gcc_dwarf_ymm3      , LLDB_INVALID_REGNUM       , gdb_ymm3           , LLDB_INVALID_REGNUM }},
+    { "ymm4"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm4      , gcc_dwarf_ymm4      , LLDB_INVALID_REGNUM       , gdb_ymm4           , LLDB_INVALID_REGNUM }},
+    { "ymm5"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm5      , gcc_dwarf_ymm5      , LLDB_INVALID_REGNUM       , gdb_ymm5           , LLDB_INVALID_REGNUM }},
+    { "ymm6"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm6      , gcc_dwarf_ymm6      , LLDB_INVALID_REGNUM       , gdb_ymm6           , LLDB_INVALID_REGNUM }},
+    { "ymm7"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm7      , gcc_dwarf_ymm7      , LLDB_INVALID_REGNUM       , gdb_ymm7           , LLDB_INVALID_REGNUM }},
+    { "ymm8"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm8      , gcc_dwarf_ymm8      , LLDB_INVALID_REGNUM       , gdb_ymm8           , LLDB_INVALID_REGNUM }},
+    { "ymm9"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm9      , gcc_dwarf_ymm9      , LLDB_INVALID_REGNUM       , gdb_ymm9           , LLDB_INVALID_REGNUM }},
+    { "ymm10" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm10     , gcc_dwarf_ymm10     , LLDB_INVALID_REGNUM       , gdb_ymm10          , LLDB_INVALID_REGNUM }},
+    { "ymm11" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm11     , gcc_dwarf_ymm11     , LLDB_INVALID_REGNUM       , gdb_ymm11          , LLDB_INVALID_REGNUM }},
+    { "ymm12" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm12     , gcc_dwarf_ymm12     , LLDB_INVALID_REGNUM       , gdb_ymm12          , LLDB_INVALID_REGNUM }},
+    { "ymm13" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm13     , gcc_dwarf_ymm13     , LLDB_INVALID_REGNUM       , gdb_ymm13          , LLDB_INVALID_REGNUM }},
+    { "ymm14" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm14     , gcc_dwarf_ymm14     , LLDB_INVALID_REGNUM       , gdb_ymm14          , LLDB_INVALID_REGNUM }},
+    { "ymm15" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm15     , gcc_dwarf_ymm15     , LLDB_INVALID_REGNUM       , gdb_ymm15          , LLDB_INVALID_REGNUM }}
+};
+
+static const uint32_t k_num_register_infos = sizeof(g_register_infos)/sizeof(RegisterInfo);
+static bool g_register_info_names_constified = false;
+
+const lldb_private::RegisterInfo *
+ABISysV_x86_64::GetRegisterInfoArray (uint32_t &count)
+{
+    // Make the C-string names and alt_names for the register infos into const 
+    // C-string values by having the ConstString unique the names in the global
+    // constant C-string pool.
+    if (!g_register_info_names_constified)
+    {
+        g_register_info_names_constified = true;
+        for (uint32_t i=0; i<k_num_register_infos; ++i)
+        {
+            if (g_register_infos[i].name)
+                g_register_infos[i].name = ConstString(g_register_infos[i].name).GetCString();
+            if (g_register_infos[i].alt_name)
+                g_register_infos[i].alt_name = ConstString(g_register_infos[i].alt_name).GetCString();
+        }
+    }
+    count = k_num_register_infos;
+    return g_register_infos;
+}
+
 
 size_t
 ABISysV_x86_64::GetRedZoneSize () const
@@ -480,6 +722,10 @@
     return !RegisterIsCalleeSaved (reg_info);
 }
 
+
+
+
+
 bool
 ABISysV_x86_64::RegisterIsCalleeSaved (const RegisterInfo *reg_info)
 {

Modified: lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h (original)
+++ lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h Sun Aug 21 21:49:39 2011
@@ -21,146 +21,8 @@
     public lldb_private::ABI
 {
 public:
-    
-    enum gcc_dwarf_regnums
-    {
-        gcc_dwarf_rax = 0,
-        gcc_dwarf_rdx,
-        gcc_dwarf_rcx,
-        gcc_dwarf_rbx,
-        gcc_dwarf_rsi,
-        gcc_dwarf_rdi,
-        gcc_dwarf_rbp,
-        gcc_dwarf_rsp,
-        gcc_dwarf_r8,
-        gcc_dwarf_r9,
-        gcc_dwarf_r10,
-        gcc_dwarf_r11,
-        gcc_dwarf_r12,
-        gcc_dwarf_r13,
-        gcc_dwarf_r14,
-        gcc_dwarf_r15,
-        gcc_dwarf_rip,
-        gcc_dwarf_xmm0,
-        gcc_dwarf_xmm1,
-        gcc_dwarf_xmm2,
-        gcc_dwarf_xmm3,
-        gcc_dwarf_xmm4,
-        gcc_dwarf_xmm5,
-        gcc_dwarf_xmm6,
-        gcc_dwarf_xmm7,
-        gcc_dwarf_xmm8,
-        gcc_dwarf_xmm9,
-        gcc_dwarf_xmm10,
-        gcc_dwarf_xmm11,
-        gcc_dwarf_xmm12,
-        gcc_dwarf_xmm13,
-        gcc_dwarf_xmm14,
-        gcc_dwarf_xmm15,
-        gcc_dwarf_stmm0,
-        gcc_dwarf_stmm1,
-        gcc_dwarf_stmm2,
-        gcc_dwarf_stmm3,
-        gcc_dwarf_stmm4,
-        gcc_dwarf_stmm5,
-        gcc_dwarf_stmm6,
-        gcc_dwarf_stmm7,
-        gcc_dwarf_ymm0 = gcc_dwarf_xmm0,
-        gcc_dwarf_ymm1 = gcc_dwarf_xmm1,
-        gcc_dwarf_ymm2 = gcc_dwarf_xmm2,
-        gcc_dwarf_ymm3 = gcc_dwarf_xmm3,
-        gcc_dwarf_ymm4 = gcc_dwarf_xmm4,
-        gcc_dwarf_ymm5 = gcc_dwarf_xmm5,
-        gcc_dwarf_ymm6 = gcc_dwarf_xmm6,
-        gcc_dwarf_ymm7 = gcc_dwarf_xmm7,
-        gcc_dwarf_ymm8 = gcc_dwarf_xmm8,
-        gcc_dwarf_ymm9 = gcc_dwarf_xmm9,
-        gcc_dwarf_ymm10 = gcc_dwarf_xmm10,
-        gcc_dwarf_ymm11 = gcc_dwarf_xmm11,
-        gcc_dwarf_ymm12 = gcc_dwarf_xmm12,
-        gcc_dwarf_ymm13 = gcc_dwarf_xmm13,
-        gcc_dwarf_ymm14 = gcc_dwarf_xmm14,
-        gcc_dwarf_ymm15 = gcc_dwarf_xmm15
-    };
-    
-    enum gdb_regnums
-    {
-        gdb_rax     =   0,
-        gdb_rbx     =   1,
-        gdb_rcx     =   2,
-        gdb_rdx     =   3,
-        gdb_rsi     =   4,
-        gdb_rdi     =   5,
-        gdb_rbp     =   6,
-        gdb_rsp     =   7,
-        gdb_r8      =   8,
-        gdb_r9      =   9,
-        gdb_r10     =  10,
-        gdb_r11     =  11,
-        gdb_r12     =  12,
-        gdb_r13     =  13,
-        gdb_r14     =  14,
-        gdb_r15     =  15,
-        gdb_rip     =  16,
-        gdb_rflags  =  17,
-        gdb_cs      =  18,
-        gdb_ss      =  19,
-        gdb_ds      =  20,
-        gdb_es      =  21,
-        gdb_fs      =  22,
-        gdb_gs      =  23,
-        gdb_stmm0   =  24,
-        gdb_stmm1   =  25,
-        gdb_stmm2   =  26,
-        gdb_stmm3   =  27,
-        gdb_stmm4   =  28,
-        gdb_stmm5   =  29,
-        gdb_stmm6   =  30,
-        gdb_stmm7   =  31,
-        gdb_fctrl   =  32,  gdb_fcw = gdb_fctrl,
-        gdb_fstat   =  33,  gdb_fsw = gdb_fstat,
-        gdb_ftag    =  34,  gdb_ftw = gdb_ftag,
-        gdb_fiseg   =  35,  gdb_fpu_cs  = gdb_fiseg,
-        gdb_fioff   =  36,  gdb_ip  = gdb_fioff,
-        gdb_foseg   =  37,  gdb_fpu_ds  = gdb_foseg,
-        gdb_fooff   =  38,  gdb_dp  = gdb_fooff,
-        gdb_fop     =  39,
-        gdb_xmm0    =  40,
-        gdb_xmm1    =  41,
-        gdb_xmm2    =  42,
-        gdb_xmm3    =  43,
-        gdb_xmm4    =  44,
-        gdb_xmm5    =  45,
-        gdb_xmm6    =  46,
-        gdb_xmm7    =  47,
-        gdb_xmm8    =  48,
-        gdb_xmm9    =  49,
-        gdb_xmm10   =  50,
-        gdb_xmm11   =  51,
-        gdb_xmm12   =  52,
-        gdb_xmm13   =  53,
-        gdb_xmm14   =  54,
-        gdb_xmm15   =  55,
-        gdb_mxcsr   =  56,
-        gdb_ymm0    =  gdb_xmm0,
-        gdb_ymm1    =  gdb_xmm1,
-        gdb_ymm2    =  gdb_xmm2,
-        gdb_ymm3    =  gdb_xmm3,
-        gdb_ymm4    =  gdb_xmm4,
-        gdb_ymm5    =  gdb_xmm5,
-        gdb_ymm6    =  gdb_xmm6,
-        gdb_ymm7    =  gdb_xmm7,
-        gdb_ymm8    =  gdb_xmm8,
-        gdb_ymm9    =  gdb_xmm9,
-        gdb_ymm10   =  gdb_xmm10,
-        gdb_ymm11   =  gdb_xmm11,
-        gdb_ymm12   =  gdb_xmm12,
-        gdb_ymm13   =  gdb_xmm13,
-        gdb_ymm14   =  gdb_xmm14,
-        gdb_ymm15   =  gdb_xmm15
-    };
 
-   ~ABISysV_x86_64()
+    ~ABISysV_x86_64()
     {
     }
 
@@ -221,6 +83,8 @@
         return true;
     }
     
+    virtual const lldb_private::RegisterInfo *
+    GetRegisterInfoArray (uint32_t &count);
     //------------------------------------------------------------------
     // Static Functions
     //------------------------------------------------------------------
@@ -246,7 +110,9 @@
     GetPluginVersion();
 
 protected:
-    
+    void
+    CreateRegisterMapIfNeeded ();
+
     bool
     RegisterIsCalleeSaved (const lldb_private::RegisterInfo *reg_info);
 

Modified: lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp (original)
+++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp Sun Aug 21 21:49:39 2011
@@ -593,7 +593,7 @@
         // by the expression, but in host memory. because this code reads memory without
         // taking the debug-info-provided object layout, we need to hand it the target version
         // of the expression output
-        lldb::addr_t tgt_address = valobj.GetValueAsUnsigned();
+        lldb::addr_t tgt_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
         ValueObjectSP target_object = ValueObjectConstResult::Create (valobj.GetExecutionContextScope(),
                                                                       valobj.GetClangAST(),
                                                                       valobj.GetClangType(),

Added: lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.cpp?rev=138228&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.cpp (added)
+++ lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.cpp Sun Aug 21 21:49:39 2011
@@ -0,0 +1,309 @@
+//===-- OperatingSystemMacOSXKernel.cpp --------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "OperatingSystemMacOSXKernel.h"
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+#include "llvm/ADT/Triple.h"
+
+#include "lldb/Core/ArchSpec.h"
+#include "lldb/Core/DataBufferHeap.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/RegisterValue.h"
+#include "lldb/Core/ValueObjectVariable.h"
+#include "lldb/Symbol/ObjectFile.h"
+#include "lldb/Symbol/VariableList.h"
+#include "lldb/Target/Process.h"
+#include "lldb/Target/StopInfo.h"
+#include "lldb/Target/Target.h"
+#include "lldb/Target/ThreadList.h"
+#include "lldb/Target/Thread.h"
+#include "Plugins/Process/Utility/DynamicRegisterInfo.h"
+#include "Plugins/Process/Utility/RegisterContextMemory.h"
+#include "Plugins/Process/Utility/ThreadMemory.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+static ConstString &
+GetThreadGPRMemberName ()
+{
+    static ConstString g_gpr_member_name("gpr");
+    return g_gpr_member_name;
+}
+
+void
+OperatingSystemMacOSXKernel::Initialize()
+{
+    PluginManager::RegisterPlugin (GetPluginNameStatic(),
+                                   GetPluginDescriptionStatic(),
+                                   CreateInstance);
+}
+
+void
+OperatingSystemMacOSXKernel::Terminate()
+{
+    PluginManager::UnregisterPlugin (CreateInstance);
+}
+
+OperatingSystem *
+OperatingSystemMacOSXKernel::CreateInstance (Process *process, bool force)
+{
+#if 0
+    bool create = force;
+    if (!create)
+    {
+        Module* exe_module = process->GetTarget().GetExecutableModulePointer();
+        if (exe_module)
+        {
+            ObjectFile *object_file = exe_module->GetObjectFile();
+            if (object_file)
+            {
+                SectionList *section_list = object_file->GetSectionList();
+                if (section_list)
+                {
+                    static ConstString g_kld_section_name ("__KLD");
+                    if (section_list->FindSectionByName (g_kld_section_name))
+                    {
+                        create = true;
+                    }
+                }
+            }
+        }
+
+        // We can limit the creation of this plug-in to "*-apple-darwin" triples
+        // if we command out the lines below...
+//        if (create)
+//        {
+//            const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
+//            create = triple_ref.getOS() == llvm::Triple::Darwin && triple_ref.getVendor() == llvm::Triple::Apple;
+//        }
+    }
+    
+    if (create)
+        return new OperatingSystemMacOSXKernel (process);
+#endif
+    return NULL;
+}
+
+
+const char *
+OperatingSystemMacOSXKernel::GetPluginNameStatic()
+{
+    return "macosx-kernel";
+}
+
+const char *
+OperatingSystemMacOSXKernel::GetPluginDescriptionStatic()
+{
+    return "Operating system plug-in that gathers OS information from darwin kernels.";
+}
+
+
+OperatingSystemMacOSXKernel::OperatingSystemMacOSXKernel (lldb_private::Process *process) :
+    OperatingSystem (process),
+    m_thread_list_valobj_sp (),
+    m_register_info_ap ()
+{
+}
+
+OperatingSystemMacOSXKernel::~OperatingSystemMacOSXKernel ()
+{
+}
+
+ValueObjectSP
+OperatingSystemMacOSXKernel::GetThreadListValueObject ()
+{
+    if (m_thread_list_valobj_sp.get() == NULL)
+    {
+        VariableList variable_list;
+        const uint32_t max_matches = 1;
+        const bool append = true;
+        static ConstString g_thread_list_name("g_thread_list");
+        Module *exe_module = m_process->GetTarget().GetExecutableModulePointer();
+        if (exe_module)
+        {
+            if (exe_module->FindGlobalVariables (g_thread_list_name, 
+                                                 append, 
+                                                 max_matches,
+                                                 variable_list))
+            {
+                m_thread_list_valobj_sp = ValueObjectVariable::Create (m_process, variable_list.GetVariableAtIndex(0));
+            }
+        }
+    }
+    return m_thread_list_valobj_sp;
+}
+
+DynamicRegisterInfo *
+OperatingSystemMacOSXKernel::GetDynamicRegisterInfo ()
+{
+    if (m_register_info_ap.get() == NULL && m_thread_list_valobj_sp)
+    {
+        m_register_info_ap.reset (new DynamicRegisterInfo());
+        ConstString empty_name;
+        const bool can_create = true;
+        AddressType addr_type;
+        addr_t base_addr = LLDB_INVALID_ADDRESS;
+        ValueObjectSP gpr_valobj_sp (m_thread_list_valobj_sp->GetChildMemberWithName(GetThreadGPRMemberName (), can_create));
+        
+        if (gpr_valobj_sp->IsPointerType ())
+            base_addr = gpr_valobj_sp->GetPointerValue (addr_type, true);
+        else
+            base_addr = gpr_valobj_sp->GetAddressOf (addr_type, true);
+
+        ValueObjectSP child_valobj_sp;
+        if (gpr_valobj_sp)
+        {
+            ABI *abi = m_process->GetABI().get();
+            assert (abi);
+            uint32_t num_children = gpr_valobj_sp->GetNumChildren();
+            
+            ConstString gpr_name (gpr_valobj_sp->GetName());
+            uint32_t reg_num = 0;
+            for (uint32_t i=0; i<num_children; ++i)
+            {
+                child_valobj_sp = gpr_valobj_sp->GetChildAtIndex(i, can_create);
+
+                ConstString reg_name(child_valobj_sp->GetName());
+                if (reg_name)
+                {
+                    const char *reg_name_cstr = reg_name.GetCString();
+                    while (reg_name_cstr[0] == '_')
+                        ++reg_name_cstr;
+                    if (reg_name_cstr != reg_name.GetCString())
+                        reg_name.SetCString (reg_name_cstr);
+                }
+                
+                RegisterInfo reg_info;
+                if (abi->GetRegisterInfoByName(reg_name, reg_info))
+                {
+                    // Adjust the byte size and the offset to match the layout of registers in our struct
+                    reg_info.byte_size = child_valobj_sp->GetByteSize();
+                    reg_info.byte_offset = child_valobj_sp->GetAddressOf(addr_type, true) - base_addr;
+                    reg_info.kinds[eRegisterKindLLDB] = reg_num++;
+                    m_register_info_ap->AddRegister (reg_info, reg_name, empty_name, gpr_name);
+                }
+                else
+                {
+                    printf ("not able to find register info for %s\n", reg_name.GetCString()); // REMOVE THIS printf before checkin!!!
+                }
+            }
+            
+            m_register_info_ap->Finalize();
+        }
+    }
+    assert (m_register_info_ap.get());
+    return m_register_info_ap.get();
+}
+
+//------------------------------------------------------------------
+// PluginInterface protocol
+//------------------------------------------------------------------
+const char *
+OperatingSystemMacOSXKernel::GetPluginName()
+{
+    return "OperatingSystemMacOSXKernel";
+}
+
+const char *
+OperatingSystemMacOSXKernel::GetShortPluginName()
+{
+    return GetPluginNameStatic();
+}
+
+uint32_t
+OperatingSystemMacOSXKernel::GetPluginVersion()
+{
+    return 1;
+}
+
+uint32_t
+OperatingSystemMacOSXKernel::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
+{
+    // Make any constant strings once and cache the uniqued C string values
+    // so we don't have to rehash them each time through this function call
+    static ConstString g_tid_member_name("tid");
+    static ConstString g_next_member_name("next");
+
+    ValueObjectSP root_valobj_sp (GetThreadListValueObject ());
+    ValueObjectSP valobj_sp = root_valobj_sp;
+    const bool can_create = true;
+    while (valobj_sp)
+    {
+        if (valobj_sp->GetValueAsUnsigned(0) == 0)
+            break;
+
+        ValueObjectSP tid_valobj_sp(valobj_sp->GetChildMemberWithName(g_tid_member_name, can_create));
+        if (!tid_valobj_sp)
+            break;
+        
+        tid_t tid = tid_valobj_sp->GetValueAsUnsigned (LLDB_INVALID_THREAD_ID);
+        if (tid == LLDB_INVALID_THREAD_ID)
+            break;
+
+        ThreadSP thread_sp (old_thread_list.FindThreadByID (tid, false));
+        if (!thread_sp)
+            thread_sp.reset (new ThreadMemory (*m_process, tid, valobj_sp));
+
+        new_thread_list.AddThread(thread_sp);
+
+        ValueObjectSP next_valobj_sp (valobj_sp->GetChildMemberWithName(g_next_member_name, can_create));
+        
+        if (next_valobj_sp)
+        {
+            // Watch for circular linked lists
+            if (next_valobj_sp.get() == root_valobj_sp.get())
+                break;
+        }
+        next_valobj_sp.swap(valobj_sp);
+    }
+    return new_thread_list.GetSize(false);
+}
+
+void
+OperatingSystemMacOSXKernel::ThreadWasSelected (Thread *thread)
+{
+}
+
+RegisterContextSP
+OperatingSystemMacOSXKernel::CreateRegisterContextForThread (Thread *thread)
+{
+    ThreadMemory *generic_thread = (ThreadMemory *)thread;
+    RegisterContextSP reg_ctx_sp;
+    
+    ValueObjectSP thread_valobj_sp (generic_thread->GetValueObject());
+    if (thread_valobj_sp)
+    {
+        const bool can_create = true;
+        AddressType addr_type;
+        addr_t base_addr = LLDB_INVALID_ADDRESS;
+        ValueObjectSP gpr_valobj_sp (thread_valobj_sp->GetChildMemberWithName(GetThreadGPRMemberName (), can_create));
+        if (gpr_valobj_sp)
+        {
+            if (gpr_valobj_sp->IsPointerType ())
+                base_addr = gpr_valobj_sp->GetPointerValue (addr_type, true);
+            else
+                base_addr = gpr_valobj_sp->GetAddressOf (addr_type, true);
+            reg_ctx_sp.reset (new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), base_addr));
+        }
+    }
+    return reg_ctx_sp;
+}
+
+StopInfoSP
+OperatingSystemMacOSXKernel::CreateThreadStopReason (lldb_private::Thread *thread)
+{
+    StopInfoSP stop_info_sp; //(StopInfo::CreateStopReasonWithSignal (*thread, SIGSTOP));
+    return stop_info_sp;
+}
+
+

Added: lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.h?rev=138228&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.h (added)
+++ lldb/trunk/source/Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.h Sun Aug 21 21:49:39 2011
@@ -0,0 +1,90 @@
+//===-- OperatingSystemMacOSXKernel.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_OperatingSystemMacOSXKernel_h_
+#define liblldb_OperatingSystemMacOSXKernel_h_
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+#include "lldb/Target/OperatingSystem.h"
+
+class DynamicRegisterInfo;
+
+class OperatingSystemMacOSXKernel : public lldb_private::OperatingSystem
+{
+public:
+    //------------------------------------------------------------------
+    // Static Functions
+    //------------------------------------------------------------------
+    static lldb_private::OperatingSystem *
+    CreateInstance (lldb_private::Process *process, bool force);
+    
+    static void
+    Initialize();
+    
+    static void
+    Terminate();
+    
+    static const char *
+    GetPluginNameStatic();
+    
+    static const char *
+    GetPluginDescriptionStatic();
+    
+    //------------------------------------------------------------------
+    // Class Methods
+    //------------------------------------------------------------------
+    OperatingSystemMacOSXKernel (lldb_private::Process *process);
+    
+    virtual
+    ~OperatingSystemMacOSXKernel ();
+    
+    //------------------------------------------------------------------
+    // lldb_private::PluginInterface Methods
+    //------------------------------------------------------------------
+    virtual const char *
+    GetPluginName();
+    
+    virtual const char *
+    GetShortPluginName();
+    
+    virtual uint32_t
+    GetPluginVersion();
+    
+    //------------------------------------------------------------------
+    // lldb_private::OperatingSystem Methods
+    //------------------------------------------------------------------
+    virtual uint32_t
+    UpdateThreadList (lldb_private::ThreadList &old_thread_list, 
+                      lldb_private::ThreadList &new_thread_list);
+    
+    virtual void
+    ThreadWasSelected (lldb_private::Thread *thread);
+
+    virtual lldb::RegisterContextSP
+    CreateRegisterContextForThread (lldb_private::Thread *thread);
+
+    virtual lldb::StopInfoSP
+    CreateThreadStopReason (lldb_private::Thread *thread);
+
+protected:
+    
+    lldb::ValueObjectSP
+    GetThreadListValueObject ();
+    
+    DynamicRegisterInfo *
+    GetDynamicRegisterInfo ();
+
+    lldb::ValueObjectSP m_thread_list_valobj_sp;
+    std::auto_ptr<DynamicRegisterInfo> m_register_info_ap;
+    
+};
+
+#endif // #ifndef liblldb_OperatingSystemMacOSXKernel_h_
\ No newline at end of file

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp Sun Aug 21 21:49:39 2011
@@ -185,7 +185,7 @@
                     kernel_arch.SetArchitecture(eArchTypeMachO, cpu, sub);
                     m_target.SetArchitecture(kernel_arch);
                     SetID (1);
-                    UpdateThreadListIfNeeded ();
+                    GetThreadList ();
                     SetPrivateState (eStateStopped);
                     StreamSP async_strm_sp(m_target.GetDebugger().GetAsyncOutputStream());
                     if (async_strm_sp)
@@ -289,34 +289,28 @@
 }
 
 uint32_t
-ProcessKDP::UpdateThreadListIfNeeded ()
+ProcessKDP::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
 {
     // locker will keep a mutex locked until it goes out of scope
     LogSP log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_THREAD));
     if (log && log->GetMask().Test(KDP_LOG_VERBOSE))
         log->Printf ("ProcessKDP::%s (pid = %i)", __FUNCTION__, GetID());
     
-    Mutex::Locker locker (m_thread_list.GetMutex ());
-    const uint32_t stop_id = GetStopID();
-    if (m_thread_list.GetSize(false) == 0)
-    {
-        // We currently are making only one thread per core and we
-        // actually don't know about actual threads. Eventually we
-        // want to get the thread list from memory and note which
-        // threads are on CPU as those are the only ones that we 
-        // will be able to resume.
-        ThreadList curr_thread_list (this);
-        curr_thread_list.SetStopID(stop_id);
-        const uint32_t cpu_mask = m_comm.GetCPUMask();
-        for (uint32_t cpu_mask_bit = 1; cpu_mask_bit & cpu_mask; cpu_mask_bit <<= 1)
-        {
-            // The thread ID is currently the CPU mask bit
-            ThreadSP thread_sp (new ThreadKDP (*this, cpu_mask_bit));
-                curr_thread_list.AddThread(thread_sp);
-        }
-        m_thread_list = curr_thread_list;
+    // We currently are making only one thread per core and we
+    // actually don't know about actual threads. Eventually we
+    // want to get the thread list from memory and note which
+    // threads are on CPU as those are the only ones that we 
+    // will be able to resume.
+    const uint32_t cpu_mask = m_comm.GetCPUMask();
+    for (uint32_t cpu_mask_bit = 1; cpu_mask_bit & cpu_mask; cpu_mask_bit <<= 1)
+    {
+        lldb::tid_t tid = cpu_mask_bit;
+        ThreadSP thread_sp (old_thread_list.FindThreadByID (tid, false));
+        if (!thread_sp)
+            thread_sp.reset(new ThreadKDP (*this, tid));
+        new_thread_list.AddThread(thread_sp);
     }
-    return GetThreadList().GetSize(false);
+    return new_thread_list.GetSize(false);
 }
 
 

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h Sun Aug 21 21:49:39 2011
@@ -233,7 +233,8 @@
     Clear ( );
     
     uint32_t
-    UpdateThreadListIfNeeded ();
+    UpdateThreadList (lldb_private::ThreadList &old_thread_list, 
+                      lldb_private::ThreadList &new_thread_list);
     
     enum
     {

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp Sun Aug 21 21:49:39 2011
@@ -28,11 +28,6 @@
 #include "RegisterContextKDP_arm.h"
 #include "RegisterContextKDP_i386.h"
 #include "RegisterContextKDP_x86_64.h"
-#include "Plugins/Process/Utility/UnwindLLDB.h"
-
-#if defined(__APPLE__)
-#include "UnwindMacOSXFrameBackchain.h"
-#endif
 
 using namespace lldb;
 using namespace lldb_private;
@@ -56,14 +51,6 @@
     DestroyThread();
 }
 
-
-const char *
-ThreadKDP::GetInfo ()
-{
-    return NULL;
-}
-
-
 const char *
 ThreadKDP::GetName ()
 {
@@ -124,32 +111,6 @@
     GetRegisterContext()->InvalidateIfNeeded (force);
 }
 
-Unwind *
-ThreadKDP::GetUnwinder ()
-{
-    if (m_unwinder_ap.get() == NULL)
-    {
-        const ArchSpec target_arch (GetProcess().GetTarget().GetArchitecture ());
-        const llvm::Triple::ArchType machine = target_arch.GetMachine();
-        switch (machine)
-        {
-            case llvm::Triple::x86_64:
-            case llvm::Triple::x86:
-            case llvm::Triple::arm:
-            case llvm::Triple::thumb:
-                m_unwinder_ap.reset (new UnwindLLDB (*this));
-                break;
-
-            default:
-#if defined(__APPLE__)
-                m_unwinder_ap.reset (new UnwindMacOSXFrameBackchain (*this));
-#endif
-                break;
-        }
-    }
-    return m_unwinder_ap.get();
-}
-
 void
 ThreadKDP::ClearStackFrames ()
 {

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h Sun Aug 21 21:49:39 2011
@@ -33,9 +33,6 @@
     RefreshStateAfterStop();
 
     virtual const char *
-    GetInfo ();
-
-    virtual const char *
     GetName ();
 
     virtual const char *
@@ -103,9 +100,6 @@
     // Member variables.
     //------------------------------------------------------------------
 
-    virtual lldb_private::Unwind *
-    GetUnwinder ();
-
     virtual lldb::StopInfoSP
     GetPrivateStopReason ();
 

Added: lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp?rev=138228&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp (added)
+++ lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp Sun Aug 21 21:49:39 2011
@@ -0,0 +1,142 @@
+//===-- DynamicRegisterInfo.cpp ----------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "DynamicRegisterInfo.h"
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+
+using namespace lldb;
+using namespace lldb_private;
+
+DynamicRegisterInfo::DynamicRegisterInfo () :
+    m_regs (),
+    m_sets (),
+    m_set_reg_nums (),
+    m_reg_names (),
+    m_reg_alt_names (),
+    m_set_names (),
+    m_reg_data_byte_size (0)
+{
+}
+
+DynamicRegisterInfo::~DynamicRegisterInfo ()
+{
+}
+
+void
+DynamicRegisterInfo::AddRegister (RegisterInfo &reg_info, 
+                                  ConstString &reg_name, 
+                                  ConstString &reg_alt_name, 
+                                  ConstString &set_name)
+{
+    const uint32_t reg_num = m_regs.size();
+    m_reg_names.push_back (reg_name);
+    m_reg_alt_names.push_back (reg_alt_name);
+    reg_info.name = reg_name.AsCString();
+    assert (reg_info.name);
+    reg_info.alt_name = reg_alt_name.AsCString(NULL);
+    m_regs.push_back (reg_info);
+    uint32_t set = GetRegisterSetIndexByName (set_name, true);
+    assert (set < m_sets.size());
+    assert (set < m_set_reg_nums.size());
+    assert (set < m_set_names.size());
+    m_set_reg_nums[set].push_back(reg_num);
+    size_t end_reg_offset = reg_info.byte_offset + reg_info.byte_size;
+    if (m_reg_data_byte_size < end_reg_offset)
+        m_reg_data_byte_size = end_reg_offset;
+}
+
+void
+DynamicRegisterInfo::Finalize ()
+{
+    for (uint32_t set = 0; set < m_sets.size(); ++set)
+    {
+        assert (m_sets.size() == m_set_reg_nums.size());
+        m_sets[set].num_registers = m_set_reg_nums[set].size();
+        m_sets[set].registers = &m_set_reg_nums[set][0];
+    }
+}
+
+size_t
+DynamicRegisterInfo::GetNumRegisters() const
+{
+    return m_regs.size();
+}
+
+size_t
+DynamicRegisterInfo::GetNumRegisterSets() const
+{
+    return m_sets.size();
+}
+
+size_t
+DynamicRegisterInfo::GetRegisterDataByteSize() const
+{
+    return m_reg_data_byte_size;
+}
+
+const RegisterInfo *
+DynamicRegisterInfo::GetRegisterInfoAtIndex (uint32_t i) const
+{
+    if (i < m_regs.size())
+        return &m_regs[i];
+    return NULL;
+}
+
+const RegisterSet *
+DynamicRegisterInfo::GetRegisterSet (uint32_t i) const
+{
+    if (i < m_sets.size())
+        return &m_sets[i];
+    return NULL;
+}
+
+uint32_t
+DynamicRegisterInfo::GetRegisterSetIndexByName (ConstString &set_name, bool can_create)
+{
+    name_collection::iterator pos, end = m_set_names.end();
+    for (pos = m_set_names.begin(); pos != end; ++pos)
+    {
+        if (*pos == set_name)
+            return std::distance (m_set_names.begin(), pos);
+    }
+    
+    m_set_names.push_back(set_name);
+    m_set_reg_nums.resize(m_set_reg_nums.size()+1);
+    RegisterSet new_set = { set_name.AsCString(), NULL, 0, NULL };
+    m_sets.push_back (new_set);
+    return m_sets.size() - 1;
+}
+
+uint32_t
+DynamicRegisterInfo::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) const
+{
+    reg_collection::const_iterator pos, end = m_regs.end();
+    for (pos = m_regs.begin(); pos != end; ++pos)
+    {
+        if (pos->kinds[kind] == num)
+            return std::distance (m_regs.begin(), pos);
+    }
+    
+    return LLDB_INVALID_REGNUM;
+}
+
+void
+DynamicRegisterInfo::Clear()
+{
+    m_regs.clear();
+    m_sets.clear();
+    m_set_reg_nums.clear();
+    m_reg_names.clear();
+    m_reg_alt_names.clear();
+    m_set_names.clear();
+}

Added: lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.h?rev=138228&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.h (added)
+++ lldb/trunk/source/Plugins/Process/Utility/DynamicRegisterInfo.h Sun Aug 21 21:49:39 2011
@@ -0,0 +1,82 @@
+//===-- DynamicRegisterInfo.h -----------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef lldb_DynamicRegisterInfo_h_
+#define lldb_DynamicRegisterInfo_h_
+
+// C Includes
+// C++ Includes
+#include <vector>
+
+// Other libraries and framework includes
+// Project includes
+#include "lldb/lldb-private.h"
+#include "lldb/Core/ConstString.h"
+
+class DynamicRegisterInfo
+{
+public:
+    DynamicRegisterInfo ();
+
+    virtual 
+    ~DynamicRegisterInfo ();
+
+    void
+    AddRegister (lldb_private::RegisterInfo &reg_info, 
+                 lldb_private::ConstString &reg_name, 
+                 lldb_private::ConstString &reg_alt_name, 
+                 lldb_private::ConstString &set_name);
+
+    void
+    Finalize ();
+
+    size_t
+    GetNumRegisters() const;
+
+    size_t
+    GetNumRegisterSets() const;
+
+    size_t
+    GetRegisterDataByteSize() const;
+
+    const lldb_private::RegisterInfo *
+    GetRegisterInfoAtIndex (uint32_t i) const;
+
+    const lldb_private::RegisterSet *
+    GetRegisterSet (uint32_t i) const;
+
+    uint32_t
+    GetRegisterSetIndexByName (lldb_private::ConstString &set_name, bool can_create);
+
+    uint32_t
+    ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) const;
+
+    void
+    Clear();
+
+protected:
+    //------------------------------------------------------------------
+    // Classes that inherit from DynamicRegisterInfo can see and modify these
+    //------------------------------------------------------------------
+    typedef std::vector <lldb_private::RegisterInfo> reg_collection;
+    typedef std::vector <lldb_private::RegisterSet> set_collection;
+    typedef std::vector <uint32_t> reg_num_collection;
+    typedef std::vector <reg_num_collection> set_reg_num_collection;
+    typedef std::vector <lldb_private::ConstString> name_collection;
+
+    reg_collection m_regs;
+    set_collection m_sets;
+    set_reg_num_collection m_set_reg_nums;
+    name_collection m_reg_names;
+    name_collection m_reg_alt_names;
+    name_collection m_set_names;
+    size_t m_reg_data_byte_size;   // The number of bytes required to store all registers
+};
+
+#endif  // lldb_DynamicRegisterInfo_h_

Added: lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.cpp?rev=138228&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.cpp (added)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.cpp Sun Aug 21 21:49:39 2011
@@ -0,0 +1,158 @@
+//===-- RegisterContextMemory.cpp -------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "RegisterContextMemory.h"
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "DynamicRegisterInfo.h"
+#include "lldb/Core/DataBufferHeap.h"
+#include "lldb/Core/Error.h"
+#include "lldb/Core/RegisterValue.h"
+#include "lldb/Target/Process.h"
+#include "lldb/Target/Thread.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//----------------------------------------------------------------------
+// RegisterContextMemory constructor
+//----------------------------------------------------------------------
+RegisterContextMemory::RegisterContextMemory
+(
+    Thread &thread,
+    uint32_t concrete_frame_idx,
+    DynamicRegisterInfo &reg_infos,
+    addr_t reg_data_addr
+) :
+    RegisterContext (thread, concrete_frame_idx),
+    m_reg_infos (reg_infos),
+    m_reg_valid (),
+    m_reg_data (),
+    m_reg_data_addr (reg_data_addr)
+{
+    // Resize our vector of bools to contain one bool for every register.
+    // We will use these boolean values to know when a register value
+    // is valid in m_reg_data.
+    const size_t num_regs = reg_infos.GetNumRegisters();
+    assert (num_regs > 0);
+    m_reg_valid.resize (num_regs);
+
+    // Make a heap based buffer that is big enough to store all registers
+    DataBufferSP reg_data_sp(new DataBufferHeap (reg_infos.GetRegisterDataByteSize(), 0));
+    m_reg_data.SetData (reg_data_sp);
+}
+
+//----------------------------------------------------------------------
+// Destructor
+//----------------------------------------------------------------------
+RegisterContextMemory::~RegisterContextMemory()
+{
+}
+
+void
+RegisterContextMemory::InvalidateAllRegisters ()
+{
+    SetAllRegisterValid (false);
+}
+
+void
+RegisterContextMemory::SetAllRegisterValid (bool b)
+{
+    std::vector<bool>::iterator pos, end = m_reg_valid.end();
+    for (pos = m_reg_valid.begin(); pos != end; ++pos)
+        *pos = b;
+}
+
+size_t
+RegisterContextMemory::GetRegisterCount ()
+{
+    return m_reg_infos.GetNumRegisters ();
+}
+
+const RegisterInfo *
+RegisterContextMemory::GetRegisterInfoAtIndex (uint32_t reg)
+{
+    return m_reg_infos.GetRegisterInfoAtIndex (reg);
+}
+
+size_t
+RegisterContextMemory::GetRegisterSetCount ()
+{
+    return m_reg_infos.GetNumRegisterSets ();
+}
+
+const RegisterSet *
+RegisterContextMemory::GetRegisterSet (uint32_t reg_set)
+{
+    return m_reg_infos.GetRegisterSet (reg_set);
+}
+
+uint32_t
+RegisterContextMemory::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num)
+{
+    return m_reg_infos.ConvertRegisterKindToRegisterNumber (kind, num);
+}
+
+bool
+RegisterContextMemory::ReadRegister (const RegisterInfo *reg_info, RegisterValue &reg_value)
+{
+    const uint32_t reg_num = reg_info->kinds[eRegisterKindLLDB];
+    if (!m_reg_valid[reg_num])
+    {                         
+        if (!ReadAllRegisterValues(m_reg_data.GetSharedDataBuffer ()))
+            return false;
+    }
+    const bool partial_data_ok = false;
+    return reg_value.SetValueFromData(reg_info, m_reg_data, reg_info->byte_offset, partial_data_ok).Success();
+}
+
+bool
+RegisterContextMemory::WriteRegister (const RegisterInfo *reg_info, const RegisterValue &reg_value)
+{
+    if (m_reg_data_addr != LLDB_INVALID_ADDRESS)
+    {
+        const uint32_t reg_num = reg_info->kinds[eRegisterKindLLDB];
+        addr_t reg_addr = m_reg_data_addr + reg_info->byte_offset;
+        Error error (WriteRegisterValueToMemory(reg_info, reg_addr, reg_info->byte_size, reg_value));
+        m_reg_valid[reg_num] = false;
+        return error.Success();
+    }
+    return false;
+}
+
+bool
+RegisterContextMemory::ReadAllRegisterValues (DataBufferSP &data_sp)
+{
+    if (m_reg_data_addr != LLDB_INVALID_ADDRESS)
+    {
+        Error error;
+        if (m_thread.GetProcess().ReadMemory(m_reg_data_addr, data_sp->GetBytes(), data_sp->GetByteSize(), error) == data_sp->GetByteSize())
+        {
+            SetAllRegisterValid (true);
+            return true;
+        }
+    }
+    return false;
+}
+
+bool
+RegisterContextMemory::WriteAllRegisterValues (const DataBufferSP &data_sp)
+{
+    if (m_reg_data_addr != LLDB_INVALID_ADDRESS)
+    {
+        Error error;
+        SetAllRegisterValid (false);
+        if (m_thread.GetProcess().WriteMemory(m_reg_data_addr, data_sp->GetBytes(), data_sp->GetByteSize(), error) == data_sp->GetByteSize())
+            return true;
+    }
+    return false;
+}

Added: lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.h?rev=138228&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.h (added)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextMemory.h Sun Aug 21 21:49:39 2011
@@ -0,0 +1,100 @@
+//===-- RegisterContextMemory.h ---------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef lldb_RegisterContextMemory_h_
+#define lldb_RegisterContextMemory_h_
+
+// C Includes
+// C++ Includes
+#include <vector>
+
+// Other libraries and framework includes
+// Project includes
+#include "lldb/lldb-private.h"
+#include "lldb/Core/DataExtractor.h"
+#include "lldb/Target/RegisterContext.h"
+
+class DynamicRegisterInfo;
+
+class RegisterContextMemory : public lldb_private::RegisterContext
+{
+public:
+    //------------------------------------------------------------------
+    // Constructors and Destructors
+    //------------------------------------------------------------------
+    RegisterContextMemory (lldb_private::Thread &thread,
+                            uint32_t concrete_frame_idx,
+                            DynamicRegisterInfo &reg_info,
+                            lldb::addr_t reg_data_addr);
+
+    virtual
+    ~RegisterContextMemory ();
+
+    //------------------------------------------------------------------
+    // Subclasses must override these functions
+    //------------------------------------------------------------------
+    virtual void
+    InvalidateAllRegisters ();
+
+    virtual size_t
+    GetRegisterCount ();
+
+    virtual const lldb_private::RegisterInfo *
+    GetRegisterInfoAtIndex (uint32_t reg);
+
+    virtual size_t
+    GetRegisterSetCount ();
+
+    virtual const lldb_private::RegisterSet *
+    GetRegisterSet (uint32_t reg_set);
+
+    virtual uint32_t
+    ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num);
+
+    
+    //------------------------------------------------------------------
+    // If all of the thread register are in a contiguous buffer in 
+    // memory, then the default ReadRegister/WriteRegiter and
+    // ReadAllRegisterValues/WriteAllRegisterValues will work. If thread
+    // registers are not contiguous, clients will want to subclass this
+    // class and modify the read/write functions as needed.
+    //------------------------------------------------------------------
+
+    virtual bool
+    ReadRegister (const lldb_private::RegisterInfo *reg_info, 
+                  lldb_private::RegisterValue &reg_value);
+    
+    virtual bool
+    WriteRegister (const lldb_private::RegisterInfo *reg_info, 
+                   const lldb_private::RegisterValue &reg_value);
+    
+    virtual bool
+    ReadAllRegisterValues (lldb::DataBufferSP &data_sp);
+    
+    virtual bool
+    WriteAllRegisterValues (const lldb::DataBufferSP &data_sp);
+
+protected:
+    
+    void
+    SetAllRegisterValid (bool b);
+
+    DynamicRegisterInfo &m_reg_infos;
+    std::vector<bool> m_reg_valid;
+    lldb_private::DataExtractor m_reg_data;
+    lldb::addr_t m_reg_data_addr; // If this is valid, then we have a register context that is stored in memmory
+
+private:
+    //------------------------------------------------------------------
+    // For RegisterContextMemory only
+    //------------------------------------------------------------------
+    DISALLOW_COPY_AND_ASSIGN (RegisterContextMemory);
+};
+
+#endif  // lldb_RegisterContextMemory_h_

Added: lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp?rev=138228&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp (added)
+++ lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp Sun Aug 21 21:49:39 2011
@@ -0,0 +1,112 @@
+//===-- ThreadMemory.cpp ----------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Plugins/Process/Utility/ThreadMemory.h"
+#include "lldb/Target/OperatingSystem.h"
+#include "lldb/Target/RegisterContext.h"
+#include "lldb/Target/Process.h"
+#include "lldb/Target/StopInfo.h"
+#include "lldb/Target/Unwind.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+ThreadMemory::ThreadMemory (Process &process, 
+                              tid_t tid, 
+                              const ValueObjectSP &thread_info_valobj_sp) :
+    Thread (process, tid),
+    m_thread_info_valobj_sp (thread_info_valobj_sp)
+{
+}
+
+
+ThreadMemory::~ThreadMemory()
+{
+    DestroyThread();
+}
+
+bool
+ThreadMemory::WillResume (StateType resume_state)
+{
+    ClearStackFrames();
+    // Call the Thread::WillResume first. If we stop at a signal, the stop info
+    // class for signal will set the resume signal that we need below. The signal
+    // stuff obeys the Process::UnixSignal defaults. 
+    Thread::WillResume(resume_state);
+    return true;
+}
+
+RegisterContextSP
+ThreadMemory::GetRegisterContext ()
+{
+    if (!m_reg_context_sp)
+    {
+        OperatingSystem *os = m_process.GetOperatingSystem ();
+        if (os)
+            m_reg_context_sp = os->CreateRegisterContextForThread (this);
+    }
+    return m_reg_context_sp;
+}
+
+RegisterContextSP
+ThreadMemory::CreateRegisterContextForFrame (StackFrame *frame)
+{
+    RegisterContextSP reg_ctx_sp;
+    uint32_t concrete_frame_idx = 0;
+    
+    if (frame)
+        concrete_frame_idx = frame->GetConcreteFrameIndex ();
+    
+    if (concrete_frame_idx == 0)
+    {
+        reg_ctx_sp = GetRegisterContext ();
+    }
+    else if (m_unwinder_ap.get())
+    {
+        reg_ctx_sp = m_unwinder_ap->CreateRegisterContextForFrame (frame);
+    }
+    return reg_ctx_sp;
+}
+
+lldb::StopInfoSP
+ThreadMemory::GetPrivateStopReason ()
+{
+    const uint32_t process_stop_id = GetProcess().GetStopID();
+    if (m_thread_stop_reason_stop_id != process_stop_id ||
+        (m_actual_stop_info_sp && !m_actual_stop_info_sp->IsValid()))
+    {
+        // If GetGDBProcess().SetThreadStopInfo() doesn't find a stop reason
+        // for this thread, then m_actual_stop_info_sp will not ever contain
+        // a valid stop reason and the "m_actual_stop_info_sp->IsValid() == false"
+        // check will never be able to tell us if we have the correct stop info
+        // for this thread and we will continually send qThreadStopInfo packets
+        // down to the remote GDB server, so we need to keep our own notion
+        // of the stop ID that m_actual_stop_info_sp is valid for (even if it
+        // contains nothing). We use m_thread_stop_reason_stop_id for this below.
+        m_thread_stop_reason_stop_id = process_stop_id;
+        m_actual_stop_info_sp.reset();
+        
+        OperatingSystem *os = m_process.GetOperatingSystem ();
+        if (os)
+            m_actual_stop_info_sp = os->CreateThreadStopReason (this);
+    }
+    return m_actual_stop_info_sp;
+    
+}
+
+void
+ThreadMemory::RefreshStateAfterStop()
+{
+    RegisterContextSP reg_ctx_sp(GetRegisterContext());
+    if (reg_ctx_sp)
+    {
+        const bool force = true;
+        reg_ctx_sp->InvalidateIfNeeded (force);
+    }
+}

Added: lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h?rev=138228&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h (added)
+++ lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h Sun Aug 21 21:49:39 2011
@@ -0,0 +1,64 @@
+//===-- ThreadMemory.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_ThreadMemory_h_
+#define liblldb_ThreadMemory_h_
+
+#include "lldb/Target/Thread.h"
+
+class ThreadMemory :
+    public lldb_private::Thread
+{
+public:
+
+    ThreadMemory (lldb_private::Process &process, 
+                   lldb::tid_t tid,
+                   const lldb::ValueObjectSP &thread_info_valobj_sp);
+
+    virtual 
+    ~ThreadMemory();
+
+    //------------------------------------------------------------------
+    // lldb_private::Thread methods
+    //------------------------------------------------------------------
+    virtual void
+    RefreshStateAfterStop();
+
+    virtual lldb::RegisterContextSP
+    GetRegisterContext ();
+
+    virtual lldb::RegisterContextSP
+    CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
+
+    virtual lldb::StopInfoSP
+    GetPrivateStopReason ();
+
+    virtual bool
+    WillResume (lldb::StateType resume_state);
+
+    lldb::ValueObjectSP &
+    GetValueObject ()
+    {
+        return m_thread_info_valobj_sp;
+    }
+
+protected:
+    //------------------------------------------------------------------
+    // For ThreadMemory and subclasses
+    //------------------------------------------------------------------
+    lldb::ValueObjectSP m_thread_info_valobj_sp;
+    
+private:
+    //------------------------------------------------------------------
+    // For ThreadMemory only
+    //------------------------------------------------------------------
+    DISALLOW_COPY_AND_ASSIGN (ThreadMemory);
+};
+
+#endif  // liblldb_ThreadMemory_h_

Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Sun Aug 21 21:49:39 2011
@@ -390,7 +390,7 @@
     {
         // We have a valid process
         SetID (pid);
-        UpdateThreadListIfNeeded ();
+        GetThreadList();
         if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false))
         {
             const StateType state = SetThreadStopInfo (m_last_stop_packet);
@@ -1062,43 +1062,32 @@
 }
 
 uint32_t
-ProcessGDBRemote::UpdateThreadListIfNeeded ()
+ProcessGDBRemote::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
 {
     // locker will keep a mutex locked until it goes out of scope
     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_THREAD));
     if (log && log->GetMask().Test(GDBR_LOG_VERBOSE))
         log->Printf ("ProcessGDBRemote::%s (pid = %i)", __FUNCTION__, GetID());
+    // Update the thread list's stop id immediately so we don't recurse into this function.
 
-    Mutex::Locker locker (m_thread_list.GetMutex ());
-    const uint32_t stop_id = GetStopID();
-    if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID())
+    std::vector<lldb::tid_t> thread_ids;
+    bool sequence_mutex_unavailable = false;
+    const size_t num_thread_ids = m_gdb_comm.GetCurrentThreadIDs (thread_ids, sequence_mutex_unavailable);
+    if (num_thread_ids > 0)
     {
-        // Update the thread list's stop id immediately so we don't recurse into this function.
-        ThreadList curr_thread_list (this);
-        curr_thread_list.SetStopID(stop_id);
-
-        std::vector<lldb::tid_t> thread_ids;
-        bool sequence_mutex_unavailable = false;
-        const size_t num_thread_ids = m_gdb_comm.GetCurrentThreadIDs (thread_ids, sequence_mutex_unavailable);
-        if (num_thread_ids > 0)
+        for (size_t i=0; i<num_thread_ids; ++i)
         {
-            for (size_t i=0; i<num_thread_ids; ++i)
-            {
-                tid_t tid = thread_ids[i];
-                ThreadSP thread_sp (GetThreadList().FindThreadByID (tid, false));
-                if (!thread_sp)
-                    thread_sp.reset (new ThreadGDBRemote (*this, tid));
-                curr_thread_list.AddThread(thread_sp);
-            }
-        }
-
-        if (sequence_mutex_unavailable == false)
-        {
-            m_thread_list = curr_thread_list;
-            SetThreadStopInfo (m_last_stop_packet);
+            tid_t tid = thread_ids[i];
+            ThreadSP thread_sp (old_thread_list.FindThreadByID (tid, false));
+            if (!thread_sp)
+                thread_sp.reset (new ThreadGDBRemote (*this, tid));
+            new_thread_list.AddThread(thread_sp);
         }
     }
-    return GetThreadList().GetSize(false);
+
+    if (sequence_mutex_unavailable == false)
+        SetThreadStopInfo (m_last_stop_packet);
+    return new_thread_list.GetSize(false);
 }
 
 
@@ -1318,7 +1307,7 @@
                             }
                         }
                         if (!handled)
-                    gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithSignal (*thread_sp, signo));
+                            gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithSignal (*thread_sp, signo));
                 }
                 else
                 {

Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h Sun Aug 21 21:49:39 2011
@@ -267,7 +267,8 @@
     }
 
     uint32_t
-    UpdateThreadListIfNeeded ();
+    UpdateThreadList (lldb_private::ThreadList &old_thread_list, 
+                      lldb_private::ThreadList &new_thread_list);
 
     lldb_private::Error
     StartDebugserverProcess (const char *debugserver_url);

Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp Sun Aug 21 21:49:39 2011
@@ -23,13 +23,8 @@
 
 #include "ProcessGDBRemote.h"
 #include "ProcessGDBRemoteLog.h"
-#include "Plugins/Process/Utility/UnwindLLDB.h"
 #include "Utility/StringExtractorGDBRemote.h"
 
-#if defined(__APPLE__)
-#include "UnwindMacOSXFrameBackchain.h"
-#endif
-
 using namespace lldb;
 using namespace lldb_private;
 
@@ -52,14 +47,6 @@
     DestroyThread();
 }
 
-
-const char *
-ThreadGDBRemote::GetInfo ()
-{
-    return NULL;
-}
-
-
 const char *
 ThreadGDBRemote::GetName ()
 {
@@ -135,32 +122,6 @@
     GetRegisterContext()->InvalidateIfNeeded (force);
 }
 
-Unwind *
-ThreadGDBRemote::GetUnwinder ()
-{
-    if (m_unwinder_ap.get() == NULL)
-    {
-        const ArchSpec target_arch (GetProcess().GetTarget().GetArchitecture ());
-        const llvm::Triple::ArchType machine = target_arch.GetMachine();
-        switch (machine)
-        {
-            case llvm::Triple::x86_64:
-            case llvm::Triple::x86:
-            case llvm::Triple::arm:
-            case llvm::Triple::thumb:
-                m_unwinder_ap.reset (new UnwindLLDB (*this));
-                break;
-
-            default:
-#if defined(__APPLE__)
-                m_unwinder_ap.reset (new UnwindMacOSXFrameBackchain (*this));
-#endif
-                break;
-        }
-    }
-    return m_unwinder_ap.get();
-}
-
 void
 ThreadGDBRemote::ClearStackFrames ()
 {

Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h Sun Aug 21 21:49:39 2011
@@ -33,9 +33,6 @@
     RefreshStateAfterStop();
 
     virtual const char *
-    GetInfo ();
-
-    virtual const char *
     GetName ();
 
     virtual const char *
@@ -113,9 +110,6 @@
     // Member variables.
     //------------------------------------------------------------------
 
-    virtual lldb_private::Unwind *
-    GetUnwinder ();
-
     void
     SetStopInfoFromPacket (StringExtractor &stop_packet, uint32_t stop_id);
 

Modified: lldb/trunk/source/Target/ABI.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ABI.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Target/ABI.cpp (original)
+++ lldb/trunk/source/Target/ABI.cpp Sun Aug 21 21:49:39 2011
@@ -45,3 +45,55 @@
 ABI::~ABI()
 {
 }
+
+
+bool
+ABI::GetRegisterInfoByName (const ConstString &name, RegisterInfo &info)
+{
+    uint32_t count = 0;
+    const RegisterInfo *register_info_array = GetRegisterInfoArray (count);
+    if (register_info_array)
+    {
+        const char *unique_name_cstr = name.GetCString();
+        uint32_t i;
+        for (i=0; i<count; ++i)
+        {
+            if (register_info_array[i].name == unique_name_cstr)
+            {
+                info = register_info_array[i];
+                return true;
+            }
+        }
+        for (i=0; i<count; ++i)
+        {
+            if (register_info_array[i].alt_name == unique_name_cstr)
+            {
+                info = register_info_array[i];
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+bool
+ABI::GetRegisterInfoByKind (RegisterKind reg_kind, uint32_t reg_num, RegisterInfo &info)
+{
+    if (reg_kind < eRegisterKindGCC || reg_kind >= kNumRegisterKinds)
+        return false;
+        
+    uint32_t count = 0;
+    const RegisterInfo *register_info_array = GetRegisterInfoArray (count);
+    if (register_info_array)
+    {
+        for (uint32_t i=0; i<count; ++i)
+        {
+            if (register_info_array[i].kinds[reg_kind] == reg_num)
+            {
+                info = register_info_array[i];
+                return true;
+            }
+        }
+    }
+    return false;
+}

Added: lldb/trunk/source/Target/OperatingSystem.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/OperatingSystem.cpp?rev=138228&view=auto
==============================================================================
--- lldb/trunk/source/Target/OperatingSystem.cpp (added)
+++ lldb/trunk/source/Target/OperatingSystem.cpp Sun Aug 21 21:49:39 2011
@@ -0,0 +1,56 @@
+//===-- OperatingSystem.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/Target/OperatingSystem.h"
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+#include "lldb/Core/PluginManager.h"
+
+
+using namespace lldb;
+using namespace lldb_private;
+
+
+OperatingSystem*
+OperatingSystem::FindPlugin (Process *process, const char *plugin_name)
+{
+    OperatingSystemCreateInstance create_callback = NULL;
+    if (plugin_name)
+    {
+        create_callback  = PluginManager::GetOperatingSystemCreateCallbackForPluginName (plugin_name);
+        if (create_callback)
+        {
+            std::auto_ptr<OperatingSystem> instance_ap(create_callback(process, true));
+            if (instance_ap.get())
+                return instance_ap.release();
+        }
+    }
+    else
+    {
+        for (uint32_t idx = 0; (create_callback = PluginManager::GetOperatingSystemCreateCallbackAtIndex(idx)) != NULL; ++idx)
+        {
+            std::auto_ptr<OperatingSystem> instance_ap(create_callback(process, false));
+            if (instance_ap.get())
+                return instance_ap.release();
+        }
+    }
+    return NULL;
+}
+
+
+OperatingSystem::OperatingSystem (Process *process) :
+    m_process (process)
+{
+}
+
+OperatingSystem::~OperatingSystem()
+{
+}

Modified: lldb/trunk/source/Target/Process.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Sun Aug 21 21:49:39 2011
@@ -25,6 +25,7 @@
 #include "lldb/Host/Host.h"
 #include "lldb/Target/ABI.h"
 #include "lldb/Target/DynamicLoader.h"
+#include "lldb/Target/OperatingSystem.h"
 #include "lldb/Target/LanguageRuntime.h"
 #include "lldb/Target/CPPLanguageRuntime.h"
 #include "lldb/Target/ObjCLanguageRuntime.h"
@@ -646,8 +647,8 @@
     
     // We need to destroy the loader before the derived Process class gets destroyed
     // since it is very likely that undoing the loader will require access to the real process.
-    if (m_dyld_ap.get() != NULL)
-        m_dyld_ap.reset();
+    m_dyld_ap.reset();
+    m_os_ap.reset();
 }
 
 void
@@ -1029,6 +1030,25 @@
 }
 
 
+void
+Process::UpdateThreadListIfNeeded ()
+{
+    const uint32_t stop_id = GetStopID();
+    if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID())
+    {
+        Mutex::Locker locker (m_thread_list.GetMutex ());
+        ThreadList new_thread_list(this);
+        // Always update the thread list with the protocol specific
+        // thread list
+        UpdateThreadList (m_thread_list, new_thread_list);
+        OperatingSystem *os = GetOperatingSystem ();
+        if (os)
+            os->UpdateThreadList (m_thread_list, new_thread_list);
+        m_thread_list.Update (new_thread_list);
+        m_thread_list.SetStopID (stop_id);
+    }
+}
+
 uint32_t
 Process::GetNextThreadIndexID ()
 {
@@ -2017,6 +2037,7 @@
     Error error;
     m_abi_sp.reset();
     m_dyld_ap.reset();
+    m_os_ap.reset();
     m_process_input_reader.reset();
 
     Module *exe_module = m_target.GetExecutableModulePointer();
@@ -2101,10 +2122,11 @@
 
                         DidLaunch ();
 
-                        m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL));
+                        m_dyld_ap.reset (DynamicLoader::FindPlugin (this, NULL));
                         if (m_dyld_ap.get())
                             m_dyld_ap->DidLaunch();
 
+                        m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
                         // This delays passing the stopped event to listeners till DidLaunch gets
                         // a chance to complete...
                         HandlePrivateEvent (event_sp);
@@ -2198,6 +2220,7 @@
     }
 
     m_dyld_ap.reset();
+    m_os_ap.reset();
 
     Error error (WillAttachToProcessWithID(attach_pid));
     if (error.Success())
@@ -2277,6 +2300,7 @@
     if (error.Success())
     {
         m_dyld_ap.reset();
+        m_os_ap.reset();
         
         error = WillAttachToProcessWithName(process_name, wait_for_launch);
         if (error.Success())
@@ -2318,6 +2342,7 @@
     if (m_dyld_ap.get())
         m_dyld_ap->DidAttach();
 
+    m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
     // Figure out which one is the executable, and set that in our target:
     ModuleList &modules = m_target.GetImages();
     

Modified: lldb/trunk/source/Target/Thread.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Thread.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Target/Thread.cpp (original)
+++ lldb/trunk/source/Target/Thread.cpp Sun Aug 21 21:49:39 2011
@@ -36,6 +36,9 @@
 #include "lldb/Target/ThreadPlanStepUntil.h"
 #include "lldb/Target/ThreadSpec.h"
 #include "lldb/Target/Unwind.h"
+#include "Plugins/Process/Utility/UnwindLLDB.h"
+#include "UnwindMacOSXFrameBackchain.h"
+
 
 using namespace lldb;
 using namespace lldb_private;
@@ -1196,6 +1199,32 @@
     return false;
 }
 
+Unwind *
+Thread::GetUnwinder ()
+{
+    if (m_unwinder_ap.get() == NULL)
+    {
+        const ArchSpec target_arch (GetProcess().GetTarget().GetArchitecture ());
+        const llvm::Triple::ArchType machine = target_arch.GetMachine();
+        switch (machine)
+        {
+            case llvm::Triple::x86_64:
+            case llvm::Triple::x86:
+            case llvm::Triple::arm:
+            case llvm::Triple::thumb:
+                m_unwinder_ap.reset (new UnwindLLDB (*this));
+                break;
+                
+            default:
+                if (target_arch.GetTriple().getVendor() == llvm::Triple::Apple)
+                    m_unwinder_ap.reset (new UnwindMacOSXFrameBackchain (*this));
+                break;
+        }
+    }
+    return m_unwinder_ap.get();
+}
+
+
 #pragma mark "Thread::SettingsController"
 //--------------------------------------------------------------
 // class Thread::SettingsController

Modified: lldb/trunk/source/Target/ThreadList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadList.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/Target/ThreadList.cpp (original)
+++ lldb/trunk/source/Target/ThreadList.cpp Sun Aug 21 21:49:39 2011
@@ -573,3 +573,20 @@
     return m_selected_tid != LLDB_INVALID_THREAD_ID;
 }
 
+void
+ThreadList::Update (ThreadList &rhs)
+{
+    if (this != &rhs)
+    {
+        // Lock both mutexes to make sure neither side changes anyone on us
+        // while the assignement occurs
+        Mutex::Locker locker_lhs(m_threads_mutex);
+        Mutex::Locker locker_rhs(rhs.m_threads_mutex);
+        m_process = rhs.m_process;
+        m_stop_id = rhs.m_stop_id;
+        m_threads.swap(rhs.m_threads);
+        m_selected_tid = rhs.m_selected_tid;
+    }
+}
+
+

Modified: lldb/trunk/source/lldb.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/lldb.cpp?rev=138228&r1=138227&r2=138228&view=diff
==============================================================================
--- lldb/trunk/source/lldb.cpp (original)
+++ lldb/trunk/source/lldb.cpp Sun Aug 21 21:49:39 2011
@@ -39,6 +39,7 @@
 #if defined (__APPLE__)
 #include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h"
 #include "Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h"
+#include "Plugins/OperatingSystem/MacOSX-Kernel/OperatingSystemMacOSXKernel.h"
 #include "Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h"
 #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h"
 #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h"
@@ -100,6 +101,7 @@
         //----------------------------------------------------------------------
         DynamicLoaderMacOSXDYLD::Initialize();
         DynamicLoaderMacOSXKernel::Initialize();
+        OperatingSystemMacOSXKernel::Initialize();
         SymbolFileDWARFDebugMap::Initialize();
         ItaniumABILanguageRuntime::Initialize();
         AppleObjCRuntimeV2::Initialize();
@@ -168,6 +170,7 @@
 #if defined (__APPLE__)
     DynamicLoaderMacOSXDYLD::Terminate();
     DynamicLoaderMacOSXKernel::Terminate();
+    OperatingSystemMacOSXKernel::Terminate();
     SymbolFileDWARFDebugMap::Terminate();
     ItaniumABILanguageRuntime::Terminate();
     AppleObjCRuntimeV2::Terminate();





More information about the lldb-commits mailing list