//===-- Log.h ---------------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLDB_UTILITY_LOG_H #define LLDB_UTILITY_LOG_H #include "lldb/Utility/Flags.h" #include "lldb/lldb-defines.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Error.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/RWMutex.h" #include <atomic> #include <cstdarg> #include <cstdint> #include <memory> #include <mutex> #include <string> #include <type_traits> namespace llvm { class raw_ostream; } // Logging Options #define LLDB_LOG_OPTION_VERBOSE … #define LLDB_LOG_OPTION_PREPEND_SEQUENCE … #define LLDB_LOG_OPTION_PREPEND_TIMESTAMP … #define LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD … #define LLDB_LOG_OPTION_PREPEND_THREAD_NAME … #define LLDB_LOG_OPTION_BACKTRACE … #define LLDB_LOG_OPTION_APPEND … #define LLDB_LOG_OPTION_PREPEND_FILE_FUNCTION … // Logging Functions namespace lldb_private { class LogHandler { … }; class StreamLogHandler : public LogHandler { … }; class CallbackLogHandler : public LogHandler { … }; class RotatingLogHandler : public LogHandler { … }; /// A T-style log handler that multiplexes messages to two log handlers. class TeeLogHandler : public LogHandler { … }; class Log final { … }; // Must be specialized for a particular log type. template <typename Cat> Log::Channel &LogChannelFor() = delete; /// Retrieve the Log object for the channel associated with the given log enum. /// /// Returns a valid Log object if any of the provided categories are enabled. /// Otherwise, returns nullptr. template <typename Cat> Log *GetLog(Cat mask) { … } } // namespace lldb_private /// The LLDB_LOG* macros defined below are the way to emit log messages. /// /// Note that the macros surround the arguments in a check for the log /// being on, so you can freely call methods in arguments without affecting /// the non-log execution flow. /// /// If you need to do more complex computations to prepare the log message /// be sure to add your own if (log) check, since we don't want logging to /// have any effect when not on. /// /// However, the LLDB_LOG macro uses the llvm::formatv system (see the /// ProgrammersManual page in the llvm docs for more details). This allows /// the use of "format_providers" to auto-format datatypes, and there are /// already formatters for some of the llvm and lldb datatypes. /// /// So if you need to do non-trivial formatting of one of these types, be /// sure to grep the lldb and llvm sources for "format_provider" to see if /// there is already a formatter before doing in situ formatting, and if /// possible add a provider if one does not already exist. #define LLDB_LOG(log, ...) … #define LLDB_LOGF(log, ...) … #define LLDB_LOGV(log, ...) … // Write message to log, if error is set. In the log message refer to the error // with {0}. Error is cleared regardless of whether logging is enabled. #define LLDB_LOG_ERROR(log, error, ...) … // Write message to the verbose log, if error is set. In the log // message refer to the error with {0}. Error is cleared regardless of // whether logging is enabled. #define LLDB_LOG_ERRORV(log, error, ...) … #endif // LLDB_UTILITY_LOG_H