Add History subclasses for Thread, Unwind, RegisterContext.
Still working out some of the details of these classes but 
I wanted to get the overall structure checked in.
<rdar://problem/15314068> 

llvm-svn: 194245
diff --git a/lldb/source/Plugins/Process/Utility/HistoryUnwind.cpp b/lldb/source/Plugins/Process/Utility/HistoryUnwind.cpp
new file mode 100644
index 0000000..86665fd
--- /dev/null
+++ b/lldb/source/Plugins/Process/Utility/HistoryUnwind.cpp
@@ -0,0 +1,79 @@
+//===-- HistoryUnwind.cpp ---------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/lldb-private.h"
+
+#include "Plugins/Process/Utility/RegisterContextHistory.h"
+#include "Plugins/Process/Utility/HistoryUnwind.h"
+
+#include "lldb/Target/StackFrame.h"
+#include "lldb/Target/Thread.h"
+#include "lldb/Target/Process.h"
+#include "lldb/Target/Target.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+HistoryUnwind::HistoryUnwind (Thread &thread,
+                              std::vector<lldb::addr_t> pcs,
+                              uint32_t stop_id,
+                              bool stop_id_is_valid) :
+        Unwind (thread),
+        m_pcs (pcs),
+        m_stop_id (stop_id),
+        m_stop_id_is_valid (stop_id_is_valid)
+{
+}
+
+HistoryUnwind::~HistoryUnwind ()
+{
+}
+
+void
+HistoryUnwind::DoClear ()
+{
+    Mutex::Locker locker(m_unwind_mutex);
+    m_pcs.clear();
+    m_stop_id_is_valid = false;
+}
+
+lldb::RegisterContextSP
+HistoryUnwind::DoCreateRegisterContextForFrame (StackFrame *frame)
+{
+    RegisterContextSP rctx;
+    if (frame)
+    {
+        addr_t pc = frame->GetFrameCodeAddress().GetLoadAddress (&frame->GetThread()->GetProcess()->GetTarget());
+        if (pc != LLDB_INVALID_ADDRESS)
+        {
+            rctx.reset (new RegisterContextHistory (*frame->GetThread().get(), frame->GetConcreteFrameIndex(), 
+                        frame->GetThread()->GetProcess()->GetAddressByteSize(), pc));
+        }
+    }
+    return rctx;
+}
+
+bool
+HistoryUnwind::DoGetFrameInfoAtIndex (uint32_t frame_idx, lldb::addr_t& cfa, lldb::addr_t& pc)
+{
+    Mutex::Locker (m_unwind_mutex);
+    if (frame_idx < m_pcs.size())
+    {
+        cfa = frame_idx;
+        pc = m_pcs[frame_idx];
+        return true;
+    }
+    return false;
+}
+
+uint32_t
+HistoryUnwind::DoGetFrameCount ()
+{
+    return m_pcs.size();
+}