blob: 6b07e4d919874730430aa8ea910448af2024c555 [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
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028Event::Event (Broadcaster *broadcaster, uint32_t event_type, EventData *data) :
Greg Clayton1e20f022016-05-12 22:58:52 +000029 m_broadcaster_wp(broadcaster->GetBroadcasterImpl()),
30 m_type(event_type),
31 m_data_sp(data)
32{
33}
34
35Event::Event (Broadcaster *broadcaster, uint32_t event_type, const EventDataSP &event_data_sp) :
36 m_broadcaster_wp(broadcaster->GetBroadcasterImpl()),
37 m_type(event_type),
38 m_data_sp(event_data_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039{
40}
41
42Event::Event(uint32_t event_type, EventData *data) :
Greg Clayton1e20f022016-05-12 22:58:52 +000043 m_broadcaster_wp(),
44 m_type(event_type),
45 m_data_sp(data)
46{
47}
48
49Event::Event(uint32_t event_type, const EventDataSP &event_data_sp) :
50 m_broadcaster_wp(),
51 m_type(event_type),
52 m_data_sp(event_data_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000053{
54}
55
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000056Event::~Event() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057
58void
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059Event::Dump (Stream *s) const
60{
Jim Ingham583bbb12016-03-07 21:50:25 +000061 Broadcaster *broadcaster;
62 Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock());
63 if (broadcaster_impl_sp)
64 broadcaster = broadcaster_impl_sp->GetBroadcaster();
65 else
66 broadcaster = nullptr;
67
68 if (broadcaster)
Greg Clayton6a3efac2012-10-29 18:08:18 +000069 {
70 StreamString event_name;
Jim Ingham583bbb12016-03-07 21:50:25 +000071 if (broadcaster->GetEventNames (event_name, m_type, false))
Greg Clayton6a3efac2012-10-29 18:08:18 +000072 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000073 static_cast<const void*>(this),
Jim Ingham583bbb12016-03-07 21:50:25 +000074 static_cast<void*>(broadcaster),
75 broadcaster->GetBroadcasterName().GetCString(),
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000076 m_type, event_name.GetString().c_str());
Greg Clayton6a3efac2012-10-29 18:08:18 +000077 else
78 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000079 static_cast<const void*>(this),
Jim Ingham583bbb12016-03-07 21:50:25 +000080 static_cast<void*>(broadcaster),
81 broadcaster->GetBroadcasterName().GetCString(), m_type);
Greg Clayton6a3efac2012-10-29 18:08:18 +000082 }
83 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000084 s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ",
85 static_cast<const void*>(this), m_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000086
Greg Clayton1e20f022016-05-12 22:58:52 +000087 if (m_data_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000088 {
89 s->PutChar('{');
Greg Clayton1e20f022016-05-12 22:58:52 +000090 m_data_sp->Dump (s);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000091 s->PutChar('}');
92 }
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +000093 else
94 s->Printf ("<NULL>");
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095}
96
Chris Lattner30fdc8d2010-06-08 16:52:24 +000097void
98Event::DoOnRemoval ()
99{
Greg Clayton1e20f022016-05-12 22:58:52 +0000100 if (m_data_sp)
101 m_data_sp->DoOnRemoval (this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000102}
103
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000104EventData::EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000105
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000106EventData::~EventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000107
108void
109EventData::Dump (Stream *s) const
110{
111 s->PutCString ("Generic Event Data");
112}
113
114EventDataBytes::EventDataBytes () :
115 m_bytes()
116{
117}
118
119EventDataBytes::EventDataBytes (const char *cstr) :
120 m_bytes()
121{
122 SetBytesFromCString (cstr);
123}
124
125EventDataBytes::EventDataBytes (const void *src, size_t src_len) :
126 m_bytes()
127{
128 SetBytes (src, src_len);
129}
130
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000131EventDataBytes::~EventDataBytes() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000132
133const ConstString &
134EventDataBytes::GetFlavorString ()
135{
136 static ConstString g_flavor ("EventDataBytes");
137 return g_flavor;
138}
139
140const ConstString &
141EventDataBytes::GetFlavor () const
142{
143 return EventDataBytes::GetFlavorString ();
144}
145
146void
147EventDataBytes::Dump (Stream *s) const
148{
149 size_t num_printable_chars = std::count_if (m_bytes.begin(), m_bytes.end(), isprint);
150 if (num_printable_chars == m_bytes.size())
151 {
152 s->Printf("\"%s\"", m_bytes.c_str());
153 }
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000154 else if (!m_bytes.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155 {
156 DataExtractor data;
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000157 data.SetData(m_bytes.data(), m_bytes.size(), endian::InlHostByteOrder());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000158 data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS, 0, 0);
159 }
160}
161
162const void *
163EventDataBytes::GetBytes() const
164{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000165 return (m_bytes.empty() ? nullptr : m_bytes.data());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166}
167
168size_t
169EventDataBytes::GetByteSize() const
170{
171 return m_bytes.size ();
172}
173
174void
175EventDataBytes::SetBytes (const void *src, size_t src_len)
176{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000177 if (src != nullptr && src_len > 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000178 m_bytes.assign ((const char *)src, src_len);
179 else
180 m_bytes.clear();
181}
182
183void
184EventDataBytes::SetBytesFromCString (const char *cstr)
185{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000186 if (cstr != nullptr && cstr[0])
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000187 m_bytes.assign (cstr);
188 else
189 m_bytes.clear();
190}
191
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000192const void *
193EventDataBytes::GetBytesFromEvent (const Event *event_ptr)
194{
195 const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000196 if (e != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000197 return e->GetBytes();
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000198 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000199}
200
201size_t
202EventDataBytes::GetByteSizeFromEvent (const Event *event_ptr)
203{
204 const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000205 if (e != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000206 return e->GetByteSize();
207 return 0;
208}
209
210const EventDataBytes *
211EventDataBytes::GetEventDataFromEvent (const Event *event_ptr)
212{
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000213 if (event_ptr != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000214 {
215 const EventData *event_data = event_ptr->GetData();
216 if (event_data && event_data->GetFlavor() == EventDataBytes::GetFlavorString())
217 return static_cast <const EventDataBytes *> (event_data);
218 }
Eugene Zelenkoa74f37a2016-03-10 23:57:12 +0000219 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000220}
221
Caroline Tice969ed3d2011-05-02 20:41:46 +0000222void
223EventDataBytes::SwapBytes (std::string &new_bytes)
224{
225 m_bytes.swap (new_bytes);
226}