xref: /openbsd-src/gnu/llvm/lldb/source/Core/DebuggerEvents.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1*f6aab3d8Srobert //===-- DebuggerEvents.cpp ------------------------------------------------===//
2*f6aab3d8Srobert //
3*f6aab3d8Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*f6aab3d8Srobert // See https://llvm.org/LICENSE.txt for license information.
5*f6aab3d8Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*f6aab3d8Srobert //
7*f6aab3d8Srobert //===----------------------------------------------------------------------===//
8*f6aab3d8Srobert 
9*f6aab3d8Srobert #include "lldb/Core/DebuggerEvents.h"
10*f6aab3d8Srobert #include "lldb/Core/Debugger.h"
11*f6aab3d8Srobert #include "lldb/Core/Module.h"
12*f6aab3d8Srobert #include "llvm/Support/WithColor.h"
13*f6aab3d8Srobert 
14*f6aab3d8Srobert using namespace lldb_private;
15*f6aab3d8Srobert using namespace lldb;
16*f6aab3d8Srobert 
17*f6aab3d8Srobert template <typename T>
GetEventDataFromEventImpl(const Event * event_ptr)18*f6aab3d8Srobert static const T *GetEventDataFromEventImpl(const Event *event_ptr) {
19*f6aab3d8Srobert   if (event_ptr)
20*f6aab3d8Srobert     if (const EventData *event_data = event_ptr->GetData())
21*f6aab3d8Srobert       if (event_data->GetFlavor() == T::GetFlavorString())
22*f6aab3d8Srobert         return static_cast<const T *>(event_ptr->GetData());
23*f6aab3d8Srobert   return nullptr;
24*f6aab3d8Srobert }
25*f6aab3d8Srobert 
GetFlavorString()26*f6aab3d8Srobert ConstString ProgressEventData::GetFlavorString() {
27*f6aab3d8Srobert   static ConstString g_flavor("ProgressEventData");
28*f6aab3d8Srobert   return g_flavor;
29*f6aab3d8Srobert }
30*f6aab3d8Srobert 
GetFlavor() const31*f6aab3d8Srobert ConstString ProgressEventData::GetFlavor() const {
32*f6aab3d8Srobert   return ProgressEventData::GetFlavorString();
33*f6aab3d8Srobert }
34*f6aab3d8Srobert 
Dump(Stream * s) const35*f6aab3d8Srobert void ProgressEventData::Dump(Stream *s) const {
36*f6aab3d8Srobert   s->Printf(" id = %" PRIu64 ", message = \"%s\"", m_id, m_message.c_str());
37*f6aab3d8Srobert   if (m_completed == 0 || m_completed == m_total)
38*f6aab3d8Srobert     s->Printf(", type = %s", m_completed == 0 ? "start" : "end");
39*f6aab3d8Srobert   else
40*f6aab3d8Srobert     s->PutCString(", type = update");
41*f6aab3d8Srobert   // If m_total is UINT64_MAX, there is no progress to report, just "start"
42*f6aab3d8Srobert   // and "end". If it isn't we will show the completed and total amounts.
43*f6aab3d8Srobert   if (m_total != UINT64_MAX)
44*f6aab3d8Srobert     s->Printf(", progress = %" PRIu64 " of %" PRIu64, m_completed, m_total);
45*f6aab3d8Srobert }
46*f6aab3d8Srobert 
47*f6aab3d8Srobert const ProgressEventData *
GetEventDataFromEvent(const Event * event_ptr)48*f6aab3d8Srobert ProgressEventData::GetEventDataFromEvent(const Event *event_ptr) {
49*f6aab3d8Srobert   return GetEventDataFromEventImpl<ProgressEventData>(event_ptr);
50*f6aab3d8Srobert }
51*f6aab3d8Srobert 
GetPrefix() const52*f6aab3d8Srobert llvm::StringRef DiagnosticEventData::GetPrefix() const {
53*f6aab3d8Srobert   switch (m_type) {
54*f6aab3d8Srobert   case Type::Info:
55*f6aab3d8Srobert     return "info";
56*f6aab3d8Srobert   case Type::Warning:
57*f6aab3d8Srobert     return "warning";
58*f6aab3d8Srobert   case Type::Error:
59*f6aab3d8Srobert     return "error";
60*f6aab3d8Srobert   }
61*f6aab3d8Srobert   llvm_unreachable("Fully covered switch above!");
62*f6aab3d8Srobert }
63*f6aab3d8Srobert 
Dump(Stream * s) const64*f6aab3d8Srobert void DiagnosticEventData::Dump(Stream *s) const {
65*f6aab3d8Srobert   llvm::HighlightColor color = m_type == Type::Warning
66*f6aab3d8Srobert                                    ? llvm::HighlightColor::Warning
67*f6aab3d8Srobert                                    : llvm::HighlightColor::Error;
68*f6aab3d8Srobert   llvm::WithColor(s->AsRawOstream(), color, llvm::ColorMode::Enable)
69*f6aab3d8Srobert       << GetPrefix();
70*f6aab3d8Srobert   *s << ": " << GetMessage() << '\n';
71*f6aab3d8Srobert   s->Flush();
72*f6aab3d8Srobert }
73*f6aab3d8Srobert 
GetFlavorString()74*f6aab3d8Srobert ConstString DiagnosticEventData::GetFlavorString() {
75*f6aab3d8Srobert   static ConstString g_flavor("DiagnosticEventData");
76*f6aab3d8Srobert   return g_flavor;
77*f6aab3d8Srobert }
78*f6aab3d8Srobert 
GetFlavor() const79*f6aab3d8Srobert ConstString DiagnosticEventData::GetFlavor() const {
80*f6aab3d8Srobert   return DiagnosticEventData::GetFlavorString();
81*f6aab3d8Srobert }
82*f6aab3d8Srobert 
83*f6aab3d8Srobert const DiagnosticEventData *
GetEventDataFromEvent(const Event * event_ptr)84*f6aab3d8Srobert DiagnosticEventData::GetEventDataFromEvent(const Event *event_ptr) {
85*f6aab3d8Srobert   return GetEventDataFromEventImpl<DiagnosticEventData>(event_ptr);
86*f6aab3d8Srobert }
87*f6aab3d8Srobert 
GetFlavorString()88*f6aab3d8Srobert ConstString SymbolChangeEventData::GetFlavorString() {
89*f6aab3d8Srobert   static ConstString g_flavor("SymbolChangeEventData");
90*f6aab3d8Srobert   return g_flavor;
91*f6aab3d8Srobert }
92*f6aab3d8Srobert 
GetFlavor() const93*f6aab3d8Srobert ConstString SymbolChangeEventData::GetFlavor() const {
94*f6aab3d8Srobert   return SymbolChangeEventData::GetFlavorString();
95*f6aab3d8Srobert }
96*f6aab3d8Srobert 
97*f6aab3d8Srobert const SymbolChangeEventData *
GetEventDataFromEvent(const Event * event_ptr)98*f6aab3d8Srobert SymbolChangeEventData::GetEventDataFromEvent(const Event *event_ptr) {
99*f6aab3d8Srobert   return GetEventDataFromEventImpl<SymbolChangeEventData>(event_ptr);
100*f6aab3d8Srobert }
101*f6aab3d8Srobert 
DoOnRemoval(Event * event_ptr)102*f6aab3d8Srobert void SymbolChangeEventData::DoOnRemoval(Event *event_ptr) {
103*f6aab3d8Srobert   DebuggerSP debugger_sp(m_debugger_wp.lock());
104*f6aab3d8Srobert   if (!debugger_sp)
105*f6aab3d8Srobert     return;
106*f6aab3d8Srobert 
107*f6aab3d8Srobert   for (TargetSP target_sp : debugger_sp->GetTargetList().Targets()) {
108*f6aab3d8Srobert     if (ModuleSP module_sp =
109*f6aab3d8Srobert             target_sp->GetImages().FindModule(m_module_spec.GetUUID())) {
110*f6aab3d8Srobert       {
111*f6aab3d8Srobert         std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
112*f6aab3d8Srobert         if (!module_sp->GetSymbolFileFileSpec())
113*f6aab3d8Srobert           module_sp->SetSymbolFileFileSpec(m_module_spec.GetSymbolFileSpec());
114*f6aab3d8Srobert       }
115*f6aab3d8Srobert       ModuleList module_list;
116*f6aab3d8Srobert       module_list.Append(module_sp);
117*f6aab3d8Srobert       target_sp->SymbolsDidLoad(module_list);
118*f6aab3d8Srobert     }
119*f6aab3d8Srobert   }
120*f6aab3d8Srobert }
121