1 //===-- StructuredDataDarwinLog.h -------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H
10 #define LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H
11 
12 #include "lldb/Target/StructuredDataPlugin.h"
13 
14 #include <mutex>
15 
16 // Forward declarations
17 namespace sddarwinlog_private {
18 class EnableCommand;
19 }
20 
21 namespace lldb_private {
22 
23 class StructuredDataDarwinLog : public StructuredDataPlugin {
24   friend sddarwinlog_private::EnableCommand;
25 
26 public:
27   // Public static API
28 
29   static void Initialize();
30 
31   static void Terminate();
32 
33   static llvm::StringRef GetStaticPluginName() { return "darwin-log"; }
34 
35   /// Return whether the DarwinLog functionality is enabled.
36   ///
37   /// The DarwinLog functionality is enabled if the user explicitly enabled
38   /// it with the enable command, or if the user has the setting set
39   /// that controls if we always enable it for newly created/attached
40   /// processes.
41   ///
42   /// \return
43   ///      True if DarwinLog support is/will be enabled for existing or
44   ///      newly launched/attached processes.
45   static bool IsEnabled();
46 
47   // PluginInterface API
48 
49   llvm::StringRef GetPluginName() override { return GetStaticPluginName(); }
50 
51   // StructuredDataPlugin API
52 
53   bool SupportsStructuredDataType(llvm::StringRef type_name) override;
54 
55   void HandleArrivalOfStructuredData(
56       Process &process, llvm::StringRef type_name,
57       const StructuredData::ObjectSP &object_sp) override;
58 
59   Status GetDescription(const StructuredData::ObjectSP &object_sp,
60                         lldb_private::Stream &stream) override;
61 
62   bool GetEnabled(llvm::StringRef type_name) const override;
63 
64   void ModulesDidLoad(Process &process, ModuleList &module_list) override;
65 
66   ~StructuredDataDarwinLog() override;
67 
68 private:
69   // Private constructors
70 
71   StructuredDataDarwinLog(const lldb::ProcessWP &process_wp);
72 
73   // Private static methods
74 
75   static lldb::StructuredDataPluginSP CreateInstance(Process &process);
76 
77   static void DebuggerInitialize(Debugger &debugger);
78 
79   static bool InitCompletionHookCallback(void *baton,
80                                          StoppointCallbackContext *context,
81                                          lldb::user_id_t break_id,
82                                          lldb::user_id_t break_loc_id);
83 
84   static Status FilterLaunchInfo(ProcessLaunchInfo &launch_info,
85                                  Target *target);
86 
87   // Internal helper methods used by friend classes
88   void SetEnabled(bool enabled);
89 
90   void AddInitCompletionHook(Process &process);
91 
92   // Private methods
93 
94   void DumpTimestamp(Stream &stream, uint64_t timestamp);
95 
96   size_t DumpHeader(Stream &stream, const StructuredData::Dictionary &event);
97 
98   size_t HandleDisplayOfEvent(const StructuredData::Dictionary &event,
99                               Stream &stream);
100 
101   /// Call the enable command again, using whatever settings were initially
102   /// made.
103 
104   void EnableNow();
105 
106   // Private data
107   bool m_recorded_first_timestamp;
108   uint64_t m_first_timestamp_seen;
109   bool m_is_enabled;
110   std::mutex m_added_breakpoint_mutex;
111   bool m_added_breakpoint;
112   lldb::user_id_t m_breakpoint_id;
113 };
114 }
115 
116 #endif // LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H
117