blob: 50cc7f061dc6a41b9e256f318f100efa498ac056 [file] [log] [blame]
Raphael Isemann80814282020-01-24 08:23:27 +01001//===-- Event.cpp ---------------------------------------------------------===//
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002//
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
Todd Fiala75930012016-08-19 04:21:48 +000028// Event functions
Todd Fiala75930012016-08-19 04:21:48 +000029
Kate Stoneb9c1b512016-09-06 20:57:50 +000030Event::Event(Broadcaster *broadcaster, uint32_t event_type, EventData *data)
31 : m_broadcaster_wp(broadcaster->GetBroadcasterImpl()), m_type(event_type),
32 m_data_sp(data) {}
Greg Clayton1e20f022016-05-12 22:58:52 +000033
Kate Stoneb9c1b512016-09-06 20:57:50 +000034Event::Event(Broadcaster *broadcaster, uint32_t event_type,
35 const EventDataSP &event_data_sp)
36 : m_broadcaster_wp(broadcaster->GetBroadcasterImpl()), m_type(event_type),
37 m_data_sp(event_data_sp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000038
Kate Stoneb9c1b512016-09-06 20:57:50 +000039Event::Event(uint32_t event_type, EventData *data)
40 : m_broadcaster_wp(), m_type(event_type), m_data_sp(data) {}
Greg Clayton1e20f022016-05-12 22:58:52 +000041
Kate Stoneb9c1b512016-09-06 20:57:50 +000042Event::Event(uint32_t event_type, const EventDataSP &event_data_sp)
43 : m_broadcaster_wp(), m_type(event_type), m_data_sp(event_data_sp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000045Event::~Event() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046
Kate Stoneb9c1b512016-09-06 20:57:50 +000047void Event::Dump(Stream *s) const {
48 Broadcaster *broadcaster;
49 Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock());
50 if (broadcaster_impl_sp)
51 broadcaster = broadcaster_impl_sp->GetBroadcaster();
52 else
53 broadcaster = nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000054
Kate Stoneb9c1b512016-09-06 20:57:50 +000055 if (broadcaster) {
56 StreamString event_name;
57 if (broadcaster->GetEventNames(event_name, m_type, false))
58 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ",
59 static_cast<const void *>(this),
60 static_cast<void *>(broadcaster),
61 broadcaster->GetBroadcasterName().GetCString(), m_type,
Zachary Turnerc1564272016-11-16 21:15:24 +000062 event_name.GetData());
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000063 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000064 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ",
65 static_cast<const void *>(this),
66 static_cast<void *>(broadcaster),
67 broadcaster->GetBroadcasterName().GetCString(), m_type);
68 } else
69 s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ",
70 static_cast<const void *>(this), m_type);
71
72 if (m_data_sp) {
73 s->PutChar('{');
74 m_data_sp->Dump(s);
75 s->PutChar('}');
76 } else
77 s->Printf("<NULL>");
Chris Lattner30fdc8d2010-06-08 16:52:24 +000078}
79
Kate Stoneb9c1b512016-09-06 20:57:50 +000080void Event::DoOnRemoval() {
81 if (m_data_sp)
82 m_data_sp->DoOnRemoval(this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000083}
84
Todd Fiala75930012016-08-19 04:21:48 +000085#pragma mark -
86#pragma mark EventData
87
Todd Fiala75930012016-08-19 04:21:48 +000088// EventData functions
Todd Fiala75930012016-08-19 04:21:48 +000089
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000090EventData::EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000091
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000092EventData::~EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000093
Kate Stoneb9c1b512016-09-06 20:57:50 +000094void EventData::Dump(Stream *s) const { s->PutCString("Generic Event Data"); }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095
Todd Fiala75930012016-08-19 04:21:48 +000096#pragma mark -
97#pragma mark EventDataBytes
98
Todd Fiala75930012016-08-19 04:21:48 +000099// EventDataBytes functions
Todd Fiala75930012016-08-19 04:21:48 +0000100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101EventDataBytes::EventDataBytes() : m_bytes() {}
Todd Fiala75930012016-08-19 04:21:48 +0000102
Kate Stoneb9c1b512016-09-06 20:57:50 +0000103EventDataBytes::EventDataBytes(const char *cstr) : m_bytes() {
104 SetBytesFromCString(cstr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000105}
106
Zachary Turner514d8cd2016-09-23 18:06:53 +0000107EventDataBytes::EventDataBytes(llvm::StringRef str) : m_bytes() {
108 SetBytes(str.data(), str.size());
109}
110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111EventDataBytes::EventDataBytes(const void *src, size_t src_len) : m_bytes() {
112 SetBytes(src, src_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000113}
114
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000115EventDataBytes::~EventDataBytes() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000116
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000117ConstString EventDataBytes::GetFlavorString() {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118 static ConstString g_flavor("EventDataBytes");
119 return g_flavor;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000120}
121
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000122ConstString EventDataBytes::GetFlavor() const {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123 return EventDataBytes::GetFlavorString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000124}
125
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126void EventDataBytes::Dump(Stream *s) const {
127 size_t num_printable_chars =
Raphael Isemannf5eaa2a2020-06-19 19:17:24 +0200128 std::count_if(m_bytes.begin(), m_bytes.end(), llvm::isPrint);
Pavel Labath082bab12018-07-24 10:49:14 +0000129 if (num_printable_chars == m_bytes.size())
130 s->Format("\"{0}\"", m_bytes);
131 else
132 s->Format("{0:$[ ]@[x-2]}", llvm::make_range(
133 reinterpret_cast<const uint8_t *>(m_bytes.data()),
134 reinterpret_cast<const uint8_t *>(m_bytes.data() +
135 m_bytes.size())));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000136}
137
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138const void *EventDataBytes::GetBytes() const {
139 return (m_bytes.empty() ? nullptr : m_bytes.data());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000140}
141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142size_t EventDataBytes::GetByteSize() const { return m_bytes.size(); }
143
144void EventDataBytes::SetBytes(const void *src, size_t src_len) {
145 if (src != nullptr && src_len > 0)
Jonas Devlieghere24374ae2019-05-23 05:12:11 +0000146 m_bytes.assign(static_cast<const char *>(src), src_len);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147 else
148 m_bytes.clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000149}
150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151void EventDataBytes::SetBytesFromCString(const char *cstr) {
152 if (cstr != nullptr && cstr[0])
153 m_bytes.assign(cstr);
154 else
155 m_bytes.clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000156}
157
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158const void *EventDataBytes::GetBytesFromEvent(const Event *event_ptr) {
159 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);
160 if (e != nullptr)
161 return e->GetBytes();
162 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000163}
164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165size_t EventDataBytes::GetByteSizeFromEvent(const Event *event_ptr) {
166 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);
167 if (e != nullptr)
168 return e->GetByteSize();
169 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000170}
171
172const EventDataBytes *
Kate Stoneb9c1b512016-09-06 20:57:50 +0000173EventDataBytes::GetEventDataFromEvent(const Event *event_ptr) {
174 if (event_ptr != nullptr) {
175 const EventData *event_data = event_ptr->GetData();
176 if (event_data &&
177 event_data->GetFlavor() == EventDataBytes::GetFlavorString())
178 return static_cast<const EventDataBytes *>(event_data);
179 }
180 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000181}
182
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183void EventDataBytes::SwapBytes(std::string &new_bytes) {
184 m_bytes.swap(new_bytes);
Caroline Tice969ed3d2011-05-02 20:41:46 +0000185}
Todd Fiala75930012016-08-19 04:21:48 +0000186
187#pragma mark -
188#pragma mark EventStructuredData
189
Todd Fiala75930012016-08-19 04:21:48 +0000190// EventDataStructuredData definitions
Todd Fiala75930012016-08-19 04:21:48 +0000191
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192EventDataStructuredData::EventDataStructuredData()
193 : EventData(), m_process_sp(), m_object_sp(), m_plugin_sp() {}
Todd Fiala75930012016-08-19 04:21:48 +0000194
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195EventDataStructuredData::EventDataStructuredData(
196 const ProcessSP &process_sp, const StructuredData::ObjectSP &object_sp,
197 const lldb::StructuredDataPluginSP &plugin_sp)
198 : EventData(), m_process_sp(process_sp), m_object_sp(object_sp),
199 m_plugin_sp(plugin_sp) {}
Todd Fiala75930012016-08-19 04:21:48 +0000200
Kate Stoneb9c1b512016-09-06 20:57:50 +0000201EventDataStructuredData::~EventDataStructuredData() {}
Todd Fiala75930012016-08-19 04:21:48 +0000202
Todd Fiala75930012016-08-19 04:21:48 +0000203// EventDataStructuredData member functions
Todd Fiala75930012016-08-19 04:21:48 +0000204
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000205ConstString EventDataStructuredData::GetFlavor() const {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000206 return EventDataStructuredData::GetFlavorString();
Todd Fiala75930012016-08-19 04:21:48 +0000207}
208
Kate Stoneb9c1b512016-09-06 20:57:50 +0000209void EventDataStructuredData::Dump(Stream *s) const {
210 if (!s)
211 return;
Todd Fiala75930012016-08-19 04:21:48 +0000212
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213 if (m_object_sp)
214 m_object_sp->Dump(*s);
Todd Fiala75930012016-08-19 04:21:48 +0000215}
216
Kate Stoneb9c1b512016-09-06 20:57:50 +0000217const ProcessSP &EventDataStructuredData::GetProcess() const {
218 return m_process_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000219}
220
Kate Stoneb9c1b512016-09-06 20:57:50 +0000221const StructuredData::ObjectSP &EventDataStructuredData::GetObject() const {
222 return m_object_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000223}
224
Kate Stoneb9c1b512016-09-06 20:57:50 +0000225const lldb::StructuredDataPluginSP &
226EventDataStructuredData::GetStructuredDataPlugin() const {
227 return m_plugin_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000228}
229
Kate Stoneb9c1b512016-09-06 20:57:50 +0000230void EventDataStructuredData::SetProcess(const ProcessSP &process_sp) {
231 m_process_sp = process_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000232}
233
Kate Stoneb9c1b512016-09-06 20:57:50 +0000234void EventDataStructuredData::SetObject(
235 const StructuredData::ObjectSP &object_sp) {
236 m_object_sp = object_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000237}
238
Kate Stoneb9c1b512016-09-06 20:57:50 +0000239void EventDataStructuredData::SetStructuredDataPlugin(
240 const lldb::StructuredDataPluginSP &plugin_sp) {
241 m_plugin_sp = plugin_sp;
Todd Fiala75930012016-08-19 04:21:48 +0000242}
243
Todd Fiala75930012016-08-19 04:21:48 +0000244// EventDataStructuredData static functions
Todd Fiala75930012016-08-19 04:21:48 +0000245
Kate Stoneb9c1b512016-09-06 20:57:50 +0000246const EventDataStructuredData *
247EventDataStructuredData::GetEventDataFromEvent(const Event *event_ptr) {
248 if (event_ptr == nullptr)
249 return nullptr;
Todd Fiala75930012016-08-19 04:21:48 +0000250
Kate Stoneb9c1b512016-09-06 20:57:50 +0000251 const EventData *event_data = event_ptr->GetData();
252 if (!event_data ||
253 event_data->GetFlavor() != EventDataStructuredData::GetFlavorString())
254 return nullptr;
Todd Fiala75930012016-08-19 04:21:48 +0000255
Kate Stoneb9c1b512016-09-06 20:57:50 +0000256 return static_cast<const EventDataStructuredData *>(event_data);
Todd Fiala75930012016-08-19 04:21:48 +0000257}
258
Kate Stoneb9c1b512016-09-06 20:57:50 +0000259ProcessSP EventDataStructuredData::GetProcessFromEvent(const Event *event_ptr) {
260 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
261 if (event_data)
262 return event_data->GetProcess();
263 else
264 return ProcessSP();
Todd Fiala75930012016-08-19 04:21:48 +0000265}
266
267StructuredData::ObjectSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000268EventDataStructuredData::GetObjectFromEvent(const Event *event_ptr) {
269 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
270 if (event_data)
271 return event_data->GetObject();
272 else
273 return StructuredData::ObjectSP();
Todd Fiala75930012016-08-19 04:21:48 +0000274}
275
276lldb::StructuredDataPluginSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000277EventDataStructuredData::GetPluginFromEvent(const Event *event_ptr) {
278 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
279 if (event_data)
280 return event_data->GetStructuredDataPlugin();
281 else
282 return StructuredDataPluginSP();
Todd Fiala75930012016-08-19 04:21:48 +0000283}
284
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000285ConstString EventDataStructuredData::GetFlavorString() {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000286 static ConstString s_flavor("EventDataStructuredData");
287 return s_flavor;
Todd Fiala75930012016-08-19 04:21:48 +0000288}