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.

llvm-svn: 138228
diff --git a/lldb/source/Plugins/Process/Utility/ThreadMemory.cpp b/lldb/source/Plugins/Process/Utility/ThreadMemory.cpp
new file mode 100644
index 0000000..95f05fd
--- /dev/null
+++ b/lldb/source/Plugins/Process/Utility/ThreadMemory.cpp
@@ -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);
+    }
+}