blob: b63b61f7772364214d91cd7b6acba1e43d6361b8 [file] [log] [blame]
Jason Molenda02706c32013-11-08 04:59:54 +00001//===-- HistoryThread.cpp ---------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/lldb-private.h"
11
12#include "Plugins/Process/Utility/HistoryUnwind.h"
13#include "Plugins/Process/Utility/HistoryThread.h"
14#include "Plugins/Process/Utility/RegisterContextHistory.h"
15
Jason Molendaee87e752013-11-12 00:09:58 +000016#include "lldb/Core/Log.h"
Jason Molenda02706c32013-11-08 04:59:54 +000017#include "lldb/Target/StackFrameList.h"
18#include "lldb/Target/Process.h"
19
20using namespace lldb;
21using namespace lldb_private;
22
23HistoryThread::HistoryThread (lldb_private::Process &process,
24 std::vector<lldb::addr_t> pcs,
25 uint32_t stop_id,
26 bool stop_id_is_valid) :
27 Thread (process, LLDB_INVALID_THREAD_ID),
28 m_framelist_mutex(),
29 m_framelist(),
30 m_pcs (pcs),
31 m_stop_id (stop_id),
Jason Molendaa7b5afa2013-11-15 00:17:32 +000032 m_stop_id_is_valid (stop_id_is_valid),
33 m_extended_unwind_token (LLDB_INVALID_ADDRESS)
Jason Molenda02706c32013-11-08 04:59:54 +000034{
35 m_unwinder_ap.reset (new HistoryUnwind (*this, pcs, stop_id, stop_id_is_valid));
Jason Molendaee87e752013-11-12 00:09:58 +000036 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
37 if (log)
38 log->Printf ("%p HistoryThread::HistoryThread", this);
Jason Molenda02706c32013-11-08 04:59:54 +000039}
40
41HistoryThread::~HistoryThread ()
42{
Jason Molendaee87e752013-11-12 00:09:58 +000043 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
44 if (log)
45 log->Printf ("%p HistoryThread::~HistoryThread (tid=0x%" PRIx64 ")", this, GetID());
46 DestroyThread();
Jason Molenda02706c32013-11-08 04:59:54 +000047}
48
49lldb::RegisterContextSP
50HistoryThread::GetRegisterContext ()
51{
52 RegisterContextSP rctx ;
53 if (m_pcs.size() > 0)
54 {
55 rctx.reset (new RegisterContextHistory (*this, 0, GetProcess()->GetAddressByteSize(), m_pcs[0]));
56 }
57 return rctx;
58
59}
60
61lldb::RegisterContextSP
62HistoryThread::CreateRegisterContextForFrame (StackFrame *frame)
63{
64 return m_unwinder_ap->CreateRegisterContextForFrame (frame);
65}
66
67lldb::StackFrameListSP
68HistoryThread::GetStackFrameList ()
69{
70 Mutex::Locker (m_framelist_mutex);
71 if (m_framelist.get() == NULL)
72 {
73 m_framelist.reset (new StackFrameList (*this, StackFrameListSP(), true));
74 }
75
76 return m_framelist;
77}