From c1592658d574e5fe693fc4ba2cd7537b1b72671e Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Wed, 29 Apr 2015 22:55:28 +0000 Subject: [PATCH] Introduce a NullLog class, which ignores all messages. The purpose of this class is so that GetLogIfAllCategoriesSet can always return an instance of some class, whether it be a real logging class or a "null" class, which ignores messages. Code that is littered with if statements that only log if the pointer is non-null can get very unwieldy very quickly, so this should help code readability in such circumstances. Since I'm in this code anyway, I'm also deleting the PrintfWithFlags methods, as well as all the flags, since they appear to be dead code that have been superceded by newer mechanisms and all the flags are simply ignored. llvm-svn: 236174 --- lldb/include/lldb/Core/Log.h | 135 ++++++++------------ lldb/include/lldb/Core/NullLog.h | 58 +++++++++ lldb/source/Core/CMakeLists.txt | 1 + lldb/source/Core/Log.cpp | 208 ++++++++++++++----------------- lldb/source/Core/NullLog.cpp | 74 +++++++++++ 5 files changed, 279 insertions(+), 197 deletions(-) create mode 100644 lldb/include/lldb/Core/NullLog.h create mode 100644 lldb/source/Core/NullLog.cpp diff --git a/lldb/include/lldb/Core/Log.h b/lldb/include/lldb/Core/Log.h index e63633ba44e8..73feb9579c47 100644 --- a/lldb/include/lldb/Core/Log.h +++ b/lldb/include/lldb/Core/Log.h @@ -25,17 +25,6 @@ #include "lldb/Core/Logging.h" #include "lldb/Core/PluginInterface.h" -//---------------------------------------------------------------------- -// Logging types -//---------------------------------------------------------------------- -#define LLDB_LOG_FLAG_STDOUT (1u << 0) -#define LLDB_LOG_FLAG_STDERR (1u << 1) -#define LLDB_LOG_FLAG_FATAL (1u << 2) -#define LLDB_LOG_FLAG_ERROR (1u << 3) -#define LLDB_LOG_FLAG_WARNING (1u << 4) -#define LLDB_LOG_FLAG_DEBUG (1u << 5) -#define LLDB_LOG_FLAG_VERBOSE (1u << 6) - //---------------------------------------------------------------------- // Logging Options //---------------------------------------------------------------------- @@ -61,12 +50,10 @@ public: //------------------------------------------------------------------ // Callback definitions for abstracted plug-in log access. //------------------------------------------------------------------ - typedef void (*DisableCallback) (const char **categories, Stream *feedback_strm); - typedef Log * (*EnableCallback) (lldb::StreamSP &log_stream_sp, - uint32_t log_options, - const char **categories, - Stream *feedback_strm); - typedef void (*ListCategoriesCallback) (Stream *strm); + typedef void (*DisableCallback)(const char **categories, Stream *feedback_strm); + typedef Log *(*EnableCallback)(lldb::StreamSP &log_stream_sp, uint32_t log_options, const char **categories, + Stream *feedback_strm); + typedef void (*ListCategoriesCallback)(Stream *strm); struct Callbacks { @@ -79,86 +66,78 @@ public: // Static accessors for logging channels //------------------------------------------------------------------ static void - RegisterLogChannel (const ConstString &channel, - const Log::Callbacks &log_callbacks); + RegisterLogChannel(const ConstString &channel, const Log::Callbacks &log_callbacks); static bool - UnregisterLogChannel (const ConstString &channel); + UnregisterLogChannel(const ConstString &channel); static bool - GetLogChannelCallbacks (const ConstString &channel, - Log::Callbacks &log_callbacks); - + GetLogChannelCallbacks(const ConstString &channel, Log::Callbacks &log_callbacks); static void - EnableAllLogChannels (lldb::StreamSP &log_stream_sp, - uint32_t log_options, - const char **categories, - Stream *feedback_strm); + EnableAllLogChannels(lldb::StreamSP &log_stream_sp, uint32_t log_options, const char **categories, + Stream *feedback_strm); static void - DisableAllLogChannels (Stream *feedback_strm); + DisableAllLogChannels(Stream *feedback_strm); static void - ListAllLogChannels (Stream *strm); + ListAllLogChannels(Stream *strm); static void - Initialize (); + Initialize(); static void - Terminate (); - + Terminate(); + //------------------------------------------------------------------ // Auto completion //------------------------------------------------------------------ static void - AutoCompleteChannelName (const char *channel_name, - StringList &matches); + AutoCompleteChannelName(const char *channel_name, StringList &matches); //------------------------------------------------------------------ // Member functions //------------------------------------------------------------------ - Log (); + Log(); - Log (const lldb::StreamSP &stream_sp); + Log(const lldb::StreamSP &stream_sp); - ~Log (); + virtual + ~Log(); - void - PutCString (const char *cstr); + virtual void + PutCString(const char *cstr); - void - Printf (const char *format, ...) __attribute__ ((format (printf, 2, 3))); + virtual void + Printf(const char *format, ...) __attribute__((format(printf, 2, 3))); - void - VAPrintf (const char *format, va_list args); + virtual void + VAPrintf(const char *format, va_list args); - void - PrintfWithFlags( uint32_t flags, const char *format, ...) __attribute__ ((format (printf, 3, 4))); + virtual void + LogIf(uint32_t mask, const char *fmt, ...) __attribute__((format(printf, 3, 4))); - void - LogIf (uint32_t mask, const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); + virtual void + Debug(const char *fmt, ...) __attribute__((format(printf, 2, 3))); - void - Debug (const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); + virtual void + DebugVerbose(const char *fmt, ...) __attribute__((format(printf, 2, 3))); - void - DebugVerbose (const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); + virtual void + Error(const char *fmt, ...) __attribute__((format(printf, 2, 3))); - void - Error (const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); + virtual void + FatalError(int err, const char *fmt, ...) __attribute__((format(printf, 3, 4))); - void - FatalError (int err, const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); + virtual void + Verbose(const char *fmt, ...) __attribute__((format(printf, 2, 3))); - void - Verbose (const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); + virtual void + Warning(const char *fmt, ...) __attribute__((format(printf, 2, 3))); - void - Warning (const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); - - void - WarningVerbose (const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); + virtual void + WarningVerbose(const char *fmt, ...) __attribute__((format(printf, 2, 3))); Flags & GetOptions(); @@ -179,7 +158,7 @@ public: GetDebug() const; void - SetStream (const lldb::StreamSP &stream_sp) + SetStream(const lldb::StreamSP &stream_sp) { m_stream_sp = stream_sp; } @@ -192,43 +171,35 @@ protected: Flags m_options; Flags m_mask_bits; - void - PrintfWithFlagsVarArg (uint32_t flags, const char *format, va_list args); - private: - DISALLOW_COPY_AND_ASSIGN (Log); + DISALLOW_COPY_AND_ASSIGN(Log); }; class LogChannel : public PluginInterface { public: - LogChannel (); + LogChannel(); - virtual - ~LogChannel (); + virtual ~LogChannel(); - static lldb::LogChannelSP - FindPlugin (const char *plugin_name); + static lldb::LogChannelSP FindPlugin(const char *plugin_name); // categories is a an array of chars that ends with a NULL element. - virtual void - Disable (const char **categories, Stream *feedback_strm) = 0; + virtual void Disable(const char **categories, Stream *feedback_strm) = 0; - virtual bool - Enable (lldb::StreamSP &log_stream_sp, - uint32_t log_options, - Stream *feedback_strm, // Feedback stream for argument errors etc - const char **categories) = 0;// The categories to enable within this logging stream, if empty, enable default set + virtual bool Enable( + lldb::StreamSP &log_stream_sp, uint32_t log_options, + Stream *feedback_strm, // Feedback stream for argument errors etc + const char **categories) = 0; // The categories to enable within this logging stream, if empty, enable default set - virtual void - ListCategories (Stream *strm) = 0; + virtual void ListCategories(Stream *strm) = 0; protected: std::unique_ptr m_log_ap; private: - DISALLOW_COPY_AND_ASSIGN (LogChannel); + DISALLOW_COPY_AND_ASSIGN(LogChannel); }; diff --git a/lldb/include/lldb/Core/NullLog.h b/lldb/include/lldb/Core/NullLog.h new file mode 100644 index 000000000000..06526239e7b1 --- /dev/null +++ b/lldb/include/lldb/Core/NullLog.h @@ -0,0 +1,58 @@ +//===-- NullLog.h -----------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_Core_NullLog_H_ +#define liblldb_Core_NullLog_H_ + +#include "lldb/Core/Log.h" + +//---------------------------------------------------------------------- +// Logging Functions +//---------------------------------------------------------------------- +namespace lldb_private +{ + +class NullLog : public Log +{ + NullLog(NullLog &) = delete; + NullLog &operator=(NullLog &) = delete; + + public: + //------------------------------------------------------------------ + // Member functions + //------------------------------------------------------------------ + NullLog(); + ~NullLog(); + + void PutCString(const char *cstr) override; + + void Printf(const char *format, ...) override __attribute__((format(printf, 2, 3))); + + void VAPrintf(const char *format, va_list args) override; + + void LogIf(uint32_t mask, const char *fmt, ...) override __attribute__((format(printf, 3, 4))); + + void Debug(const char *fmt, ...) override __attribute__((format(printf, 2, 3))); + + void DebugVerbose(const char *fmt, ...) override __attribute__((format(printf, 2, 3))); + + void Error(const char *fmt, ...) override __attribute__((format(printf, 2, 3))); + + void FatalError(int err, const char *fmt, ...) override __attribute__((format(printf, 3, 4))); + + void Verbose(const char *fmt, ...) override __attribute__((format(printf, 2, 3))); + + void Warning(const char *fmt, ...) override __attribute__((format(printf, 2, 3))); + + void WarningVerbose(const char *fmt, ...) override __attribute__((format(printf, 2, 3))); +}; + +} // namespace lldb_private + +#endif // liblldb_Core_NullLog_H_ diff --git a/lldb/source/Core/CMakeLists.txt b/lldb/source/Core/CMakeLists.txt index 8a62fc35842e..50398823f422 100644 --- a/lldb/source/Core/CMakeLists.txt +++ b/lldb/source/Core/CMakeLists.txt @@ -38,6 +38,7 @@ add_lldb_library(lldbCore Module.cpp ModuleChild.cpp ModuleList.cpp + NullLog.cpp Opcode.cpp PluginManager.cpp RegisterValue.cpp diff --git a/lldb/source/Core/Log.cpp b/lldb/source/Core/Log.cpp index 57b888a3bacc..fde7bee16061 100644 --- a/lldb/source/Core/Log.cpp +++ b/lldb/source/Core/Log.cpp @@ -77,6 +77,23 @@ Log::GetMask() const return m_mask_bits; } +void +Log::PutCString(const char *cstr) +{ + Printf("%s", cstr); +} + +//---------------------------------------------------------------------- +// Simple variable argument logging with flags. +//---------------------------------------------------------------------- +void +Log::Printf(const char *format, ...) +{ + va_list args; + va_start(args, format); + VAPrintf(format, args); + va_end(args); +} //---------------------------------------------------------------------- // All logging eventually boils down to this function call. If we have @@ -84,7 +101,7 @@ Log::GetMask() const // a valid file handle, we also log to the file. //---------------------------------------------------------------------- void -Log::PrintfWithFlagsVarArg (uint32_t flags, const char *format, va_list args) +Log::VAPrintf(const char *format, va_list args) { // Make a copy of our stream shared pointer in case someone disables our // log while we are logging and releases the stream @@ -136,59 +153,20 @@ Log::PrintfWithFlagsVarArg (uint32_t flags, const char *format, va_list args) } } - -void -Log::PutCString (const char *cstr) -{ - Printf ("%s", cstr); -} - - -//---------------------------------------------------------------------- -// Simple variable argument logging with flags. -//---------------------------------------------------------------------- -void -Log::Printf(const char *format, ...) -{ - va_list args; - va_start (args, format); - PrintfWithFlagsVarArg (0, format, args); - va_end (args); -} - -void -Log::VAPrintf (const char *format, va_list args) -{ - PrintfWithFlagsVarArg (0, format, args); -} - - -//---------------------------------------------------------------------- -// Simple variable argument logging with flags. -//---------------------------------------------------------------------- -void -Log::PrintfWithFlags (uint32_t flags, const char *format, ...) -{ - va_list args; - va_start (args, format); - PrintfWithFlagsVarArg (flags, format, args); - va_end (args); -} - //---------------------------------------------------------------------- // Print debug strings if and only if the global debug option is set to // a non-zero value. //---------------------------------------------------------------------- void -Log::Debug (const char *format, ...) +Log::Debug(const char *format, ...) { - if (GetOptions().Test(LLDB_LOG_OPTION_DEBUG)) - { - va_list args; - va_start (args, format); - PrintfWithFlagsVarArg (LLDB_LOG_FLAG_DEBUG, format, args); - va_end (args); - } + if (!GetOptions().Test(LLDB_LOG_OPTION_DEBUG)) + return; + + va_list args; + va_start(args, format); + VAPrintf(format, args); + va_end(args); } @@ -197,15 +175,15 @@ Log::Debug (const char *format, ...) // a non-zero value. //---------------------------------------------------------------------- void -Log::DebugVerbose (const char *format, ...) +Log::DebugVerbose(const char *format, ...) { - if (GetOptions().AllSet (LLDB_LOG_OPTION_DEBUG | LLDB_LOG_OPTION_VERBOSE)) - { - va_list args; - va_start (args, format); - PrintfWithFlagsVarArg (LLDB_LOG_FLAG_DEBUG | LLDB_LOG_FLAG_VERBOSE, format, args); - va_end (args); - } + if (!GetOptions().AllSet(LLDB_LOG_OPTION_DEBUG | LLDB_LOG_OPTION_VERBOSE)) + return; + + va_list args; + va_start(args, format); + VAPrintf(format, args); + va_end(args); } @@ -213,34 +191,34 @@ Log::DebugVerbose (const char *format, ...) // Log only if all of the bits are set //---------------------------------------------------------------------- void -Log::LogIf (uint32_t bits, const char *format, ...) +Log::LogIf(uint32_t bits, const char *format, ...) { - if (m_options.AllSet (bits)) - { - va_list args; - va_start (args, format); - PrintfWithFlagsVarArg (0, format, args); - va_end (args); - } + if (!m_options.AllSet(bits)) + return; + + va_list args; + va_start(args, format); + VAPrintf(format, args); + va_end(args); } //---------------------------------------------------------------------- // Printing of errors that are not fatal. //---------------------------------------------------------------------- void -Log::Error (const char *format, ...) +Log::Error(const char *format, ...) { - char *arg_msg = NULL; + char *arg_msg = nullptr; va_list args; - va_start (args, format); - ::vasprintf (&arg_msg, format, args); - va_end (args); + va_start(args, format); + ::vasprintf(&arg_msg, format, args); + va_end(args); - if (arg_msg != NULL) - { - PrintfWithFlags (LLDB_LOG_FLAG_ERROR, "error: %s", arg_msg); - free (arg_msg); - } + if (arg_msg == nullptr) + return; + + VAPrintf("error: %s", arg_msg); + free(arg_msg); } //---------------------------------------------------------------------- @@ -248,20 +226,20 @@ Log::Error (const char *format, ...) // immediately. //---------------------------------------------------------------------- void -Log::FatalError (int err, const char *format, ...) +Log::FatalError(int err, const char *format, ...) { - char *arg_msg = NULL; + char *arg_msg = nullptr; va_list args; - va_start (args, format); - ::vasprintf (&arg_msg, format, args); - va_end (args); + va_start(args, format); + ::vasprintf(&arg_msg, format, args); + va_end(args); - if (arg_msg != NULL) + if (arg_msg != nullptr) { - PrintfWithFlags (LLDB_LOG_FLAG_ERROR | LLDB_LOG_FLAG_FATAL, "error: %s", arg_msg); - ::free (arg_msg); + VAPrintf("error: %s", arg_msg); + ::free(arg_msg); } - ::exit (err); + ::exit(err); } @@ -270,15 +248,15 @@ Log::FatalError (int err, const char *format, ...) // enabled. //---------------------------------------------------------------------- void -Log::Verbose (const char *format, ...) +Log::Verbose(const char *format, ...) { - if (m_options.Test(LLDB_LOG_OPTION_VERBOSE)) - { - va_list args; - va_start (args, format); - PrintfWithFlagsVarArg (LLDB_LOG_FLAG_VERBOSE, format, args); - va_end (args); - } + if (!m_options.Test(LLDB_LOG_OPTION_VERBOSE)) + return; + + va_list args; + va_start(args, format); + VAPrintf(format, args); + va_end(args); } //---------------------------------------------------------------------- @@ -286,40 +264,40 @@ Log::Verbose (const char *format, ...) // enabled. //---------------------------------------------------------------------- void -Log::WarningVerbose (const char *format, ...) +Log::WarningVerbose(const char *format, ...) { - if (m_options.Test(LLDB_LOG_OPTION_VERBOSE)) - { - char *arg_msg = NULL; - va_list args; - va_start (args, format); - ::vasprintf (&arg_msg, format, args); - va_end (args); + if (!m_options.Test(LLDB_LOG_OPTION_VERBOSE)) + return; - if (arg_msg != NULL) - { - PrintfWithFlags (LLDB_LOG_FLAG_WARNING | LLDB_LOG_FLAG_VERBOSE, "warning: %s", arg_msg); - free (arg_msg); - } - } + char *arg_msg = nullptr; + va_list args; + va_start(args, format); + ::vasprintf(&arg_msg, format, args); + va_end(args); + + if (arg_msg == nullptr) + return; + + VAPrintf("warning: %s", arg_msg); + free(arg_msg); } //---------------------------------------------------------------------- // Printing of warnings that are not fatal. //---------------------------------------------------------------------- void -Log::Warning (const char *format, ...) +Log::Warning(const char *format, ...) { - char *arg_msg = NULL; + char *arg_msg = nullptr; va_list args; - va_start (args, format); - ::vasprintf (&arg_msg, format, args); - va_end (args); + va_start(args, format); + ::vasprintf(&arg_msg, format, args); + va_end(args); - if (arg_msg != NULL) - { - PrintfWithFlags (LLDB_LOG_FLAG_WARNING, "warning: %s", arg_msg); - free (arg_msg); - } + if (arg_msg == nullptr) + return; + + VAPrintf("warning: %s", arg_msg); + free(arg_msg); } typedef std::map CallbackMap; diff --git a/lldb/source/Core/NullLog.cpp b/lldb/source/Core/NullLog.cpp new file mode 100644 index 000000000000..01a3142de67b --- /dev/null +++ b/lldb/source/Core/NullLog.cpp @@ -0,0 +1,74 @@ +//===-- NullLog.cpp ---------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Core/NullLog.h" + +using namespace lldb_private; + +NullLog::NullLog() +{ +} +NullLog::~NullLog() +{ +} + +void +NullLog::PutCString(const char *cstr) +{ +} + +void +NullLog::Printf(const char *format, ...) +{ +} + +void +NullLog::VAPrintf(const char *format, va_list args) +{ +} + +void +NullLog::LogIf(uint32_t mask, const char *fmt, ...) +{ +} + +void +NullLog::Debug(const char *fmt, ...) +{ +} + +void +NullLog::DebugVerbose(const char *fmt, ...) +{ +} + +void +NullLog::Error(const char *fmt, ...) +{ +} + +void +NullLog::FatalError(int err, const char *fmt, ...) +{ +} + +void +NullLog::Verbose(const char *fmt, ...) +{ +} + +void +NullLog::Warning(const char *fmt, ...) +{ +} + +void +NullLog::WarningVerbose(const char *fmt, ...) +{ +}