1643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//===-- StopInfo.cpp ---------------------------------------------*- C++ -*-===//
2643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//
3643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//                     The LLVM Compiler Infrastructure
4643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//
5643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// This file is distributed under the University of Illinois Open Source
6643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// License. See LICENSE.TXT for details.
7643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//
8643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//===----------------------------------------------------------------------===//
9643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
12643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h"
13643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
14643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// C Includes
15643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// C++ Includes
16643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include <string>
17643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
18643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// Other libraries and framework includes
19643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// Project includes
20643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Core/Log.h"
21640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton#include "lldb/Breakpoint/Breakpoint.h"
22643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Breakpoint/BreakpointLocation.h"
23643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Breakpoint/StoppointCallbackContext.h"
24ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen#include "lldb/Breakpoint/Watchpoint.h"
2521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham#include "lldb/Core/Debugger.h"
26643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Core/StreamString.h"
2721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham#include "lldb/Expression/ClangUserExpression.h"
2821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham#include "lldb/Target/Target.h"
29643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/Thread.h"
30643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/ThreadPlan.h"
31643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/Process.h"
32643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/UnixSignals.h"
33643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
34643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonusing namespace lldb;
35643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonusing namespace lldb_private;
36643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
37643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::StopInfo (Thread &thread, uint64_t value) :
388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    m_thread_wp (thread.shared_from_this()),
39f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    m_stop_id (thread.GetProcess()->GetStopID()),
40f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    m_resume_id (thread.GetProcess()->GetResumeID()),
4189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    m_value (value),
427c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    m_override_should_notify (eLazyBoolCalculate),
437c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    m_override_should_stop (eLazyBoolCalculate)
44643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
45643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}
46643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
47643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonbool
48643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::IsValid () const
49643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    ThreadSP thread_sp (m_thread_wp.lock());
518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    if (thread_sp)
528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        return thread_sp->GetProcess()->GetStopID() == m_stop_id;
538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    return false;
54643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}
55643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
5615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Inghamvoid
5715dcb7ca49b8d8f46910cf085b4c249aac5317faJim InghamStopInfo::MakeStopInfoValid ()
5815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham{
598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    ThreadSP thread_sp (m_thread_wp.lock());
608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    if (thread_sp)
618a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    {
628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        m_stop_id = thread_sp->GetProcess()->GetStopID();
638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        m_resume_id = thread_sp->GetProcess()->GetResumeID();
648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    }
6515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham}
6615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
670296fe73a7cb1482226b1303a795ede00e12d677Jim Inghambool
680296fe73a7cb1482226b1303a795ede00e12d677Jim InghamStopInfo::HasTargetRunSinceMe ()
6921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{
708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    ThreadSP thread_sp (m_thread_wp.lock());
718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    if (thread_sp)
730296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham    {
748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        lldb::StateType ret_type = thread_sp->GetProcess()->GetPrivateState();
758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (ret_type == eStateRunning)
760296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham        {
778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            return true;
780296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham        }
798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        else if (ret_type == eStateStopped)
800296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham        {
818a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            // This is a little tricky.  We want to count "run and stopped again before you could
828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            // ask this question as a "TRUE" answer to HasTargetRunSinceMe.  But we don't want to
838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            // include any running of the target done for expressions.  So we track both resumes,
848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            // and resumes caused by expressions, and check if there are any resumes NOT caused
858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            // by expressions.
868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            uint32_t curr_resume_id = thread_sp->GetProcess()->GetResumeID();
888a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            uint32_t last_user_expression_id = thread_sp->GetProcess()->GetLastUserExpressionResumeID ();
898a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (curr_resume_id == m_resume_id)
908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            {
918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                return false;
928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            }
938a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            else if (curr_resume_id > last_user_expression_id)
948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            {
958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                return true;
968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            }
970296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham        }
980296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham    }
990296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham    return false;
10021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham}
10121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
102643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
103643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoBreakpoint
104643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
105643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
10621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Inghamnamespace lldb_private
10721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{
108643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoBreakpoint : public StopInfo
109643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
110643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic:
111643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
112643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    StopInfoBreakpoint (Thread &thread, break_id_t break_id) :
113643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        StopInfo (thread, break_id),
114643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        m_description(),
115643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        m_should_stop (false),
116f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        m_should_stop_is_valid (false),
1171c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham        m_should_perform_action (true),
1182753a024a5a314232baa579c0ada87551aa86988Jim Ingham        m_address (LLDB_INVALID_ADDRESS),
1192753a024a5a314232baa579c0ada87551aa86988Jim Ingham        m_break_id(LLDB_INVALID_BREAK_ID),
1202753a024a5a314232baa579c0ada87551aa86988Jim Ingham        m_was_one_shot (false)
121643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
1222753a024a5a314232baa579c0ada87551aa86988Jim Ingham        StoreBPInfo();
123643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
124643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
125d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    StopInfoBreakpoint (Thread &thread, break_id_t break_id, bool should_stop) :
126d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham        StopInfo (thread, break_id),
127d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham        m_description(),
128d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham        m_should_stop (should_stop),
129f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        m_should_stop_is_valid (true),
1301c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham        m_should_perform_action (true),
1312753a024a5a314232baa579c0ada87551aa86988Jim Ingham        m_address (LLDB_INVALID_ADDRESS),
1322753a024a5a314232baa579c0ada87551aa86988Jim Ingham        m_break_id(LLDB_INVALID_BREAK_ID),
1332753a024a5a314232baa579c0ada87551aa86988Jim Ingham        m_was_one_shot (false)
1342753a024a5a314232baa579c0ada87551aa86988Jim Ingham    {
1352753a024a5a314232baa579c0ada87551aa86988Jim Ingham        StoreBPInfo();
1362753a024a5a314232baa579c0ada87551aa86988Jim Ingham    }
1372753a024a5a314232baa579c0ada87551aa86988Jim Ingham
1388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    void
1398a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton    StoreBPInfo ()
140d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    {
1418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
1428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
1431c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham        {
1448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value));
1458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (bp_site_sp)
1462753a024a5a314232baa579c0ada87551aa86988Jim Ingham            {
1478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (bp_site_sp->GetNumberOfOwners() == 1)
1482753a024a5a314232baa579c0ada87551aa86988Jim Ingham                {
1498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    BreakpointLocationSP bp_loc_sp = bp_site_sp->GetOwnerAtIndex(0);
1508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (bp_loc_sp)
1518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    {
1528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        m_break_id = bp_loc_sp->GetBreakpoint().GetID();
1538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        m_was_one_shot = bp_loc_sp->GetBreakpoint().IsOneShot();
1548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    }
1552753a024a5a314232baa579c0ada87551aa86988Jim Ingham                }
1568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                m_address = bp_site_sp->GetLoadAddress();
1572753a024a5a314232baa579c0ada87551aa86988Jim Ingham            }
1581c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham        }
159d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    }
160d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham
161643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual ~StopInfoBreakpoint ()
162643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
163643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
164643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
165643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual StopReason
166643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetStopReason () const
167643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
168643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        return eStopReasonBreakpoint;
169643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
170643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
171643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual bool
172e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham    ShouldStopSynchronous (Event *event_ptr)
173643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
1748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
1758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
176643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        {
1778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (!m_should_stop_is_valid)
178643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            {
1798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                // Only check once if we should stop at a breakpoint
1808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value));
1818a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (bp_site_sp)
1828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                {
1838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    ExecutionContext exe_ctx (thread_sp->GetStackFrameAtIndex(0));
1848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    StoppointCallbackContext context (event_ptr, exe_ctx, true);
1858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    m_should_stop = bp_site_sp->ShouldStop (&context);
1868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                }
1878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                else
1888a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                {
1898a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
190643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (log)
1928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        log->Printf ("Process::%s could not find breakpoint site id: %" PRId64 "...", __FUNCTION__, m_value);
193643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    m_should_stop = true;
1958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                }
1968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                m_should_stop_is_valid = true;
197643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            }
1988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            return m_should_stop;
199643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        }
2008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        return false;
201643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
2026fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham
20379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    virtual bool
2047c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    DoShouldNotify (Event *event_ptr)
20579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    {
2068a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
2078a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
20879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        {
2098a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value));
2108a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (bp_site_sp)
21179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            {
2128a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                bool all_internal = true;
2138a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
2148a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                for (uint32_t i = 0; i < bp_site_sp->GetNumberOfOwners(); i++)
21579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham                {
2168a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal())
2178a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    {
2188a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        all_internal = false;
2198a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        break;
2208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    }
22179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham                }
2228a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                return all_internal == false;
22379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            }
22479f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        }
22579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        return true;
22679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    }
22779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham
22879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    virtual const char *
22979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    GetDescription ()
23079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    {
23179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        if (m_description.empty())
23279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        {
2338a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            ThreadSP thread_sp (m_thread_wp.lock());
2348a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (thread_sp)
23579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            {
2368a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value));
2378a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (bp_site_sp)
238090f83176695d86197b0e86b67dee4160ec5003dJim Ingham                {
2398a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    StreamString strm;
2408a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // If we have just hit an internal breakpoint, and it has a kind description, print that instead of the
2418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // full breakpoint printing:
2428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (bp_site_sp->IsInternal())
243090f83176695d86197b0e86b67dee4160ec5003dJim Ingham                    {
2448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        size_t num_owners = bp_site_sp->GetNumberOfOwners();
2458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        for (size_t idx = 0; idx < num_owners; idx++)
246090f83176695d86197b0e86b67dee4160ec5003dJim Ingham                        {
2478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            const char *kind = bp_site_sp->GetOwnerAtIndex(idx)->GetBreakpoint().GetBreakpointKind();
2488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            if (kind != NULL)
2498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            {
2508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                m_description.assign (kind);
2518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                return kind;
2528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            }
253090f83176695d86197b0e86b67dee4160ec5003dJim Ingham                        }
254090f83176695d86197b0e86b67dee4160ec5003dJim Ingham                    }
2558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
2568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    strm.Printf("breakpoint ");
2578a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    bp_site_sp->GetDescription(&strm, eDescriptionLevelBrief);
2588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    m_description.swap (strm.GetString());
259090f83176695d86197b0e86b67dee4160ec5003dJim Ingham                }
2608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                else
26179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham                {
2628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    StreamString strm;
2638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (m_break_id != LLDB_INVALID_BREAK_ID)
2644b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham                    {
2658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        BreakpointSP break_sp = thread_sp->GetProcess()->GetTarget().GetBreakpointByID(m_break_id);
2668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (break_sp)
2674b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham                        {
2688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            if (break_sp->IsInternal())
2698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            {
2708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                const char *kind = break_sp->GetBreakpointKind();
2718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                if (kind)
2728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    strm.Printf ("internal %s breakpoint(%d).", kind, m_break_id);
2738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                else
2748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    strm.Printf ("internal breakpoint(%d).", m_break_id);
2758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            }
2764b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham                            else
2778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            {
2788a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                strm.Printf ("breakpoint %d.", m_break_id);
2798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            }
2808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        }
2814b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham                        else
2824b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham                        {
2838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            if (m_was_one_shot)
2848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                strm.Printf ("one-shot breakpoint %d", m_break_id);
2858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            else
2868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                strm.Printf ("breakpoint %d which has been deleted.", m_break_id);
2874b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham                        }
2884b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham                    }
2898a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    else if (m_address == LLDB_INVALID_ADDRESS)
2908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        strm.Printf("breakpoint site %" PRIi64 " which has been deleted - unknown address", m_value);
2918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    else
2928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        strm.Printf("breakpoint site %" PRIi64 " which has been deleted - was at 0x%" PRIx64, m_value, m_address);
2938a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
2948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    m_description.swap (strm.GetString());
29579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham                }
29679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            }
29779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        }
29879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        return m_description.c_str();
29979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    }
30079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham
30179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Inghamprotected:
302e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham    bool
303e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham    ShouldStop (Event *event_ptr)
304e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham    {
305e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham        // This just reports the work done by PerformAction or the synchronous stop.  It should
306e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham        // only ever get called after they have had a chance to run.
307e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham        assert (m_should_stop_is_valid);
308e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham        return m_should_stop;
309e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham    }
310e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham
3116fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham    virtual void
3126fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham    PerformAction (Event *event_ptr)
3136fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham    {
314f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        if (!m_should_perform_action)
315f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            return;
316f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        m_should_perform_action = false;
317f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
3188a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
3198a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
3208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
3216fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham        {
3228a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
3238a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
3248a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (!thread_sp->IsValid())
3256fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham            {
3268a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                // This shouldn't ever happen, but just in case, don't do more harm.
327a688acc09a9a3e31a02d34a58f21e034bdebcad4Jason Molenda                if (log)
328a688acc09a9a3e31a02d34a58f21e034bdebcad4Jason Molenda                {
329a688acc09a9a3e31a02d34a58f21e034bdebcad4Jason Molenda                    log->Printf ("PerformAction got called with an invalid thread.");
330a688acc09a9a3e31a02d34a58f21e034bdebcad4Jason Molenda                }
331982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham                m_should_stop = true;
3328a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                m_should_stop_is_valid = true;
3338a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                return;
334982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham            }
3358a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
3368a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value));
3378a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
3388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (bp_site_sp)
339982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham            {
3408a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                size_t num_owners = bp_site_sp->GetNumberOfOwners();
3418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
3428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (num_owners == 0)
343b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                {
3448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    m_should_stop = true;
3458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                }
3468a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                else
3478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                {
3488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // We go through each location, and test first its condition.  If the condition says to stop,
3498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // then we run the callback for that location.  If that callback says to stop as well, then
3508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // we set m_should_stop to true; we are going to stop.
3518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // But we still want to give all the breakpoints whose conditions say we are going to stop a
3528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // chance to run their callbacks.
3538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // Of course if any callback restarts the target by putting "continue" in the callback, then
3548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // we're going to restart, without running the rest of the callbacks.  And in this case we will
3558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // end up not stopping even if another location said we should stop.  But that's better than not
3568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // running all the callbacks.
357b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham
3588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    m_should_stop = false;
3598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
3608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    ExecutionContext exe_ctx (thread_sp->GetStackFrameAtIndex(0));
3618a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    Process *process  = exe_ctx.GetProcessPtr();
3628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (process->GetModIDRef().IsLastResumeForUserExpression())
363b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                    {
3648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // If we are in the middle of evaluating an expression, don't run asynchronous breakpoint commands or
3658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // expressions.  That could lead to infinite recursion if the command or condition re-calls the function
3668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // with this breakpoint.
3678a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // TODO: We can keep a list of the breakpoints we've seen while running expressions in the nested
3688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // PerformAction calls that can arise when the action runs a function that hits another breakpoint,
3698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // and only stop running commands when we see the same breakpoint hit a second time.
3708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
3718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        m_should_stop_is_valid = true;
3728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (log)
3738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            log->Printf ("StopInfoBreakpoint::PerformAction - Hit a breakpoint while running an expression,"
3748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                         " not running commands to avoid recursion.");
3758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        bool ignoring_breakpoints = process->GetIgnoreBreakpointsInExpressions();
3768a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (ignoring_breakpoints)
377b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                        {
3788a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            m_should_stop = false;
3798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            // Internal breakpoints will always stop.
3808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            for (size_t j = 0; j < num_owners; j++)
381b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                            {
3828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                lldb::BreakpointLocationSP bp_loc_sp = bp_site_sp->GetOwnerAtIndex(j);
3838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                if (bp_loc_sp->GetBreakpoint().IsInternal())
3848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                {
3858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    m_should_stop = true;
3868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    break;
3878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                }
388b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                            }
389b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                        }
3908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        else
3918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        {
3928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            m_should_stop = true;
3938a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        }
3948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (log)
3958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            log->Printf ("StopInfoBreakpoint::PerformAction - in expression, continuing: %s.",
3968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                         m_should_stop ? "true" : "false");
3978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        process->GetTarget().GetDebugger().GetAsyncOutputStream()->Printf("Warning: hit breakpoint while "
3988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                               "running function, skipping commands and conditions to prevent recursion.");
3998a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        return;
400b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                    }
4010bc756d6e062105aef9f1d761d1033a9daed8478Jim Ingham
4028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    StoppointCallbackContext context (event_ptr, exe_ctx, false);
4030bc756d6e062105aef9f1d761d1033a9daed8478Jim Ingham
4048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // Let's copy the breakpoint locations out of the site and store them in a local list.  That way if
4058a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // one of the breakpoint actions changes the site, then we won't be operating on a bad list.
406982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham
4078a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    BreakpointLocationCollection site_locations;
4088a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    for (size_t j = 0; j < num_owners; j++)
4098a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        site_locations.Add(bp_site_sp->GetOwnerAtIndex(j));
4108a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4118a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    for (size_t j = 0; j < num_owners; j++)
41221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                    {
4138a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        lldb::BreakpointLocationSP bp_loc_sp = site_locations.GetByIndex(j);
4148a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4158a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // If another action disabled this breakpoint or its location, then don't run the actions.
4168a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (!bp_loc_sp->IsEnabled() || !bp_loc_sp->GetBreakpoint().IsEnabled())
4178a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            continue;
41821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
4198a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // The breakpoint site may have many locations associated with it, not all of them valid for
4208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // this thread.  Skip the ones that aren't:
4218a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (!bp_loc_sp->ValidForThisThread(thread_sp.get()))
4228a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            continue;
4238a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4248a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // First run the condition for the breakpoint.  If that says we should stop, then we'll run
4258a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // the callback for the breakpoint.  If the callback says we shouldn't stop that will win.
4268a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4278a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (bp_loc_sp->GetConditionText() != NULL)
42821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                        {
4298a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            Error condition_error;
4308a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            bool condition_says_stop = bp_loc_sp->ConditionSaysStop(exe_ctx, condition_error);
43121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
4328a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            if (!condition_error.Success())
4338a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            {
4348a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger();
4358a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                StreamSP error_sp = debugger.GetAsyncErrorStream ();
4368a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                error_sp->Printf ("Stopped due to an error evaluating condition of breakpoint ");
4378a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                bp_loc_sp->GetDescription (error_sp.get(), eDescriptionLevelBrief);
4388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                error_sp->Printf (": \"%s\"",
4398a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                  bp_loc_sp->GetConditionText());
4408a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                error_sp->EOL();
4418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                const char *err_str = condition_error.AsCString("<Unknown Error>");
4428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                if (log)
4438a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    log->Printf("Error evaluating condition: \"%s\"\n", err_str);
4448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                error_sp->PutCString (err_str);
4468a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                error_sp->EOL();
4478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                error_sp->Flush();
4488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                // If the condition fails to be parsed or run, we should stop.
4498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                condition_says_stop = true;
4508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            }
4518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            else
4528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            {
4538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                if (!condition_says_stop)
4548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    continue;
4558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            }
45621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                        }
4578a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        bool callback_says_stop;
4598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // FIXME: For now the callbacks have to run in async mode - the first time we restart we need
4618a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // to get out of there.  So set it here.
4628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // When we figure out how to nest breakpoint hits then this will change.
4638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        Debugger &debugger = thread_sp->CalculateTarget()->GetDebugger();
4658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        bool old_async = debugger.GetAsyncExecution();
4668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        debugger.SetAsyncExecution (true);
4678a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        callback_says_stop = bp_loc_sp->InvokeCallback (&context);
4698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        debugger.SetAsyncExecution (old_async);
4718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (callback_says_stop)
4738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            m_should_stop = true;
4748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // If we are going to stop for this breakpoint, then remove the breakpoint.
4768a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (callback_says_stop && bp_loc_sp && bp_loc_sp->GetBreakpoint().IsOneShot())
47728195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan                        {
4788a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            thread_sp->GetProcess()->GetTarget().RemoveBreakpointByID (bp_loc_sp->GetBreakpoint().GetID());
4798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        }
4808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
4818a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // Also make sure that the callback hasn't continued the target.
4828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // If it did, when we'll set m_should_start to false and get out of here.
4838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (HasTargetRunSinceMe ())
4848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        {
4858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            m_should_stop = false;
4868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            break;
48728195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan                        }
488982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham                    }
48921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                }
4908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                // We've figured out what this stop wants to do, so mark it as valid so we don't compute it again.
4918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                m_should_stop_is_valid = true;
492982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham
4938a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            }
4948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            else
4958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            {
4968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                m_should_stop = true;
4978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                m_should_stop_is_valid = true;
4988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                Log * log_process(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
4996fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham
5008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (log_process)
5018a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    log_process->Printf ("Process::%s could not find breakpoint site id: %" PRId64 "...", __FUNCTION__, m_value);
5028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            }
5038a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (log)
5048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                log->Printf ("Process::%s returning from action with m_should_stop: %d.", __FUNCTION__, m_should_stop);
5056fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham        }
5066fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham    }
507643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
508643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonprivate:
509643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    std::string m_description;
510643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    bool m_should_stop;
511643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    bool m_should_stop_is_valid;
512f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    bool m_should_perform_action; // Since we are trying to preserve the "state" of the system even if we run functions
513f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                  // etc. behind the users backs, we need to make sure we only REALLY perform the action once.
5141c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham    lldb::addr_t m_address;       // We use this to capture the breakpoint site address when we create the StopInfo,
5151c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham                                  // in case somebody deletes it between the time the StopInfo is made and the
5161c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham                                  // description is asked for.
5172753a024a5a314232baa579c0ada87551aa86988Jim Ingham    lldb::break_id_t m_break_id;
5182753a024a5a314232baa579c0ada87551aa86988Jim Ingham    bool m_was_one_shot;
519643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton};
520643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
521643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
522643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
523643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoWatchpoint
524643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
525643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
526643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoWatchpoint : public StopInfo
527643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
528643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic:
52979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    // Make sure watchpoint is properly disabled and subsequently enabled while performing watchpoint actions.
53079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    class WatchpointSentry {
53179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    public:
53279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        WatchpointSentry(Process *p, Watchpoint *w):
53379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            process(p),
53479f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            watchpoint(w)
53579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        {
53679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            if (process && watchpoint)
53779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            {
5389c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham                const bool notify = false;
53979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham                watchpoint->TurnOnEphemeralMode();
5409c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham                process->DisableWatchpoint(watchpoint, notify);
54179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            }
54279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        }
54379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        ~WatchpointSentry()
54479f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        {
54579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            if (process && watchpoint)
54679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            {
54779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham                if (!watchpoint->IsDisabledDuringEphemeralMode())
5489c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham                {
5499c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham                    const bool notify = false;
5509c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham                    process->EnableWatchpoint(watchpoint, notify);
5519c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham                }
55279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham                watchpoint->TurnOffEphemeralMode();
55379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            }
55479f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        }
55579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    private:
55679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        Process *process;
55779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        Watchpoint *watchpoint;
55879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    };
559643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
560643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    StopInfoWatchpoint (Thread &thread, break_id_t watch_id) :
561043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        StopInfo(thread, watch_id),
562043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        m_description(),
563043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        m_should_stop(false),
564043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        m_should_stop_is_valid(false)
565643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
566643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
567643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
568643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual ~StopInfoWatchpoint ()
569643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
570643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
571643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
572643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual StopReason
573643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetStopReason () const
574643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
575643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        return eStopReasonWatchpoint;
576643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
577643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
57879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    virtual const char *
57979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    GetDescription ()
58079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    {
58179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        if (m_description.empty())
58279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        {
58379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            StreamString strm;
5845f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            strm.Printf("watchpoint %" PRIi64, m_value);
58579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham            m_description.swap (strm.GetString());
58679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        }
58779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham        return m_description.c_str();
58879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham    }
58979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham
59079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Inghamprotected:
591043f8c230739ceab194257a617731ecd28e1a912Johnny Chen    virtual bool
5928b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham    ShouldStopSynchronous (Event *event_ptr)
593043f8c230739ceab194257a617731ecd28e1a912Johnny Chen    {
594043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        // ShouldStop() method is idempotent and should not affect hit count.
595712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        // See Process::RunPrivateStateThread()->Process()->HandlePrivateEvent()
596712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        // -->Process()::ShouldBroadcastEvent()->ThreadList::ShouldStop()->
597712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        // Thread::ShouldStop()->ThreadPlanBase::ShouldStop()->
598712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        // StopInfoWatchpoint::ShouldStop() and
599712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        // Event::DoOnRemoval()->Process::ProcessEventData::DoOnRemoval()->
600712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        // StopInfoWatchpoint::PerformAction().
601043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        if (m_should_stop_is_valid)
602043f8c230739ceab194257a617731ecd28e1a912Johnny Chen            return m_should_stop;
603043f8c230739ceab194257a617731ecd28e1a912Johnny Chen
6048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
6058a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
606043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        {
6078a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            WatchpointSP wp_sp (thread_sp->CalculateTarget()->GetWatchpointList().FindByID(GetValue()));
6088a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (wp_sp)
6098a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            {
6108a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                // Check if we should stop at a watchpoint.
6118a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                ExecutionContext exe_ctx (thread_sp->GetStackFrameAtIndex(0));
6128a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                StoppointCallbackContext context (event_ptr, exe_ctx, true);
6138a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                m_should_stop = wp_sp->ShouldStop (&context);
6148a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            }
6158a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            else
6168a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            {
6178a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
618043f8c230739ceab194257a617731ecd28e1a912Johnny Chen
6198a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (log)
6208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    log->Printf ("Process::%s could not find watchpoint location id: %" PRId64 "...",
6218a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                 __FUNCTION__, GetValue());
622043f8c230739ceab194257a617731ecd28e1a912Johnny Chen
6238a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                m_should_stop = true;
6248a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            }
625043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        }
626043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        m_should_stop_is_valid = true;
627043f8c230739ceab194257a617731ecd28e1a912Johnny Chen        return m_should_stop;
628043f8c230739ceab194257a617731ecd28e1a912Johnny Chen    }
629043f8c230739ceab194257a617731ecd28e1a912Johnny Chen
6308b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham    bool
6318b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham    ShouldStop (Event *event_ptr)
6328b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham    {
6338b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham        // This just reports the work done by PerformAction or the synchronous stop.  It should
6348b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham        // only ever get called after they have had a chance to run.
6358b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham        assert (m_should_stop_is_valid);
6368b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham        return m_should_stop;
6378b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham    }
6388b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham
639712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    virtual void
640712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    PerformAction (Event *event_ptr)
641712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    {
642952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS);
643712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        // We're going to calculate if we should stop or not in some way during the course of
644712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        // this code.  Also by default we're going to stop, so set that here.
645712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        m_should_stop = true;
646712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen
6478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
6488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
649712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        {
650bd446f1c519f466a2e24790fd1c362fc06897673Johnny Chen
6518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            WatchpointSP wp_sp (thread_sp->CalculateTarget()->GetWatchpointList().FindByID(GetValue()));
6528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (wp_sp)
6537de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata            {
6548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                ExecutionContext exe_ctx (thread_sp->GetStackFrameAtIndex(0));
6558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                Process* process = exe_ctx.GetProcessPtr();
6568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
6578a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                // This sentry object makes sure the current watchpoint is disabled while performing watchpoint actions,
6588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                // and it is then enabled after we are finished.
6598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                WatchpointSentry sentry(process, wp_sp.get());
6608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
6617de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata                {
6628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // check if this process is running on an architecture where watchpoints trigger
6638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // before the associated instruction runs. if so, disable the WP, single-step and then
6648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // re-enable the watchpoint
6658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (process)
6667de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata                    {
66708f60c88b61c42c35abf3233f0cbe19d29fbe814Jason Molenda                        uint32_t num;
66808f60c88b61c42c35abf3233f0cbe19d29fbe814Jason Molenda                        bool wp_triggers_after;
6698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (process->GetWatchpointSupportInfo(num, wp_triggers_after).Success())
6707de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata                        {
6718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            if (!wp_triggers_after)
6728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            {
673a0e48cc2e971aeb4287dba435cefeb0acdbf006aJim Ingham                                StopInfoSP stored_stop_info_sp = thread_sp->GetStopInfo();
674a0e48cc2e971aeb4287dba435cefeb0acdbf006aJim Ingham                                assert (stored_stop_info_sp.get() == this);
675a0e48cc2e971aeb4287dba435cefeb0acdbf006aJim Ingham
676008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                                ThreadPlanSP new_plan_sp(thread_sp->QueueThreadPlanForStepSingleInstruction(false, // step-over
677008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                                                                                                        false,     // abort_other_plans
678008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                                                                                                        true));    // stop_other_threads
679008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                                new_plan_sp->SetIsMasterPlan (true);
680008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                                new_plan_sp->SetOkayToDiscard (false);
681008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                                new_plan_sp->SetPrivate (true);
6828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                process->GetThreadList().SetSelectedThreadByID (thread_sp->GetID());
6838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                process->Resume ();
6848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                process->WaitForProcessToStop (NULL);
6858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                process->GetThreadList().SetSelectedThreadByID (thread_sp->GetID());
686a0e48cc2e971aeb4287dba435cefeb0acdbf006aJim Ingham                                thread_sp->SetStopInfo(stored_stop_info_sp);
6878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            }
6887de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata                        }
6897de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata                    }
6907de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata                }
6919e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen
6928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (m_should_stop && wp_sp->GetConditionText() != NULL)
693712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                {
6948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // We need to make sure the user sees any parse errors in their condition, so we'll hook the
6958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // constructor errors up to the debugger's Async I/O.
6968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    ExecutionResults result_code;
6978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    ValueObjectSP result_value_sp;
6988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    const bool unwind_on_error = true;
6998a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    const bool ignore_breakpoints = true;
7008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    Error error;
7018a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    result_code = ClangUserExpression::EvaluateWithError (exe_ctx,
7028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          eExecutionPolicyOnlyWhenNeeded,
7038a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          lldb::eLanguageTypeUnknown,
7048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          ClangUserExpression::eResultTypeAny,
7058a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          unwind_on_error,
7068a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          ignore_breakpoints,
7078a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          wp_sp->GetConditionText(),
7088a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          NULL,
7098a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          result_value_sp,
7108a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          error,
7118a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          true,
7128a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                                          ClangUserExpression::kDefaultTimeout);
7138a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (result_code == eExecutionCompleted)
714712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                    {
7158a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (result_value_sp)
716712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                        {
7178a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            Scalar scalar_value;
7188a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            if (result_value_sp->ResolveValue (scalar_value))
719712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                            {
7208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                if (scalar_value.ULongLong(1) == 0)
7218a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                {
7228a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    // We have been vetoed.  This takes precedence over querying
7238a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    // the watchpoint whether it should stop (aka ignore count and
7248a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    // friends).  See also StopInfoWatchpoint::ShouldStop() as well
7258a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    // as Process::ProcessEventData::DoOnRemoval().
7268a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    m_should_stop = false;
7278a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                }
7288a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                else
7298a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    m_should_stop = true;
7308a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                if (log)
7318a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    log->Printf("Condition successfully evaluated, result is %s.\n",
7328a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                                m_should_stop ? "true" : "false");
733712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                            }
734712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                            else
7358a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            {
736712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                                m_should_stop = true;
7378a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                if (log)
7388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                    log->Printf("Failed to get an integer result from the expression.");
7398a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            }
740712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                        }
741712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                    }
7428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    else
7438a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    {
7448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger();
7458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        StreamSP error_sp = debugger.GetAsyncErrorStream ();
7468a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        error_sp->Printf ("Stopped due to an error evaluating condition of watchpoint ");
7478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        wp_sp->GetDescription (error_sp.get(), eDescriptionLevelBrief);
7488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        error_sp->Printf (": \"%s\"",
7498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                                          wp_sp->GetConditionText());
7508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        error_sp->EOL();
7518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        const char *err_str = error.AsCString("<Unknown Error>");
7528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        if (log)
7538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                            log->Printf("Error evaluating condition: \"%s\"\n", err_str);
7548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
7558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        error_sp->PutCString (err_str);
7568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        error_sp->EOL();
7578a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        error_sp->Flush();
7588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // If the condition fails to be parsed or run, we should stop.
7598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        m_should_stop = true;
7608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    }
761712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                }
762712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen
7638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                // If the condition says to stop, we run the callback to further decide whether to stop.
7648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (m_should_stop)
7658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                {
7668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    StoppointCallbackContext context (event_ptr, exe_ctx, false);
7678a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    bool stop_requested = wp_sp->InvokeCallback (&context);
7688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // Also make sure that the callback hasn't continued the target.
7698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    // If it did, when we'll set m_should_stop to false and get out of here.
7708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (HasTargetRunSinceMe ())
7718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        m_should_stop = false;
7728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
7738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    if (m_should_stop && !stop_requested)
7748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    {
7758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        // We have been vetoed by the callback mechanism.
7768a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                        m_should_stop = false;
7778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    }
778712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen                }
7798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                // Finally, if we are going to stop, print out the new & old values:
7808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (m_should_stop)
78197600c1e01f4a6412ad3e3e61587a1e7229ce82dJohnny Chen                {
7828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    wp_sp->CaptureWatchedValue(exe_ctx);
7838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
7848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger();
7858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    StreamSP output_sp = debugger.GetAsyncOutputStream ();
7868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    wp_sp->DumpSnapshots(output_sp.get());
7878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    output_sp->EOL();
7888a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    output_sp->Flush();
78997600c1e01f4a6412ad3e3e61587a1e7229ce82dJohnny Chen                }
7908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
79197600c1e01f4a6412ad3e3e61587a1e7229ce82dJohnny Chen            }
7928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            else
7939e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham            {
7948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                Log * log_process(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
7958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton
7968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (log_process)
7978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    log_process->Printf ("Process::%s could not find watchpoint id: %" PRId64 "...", __FUNCTION__, m_value);
7989e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham            }
7998a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (log)
8008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                log->Printf ("Process::%s returning from action with m_should_stop: %d.", __FUNCTION__, m_should_stop);
8019e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham
8028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            m_should_stop_is_valid = true;
803712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        }
804712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    }
805712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen
806643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonprivate:
807643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    std::string m_description;
808043f8c230739ceab194257a617731ecd28e1a912Johnny Chen    bool m_should_stop;
809043f8c230739ceab194257a617731ecd28e1a912Johnny Chen    bool m_should_stop_is_valid;
810643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton};
811643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
812643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
813643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
814643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
815643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoUnixSignal
816643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
817643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
818643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoUnixSignal : public StopInfo
819643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
820643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic:
821643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
822643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    StopInfoUnixSignal (Thread &thread, int signo) :
8236561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton        StopInfo (thread, signo)
824643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
825643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
826643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
827643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual ~StopInfoUnixSignal ()
828643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
829643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
830643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
831643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
832643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual StopReason
833643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetStopReason () const
834643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
835643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        return eStopReasonSignal;
836643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
837643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
838643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual bool
83989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    ShouldStopSynchronous (Event *event_ptr)
84089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    {
8418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
8428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
8438a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            return thread_sp->GetProcess()->GetUnixSignals().GetShouldStop (m_value);
8448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        return false;
84589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    }
84689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham
84789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    virtual bool
848643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    ShouldStop (Event *event_ptr)
849643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
8508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
8518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
8528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            return thread_sp->GetProcess()->GetUnixSignals().GetShouldStop (m_value);
8538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        return false;
854643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
855643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
856643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
857643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    // If should stop returns false, check if we should notify of this event
858643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual bool
8597c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    DoShouldNotify (Event *event_ptr)
860643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
8618a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
8628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
86389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham        {
8648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            bool should_notify = thread_sp->GetProcess()->GetUnixSignals().GetShouldNotify (m_value);
8658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (should_notify)
8668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            {
8678a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                StreamString strm;
8688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                strm.Printf ("thread %d received signal: %s",
8698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                             thread_sp->GetIndexID(),
8708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                             thread_sp->GetProcess()->GetUnixSignals().GetSignalAsCString (m_value));
8718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                Process::ProcessEventData::AddRestartedReason(event_ptr, strm.GetData());
8728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            }
8738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            return should_notify;
87489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham        }
8758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        return true;
876643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
877643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
878643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
879643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual void
880643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    WillResume (lldb::StateType resume_state)
881643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
8828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
8838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
8848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        {
8858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (thread_sp->GetProcess()->GetUnixSignals().GetShouldSuppress(m_value) == false)
8868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                thread_sp->SetResumeSignal(m_value);
8878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        }
888643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
889643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
890643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual const char *
891643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetDescription ()
892643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
893643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        if (m_description.empty())
894643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        {
8958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            ThreadSP thread_sp (m_thread_wp.lock());
8968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            if (thread_sp)
8978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            {
8988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                StreamString strm;
8998a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                const char *signal_name = thread_sp->GetProcess()->GetUnixSignals().GetSignalAsCString (m_value);
9008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                if (signal_name)
9018a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    strm.Printf("signal %s", signal_name);
9028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                else
9038a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                    strm.Printf("signal %" PRIi64, m_value);
9048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton                m_description.swap (strm.GetString());
9058a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            }
906643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        }
907643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        return m_description.c_str();
908643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
909643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton};
910643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
911643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
912643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoTrace
913643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
914643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
915643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoTrace : public StopInfo
916643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
917643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic:
918643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
919643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    StopInfoTrace (Thread &thread) :
920643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        StopInfo (thread, LLDB_INVALID_UID)
921643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
922643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
923643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
924643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual ~StopInfoTrace ()
925643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
926643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
927643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
928643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual StopReason
929643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetStopReason () const
930643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
931643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        return eStopReasonTrace;
932643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
933643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
934643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual const char *
935643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetDescription ()
936643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
9376561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton        if (m_description.empty())
938643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        return "trace";
9396561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton        else
9406561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton            return m_description.c_str();
9416561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    }
9426561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton};
9436561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton
9446561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton
9456561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton//----------------------------------------------------------------------
9466561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton// StopInfoException
9476561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton//----------------------------------------------------------------------
9486561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton
9496561155acc9dee660de73e4aa8215839a06f01a7Greg Claytonclass StopInfoException : public StopInfo
9506561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton{
9516561155acc9dee660de73e4aa8215839a06f01a7Greg Claytonpublic:
9526561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton
9536561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    StopInfoException (Thread &thread, const char *description) :
9546561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton        StopInfo (thread, LLDB_INVALID_UID)
9556561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    {
9566561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton        if (description)
9576561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton            SetDescription (description);
9586561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    }
9596561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton
9606561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    virtual
9616561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    ~StopInfoException ()
9626561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    {
9636561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    }
9646561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton
9656561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    virtual StopReason
9666561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    GetStopReason () const
9676561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    {
9686561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton        return eStopReasonException;
9696561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    }
9706561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton
9716561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    virtual const char *
9726561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    GetDescription ()
9736561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    {
9746561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton        if (m_description.empty())
9756561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton            return "exception";
9766561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton        else
9776561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton            return m_description.c_str();
978643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
979643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton};
980643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
981643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
982643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
983643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoThreadPlan
984643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//----------------------------------------------------------------------
985643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
986643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoThreadPlan : public StopInfo
987643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
988643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic:
989643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
9901586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    StopInfoThreadPlan (ThreadPlanSP &plan_sp, ValueObjectSP &return_valobj_sp) :
991643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        StopInfo (plan_sp->GetThread(), LLDB_INVALID_UID),
9921586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        m_plan_sp (plan_sp),
9931586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        m_return_valobj_sp (return_valobj_sp)
994643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
995643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
996643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
997643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual ~StopInfoThreadPlan ()
998643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
999643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
1000643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1001643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual StopReason
1002643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetStopReason () const
1003643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
1004643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        return eStopReasonPlanComplete;
1005643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
1006643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1007643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual const char *
1008643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetDescription ()
1009643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    {
1010643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        if (m_description.empty())
1011643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        {
1012643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            StreamString strm;
1013643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            m_plan_sp->GetDescription (&strm, eDescriptionLevelBrief);
1014643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            m_description.swap (strm.GetString());
1015643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        }
1016643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        return m_description.c_str();
1017643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    }
10181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
10191586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    ValueObjectSP
10201586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    GetReturnValueObject()
10211586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    {
10221586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        return m_return_valobj_sp;
10231586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    }
102489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham
102589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Inghamprotected:
102689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    virtual bool
102789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    ShouldStop (Event *event_ptr)
102889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    {
102989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham        if (m_plan_sp)
103089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham            return m_plan_sp->ShouldStop(event_ptr);
103189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham        else
103289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham            return StopInfo::ShouldStop(event_ptr);
103389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    }
1034643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1035643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonprivate:
1036643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    ThreadPlanSP m_plan_sp;
10371586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    ValueObjectSP m_return_valobj_sp;
1038643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton};
10390bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
10400bce9a22354df3f00e68ffd912119a0741753b7fGreg Claytonclass StopInfoExec : public StopInfo
10410bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton{
10420bce9a22354df3f00e68ffd912119a0741753b7fGreg Claytonpublic:
10430bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
10440bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    StopInfoExec (Thread &thread) :
10450bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        StopInfo (thread, LLDB_INVALID_UID),
10460bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        m_performed_action (false)
10470bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    {
10480bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    }
10490bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
10500bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    virtual
10510bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    ~StopInfoExec ()
10520bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    {
10530bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    }
10540bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
10550bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    virtual StopReason
10560bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    GetStopReason () const
10570bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    {
10580bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        return eStopReasonExec;
10590bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    }
10600bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
10610bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    virtual const char *
10620bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    GetDescription ()
10630bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    {
10640bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        return "exec";
10650bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    }
10660bce9a22354df3f00e68ffd912119a0741753b7fGreg Claytonprotected:
10670bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
10680bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    virtual void
10690bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    PerformAction (Event *event_ptr)
10700bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    {
10710bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        // Only perform the action once
10720bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        if (m_performed_action)
10730bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            return;
10740bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        m_performed_action = true;
10758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        ThreadSP thread_sp (m_thread_wp.lock());
10768a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton        if (thread_sp)
10778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton            thread_sp->GetProcess()->DidExec();
10780bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    }
10790bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
10800bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    bool m_performed_action;
10810bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton};
10820bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
108321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham} // namespace lldb_private
1084643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1085643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP
1086643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::CreateStopReasonWithBreakpointSiteID (Thread &thread, break_id_t break_id)
1087643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
1088643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    return StopInfoSP (new StopInfoBreakpoint (thread, break_id));
1089643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}
1090643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1091643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP
1092d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim InghamStopInfo::CreateStopReasonWithBreakpointSiteID (Thread &thread, break_id_t break_id, bool should_stop)
1093d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham{
1094d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    return StopInfoSP (new StopInfoBreakpoint (thread, break_id, should_stop));
1095d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham}
1096d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham
1097d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim InghamStopInfoSP
1098643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::CreateStopReasonWithWatchpointID (Thread &thread, break_id_t watch_id)
1099643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
1100643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    return StopInfoSP (new StopInfoWatchpoint (thread, watch_id));
1101643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}
1102643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1103643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP
1104643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::CreateStopReasonWithSignal (Thread &thread, int signo)
1105643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
1106643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    return StopInfoSP (new StopInfoUnixSignal (thread, signo));
1107643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}
1108643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1109643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP
1110643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::CreateStopReasonToTrace (Thread &thread)
1111643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
1112643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    return StopInfoSP (new StopInfoTrace (thread));
1113643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}
1114643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
1115643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP
11161586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamStopInfo::CreateStopReasonWithPlan (ThreadPlanSP &plan_sp, ValueObjectSP return_valobj_sp)
1117643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{
11181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    return StopInfoSP (new StopInfoThreadPlan (plan_sp, return_valobj_sp));
1119643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}
11206561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton
11216561155acc9dee660de73e4aa8215839a06f01a7Greg ClaytonStopInfoSP
11226561155acc9dee660de73e4aa8215839a06f01a7Greg ClaytonStopInfo::CreateStopReasonWithException (Thread &thread, const char *description)
11236561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton{
11246561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton    return StopInfoSP (new StopInfoException (thread, description));
11256561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton}
11261586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
11270bce9a22354df3f00e68ffd912119a0741753b7fGreg ClaytonStopInfoSP
11280bce9a22354df3f00e68ffd912119a0741753b7fGreg ClaytonStopInfo::CreateStopReasonWithExec (Thread &thread)
11290bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton{
11300bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    return StopInfoSP (new StopInfoExec (thread));
11310bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton}
11320bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
11331586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamValueObjectSP
11341586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamStopInfo::GetReturnValueObject(StopInfoSP &stop_info_sp)
11351586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham{
11361586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    if (stop_info_sp && stop_info_sp->GetStopReason() == eStopReasonPlanComplete)
11371586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    {
11381586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        StopInfoThreadPlan *plan_stop_info = static_cast<StopInfoThreadPlan *>(stop_info_sp.get());
11391586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        return plan_stop_info->GetReturnValueObject();
11401586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    }
11411586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    else
11421586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        return ValueObjectSP();
11431586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham}
1144