1061da546Spatrick //===-- StructuredDataDarwinLog.h -------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H 11061da546Spatrick 12061da546Spatrick #include "lldb/Target/StructuredDataPlugin.h" 13061da546Spatrick 14061da546Spatrick #include <mutex> 15061da546Spatrick 16061da546Spatrick // Forward declarations 17061da546Spatrick namespace sddarwinlog_private { 18061da546Spatrick class EnableCommand; 19061da546Spatrick } 20061da546Spatrick 21061da546Spatrick namespace lldb_private { 22061da546Spatrick 23061da546Spatrick class StructuredDataDarwinLog : public StructuredDataPlugin { 24061da546Spatrick friend sddarwinlog_private::EnableCommand; 25061da546Spatrick 26061da546Spatrick public: 27061da546Spatrick // Public static API 28061da546Spatrick 29061da546Spatrick static void Initialize(); 30061da546Spatrick 31061da546Spatrick static void Terminate(); 32061da546Spatrick GetStaticPluginName()33*f6aab3d8Srobert static llvm::StringRef GetStaticPluginName() { return "darwin-log"; } 34061da546Spatrick 35061da546Spatrick /// Return whether the DarwinLog functionality is enabled. 36061da546Spatrick /// 37dda28197Spatrick /// The DarwinLog functionality is enabled if the user explicitly enabled 38061da546Spatrick /// it with the enable command, or if the user has the setting set 39061da546Spatrick /// that controls if we always enable it for newly created/attached 40061da546Spatrick /// processes. 41061da546Spatrick /// 42061da546Spatrick /// \return 43061da546Spatrick /// True if DarwinLog support is/will be enabled for existing or 44061da546Spatrick /// newly launched/attached processes. 45061da546Spatrick static bool IsEnabled(); 46061da546Spatrick 47061da546Spatrick // PluginInterface API 48061da546Spatrick GetPluginName()49*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetStaticPluginName(); } 50061da546Spatrick 51061da546Spatrick // StructuredDataPlugin API 52061da546Spatrick 53061da546Spatrick bool SupportsStructuredDataType(ConstString type_name) override; 54061da546Spatrick 55061da546Spatrick void HandleArrivalOfStructuredData( 56061da546Spatrick Process &process, ConstString type_name, 57061da546Spatrick const StructuredData::ObjectSP &object_sp) override; 58061da546Spatrick 59061da546Spatrick Status GetDescription(const StructuredData::ObjectSP &object_sp, 60061da546Spatrick lldb_private::Stream &stream) override; 61061da546Spatrick 62061da546Spatrick bool GetEnabled(ConstString type_name) const override; 63061da546Spatrick 64061da546Spatrick void ModulesDidLoad(Process &process, ModuleList &module_list) override; 65061da546Spatrick 66061da546Spatrick ~StructuredDataDarwinLog() override; 67061da546Spatrick 68061da546Spatrick private: 69061da546Spatrick // Private constructors 70061da546Spatrick 71061da546Spatrick StructuredDataDarwinLog(const lldb::ProcessWP &process_wp); 72061da546Spatrick 73061da546Spatrick // Private static methods 74061da546Spatrick 75061da546Spatrick static lldb::StructuredDataPluginSP CreateInstance(Process &process); 76061da546Spatrick 77061da546Spatrick static void DebuggerInitialize(Debugger &debugger); 78061da546Spatrick 79061da546Spatrick static bool InitCompletionHookCallback(void *baton, 80061da546Spatrick StoppointCallbackContext *context, 81061da546Spatrick lldb::user_id_t break_id, 82061da546Spatrick lldb::user_id_t break_loc_id); 83061da546Spatrick 84061da546Spatrick static Status FilterLaunchInfo(ProcessLaunchInfo &launch_info, 85061da546Spatrick Target *target); 86061da546Spatrick 87061da546Spatrick // Internal helper methods used by friend classes 88061da546Spatrick void SetEnabled(bool enabled); 89061da546Spatrick 90061da546Spatrick void AddInitCompletionHook(Process &process); 91061da546Spatrick 92061da546Spatrick // Private methods 93061da546Spatrick 94061da546Spatrick void DumpTimestamp(Stream &stream, uint64_t timestamp); 95061da546Spatrick 96061da546Spatrick size_t DumpHeader(Stream &stream, const StructuredData::Dictionary &event); 97061da546Spatrick 98061da546Spatrick size_t HandleDisplayOfEvent(const StructuredData::Dictionary &event, 99061da546Spatrick Stream &stream); 100061da546Spatrick 101061da546Spatrick /// Call the enable command again, using whatever settings were initially 102061da546Spatrick /// made. 103061da546Spatrick 104061da546Spatrick void EnableNow(); 105061da546Spatrick 106061da546Spatrick // Private data 107061da546Spatrick bool m_recorded_first_timestamp; 108061da546Spatrick uint64_t m_first_timestamp_seen; 109061da546Spatrick bool m_is_enabled; 110061da546Spatrick std::mutex m_added_breakpoint_mutex; 111061da546Spatrick bool m_added_breakpoint; 112061da546Spatrick lldb::user_id_t m_breakpoint_id; 113061da546Spatrick }; 114061da546Spatrick } 115061da546Spatrick 116dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H 117