blob: 23f6077b32c15dfa6f6416ad99188dd2fc787cb3 [file] [log] [blame]
Jason Molenda02706c32013-11-08 04:59:54 +00001//===-- HistoryThread.cpp ---------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Jason Molenda02706c32013-11-08 04:59:54 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/lldb-private.h"
10
Jason Molenda02706c32013-11-08 04:59:54 +000011#include "Plugins/Process/Utility/HistoryThread.h"
Jonas Devlieghere796ac802019-02-11 23:13:08 +000012
Kate Stoneb9c1b512016-09-06 20:57:50 +000013#include "Plugins/Process/Utility/HistoryUnwind.h"
Jason Molenda02706c32013-11-08 04:59:54 +000014#include "Plugins/Process/Utility/RegisterContextHistory.h"
15
Jason Molenda02706c32013-11-08 04:59:54 +000016#include "lldb/Target/Process.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000017#include "lldb/Target/StackFrameList.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000018#include "lldb/Utility/Log.h"
Jason Molenda02706c32013-11-08 04:59:54 +000019
Jonas Devlieghere796ac802019-02-11 23:13:08 +000020#include <memory>
21
Jason Molenda02706c32013-11-08 04:59:54 +000022using namespace lldb;
23using namespace lldb_private;
24
Jason Molendaa8ff5432014-03-06 06:31:18 +000025// Constructor
26
Kate Stoneb9c1b512016-09-06 20:57:50 +000027HistoryThread::HistoryThread(lldb_private::Process &process, lldb::tid_t tid,
28 std::vector<lldb::addr_t> pcs, uint32_t stop_id,
29 bool stop_id_is_valid)
30 : Thread(process, tid, true), m_framelist_mutex(), m_framelist(),
31 m_pcs(pcs), m_stop_id(stop_id), m_stop_id_is_valid(stop_id_is_valid),
32 m_extended_unwind_token(LLDB_INVALID_ADDRESS), m_queue_name(),
33 m_thread_name(), m_originating_unique_thread_id(tid),
34 m_queue_id(LLDB_INVALID_QUEUE_ID) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +000035 m_unwinder_up.reset(new HistoryUnwind(*this, pcs, stop_id_is_valid));
Kate Stoneb9c1b512016-09-06 20:57:50 +000036 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT));
37 if (log)
38 log->Printf("%p HistoryThread::HistoryThread", static_cast<void *>(this));
Jason Molenda02706c32013-11-08 04:59:54 +000039}
40
Jason Molendaa8ff5432014-03-06 06:31:18 +000041// Destructor
42
Kate Stoneb9c1b512016-09-06 20:57:50 +000043HistoryThread::~HistoryThread() {
44 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT));
45 if (log)
46 log->Printf("%p HistoryThread::~HistoryThread (tid=0x%" PRIx64 ")",
47 static_cast<void *>(this), GetID());
48 DestroyThread();
49}
50
51lldb::RegisterContextSP HistoryThread::GetRegisterContext() {
52 RegisterContextSP rctx;
53 if (m_pcs.size() > 0) {
Jonas Devlieghere796ac802019-02-11 23:13:08 +000054 rctx = std::make_shared<RegisterContextHistory>(
55 *this, 0, GetProcess()->GetAddressByteSize(), m_pcs[0]);
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 }
57 return rctx;
Jason Molenda02706c32013-11-08 04:59:54 +000058}
59
60lldb::RegisterContextSP
Kate Stoneb9c1b512016-09-06 20:57:50 +000061HistoryThread::CreateRegisterContextForFrame(StackFrame *frame) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +000062 return m_unwinder_up->CreateRegisterContextForFrame(frame);
Jason Molenda02706c32013-11-08 04:59:54 +000063}
64
Kate Stoneb9c1b512016-09-06 20:57:50 +000065lldb::StackFrameListSP HistoryThread::GetStackFrameList() {
66 // FIXME do not throw away the lock after we acquire it..
67 std::unique_lock<std::mutex> lock(m_framelist_mutex);
68 lock.unlock();
69 if (m_framelist.get() == NULL) {
Jonas Devlieghere796ac802019-02-11 23:13:08 +000070 m_framelist =
71 std::make_shared<StackFrameList>(*this, StackFrameListSP(), true);
Kate Stoneb9c1b512016-09-06 20:57:50 +000072 }
73
74 return m_framelist;
Jason Molenda02706c32013-11-08 04:59:54 +000075}
76
Kate Stoneb9c1b512016-09-06 20:57:50 +000077uint32_t HistoryThread::GetExtendedBacktraceOriginatingIndexID() {
78 if (m_originating_unique_thread_id != LLDB_INVALID_THREAD_ID) {
79 if (GetProcess()->HasAssignedIndexIDToThread(
80 m_originating_unique_thread_id)) {
81 return GetProcess()->AssignIndexIDToThread(
82 m_originating_unique_thread_id);
Jason Molenda02706c32013-11-08 04:59:54 +000083 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000084 }
85 return LLDB_INVALID_THREAD_ID;
Jason Molenda8ee9cb52013-11-16 01:24:22 +000086}