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