blob: 9e293db6df612bf75cb2239aaac770aba24616fb [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Event.cpp -----------------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
Pavel Labath181b8232018-12-14 15:59:49 +00009#include "lldb/Utility/Event.h"
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000010
Pavel Labath181b8232018-12-14 15:59:49 +000011#include "lldb/Utility/Broadcaster.h"
Zachary Turner666cc0b2017-03-04 01:30:05 +000012#include "lldb/Utility/DataExtractor.h"
Zachary Turner01c32432017-02-14 19:06:07 +000013#include "lldb/Utility/Endian.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000014#include "lldb/Utility/Stream.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000015#include "lldb/Utility/StreamString.h"
16#include "lldb/lldb-enumerations.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000017
18#include <algorithm>
19
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000020#include <ctype.h>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021
22using namespace lldb;
23using namespace lldb_private;
24
Todd Fiala75930012016-08-19 04:21:48 +000025#pragma mark -
26#pragma mark Event
27
28//------------------------------------------------------------------
29// Event functions
30//------------------------------------------------------------------
31
Kate Stoneb9c1b512016-09-06 20:57:50 +000032Event::Event(Broadcaster *broadcaster, uint32_t event_type, EventData *data)
33 : m_broadcaster_wp(broadcaster->GetBroadcasterImpl()), m_type(event_type),
34 m_data_sp(data) {}
Greg Clayton1e20f022016-05-12 22:58:52 +000035
Kate Stoneb9c1b512016-09-06 20:57:50 +000036Event::Event(Broadcaster *broadcaster, uint32_t event_type,
37 const EventDataSP &event_data_sp)
38 : m_broadcaster_wp(broadcaster->GetBroadcasterImpl()), m_type(event_type),
39 m_data_sp(event_data_sp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000040
Kate Stoneb9c1b512016-09-06 20:57:50 +000041Event::Event(uint32_t event_type, EventData *data)
42 : m_broadcaster_wp(), m_type(event_type), m_data_sp(data) {}
Greg Clayton1e20f022016-05-12 22:58:52 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044Event::Event(uint32_t event_type, const EventDataSP &event_data_sp)
45 : m_broadcaster_wp(), m_type(event_type), m_data_sp(event_data_sp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000047Event::~Event() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048
Kate Stoneb9c1b512016-09-06 20:57:50 +000049void Event::Dump(Stream *s) const {
50 Broadcaster *broadcaster;
51 Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock());
52 if (broadcaster_impl_sp)
53 broadcaster = broadcaster_impl_sp->GetBroadcaster();
54 else
55 broadcaster = nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000056
Kate Stoneb9c1b512016-09-06 20:57:50 +000057 if (broadcaster) {
58 StreamString event_name;
59 if (broadcaster->GetEventNames(event_name, m_type, false))
60 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ",
61 static_cast<const void *>(this),
62 static_cast<void *>(broadcaster),
63 broadcaster->GetBroadcasterName().GetCString(), m_type,
Zachary Turnerc1564272016-11-16 21:15:24 +000064 event_name.GetData());
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000065 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000066 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ",
67 static_cast<const void *>(this),
68 static_cast<void *>(broadcaster),
69 broadcaster->GetBroadcasterName().GetCString(), m_type);
70 } else
71 s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ",
72 static_cast<const void *>(this), m_type);
73
74 if (m_data_sp) {
75 s->PutChar('{');
76 m_data_sp->Dump(s);
77 s->PutChar('}');
78 } else
79 s->Printf("<NULL>");
Chris Lattner30fdc8d2010-06-08 16:52:24 +000080}
81
Kate Stoneb9c1b512016-09-06 20:57:50 +000082void Event::DoOnRemoval() {
83 if (m_data_sp)
84 m_data_sp->DoOnRemoval(this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000085}
86
Todd Fiala75930012016-08-19 04:21:48 +000087#pragma mark -
88#pragma mark EventData
89
90//------------------------------------------------------------------
91// EventData functions
92//------------------------------------------------------------------
93
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000094EventData::EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000096EventData::~EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000097
Kate Stoneb9c1b512016-09-06 20:57:50 +000098void EventData::Dump(Stream *s) const { s->PutCString("Generic Event Data"); }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000099
Todd Fiala75930012016-08-19 04:21:48 +0000100#pragma mark -
101#pragma mark EventDataBytes
102
103//------------------------------------------------------------------
104// EventDataBytes functions
105//------------------------------------------------------------------
106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107EventDataBytes::EventDataBytes() : m_bytes() {}
Todd Fiala75930012016-08-19 04:21:48 +0000108
Kate Stoneb9c1b512016-09-06 20:57:50 +0000109EventDataBytes::EventDataBytes(const char *cstr) : m_bytes() {
110 SetBytesFromCString(cstr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000111}
112
Zachary Turner514d8cd2016-09-23 18:06:53 +0000113EventDataBytes::EventDataBytes(llvm::StringRef str) : m_bytes() {
114 SetBytes(str.data(), str.size());
115}
116
Kate Stoneb9c1b512016-09-06 20:57:50 +0000117EventDataBytes::EventDataBytes(const void *src, size_t src_len) : m_bytes() {
118 SetBytes(src, src_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000119}
120
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000121EventDataBytes::~EventDataBytes() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000122
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000123ConstString EventDataBytes::GetFlavorString() {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124 static ConstString g_flavor("EventDataBytes");
125 return g_flavor;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000126}
127
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000128ConstString EventDataBytes::GetFlavor() const {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 return EventDataBytes::GetFlavorString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000130}
131
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132void EventDataBytes::Dump(Stream *s) const {
133 size_t num_printable_chars =
134 std::count_if(m_bytes.begin(), m_bytes.end(), isprint);
Pavel Labath082bab12018-07-24 10:49:14 +0000135 if (num_printable_chars == m_bytes.size())
136 s->Format("\"{0}\"", m_bytes);
137 else
138 s->Format("{0:$[ ]@[x-2]}", llvm::make_range(
139 reinterpret_cast<const uint8_t *>(m_bytes.data()),
140 reinterpret_cast<const uint8_t *>(m_bytes.data() +
141 m_bytes.size())));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000142}
143
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144const void *EventDataBytes::GetBytes() const {
145 return (m_bytes.empty() ? nullptr : m_bytes.data());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000146}
147
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148size_t EventDataBytes::GetByteSize() const { return m_bytes.size(); }
149
150void EventDataBytes::SetBytes(const void *src, size_t src_len) {
151 if (src != nullptr && src_len > 0)
152 m_bytes.assign((const char *)src, src_len);
153 else
154 m_bytes.clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155}
156
Kate Stoneb9c1b512016-09-06 20:57:50 +0000157void EventDataBytes::SetBytesFromCString(const char *cstr) {
158 if (cstr != nullptr && cstr[0])
159 m_bytes.assign(cstr);
160 else
161 m_bytes.clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000162}
163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164const void *EventDataBytes::GetBytesFromEvent(const Event *event_ptr) {
165 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);
166 if (e != nullptr)
167 return e->GetBytes();
168 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000169}
170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171size_t EventDataBytes::GetByteSizeFromEvent(const Event *event_ptr) {
172 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);
173 if (e != nullptr)
174 return e->GetByteSize();
175 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000176}
177
178const EventDataBytes *
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179EventDataBytes::GetEventDataFromEvent(const Event *event_ptr) {
180 if (event_ptr != nullptr) {
181 const EventData *event_data = event_ptr->GetData();
182 if (event_data &&
183 event_data->GetFlavor() == EventDataBytes::GetFlavorString())
184 return static_cast<const EventDataBytes *>(event_data);
185 }
186 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000187}
188
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189void EventDataBytes::SwapBytes(std::string &new_bytes) {
190 m_bytes.swap(new_bytes);
Caroline Tice969ed3d2011-05-02 20:41:46 +0000191}
Todd Fiala75930012016-08-19 04:21:48 +0000192
193#pragma mark -
194#pragma mark EventStructuredData
195
196//------------------------------------------------------------------
197// EventDataStructuredData definitions
198//------------------------------------------------------------------
199
Kate Stoneb9c1b512016-09-06 20:57:50 +0000200EventDataStructuredData::EventDataStructuredData()
201 : EventData(), m_process_sp(), m_object_sp(), m_plugin_sp() {}
Todd Fiala75930012016-08-19 04:21:48 +0000202
Kate Stoneb9c1b512016-09-06 20:57:50 +0000203EventDataStructuredData::EventDataStructuredData(
204 const ProcessSP &process_sp, const StructuredData::ObjectSP &object_sp,
205 const lldb::StructuredDataPluginSP &plugin_sp)
206 : EventData(), m_process_sp(process_sp), m_object_sp(object_sp),
207 m_plugin_sp(plugin_sp) {}
Todd Fiala75930012016-08-19 04:21:48 +0000208
Kate Stoneb9c1b512016-09-06 20:57:50 +0000209EventDataStructuredData::~EventDataStructuredData() {}
Todd Fiala75930012016-08-19 04:21:48 +0000210
211//------------------------------------------------------------------
212// EventDataStructuredData member functions
213//------------------------------------------------------------------
214
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000215ConstString EventDataStructuredData::GetFlavor() const {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000216 return EventDataStructuredData::GetFlavorString();
Todd Fiala75930012016-08-19 04:21:48 +0000217}
218
Kate Stoneb9c1b512016-09-06 20:57:50 +0000219void EventDataStructuredData::Dump(Stream *s) const {
220 if (!s)
221 return;
Todd Fiala75930012016-08-19 04:21:48 +0000222
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223 if (m_object_sp)
224 m_object_sp->Dump(*s);
Todd Fiala75930012016-08-19 04:21:48 +0000225}
226
Kate Stoneb9c1b512016-09-06 20:57:50 +0000227const ProcessSP &EventDataStructuredData::GetProcess() const {
228 return m_process_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000229}
230
Kate Stoneb9c1b512016-09-06 20:57:50 +0000231const StructuredData::ObjectSP &EventDataStructuredData::GetObject() const {
232 return m_object_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000233}
234
Kate Stoneb9c1b512016-09-06 20:57:50 +0000235const lldb::StructuredDataPluginSP &
236EventDataStructuredData::GetStructuredDataPlugin() const {
237 return m_plugin_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000238}
239
Kate Stoneb9c1b512016-09-06 20:57:50 +0000240void EventDataStructuredData::SetProcess(const ProcessSP &process_sp) {
241 m_process_sp = process_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000242}
243
Kate Stoneb9c1b512016-09-06 20:57:50 +0000244void EventDataStructuredData::SetObject(
245 const StructuredData::ObjectSP &object_sp) {
246 m_object_sp = object_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000247}
248
Kate Stoneb9c1b512016-09-06 20:57:50 +0000249void EventDataStructuredData::SetStructuredDataPlugin(
250 const lldb::StructuredDataPluginSP &plugin_sp) {
251 m_plugin_sp = plugin_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000252}
253
254//------------------------------------------------------------------
255// EventDataStructuredData static functions
256//------------------------------------------------------------------
257
Kate Stoneb9c1b512016-09-06 20:57:50 +0000258const EventDataStructuredData *
259EventDataStructuredData::GetEventDataFromEvent(const Event *event_ptr) {
260 if (event_ptr == nullptr)
261 return nullptr;
Todd Fiala75930012016-08-19 04:21:48 +0000262
Kate Stoneb9c1b512016-09-06 20:57:50 +0000263 const EventData *event_data = event_ptr->GetData();
264 if (!event_data ||
265 event_data->GetFlavor() != EventDataStructuredData::GetFlavorString())
266 return nullptr;
Todd Fiala75930012016-08-19 04:21:48 +0000267
Kate Stoneb9c1b512016-09-06 20:57:50 +0000268 return static_cast<const EventDataStructuredData *>(event_data);
Todd Fiala75930012016-08-19 04:21:48 +0000269}
270
Kate Stoneb9c1b512016-09-06 20:57:50 +0000271ProcessSP EventDataStructuredData::GetProcessFromEvent(const Event *event_ptr) {
272 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
273 if (event_data)
274 return event_data->GetProcess();
275 else
276 return ProcessSP();
Todd Fiala75930012016-08-19 04:21:48 +0000277}
278
279StructuredData::ObjectSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000280EventDataStructuredData::GetObjectFromEvent(const Event *event_ptr) {
281 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
282 if (event_data)
283 return event_data->GetObject();
284 else
285 return StructuredData::ObjectSP();
Todd Fiala75930012016-08-19 04:21:48 +0000286}
287
288lldb::StructuredDataPluginSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000289EventDataStructuredData::GetPluginFromEvent(const Event *event_ptr) {
290 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
291 if (event_data)
292 return event_data->GetStructuredDataPlugin();
293 else
294 return StructuredDataPluginSP();
Todd Fiala75930012016-08-19 04:21:48 +0000295}
296
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000297ConstString EventDataStructuredData::GetFlavorString() {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000298 static ConstString s_flavor("EventDataStructuredData");
299 return s_flavor;
Todd Fiala75930012016-08-19 04:21:48 +0000300}