blob: 5b1a0699925bcc6497adc75a5993860324fe11b8 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Event.cpp -----------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// C Includes
11// C++ Includes
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000012#include <algorithm>
13
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014// Other libraries and framework includes
15// Project includes
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016#include "lldb/Core/Broadcaster.h"
17#include "lldb/Core/DataExtractor.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000018#include "lldb/Core/Event.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Core/Log.h"
20#include "lldb/Core/State.h"
Greg Clayton7fb56d02011-02-01 01:31:41 +000021#include "lldb/Host/Endian.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022#include "lldb/Target/Process.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000023#include "lldb/Utility/Stream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024
25using namespace lldb;
26using namespace lldb_private;
27
Todd Fiala75930012016-08-19 04:21:48 +000028#pragma mark -
29#pragma mark Event
30
31//------------------------------------------------------------------
32// Event functions
33//------------------------------------------------------------------
34
Kate Stoneb9c1b512016-09-06 20:57:50 +000035Event::Event(Broadcaster *broadcaster, uint32_t event_type, EventData *data)
36 : m_broadcaster_wp(broadcaster->GetBroadcasterImpl()), m_type(event_type),
37 m_data_sp(data) {}
Greg Clayton1e20f022016-05-12 22:58:52 +000038
Kate Stoneb9c1b512016-09-06 20:57:50 +000039Event::Event(Broadcaster *broadcaster, uint32_t event_type,
40 const EventDataSP &event_data_sp)
41 : m_broadcaster_wp(broadcaster->GetBroadcasterImpl()), m_type(event_type),
42 m_data_sp(event_data_sp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044Event::Event(uint32_t event_type, EventData *data)
45 : m_broadcaster_wp(), m_type(event_type), m_data_sp(data) {}
Greg Clayton1e20f022016-05-12 22:58:52 +000046
Kate Stoneb9c1b512016-09-06 20:57:50 +000047Event::Event(uint32_t event_type, const EventDataSP &event_data_sp)
48 : m_broadcaster_wp(), m_type(event_type), m_data_sp(event_data_sp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000050Event::~Event() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051
Kate Stoneb9c1b512016-09-06 20:57:50 +000052void Event::Dump(Stream *s) const {
53 Broadcaster *broadcaster;
54 Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock());
55 if (broadcaster_impl_sp)
56 broadcaster = broadcaster_impl_sp->GetBroadcaster();
57 else
58 broadcaster = nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059
Kate Stoneb9c1b512016-09-06 20:57:50 +000060 if (broadcaster) {
61 StreamString event_name;
62 if (broadcaster->GetEventNames(event_name, m_type, false))
63 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ",
64 static_cast<const void *>(this),
65 static_cast<void *>(broadcaster),
66 broadcaster->GetBroadcasterName().GetCString(), m_type,
Zachary Turnerc1564272016-11-16 21:15:24 +000067 event_name.GetData());
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000068 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ",
70 static_cast<const void *>(this),
71 static_cast<void *>(broadcaster),
72 broadcaster->GetBroadcasterName().GetCString(), m_type);
73 } else
74 s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ",
75 static_cast<const void *>(this), m_type);
76
77 if (m_data_sp) {
78 s->PutChar('{');
79 m_data_sp->Dump(s);
80 s->PutChar('}');
81 } else
82 s->Printf("<NULL>");
Chris Lattner30fdc8d2010-06-08 16:52:24 +000083}
84
Kate Stoneb9c1b512016-09-06 20:57:50 +000085void Event::DoOnRemoval() {
86 if (m_data_sp)
87 m_data_sp->DoOnRemoval(this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000088}
89
Todd Fiala75930012016-08-19 04:21:48 +000090#pragma mark -
91#pragma mark EventData
92
93//------------------------------------------------------------------
94// EventData functions
95//------------------------------------------------------------------
96
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000097EventData::EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000099EventData::~EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101void EventData::Dump(Stream *s) const { s->PutCString("Generic Event Data"); }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000102
Todd Fiala75930012016-08-19 04:21:48 +0000103#pragma mark -
104#pragma mark EventDataBytes
105
106//------------------------------------------------------------------
107// EventDataBytes functions
108//------------------------------------------------------------------
109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110EventDataBytes::EventDataBytes() : m_bytes() {}
Todd Fiala75930012016-08-19 04:21:48 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112EventDataBytes::EventDataBytes(const char *cstr) : m_bytes() {
113 SetBytesFromCString(cstr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000114}
115
Zachary Turner514d8cd2016-09-23 18:06:53 +0000116EventDataBytes::EventDataBytes(llvm::StringRef str) : m_bytes() {
117 SetBytes(str.data(), str.size());
118}
119
Kate Stoneb9c1b512016-09-06 20:57:50 +0000120EventDataBytes::EventDataBytes(const void *src, size_t src_len) : m_bytes() {
121 SetBytes(src, src_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000122}
123
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000124EventDataBytes::~EventDataBytes() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000125
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126const ConstString &EventDataBytes::GetFlavorString() {
127 static ConstString g_flavor("EventDataBytes");
128 return g_flavor;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000129}
130
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131const ConstString &EventDataBytes::GetFlavor() const {
132 return EventDataBytes::GetFlavorString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000133}
134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135void EventDataBytes::Dump(Stream *s) const {
136 size_t num_printable_chars =
137 std::count_if(m_bytes.begin(), m_bytes.end(), isprint);
138 if (num_printable_chars == m_bytes.size()) {
139 s->Printf("\"%s\"", m_bytes.c_str());
140 } else if (!m_bytes.empty()) {
141 DataExtractor data;
142 data.SetData(m_bytes.data(), m_bytes.size(), endian::InlHostByteOrder());
143 data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS,
144 0, 0);
145 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000146}
147
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148const void *EventDataBytes::GetBytes() const {
149 return (m_bytes.empty() ? nullptr : m_bytes.data());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000150}
151
Kate Stoneb9c1b512016-09-06 20:57:50 +0000152size_t EventDataBytes::GetByteSize() const { return m_bytes.size(); }
153
154void EventDataBytes::SetBytes(const void *src, size_t src_len) {
155 if (src != nullptr && src_len > 0)
156 m_bytes.assign((const char *)src, src_len);
157 else
158 m_bytes.clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000159}
160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161void EventDataBytes::SetBytesFromCString(const char *cstr) {
162 if (cstr != nullptr && cstr[0])
163 m_bytes.assign(cstr);
164 else
165 m_bytes.clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166}
167
Kate Stoneb9c1b512016-09-06 20:57:50 +0000168const void *EventDataBytes::GetBytesFromEvent(const Event *event_ptr) {
169 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);
170 if (e != nullptr)
171 return e->GetBytes();
172 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000173}
174
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175size_t EventDataBytes::GetByteSizeFromEvent(const Event *event_ptr) {
176 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);
177 if (e != nullptr)
178 return e->GetByteSize();
179 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000180}
181
182const EventDataBytes *
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183EventDataBytes::GetEventDataFromEvent(const Event *event_ptr) {
184 if (event_ptr != nullptr) {
185 const EventData *event_data = event_ptr->GetData();
186 if (event_data &&
187 event_data->GetFlavor() == EventDataBytes::GetFlavorString())
188 return static_cast<const EventDataBytes *>(event_data);
189 }
190 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000191}
192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193void EventDataBytes::SwapBytes(std::string &new_bytes) {
194 m_bytes.swap(new_bytes);
Caroline Tice969ed3d2011-05-02 20:41:46 +0000195}
Todd Fiala75930012016-08-19 04:21:48 +0000196
197#pragma mark -
198#pragma mark EventStructuredData
199
200//------------------------------------------------------------------
201// EventDataStructuredData definitions
202//------------------------------------------------------------------
203
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204EventDataStructuredData::EventDataStructuredData()
205 : EventData(), m_process_sp(), m_object_sp(), m_plugin_sp() {}
Todd Fiala75930012016-08-19 04:21:48 +0000206
Kate Stoneb9c1b512016-09-06 20:57:50 +0000207EventDataStructuredData::EventDataStructuredData(
208 const ProcessSP &process_sp, const StructuredData::ObjectSP &object_sp,
209 const lldb::StructuredDataPluginSP &plugin_sp)
210 : EventData(), m_process_sp(process_sp), m_object_sp(object_sp),
211 m_plugin_sp(plugin_sp) {}
Todd Fiala75930012016-08-19 04:21:48 +0000212
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213EventDataStructuredData::~EventDataStructuredData() {}
Todd Fiala75930012016-08-19 04:21:48 +0000214
215//------------------------------------------------------------------
216// EventDataStructuredData member functions
217//------------------------------------------------------------------
218
Kate Stoneb9c1b512016-09-06 20:57:50 +0000219const ConstString &EventDataStructuredData::GetFlavor() const {
220 return EventDataStructuredData::GetFlavorString();
Todd Fiala75930012016-08-19 04:21:48 +0000221}
222
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223void EventDataStructuredData::Dump(Stream *s) const {
224 if (!s)
225 return;
Todd Fiala75930012016-08-19 04:21:48 +0000226
Kate Stoneb9c1b512016-09-06 20:57:50 +0000227 if (m_object_sp)
228 m_object_sp->Dump(*s);
Todd Fiala75930012016-08-19 04:21:48 +0000229}
230
Kate Stoneb9c1b512016-09-06 20:57:50 +0000231const ProcessSP &EventDataStructuredData::GetProcess() const {
232 return m_process_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000233}
234
Kate Stoneb9c1b512016-09-06 20:57:50 +0000235const StructuredData::ObjectSP &EventDataStructuredData::GetObject() const {
236 return m_object_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000237}
238
Kate Stoneb9c1b512016-09-06 20:57:50 +0000239const lldb::StructuredDataPluginSP &
240EventDataStructuredData::GetStructuredDataPlugin() const {
241 return m_plugin_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000242}
243
Kate Stoneb9c1b512016-09-06 20:57:50 +0000244void EventDataStructuredData::SetProcess(const ProcessSP &process_sp) {
245 m_process_sp = process_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000246}
247
Kate Stoneb9c1b512016-09-06 20:57:50 +0000248void EventDataStructuredData::SetObject(
249 const StructuredData::ObjectSP &object_sp) {
250 m_object_sp = object_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000251}
252
Kate Stoneb9c1b512016-09-06 20:57:50 +0000253void EventDataStructuredData::SetStructuredDataPlugin(
254 const lldb::StructuredDataPluginSP &plugin_sp) {
255 m_plugin_sp = plugin_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000256}
257
258//------------------------------------------------------------------
259// EventDataStructuredData static functions
260//------------------------------------------------------------------
261
Kate Stoneb9c1b512016-09-06 20:57:50 +0000262const EventDataStructuredData *
263EventDataStructuredData::GetEventDataFromEvent(const Event *event_ptr) {
264 if (event_ptr == nullptr)
265 return nullptr;
Todd Fiala75930012016-08-19 04:21:48 +0000266
Kate Stoneb9c1b512016-09-06 20:57:50 +0000267 const EventData *event_data = event_ptr->GetData();
268 if (!event_data ||
269 event_data->GetFlavor() != EventDataStructuredData::GetFlavorString())
270 return nullptr;
Todd Fiala75930012016-08-19 04:21:48 +0000271
Kate Stoneb9c1b512016-09-06 20:57:50 +0000272 return static_cast<const EventDataStructuredData *>(event_data);
Todd Fiala75930012016-08-19 04:21:48 +0000273}
274
Kate Stoneb9c1b512016-09-06 20:57:50 +0000275ProcessSP EventDataStructuredData::GetProcessFromEvent(const Event *event_ptr) {
276 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
277 if (event_data)
278 return event_data->GetProcess();
279 else
280 return ProcessSP();
Todd Fiala75930012016-08-19 04:21:48 +0000281}
282
283StructuredData::ObjectSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000284EventDataStructuredData::GetObjectFromEvent(const Event *event_ptr) {
285 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
286 if (event_data)
287 return event_data->GetObject();
288 else
289 return StructuredData::ObjectSP();
Todd Fiala75930012016-08-19 04:21:48 +0000290}
291
292lldb::StructuredDataPluginSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000293EventDataStructuredData::GetPluginFromEvent(const Event *event_ptr) {
294 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
295 if (event_data)
296 return event_data->GetStructuredDataPlugin();
297 else
298 return StructuredDataPluginSP();
Todd Fiala75930012016-08-19 04:21:48 +0000299}
300
Kate Stoneb9c1b512016-09-06 20:57:50 +0000301const ConstString &EventDataStructuredData::GetFlavorString() {
302 static ConstString s_flavor("EventDataStructuredData");
303 return s_flavor;
Todd Fiala75930012016-08-19 04:21:48 +0000304}