ThreadMemory.cpp revision 863aa28adf536c9c008e1590f25da662431d6f13
1//===-- ThreadMemory.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 "Plugins/Process/Utility/ThreadMemory.h"
11#include "lldb/Target/OperatingSystem.h"
12#include "lldb/Target/RegisterContext.h"
13#include "lldb/Target/Process.h"
14#include "lldb/Target/StopInfo.h"
15#include "lldb/Target/Unwind.h"
16#include "Plugins/Process/Utility/RegisterContextThreadMemory.h"
17
18using namespace lldb;
19using namespace lldb_private;
20
21ThreadMemory::ThreadMemory (Process &process,
22                            tid_t tid,
23                            const ValueObjectSP &thread_info_valobj_sp) :
24    Thread (process, tid),
25    m_backing_thread_sp (),
26    m_thread_info_valobj_sp (thread_info_valobj_sp),
27    m_name(),
28    m_queue()
29{
30}
31
32
33ThreadMemory::ThreadMemory (Process &process,
34                            lldb::tid_t tid,
35                            const char *name,
36                            const char *queue,
37                            lldb::addr_t register_data_addr) :
38    Thread (process, tid),
39    m_backing_thread_sp (),
40    m_thread_info_valobj_sp (),
41    m_name(),
42    m_queue(),
43    m_register_data_addr (register_data_addr)
44{
45    if (name)
46        m_name = name;
47    if (queue)
48        m_queue = queue;
49}
50
51
52ThreadMemory::~ThreadMemory()
53{
54    DestroyThread();
55}
56
57void
58ThreadMemory::WillResume (StateType resume_state)
59{
60    if (m_backing_thread_sp)
61        m_backing_thread_sp->WillResume(resume_state);
62}
63
64void
65ThreadMemory::ClearStackFrames ()
66{
67    if (m_backing_thread_sp)
68        m_backing_thread_sp->ClearStackFrames();
69    Thread::ClearStackFrames();
70}
71
72RegisterContextSP
73ThreadMemory::GetRegisterContext ()
74{
75    if (!m_reg_context_sp)
76        m_reg_context_sp.reset (new RegisterContextThreadMemory (*this, m_register_data_addr));
77    return m_reg_context_sp;
78}
79
80RegisterContextSP
81ThreadMemory::CreateRegisterContextForFrame (StackFrame *frame)
82{
83    RegisterContextSP reg_ctx_sp;
84    uint32_t concrete_frame_idx = 0;
85
86    if (frame)
87        concrete_frame_idx = frame->GetConcreteFrameIndex ();
88
89    if (concrete_frame_idx == 0)
90    {
91        reg_ctx_sp = GetRegisterContext ();
92    }
93    else
94    {
95        Unwind *unwinder = GetUnwinder ();
96        if (unwinder)
97            reg_ctx_sp = unwinder->CreateRegisterContextForFrame (frame);
98    }
99    return reg_ctx_sp;
100}
101
102bool
103ThreadMemory::CalculateStopInfo ()
104{
105    if (m_backing_thread_sp)
106    {
107        lldb::StopInfoSP backing_stop_info_sp (m_backing_thread_sp->GetPrivateStopInfo());
108        if (backing_stop_info_sp)
109        {
110            backing_stop_info_sp->SetThread (shared_from_this());
111            SetStopInfo (backing_stop_info_sp);
112            return true;
113        }
114    }
115    else
116    {
117        ProcessSP process_sp (GetProcess());
118
119        if (process_sp)
120        {
121            OperatingSystem *os = process_sp->GetOperatingSystem ();
122            if (os)
123            {
124                SetStopInfo (os->CreateThreadStopReason (this));
125                return true;
126            }
127        }
128    }
129    return false;
130}
131
132void
133ThreadMemory::RefreshStateAfterStop()
134{
135    if (m_backing_thread_sp)
136        return m_backing_thread_sp->RefreshStateAfterStop();
137
138    if (m_reg_context_sp)
139        m_reg_context_sp->InvalidateAllRegisters();
140}
141