1ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen//===-- Watchpoint.cpp ------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen#include "lldb/Breakpoint/Watchpoint.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
16712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen#include "lldb/Breakpoint/StoppointCallbackContext.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
189e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham#include "lldb/Core/Value.h"
199e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham#include "lldb/Core/ValueObject.h"
209e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham#include "lldb/Core/ValueObjectMemory.h"
219e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham#include "lldb/Symbol/ClangASTContext.h"
22712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen#include "lldb/Target/Process.h"
23712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen#include "lldb/Target/Target.h"
24712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen#include "lldb/Target/ThreadSpec.h"
2514f17cfda294800268b0bc68f064eb1ea1c80d10Jim Ingham#include "lldb/Expression/ClangUserExpression.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonWatchpoint::Watchpoint (Target& target, lldb::addr_t addr, uint32_t size, const ClangASTType *type, bool hardware) :
31116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen    StoppointLocation (0, addr, size, hardware),
329e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    m_target(target),
33116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen    m_enabled(false),
3401acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen    m_is_hardware(hardware),
359e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen    m_is_watch_variable(false),
36f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen    m_is_ephemeral(false),
37258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen    m_disabled_count(0),
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_watch_read(0),
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_watch_write(0),
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_watch_was_read(0),
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_watch_was_written(0),
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ignore_count(0),
430b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen    m_false_alarms(0),
4441a55efdfd779b910fb3515c47357c97e695ec22Johnny Chen    m_decl_str(),
45116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen    m_watch_spec_str(),
469e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    m_type(),
47f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen    m_error(),
489c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    m_options (),
499c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    m_being_created(true)
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
519e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    if (type && type->IsValid())
529e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        m_type = *type;
539e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    else
549e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    {
559e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        // If we don't have a known type, then we force it to unsigned int of the right size.
569e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        ClangASTContext *ast_context = target.GetScratchClangASTContext();
5752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_type = ast_context->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 8 * size);
589e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    }
599e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham
609e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    // Set the initial value of the watched variable:
619e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    if (m_target.GetProcessSP())
629e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    {
639e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        ExecutionContext exe_ctx;
649e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        m_target.GetProcessSP()->CalculateExecutionContext(exe_ctx);
659e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        CaptureWatchedValue (exe_ctx);
669e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    }
679c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    m_being_created = false;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::~Watchpoint()
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen// This function is used when "baton" doesn't need to be freed
75f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chenvoid
76f3ec4617297810223deb545cb68214ca4dd8009cJohnny ChenWatchpoint::SetCallback (WatchpointHitCallback callback, void *baton, bool is_synchronous)
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
78f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen    // The default "Baton" class will keep a copy of "baton" and won't free
79f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen    // or delete it when it goes goes out of scope.
80f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen    m_options.SetCallback(callback, BatonSP (new Baton(baton)), is_synchronous);
81f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen
829c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    SendWatchpointChangedEvent (eWatchpointEventTypeCommandChanged);
83f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen}
84f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen
85f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen// This function is used when a baton needs to be freed and therefore is
86f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen// contained in a "Baton" subclass.
87f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chenvoid
88f3ec4617297810223deb545cb68214ca4dd8009cJohnny ChenWatchpoint::SetCallback (WatchpointHitCallback callback, const BatonSP &callback_baton_sp, bool is_synchronous)
89f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen{
90f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen    m_options.SetCallback(callback, callback_baton_sp, is_synchronous);
919c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    SendWatchpointChangedEvent (eWatchpointEventTypeCommandChanged);
92f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen}
93f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen
94f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chenvoid
95f3ec4617297810223deb545cb68214ca4dd8009cJohnny ChenWatchpoint::ClearCallback ()
96f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen{
97f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen    m_options.ClearCallback ();
989c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    SendWatchpointChangedEvent (eWatchpointEventTypeCommandChanged);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10110b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chenvoid
1029e98559420d8c7c248b0c75b48db65ffd878402bJohnny ChenWatchpoint::SetDeclInfo (const std::string &str)
10310b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen{
10410b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen    m_decl_str = str;
10510b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen    return;
10610b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen}
10710b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen
1089e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chenstd::string
1099e98559420d8c7c248b0c75b48db65ffd878402bJohnny ChenWatchpoint::GetWatchSpec()
1109e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen{
1119e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen    return m_watch_spec_str;
1129e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen}
1139e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen
114116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chenvoid
1159e98559420d8c7c248b0c75b48db65ffd878402bJohnny ChenWatchpoint::SetWatchSpec (const std::string &str)
116116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen{
117116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen    m_watch_spec_str = str;
118116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen    return;
119116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen}
120116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen
12151b7c5ff358a6eecfc4c827a96ab301a1798c4e2Johnny Chen// Override default impl of StoppointLocation::IsHardware() since m_is_hardware
12251b7c5ff358a6eecfc4c827a96ab301a1798c4e2Johnny Chen// member field is more accurate.
12301acfa76010b8db2e77016c144963c4dd70f1392Johnny Chenbool
124ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::IsHardware () const
12501acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen{
12601acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen    return m_is_hardware;
12701acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen}
12801acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen
1299e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chenbool
1309e98559420d8c7c248b0c75b48db65ffd878402bJohnny ChenWatchpoint::IsWatchVariable() const
1319e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen{
1329e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen    return m_is_watch_variable;
1339e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen}
1349e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen
1359e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chenvoid
1369e98559420d8c7c248b0c75b48db65ffd878402bJohnny ChenWatchpoint::SetWatchVariable(bool val)
1379e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen{
1389e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen    m_is_watch_variable = val;
1399e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen}
1409e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen
1419e376625d6354d77cd6240007f0d42034dd3f1eeJim Inghambool
1429e376625d6354d77cd6240007f0d42034dd3f1eeJim InghamWatchpoint::CaptureWatchedValue (const ExecutionContext &exe_ctx)
1439e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham{
1449e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    ConstString watch_name("$__lldb__watch_value");
1459e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    m_old_value_sp = m_new_value_sp;
1469e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    Address watch_address(GetLoadAddress());
147ed2b62acb11143ab6955ffccb939a9f91c18f5f8Jim Ingham    if (!m_type.IsValid())
148ed2b62acb11143ab6955ffccb939a9f91c18f5f8Jim Ingham    {
149ed2b62acb11143ab6955ffccb939a9f91c18f5f8Jim Ingham        // Don't know how to report new & old values, since we couldn't make a scalar type for this watchpoint.
150ed2b62acb11143ab6955ffccb939a9f91c18f5f8Jim Ingham        // This works around an assert in ValueObjectMemory::Create.
151ed2b62acb11143ab6955ffccb939a9f91c18f5f8Jim Ingham        // FIXME: This should not happen, but if it does in some case we care about,
152ed2b62acb11143ab6955ffccb939a9f91c18f5f8Jim Ingham        // we can go grab the value raw and print it as unsigned.
153ed2b62acb11143ab6955ffccb939a9f91c18f5f8Jim Ingham        return false;
154ed2b62acb11143ab6955ffccb939a9f91c18f5f8Jim Ingham    }
1559e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    m_new_value_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(), watch_name.AsCString(), watch_address, m_type);
1569e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    m_new_value_sp = m_new_value_sp->CreateConstantValue(watch_name);
1579e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    if (m_new_value_sp && m_new_value_sp->GetError().Success())
1589e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        return true;
1599e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    else
1609e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        return false;
1619e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham}
1629e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham
1630b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chenvoid
1640b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny ChenWatchpoint::IncrementFalseAlarmsAndReviseHitCount()
1650b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen{
1660b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen    ++m_false_alarms;
1670b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen    if (m_false_alarms)
1680b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen    {
1690b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen        if (m_hit_count >= m_false_alarms)
1700b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen        {
1710b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen            m_hit_count -= m_false_alarms;
1720b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen            m_false_alarms = 0;
1730b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen        }
1740b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen        else
1750b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen        {
1760b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen            m_false_alarms -= m_hit_count;
1770b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen            m_hit_count = 0;
1780b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen        }
1790b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen    }
1800b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen}
1810b09366e83f256920bb55ec7488cb58dfa85ab6bJohnny Chen
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// RETURNS - true if we should stop at this breakpoint, false if we
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// should continue.
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
186ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::ShouldStop (StoppointCallbackContext *context)
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18851b7c5ff358a6eecfc4c827a96ab301a1798c4e2Johnny Chen    IncrementHitCount();
18901acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen
19001acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen    if (!IsEnabled())
19101acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen        return false;
19201acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen
19351b7c5ff358a6eecfc4c827a96ab301a1798c4e2Johnny Chen    if (GetHitCount() <= GetIgnoreCount())
19401acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen        return false;
19501acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen
196712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    return true;
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
200ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::GetDescription (Stream *s, lldb::DescriptionLevel level)
20134bbf85e60949752de9c8272a70d59383e523cc5Johnny Chen{
20210b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen    DumpWithLevel(s, level);
20334bbf85e60949752de9c8272a70d59383e523cc5Johnny Chen    return;
20434bbf85e60949752de9c8272a70d59383e523cc5Johnny Chen}
20534bbf85e60949752de9c8272a70d59383e523cc5Johnny Chen
20634bbf85e60949752de9c8272a70d59383e523cc5Johnny Chenvoid
207ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::Dump(Stream *s) const
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20910b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen    DumpWithLevel(s, lldb::eDescriptionLevelBrief);
21010b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen}
21110b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen
212c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny Chen// If prefix is NULL, we display the watch id and ignore the prefix altogether.
21310b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chenvoid
214c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny ChenWatchpoint::DumpSnapshots(Stream *s, const char *prefix) const
2159e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen{
216c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny Chen    if (!prefix)
217c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny Chen    {
218c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny Chen        s->Printf("\nWatchpoint %u hit:", GetID());
219c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny Chen        prefix = "";
220c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny Chen    }
2219e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham
2229e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    if (m_old_value_sp)
2239e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen    {
2249e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        s->Printf("\n%sold value: %s", prefix, m_old_value_sp->GetValueAsCString());
2259e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen    }
2269e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham    if (m_new_value_sp)
2279e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen    {
2289e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham        s->Printf("\n%snew value: %s", prefix, m_new_value_sp->GetValueAsCString());
2299e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen    }
2309e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen}
2319e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen
2329e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chenvoid
233ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::DumpWithLevel(Stream *s, lldb::DescriptionLevel description_level) const
23410b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen{
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (s == NULL)
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23810b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen    assert(description_level >= lldb::eDescriptionLevelBrief &&
23910b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen           description_level <= lldb::eDescriptionLevelVerbose);
24010b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen
2415f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    s->Printf("Watchpoint %u: addr = 0x%8.8" PRIx64 " size = %u state = %s type = %s%s",
24210b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen              GetID(),
2431c2d941ab4c3ba05888c48e25d245b099a18213aJohnny Chen              GetLoadAddress(),
24410b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen              m_byte_size,
245116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen              IsEnabled() ? "enabled" : "disabled",
24610b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen              m_watch_read ? "r" : "",
24710b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen              m_watch_write ? "w" : "");
24810b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen
249712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    if (description_level >= lldb::eDescriptionLevelFull) {
25055a2d5a49d82fcfc0fe72825293f6c04d1970e21Johnny Chen        if (!m_decl_str.empty())
251712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen            s->Printf("\n    declare @ '%s'", m_decl_str.c_str());
252116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen        if (!m_watch_spec_str.empty())
2539e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen            s->Printf("\n    watchpoint spec = '%s'", m_watch_spec_str.c_str());
2549e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen
2559e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen        // Dump the snapshots we have taken.
256c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny Chen        DumpSnapshots(s, "    ");
2579e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen
258712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        if (GetConditionText())
259712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen            s->Printf("\n    condition = '%s'", GetConditionText());
260f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen        m_options.GetCallbackDescription(s, description_level);
261712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    }
26210b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen
26310b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen    if (description_level >= lldb::eDescriptionLevelVerbose)
264a4a1587e855d8533b5863937b0be8125041f6f4cJason Molenda    {
265f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen        s->Printf("\n    hw_index = %i  hit_count = %-4u  ignore_count = %-4u",
266f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen                  GetHardwareIndex(),
267f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen                  GetHitCount(),
268f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen                  GetIgnoreCount());
269a4a1587e855d8533b5863937b0be8125041f6f4cJason Molenda    }
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
273ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::IsEnabled() const
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_enabled;
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
278f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen// Within StopInfo.cpp, we purposely turn on the ephemeral mode right before temporarily disable the watchpoint
279f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen// in order to perform possible watchpoint actions without triggering further watchpoint events.
280f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen// After the temporary disabled watchpoint is enabled, we then turn off the ephemeral mode.
281f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen
282f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chenvoid
283f84e566ff66dceb58674494b26408d3c83921ab9Johnny ChenWatchpoint::TurnOnEphemeralMode()
284f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen{
285f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen    m_is_ephemeral = true;
286f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen}
287f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen
288f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chenvoid
289f84e566ff66dceb58674494b26408d3c83921ab9Johnny ChenWatchpoint::TurnOffEphemeralMode()
290f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen{
291f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen    m_is_ephemeral = false;
292258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen    // Leaving ephemeral mode, reset the m_disabled_count!
293258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen    m_disabled_count = 0;
294258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen}
295258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen
296258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chenbool
297258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny ChenWatchpoint::IsDisabledDuringEphemeralMode()
298258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen{
299258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen    return m_disabled_count > 1;
300f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen}
301f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
3039c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::SetEnabled(bool enabled, bool notify)
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!enabled)
306c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny Chen    {
307f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen        if (!m_is_ephemeral)
308f84e566ff66dceb58674494b26408d3c83921ab9Johnny Chen            SetHardwareIndex(LLDB_INVALID_INDEX32);
309258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen        else
310258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen            ++m_disabled_count;
311258db3ab3d02fc013f8674f3c20007c1e86b503dJohnny Chen
312bd446f1c519f466a2e24790fd1c362fc06897673Johnny Chen        // Don't clear the snapshots for now.
313bd446f1c519f466a2e24790fd1c362fc06897673Johnny Chen        // Within StopInfo.cpp, we purposely do disable/enable watchpoint while performing watchpoint actions.
314c9c2a9b1c36e54220369c37cd8d859ed423d5b59Johnny Chen    }
3159c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    bool changed = enabled != m_enabled;
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_enabled = enabled;
3179c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    if (notify && !m_is_ephemeral && changed)
3189c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        SendWatchpointChangedEvent (enabled ? eWatchpointEventTypeEnabled : eWatchpointEventTypeDisabled);
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
3229c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::SetWatchpointType (uint32_t type, bool notify)
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3249c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    int old_watch_read = m_watch_read;
3259c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    int old_watch_write = m_watch_write;
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_watch_read = (type & LLDB_WATCH_TYPE_READ) != 0;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_watch_write = (type & LLDB_WATCH_TYPE_WRITE) != 0;
3289c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    if (notify && (old_watch_read != m_watch_read || old_watch_write != m_watch_write))
3299c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        SendWatchpointChangedEvent (eWatchpointEventTypeTypeChanged);
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
333ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::WatchpointRead () const
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_watch_read != 0;
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
338ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::WatchpointWrite () const
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_watch_write != 0;
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Claytonuint32_t
343ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::GetIgnoreCount () const
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_ignore_count;
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
349ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenWatchpoint::SetIgnoreCount (uint32_t n)
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3519c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    bool changed = m_ignore_count != n;
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ignore_count = n;
3539c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    if (changed)
3549c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        SendWatchpointChangedEvent (eWatchpointEventTypeIgnoreChanged);
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
356712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen
357712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chenbool
358712a628dde2f4f786389feecf7e06e59f0853c75Johnny ChenWatchpoint::InvokeCallback (StoppointCallbackContext *context)
359712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen{
360f3ec4617297810223deb545cb68214ca4dd8009cJohnny Chen    return m_options.InvokeCallback (context, GetID());
361712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen}
362712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen
363712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chenvoid
364712a628dde2f4f786389feecf7e06e59f0853c75Johnny ChenWatchpoint::SetCondition (const char *condition)
365712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen{
366712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    if (condition == NULL || condition[0] == '\0')
367712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    {
368712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        if (m_condition_ap.get())
369712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen            m_condition_ap.reset();
370712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    }
371712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    else
372712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    {
373712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        // Pass NULL for expr_prefix (no translation-unit level definitions).
374daa6efe771f5f068e29328a774fa5bf2358ce14aSean Callanan        m_condition_ap.reset(new ClangUserExpression (condition, NULL, lldb::eLanguageTypeUnknown, ClangUserExpression::eResultTypeAny));
375712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    }
3769c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    SendWatchpointChangedEvent (eWatchpointEventTypeConditionChanged);
377712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen}
378712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen
379712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chenconst char *
380712a628dde2f4f786389feecf7e06e59f0853c75Johnny ChenWatchpoint::GetConditionText () const
381712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen{
382712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    if (m_condition_ap.get())
383712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        return m_condition_ap->GetUserText();
384712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen    else
385712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen        return NULL;
386712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen}
387712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen
3889c970a371511a0e31ba9360aa841d445792c1ab0Jim Inghamvoid
3899c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::SendWatchpointChangedEvent (lldb::WatchpointEventType eventKind)
3909c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
3919c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    if (!m_being_created
3929c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        && GetTarget().EventTypeHasListeners(Target::eBroadcastBitWatchpointChanged))
3939c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    {
3949c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        WatchpointEventData *data = new Watchpoint::WatchpointEventData (eventKind, shared_from_this());
3959c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        GetTarget().BroadcastEvent (Target::eBroadcastBitWatchpointChanged, data);
3969c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    }
3979c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
3989c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
3999c970a371511a0e31ba9360aa841d445792c1ab0Jim Inghamvoid
4009c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::SendWatchpointChangedEvent (WatchpointEventData *data)
4019c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4029c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4039c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    if (data == NULL)
4049c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        return;
4059c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4069c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    if (!m_being_created
4079c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        && GetTarget().EventTypeHasListeners(Target::eBroadcastBitWatchpointChanged))
4089c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        GetTarget().BroadcastEvent (Target::eBroadcastBitWatchpointChanged, data);
4099c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    else
4109c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        delete data;
4119c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4129c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4139c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::WatchpointEventData (WatchpointEventType sub_type,
4149c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham                                                      const WatchpointSP &new_watchpoint_sp) :
4159c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    EventData (),
4169c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    m_watchpoint_event (sub_type),
4179c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    m_new_watchpoint_sp (new_watchpoint_sp)
4189c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4199c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4209c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4219c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::~WatchpointEventData ()
4229c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4239c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4249c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4259c970a371511a0e31ba9360aa841d445792c1ab0Jim Inghamconst ConstString &
4269c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::GetFlavorString ()
4279c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4289c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    static ConstString g_flavor ("Watchpoint::WatchpointEventData");
4299c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    return g_flavor;
4309c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4319c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4329c970a371511a0e31ba9360aa841d445792c1ab0Jim Inghamconst ConstString &
4339c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::GetFlavor () const
4349c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4359c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    return WatchpointEventData::GetFlavorString ();
4369c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4379c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4389c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4399c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpointSP &
4409c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::GetWatchpoint ()
4419c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4429c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    return m_new_watchpoint_sp;
4439c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4449c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4459c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpointEventType
4469c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::GetWatchpointEventType () const
4479c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4489c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    return m_watchpoint_event;
4499c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4509c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4519c970a371511a0e31ba9360aa841d445792c1ab0Jim Inghamvoid
4529c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::Dump (Stream *s) const
4539c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4549c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4559c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4569c970a371511a0e31ba9360aa841d445792c1ab0Jim Inghamconst Watchpoint::WatchpointEventData *
4579c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::GetEventDataFromEvent (const Event *event)
4589c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4599c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    if (event)
4609c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    {
4619c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        const EventData *event_data = event->GetData();
4629c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        if (event_data && event_data->GetFlavor() == WatchpointEventData::GetFlavorString())
4639c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham            return static_cast <const WatchpointEventData *> (event->GetData());
4649c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    }
4659c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    return NULL;
4669c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4679c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4689c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpointEventType
4699c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::GetWatchpointEventTypeFromEvent (const EventSP &event_sp)
4709c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4719c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    const WatchpointEventData *data = GetEventDataFromEvent (event_sp.get());
4729c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4739c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    if (data == NULL)
4749c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        return eWatchpointEventTypeInvalidType;
4759c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    else
4769c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        return data->GetWatchpointEventType();
4779c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
4789c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4799c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpointSP
4809c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamWatchpoint::WatchpointEventData::GetWatchpointFromEvent (const EventSP &event_sp)
4819c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham{
4829c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    WatchpointSP wp_sp;
4839c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4849c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    const WatchpointEventData *data = GetEventDataFromEvent (event_sp.get());
4859c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    if (data)
4869c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham        wp_sp = data->m_new_watchpoint_sp;
4879c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham
4889c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    return wp_sp;
4899c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham}
490