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