blob: 50cc7f061dc6a41b9e256f318f100efa498ac056 [file] [log] [blame]
Raphael Isemann80814282020-01-24 07:23:271//===-- Event.cpp ---------------------------------------------------------===//
Chris Lattner30fdc8d2010-06-08 16:52:242//
Chandler Carruth2946cd72019-01-19 08:50:563// 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:246//
7//===----------------------------------------------------------------------===//
8
Pavel Labath181b8232018-12-14 15:59:499#include "lldb/Utility/Event.h"
Eugene Zelenkoa74f37a2016-03-10 23:57:1210
Pavel Labath181b8232018-12-14 15:59:4911#include "lldb/Utility/Broadcaster.h"
Zachary Turner666cc0b2017-03-04 01:30:0512#include "lldb/Utility/DataExtractor.h"
Zachary Turner01c32432017-02-14 19:06:0713#include "lldb/Utility/Endian.h"
Zachary Turnerbf9a7732017-02-02 21:39:5014#include "lldb/Utility/Stream.h"
Jonas Devlieghere672d2c12018-11-11 23:16:4315#include "lldb/Utility/StreamString.h"
16#include "lldb/lldb-enumerations.h"
Zachary Turner2f3df612017-04-06 21:28:2917
18#include <algorithm>
19
Jonas Devlieghere672d2c12018-11-11 23:16:4320#include <ctype.h>
Chris Lattner30fdc8d2010-06-08 16:52:2421
22using namespace lldb;
23using namespace lldb_private;
24
Todd Fiala75930012016-08-19 04:21:4825#pragma mark -
26#pragma mark Event
27
Todd Fiala75930012016-08-19 04:21:4828// Event functions
Todd Fiala75930012016-08-19 04:21:4829
Kate Stoneb9c1b512016-09-06 20:57:5030Event::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:5233
Kate Stoneb9c1b512016-09-06 20:57:5034Event::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:2438
Kate Stoneb9c1b512016-09-06 20:57:5039Event::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:5241
Kate Stoneb9c1b512016-09-06 20:57:5042Event::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:2444
Eugene Zelenkoa74f37a2016-03-10 23:57:1245Event::~Event() = default;
Chris Lattner30fdc8d2010-06-08 16:52:2446
Kate Stoneb9c1b512016-09-06 20:57:5047void 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:2454
Kate Stoneb9c1b512016-09-06 20:57:5055 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:2462 event_name.GetData());
Eugene Zelenkoa74f37a2016-03-10 23:57:1263 else
Kate Stoneb9c1b512016-09-06 20:57:5064 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:2478}
79
Kate Stoneb9c1b512016-09-06 20:57:5080void Event::DoOnRemoval() {
81 if (m_data_sp)
82 m_data_sp->DoOnRemoval(this);
Chris Lattner30fdc8d2010-06-08 16:52:2483}
84
Todd Fiala75930012016-08-19 04:21:4885#pragma mark -
86#pragma mark EventData
87
Todd Fiala75930012016-08-19 04:21:4888// EventData functions
Todd Fiala75930012016-08-19 04:21:4889
Eugene Zelenkoa74f37a2016-03-10 23:57:1290EventData::EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:2491
Eugene Zelenkoa74f37a2016-03-10 23:57:1292EventData::~EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:2493
Kate Stoneb9c1b512016-09-06 20:57:5094void EventData::Dump(Stream *s) const { s->PutCString("Generic Event Data"); }
Chris Lattner30fdc8d2010-06-08 16:52:2495
Todd Fiala75930012016-08-19 04:21:4896#pragma mark -
97#pragma mark EventDataBytes
98
Todd Fiala75930012016-08-19 04:21:4899// EventDataBytes functions
Todd Fiala75930012016-08-19 04:21:48100
Kate Stoneb9c1b512016-09-06 20:57:50101EventDataBytes::EventDataBytes() : m_bytes() {}
Todd Fiala75930012016-08-19 04:21:48102
Kate Stoneb9c1b512016-09-06 20:57:50103EventDataBytes::EventDataBytes(const char *cstr) : m_bytes() {
104 SetBytesFromCString(cstr);
Chris Lattner30fdc8d2010-06-08 16:52:24105}
106
Zachary Turner514d8cd2016-09-23 18:06:53107EventDataBytes::EventDataBytes(llvm::StringRef str) : m_bytes() {
108 SetBytes(str.data(), str.size());
109}
110
Kate Stoneb9c1b512016-09-06 20:57:50111EventDataBytes::EventDataBytes(const void *src, size_t src_len) : m_bytes() {
112 SetBytes(src, src_len);
Chris Lattner30fdc8d2010-06-08 16:52:24113}
114
Eugene Zelenkoa74f37a2016-03-10 23:57:12115EventDataBytes::~EventDataBytes() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24116
Adrian Prantl0e4c4822019-03-06 21:22:25117ConstString EventDataBytes::GetFlavorString() {
Kate Stoneb9c1b512016-09-06 20:57:50118 static ConstString g_flavor("EventDataBytes");
119 return g_flavor;
Chris Lattner30fdc8d2010-06-08 16:52:24120}
121
Adrian Prantl0e4c4822019-03-06 21:22:25122ConstString EventDataBytes::GetFlavor() const {
Kate Stoneb9c1b512016-09-06 20:57:50123 return EventDataBytes::GetFlavorString();
Chris Lattner30fdc8d2010-06-08 16:52:24124}
125
Kate Stoneb9c1b512016-09-06 20:57:50126void EventDataBytes::Dump(Stream *s) const {
127 size_t num_printable_chars =
Raphael Isemannf5eaa2a2020-06-19 17:17:24128 std::count_if(m_bytes.begin(), m_bytes.end(), llvm::isPrint);
Pavel Labath082bab12018-07-24 10:49:14129 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:24136}
137
Kate Stoneb9c1b512016-09-06 20:57:50138const void *EventDataBytes::GetBytes() const {
139 return (m_bytes.empty() ? nullptr : m_bytes.data());
Chris Lattner30fdc8d2010-06-08 16:52:24140}
141
Kate Stoneb9c1b512016-09-06 20:57:50142size_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:11146 m_bytes.assign(static_cast<const char *>(src), src_len);
Kate Stoneb9c1b512016-09-06 20:57:50147 else
148 m_bytes.clear();
Chris Lattner30fdc8d2010-06-08 16:52:24149}
150
Kate Stoneb9c1b512016-09-06 20:57:50151void 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:24156}
157
Kate Stoneb9c1b512016-09-06 20:57:50158const 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:24163}
164
Kate Stoneb9c1b512016-09-06 20:57:50165size_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:24170}
171
172const EventDataBytes *
Kate Stoneb9c1b512016-09-06 20:57:50173EventDataBytes::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:24181}
182
Kate Stoneb9c1b512016-09-06 20:57:50183void EventDataBytes::SwapBytes(std::string &new_bytes) {
184 m_bytes.swap(new_bytes);
Caroline Tice969ed3d12011-05-02 20:41:46185}
Todd Fiala75930012016-08-19 04:21:48186
187#pragma mark -
188#pragma mark EventStructuredData
189
Todd Fiala75930012016-08-19 04:21:48190// EventDataStructuredData definitions
Todd Fiala75930012016-08-19 04:21:48191
Kate Stoneb9c1b512016-09-06 20:57:50192EventDataStructuredData::EventDataStructuredData()
193 : EventData(), m_process_sp(), m_object_sp(), m_plugin_sp() {}
Todd Fiala75930012016-08-19 04:21:48194
Kate Stoneb9c1b512016-09-06 20:57:50195EventDataStructuredData::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:48200
Kate Stoneb9c1b512016-09-06 20:57:50201EventDataStructuredData::~EventDataStructuredData() {}
Todd Fiala75930012016-08-19 04:21:48202
Todd Fiala75930012016-08-19 04:21:48203// EventDataStructuredData member functions
Todd Fiala75930012016-08-19 04:21:48204
Adrian Prantl0e4c4822019-03-06 21:22:25205ConstString EventDataStructuredData::GetFlavor() const {
Kate Stoneb9c1b512016-09-06 20:57:50206 return EventDataStructuredData::GetFlavorString();
Todd Fiala75930012016-08-19 04:21:48207}
208
Kate Stoneb9c1b512016-09-06 20:57:50209void EventDataStructuredData::Dump(Stream *s) const {
210 if (!s)
211 return;
Todd Fiala75930012016-08-19 04:21:48212
Kate Stoneb9c1b512016-09-06 20:57:50213 if (m_object_sp)
214 m_object_sp->Dump(*s);
Todd Fiala75930012016-08-19 04:21:48215}
216
Kate Stoneb9c1b512016-09-06 20:57:50217const ProcessSP &EventDataStructuredData::GetProcess() const {
218 return m_process_sp;
Todd Fiala75930012016-08-19 04:21:48219}
220
Kate Stoneb9c1b512016-09-06 20:57:50221const StructuredData::ObjectSP &EventDataStructuredData::GetObject() const {
222 return m_object_sp;
Todd Fiala75930012016-08-19 04:21:48223}
224
Kate Stoneb9c1b512016-09-06 20:57:50225const lldb::StructuredDataPluginSP &
226EventDataStructuredData::GetStructuredDataPlugin() const {
227 return m_plugin_sp;
Todd Fiala75930012016-08-19 04:21:48228}
229
Kate Stoneb9c1b512016-09-06 20:57:50230void EventDataStructuredData::SetProcess(const ProcessSP &process_sp) {
231 m_process_sp = process_sp;
Todd Fiala75930012016-08-19 04:21:48232}
233
Kate Stoneb9c1b512016-09-06 20:57:50234void EventDataStructuredData::SetObject(
235 const StructuredData::ObjectSP &object_sp) {
236 m_object_sp = object_sp;
Todd Fiala75930012016-08-19 04:21:48237}
238
Kate Stoneb9c1b512016-09-06 20:57:50239void EventDataStructuredData::SetStructuredDataPlugin(
240 const lldb::StructuredDataPluginSP &plugin_sp) {
241 m_plugin_sp = plugin_sp;
Todd Fiala75930012016-08-19 04:21:48242}
243
Todd Fiala75930012016-08-19 04:21:48244// EventDataStructuredData static functions
Todd Fiala75930012016-08-19 04:21:48245
Kate Stoneb9c1b512016-09-06 20:57:50246const EventDataStructuredData *
247EventDataStructuredData::GetEventDataFromEvent(const Event *event_ptr) {
248 if (event_ptr == nullptr)
249 return nullptr;
Todd Fiala75930012016-08-19 04:21:48250
Kate Stoneb9c1b512016-09-06 20:57:50251 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:48255
Kate Stoneb9c1b512016-09-06 20:57:50256 return static_cast<const EventDataStructuredData *>(event_data);
Todd Fiala75930012016-08-19 04:21:48257}
258
Kate Stoneb9c1b512016-09-06 20:57:50259ProcessSP 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:48265}
266
267StructuredData::ObjectSP
Kate Stoneb9c1b512016-09-06 20:57:50268EventDataStructuredData::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:48274}
275
276lldb::StructuredDataPluginSP
Kate Stoneb9c1b512016-09-06 20:57:50277EventDataStructuredData::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:48283}
284
Adrian Prantl0e4c4822019-03-06 21:22:25285ConstString EventDataStructuredData::GetFlavorString() {
Kate Stoneb9c1b512016-09-06 20:57:50286 static ConstString s_flavor("EventDataStructuredData");
287 return s_flavor;
Todd Fiala75930012016-08-19 04:21:48288}