blob: 96c1c56b10ff50ec0ca3425846d1325e4aaa66dd [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
16#include "lldb/Core/Event.h"
17#include "lldb/Core/Broadcaster.h"
18#include "lldb/Core/DataExtractor.h"
19#include "lldb/Core/Log.h"
20#include "lldb/Core/State.h"
21#include "lldb/Core/Stream.h"
Greg Clayton7fb56d02011-02-01 01:31:41 +000022#include "lldb/Host/Endian.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023#include "lldb/Target/Process.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
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035Event::Event (Broadcaster *broadcaster, uint32_t event_type, EventData *data) :
Greg Clayton1e20f022016-05-12 22:58:52 +000036 m_broadcaster_wp(broadcaster->GetBroadcasterImpl()),
37 m_type(event_type),
38 m_data_sp(data)
39{
40}
41
42Event::Event (Broadcaster *broadcaster, uint32_t event_type, const EventDataSP &event_data_sp) :
43 m_broadcaster_wp(broadcaster->GetBroadcasterImpl()),
44 m_type(event_type),
45 m_data_sp(event_data_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046{
47}
48
49Event::Event(uint32_t event_type, EventData *data) :
Greg Clayton1e20f022016-05-12 22:58:52 +000050 m_broadcaster_wp(),
51 m_type(event_type),
52 m_data_sp(data)
53{
54}
55
56Event::Event(uint32_t event_type, const EventDataSP &event_data_sp) :
57 m_broadcaster_wp(),
58 m_type(event_type),
59 m_data_sp(event_data_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060{
61}
62
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000063Event::~Event() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000064
65void
Chris Lattner30fdc8d2010-06-08 16:52:24 +000066Event::Dump (Stream *s) const
67{
Jim Ingham583bbb12016-03-07 21:50:25 +000068 Broadcaster *broadcaster;
69 Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock());
70 if (broadcaster_impl_sp)
71 broadcaster = broadcaster_impl_sp->GetBroadcaster();
72 else
73 broadcaster = nullptr;
74
75 if (broadcaster)
Greg Clayton6a3efac2012-10-29 18:08:18 +000076 {
77 StreamString event_name;
Jim Ingham583bbb12016-03-07 21:50:25 +000078 if (broadcaster->GetEventNames (event_name, m_type, false))
Greg Clayton6a3efac2012-10-29 18:08:18 +000079 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000080 static_cast<const void*>(this),
Jim Ingham583bbb12016-03-07 21:50:25 +000081 static_cast<void*>(broadcaster),
82 broadcaster->GetBroadcasterName().GetCString(),
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000083 m_type, event_name.GetString().c_str());
Greg Clayton6a3efac2012-10-29 18:08:18 +000084 else
85 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000086 static_cast<const void*>(this),
Jim Ingham583bbb12016-03-07 21:50:25 +000087 static_cast<void*>(broadcaster),
88 broadcaster->GetBroadcasterName().GetCString(), m_type);
Greg Clayton6a3efac2012-10-29 18:08:18 +000089 }
90 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000091 s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ",
92 static_cast<const void*>(this), m_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000093
Greg Clayton1e20f022016-05-12 22:58:52 +000094 if (m_data_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095 {
96 s->PutChar('{');
Greg Clayton1e20f022016-05-12 22:58:52 +000097 m_data_sp->Dump (s);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098 s->PutChar('}');
99 }
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000100 else
101 s->Printf ("<NULL>");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000102}
103
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000104void
105Event::DoOnRemoval ()
106{
Greg Clayton1e20f022016-05-12 22:58:52 +0000107 if (m_data_sp)
108 m_data_sp->DoOnRemoval (this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000109}
110
Todd Fiala75930012016-08-19 04:21:48 +0000111#pragma mark -
112#pragma mark EventData
113
114//------------------------------------------------------------------
115// EventData functions
116//------------------------------------------------------------------
117
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000118EventData::EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000119
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000120EventData::~EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000121
122void
123EventData::Dump (Stream *s) const
124{
125 s->PutCString ("Generic Event Data");
126}
127
Todd Fiala75930012016-08-19 04:21:48 +0000128#pragma mark -
129#pragma mark EventDataBytes
130
131//------------------------------------------------------------------
132// EventDataBytes functions
133//------------------------------------------------------------------
134
135
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000136EventDataBytes::EventDataBytes () :
137 m_bytes()
138{
139}
140
141EventDataBytes::EventDataBytes (const char *cstr) :
142 m_bytes()
143{
144 SetBytesFromCString (cstr);
145}
146
147EventDataBytes::EventDataBytes (const void *src, size_t src_len) :
148 m_bytes()
149{
150 SetBytes (src, src_len);
151}
152
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000153EventDataBytes::~EventDataBytes() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000154
155const ConstString &
156EventDataBytes::GetFlavorString ()
157{
158 static ConstString g_flavor ("EventDataBytes");
159 return g_flavor;
160}
161
162const ConstString &
163EventDataBytes::GetFlavor () const
164{
165 return EventDataBytes::GetFlavorString ();
166}
167
168void
169EventDataBytes::Dump (Stream *s) const
170{
171 size_t num_printable_chars = std::count_if (m_bytes.begin(), m_bytes.end(), isprint);
172 if (num_printable_chars == m_bytes.size())
173 {
174 s->Printf("\"%s\"", m_bytes.c_str());
175 }
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000176 else if (!m_bytes.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000177 {
178 DataExtractor data;
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000179 data.SetData(m_bytes.data(), m_bytes.size(), endian::InlHostByteOrder());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000180 data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS, 0, 0);
181 }
182}
183
184const void *
185EventDataBytes::GetBytes() const
186{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000187 return (m_bytes.empty() ? nullptr : m_bytes.data());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000188}
189
190size_t
191EventDataBytes::GetByteSize() const
192{
193 return m_bytes.size ();
194}
195
196void
197EventDataBytes::SetBytes (const void *src, size_t src_len)
198{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000199 if (src != nullptr && src_len > 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000200 m_bytes.assign ((const char *)src, src_len);
201 else
202 m_bytes.clear();
203}
204
205void
206EventDataBytes::SetBytesFromCString (const char *cstr)
207{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000208 if (cstr != nullptr && cstr[0])
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000209 m_bytes.assign (cstr);
210 else
211 m_bytes.clear();
212}
213
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000214const void *
215EventDataBytes::GetBytesFromEvent (const Event *event_ptr)
216{
217 const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000218 if (e != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000219 return e->GetBytes();
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000220 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000221}
222
223size_t
224EventDataBytes::GetByteSizeFromEvent (const Event *event_ptr)
225{
226 const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000227 if (e != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000228 return e->GetByteSize();
229 return 0;
230}
231
232const EventDataBytes *
233EventDataBytes::GetEventDataFromEvent (const Event *event_ptr)
234{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000235 if (event_ptr != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000236 {
237 const EventData *event_data = event_ptr->GetData();
238 if (event_data && event_data->GetFlavor() == EventDataBytes::GetFlavorString())
239 return static_cast <const EventDataBytes *> (event_data);
240 }
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000241 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000242}
243
Caroline Tice969ed3d2011-05-02 20:41:46 +0000244void
245EventDataBytes::SwapBytes (std::string &new_bytes)
246{
247 m_bytes.swap (new_bytes);
248}
Todd Fiala75930012016-08-19 04:21:48 +0000249
250#pragma mark -
251#pragma mark EventStructuredData
252
253//------------------------------------------------------------------
254// EventDataStructuredData definitions
255//------------------------------------------------------------------
256
257EventDataStructuredData::EventDataStructuredData() :
258 EventData(),
259 m_process_sp(),
260 m_object_sp(),
261 m_plugin_sp()
262{
263}
264
265EventDataStructuredData::EventDataStructuredData(const ProcessSP &process_sp,
266 const StructuredData::ObjectSP
267 &object_sp,
268 const
269 lldb::StructuredDataPluginSP
270 &plugin_sp) :
271 EventData(),
272 m_process_sp(process_sp),
273 m_object_sp(object_sp),
274 m_plugin_sp(plugin_sp)
275{
276}
277
278EventDataStructuredData::~EventDataStructuredData()
279{
280}
281
282//------------------------------------------------------------------
283// EventDataStructuredData member functions
284//------------------------------------------------------------------
285
286const ConstString &
287EventDataStructuredData::GetFlavor() const
288{
289 return EventDataStructuredData::GetFlavorString();
290}
291
292void
293EventDataStructuredData::Dump(Stream *s) const
294{
295 if (!s)
296 return;
297
298 if (m_object_sp)
299 m_object_sp->Dump(*s);
300}
301
302const ProcessSP&
303EventDataStructuredData::GetProcess() const
304{
305 return m_process_sp;
306}
307
308const StructuredData::ObjectSP&
309EventDataStructuredData::GetObject() const
310{
311 return m_object_sp;
312}
313
314const lldb::StructuredDataPluginSP&
315EventDataStructuredData::GetStructuredDataPlugin() const
316{
317 return m_plugin_sp;
318}
319
320void
321EventDataStructuredData::SetProcess(const ProcessSP &process_sp)
322{
323 m_process_sp = process_sp;
324}
325
326void
327EventDataStructuredData::SetObject(const StructuredData::ObjectSP &object_sp)
328{
329 m_object_sp = object_sp;
330}
331
332void
333EventDataStructuredData::SetStructuredDataPlugin(const
334 lldb::StructuredDataPluginSP
335 &plugin_sp)
336{
337 m_plugin_sp = plugin_sp;
338}
339
340//------------------------------------------------------------------
341// EventDataStructuredData static functions
342//------------------------------------------------------------------
343
344const EventDataStructuredData*
345EventDataStructuredData::GetEventDataFromEvent(const Event *event_ptr)
346{
347 if (event_ptr == nullptr)
348 return nullptr;
349
350 const EventData *event_data = event_ptr->GetData();
351 if (!event_data || event_data->GetFlavor() !=
352 EventDataStructuredData::GetFlavorString())
353 return nullptr;
354
355 return static_cast<const EventDataStructuredData*>(event_data);
356}
357
358ProcessSP
359EventDataStructuredData::GetProcessFromEvent(const Event *event_ptr)
360{
361 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
362 if (event_data)
363 return event_data->GetProcess();
364 else
365 return ProcessSP();
366}
367
368StructuredData::ObjectSP
369EventDataStructuredData::GetObjectFromEvent(const Event *event_ptr)
370{
371 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
372 if (event_data)
373 return event_data->GetObject();
374 else
375 return StructuredData::ObjectSP();
376}
377
378lldb::StructuredDataPluginSP
379EventDataStructuredData::GetPluginFromEvent(const Event *event_ptr)
380{
381 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
382 if (event_data)
383 return event_data->GetStructuredDataPlugin();
384 else
385 return StructuredDataPluginSP();
386}
387
388const ConstString &
389EventDataStructuredData::GetFlavorString ()
390{
391 static ConstString s_flavor("EventDataStructuredData");
392 return s_flavor;
393}
394
395