124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Event.cpp -----------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Broadcaster.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 20cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 22a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <algorithm> 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Event constructor 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent::Event (Broadcaster *broadcaster, uint32_t event_type, EventData *data) : 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_broadcaster (broadcaster), 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_type (event_type), 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_ap (data) 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent::Event(uint32_t event_type, EventData *data) : 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_broadcaster (NULL), // Set by the broadcaster when this event gets broadcast 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_type (event_type), 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_ap (data) 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Event destructor 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent::~Event () 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent::Dump (Stream *s) const 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton if (m_broadcaster) 56a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton { 57a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton StreamString event_name; 58a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton if (m_broadcaster->GetEventNames (event_name, m_type, false)) 59a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ", 60a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton this, 61a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton m_broadcaster, 62a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton m_broadcaster->GetBroadcasterName().GetCString(), 63a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton m_type, 64a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton event_name.GetString().c_str()); 65a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton else 66a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ", 67a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton this, 68a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton m_broadcaster, 69a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton m_broadcaster->GetBroadcasterName().GetCString(), 70a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton m_type); 71a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton } 72a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton else 73a95527593e33bf97b3a0ac7c6b81b7ab9fec8199Greg Clayton s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ", this, m_type); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_data_ap.get() == NULL) 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf ("<NULL>"); 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar('{'); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_ap->Dump (s); 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar('}'); 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent::DoOnRemoval () 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_data_ap.get()) 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_ap->DoOnRemoval (this); 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventData::EventData() 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventData::~EventData() 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventData::Dump (Stream *s) const 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutCString ("Generic Event Data"); 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::EventDataBytes () : 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bytes() 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::EventDataBytes (const char *cstr) : 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bytes() 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetBytesFromCString (cstr); 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::EventDataBytes (const void *src, size_t src_len) : 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bytes() 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetBytes (src, src_len); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::~EventDataBytes() 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::GetFlavorString () 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString g_flavor ("EventDataBytes"); 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_flavor; 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::GetFlavor () const 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return EventDataBytes::GetFlavorString (); 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::Dump (Stream *s) const 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_printable_chars = std::count_if (m_bytes.begin(), m_bytes.end(), isprint); 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_printable_chars == m_bytes.size()) 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("\"%s\"", m_bytes.c_str()); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton else if (m_bytes.size() > 0) 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataExtractor data; 151cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton data.SetData(&m_bytes[0], m_bytes.size(), lldb::endian::InlHostByteOrder()); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS, 0, 0); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst void * 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::GetBytes() const 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_bytes.empty()) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 16153d68e749f0715691a95f23e9490d97e484b15daGreg Clayton return &m_bytes[0]; 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::GetByteSize() const 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_bytes.size (); 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::SetBytes (const void *src, size_t src_len) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (src && src_len > 0) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bytes.assign ((const char *)src, src_len); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bytes.clear(); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::SetBytesFromCString (const char *cstr) 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cstr && cstr[0]) 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bytes.assign (cstr); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bytes.clear(); 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst void * 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::GetBytesFromEvent (const Event *event_ptr) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EventDataBytes *e = GetEventDataFromEvent (event_ptr); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (e) 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return e->GetBytes(); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::GetByteSizeFromEvent (const Event *event_ptr) 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EventDataBytes *e = GetEventDataFromEvent (event_ptr); 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (e) 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return e->GetByteSize(); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst EventDataBytes * 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEventDataBytes::GetEventDataFromEvent (const Event *event_ptr) 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EventData *event_data = event_ptr->GetData(); 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_data && event_data->GetFlavor() == EventDataBytes::GetFlavorString()) 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast <const EventDataBytes *> (event_data); 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2194a348081030cdd2af758fddc869518357d9befd3Caroline Ticevoid 2204a348081030cdd2af758fddc869518357d9befd3Caroline TiceEventDataBytes::SwapBytes (std::string &new_bytes) 2214a348081030cdd2af758fddc869518357d9befd3Caroline Tice{ 2224a348081030cdd2af758fddc869518357d9befd3Caroline Tice m_bytes.swap (new_bytes); 2234a348081030cdd2af758fddc869518357d9befd3Caroline Tice} 2244a348081030cdd2af758fddc869518357d9befd3Caroline Tice 2254a348081030cdd2af758fddc869518357d9befd3Caroline Tice 226