Home | History | Annotate | Download | only in Core
      1 //===-- Log.h ---------------------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_Log_h_
     11 #define liblldb_Log_h_
     12 
     13 // C Includes
     14 #include <stdbool.h>
     15 #include <stdint.h>
     16 #include <signal.h>
     17 #include <stdio.h>
     18 #include <unistd.h>
     19 
     20 // C++ Includes
     21 // Other libraries and framework includes
     22 // Project includes
     23 #include "lldb/lldb-private.h"
     24 #include "lldb/Core/ConstString.h"
     25 #include "lldb/Core/Flags.h"
     26 #include "lldb/Core/PluginInterface.h"
     27 
     28 //----------------------------------------------------------------------
     29 // Logging types
     30 //----------------------------------------------------------------------
     31 #define LLDB_LOG_FLAG_STDOUT    (1u << 0)
     32 #define LLDB_LOG_FLAG_STDERR    (1u << 1)
     33 #define LLDB_LOG_FLAG_FATAL     (1u << 2)
     34 #define LLDB_LOG_FLAG_ERROR     (1u << 3)
     35 #define LLDB_LOG_FLAG_WARNING   (1u << 4)
     36 #define LLDB_LOG_FLAG_DEBUG     (1u << 5)
     37 #define LLDB_LOG_FLAG_VERBOSE   (1u << 6)
     38 
     39 //----------------------------------------------------------------------
     40 // Logging Options
     41 //----------------------------------------------------------------------
     42 #define LLDB_LOG_OPTION_THREADSAFE              (1u << 0)
     43 #define LLDB_LOG_OPTION_VERBOSE                 (1u << 1)
     44 #define LLDB_LOG_OPTION_DEBUG                   (1u << 2)
     45 #define LLDB_LOG_OPTION_PREPEND_SEQUENCE        (1u << 3)
     46 #define LLDB_LOG_OPTION_PREPEND_TIMESTAMP       (1u << 4)
     47 #define LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD (1u << 5)
     48 #define LLDB_LOG_OPTION_PREPEND_THREAD_NAME     (1U << 6)
     49 #define LLDB_LOG_OPTION_BACKTRACE               (1U << 7)
     50 
     51 //----------------------------------------------------------------------
     52 // Logging Functions
     53 //----------------------------------------------------------------------
     54 namespace lldb_private {
     55 
     56 class Log
     57 {
     58 public:
     59 
     60     //------------------------------------------------------------------
     61     // Callback definitions for abstracted plug-in log access.
     62     //------------------------------------------------------------------
     63     typedef void (*DisableCallback) (const char **categories, Stream *feedback_strm);
     64     typedef Log * (*EnableCallback) (lldb::StreamSP &log_stream_sp,
     65                                      uint32_t log_options,
     66                                      const char **categories,
     67                                      Stream *feedback_strm);
     68     typedef void (*ListCategoriesCallback) (Stream *strm);
     69 
     70     struct Callbacks
     71     {
     72         DisableCallback disable;
     73         EnableCallback enable;
     74         ListCategoriesCallback list_categories;
     75     };
     76 
     77     //------------------------------------------------------------------
     78     // Static accessors for logging channels
     79     //------------------------------------------------------------------
     80     static void
     81     RegisterLogChannel (const ConstString &channel,
     82                         const Log::Callbacks &log_callbacks);
     83 
     84     static bool
     85     UnregisterLogChannel (const ConstString &channel);
     86 
     87     static bool
     88     GetLogChannelCallbacks (const ConstString &channel,
     89                             Log::Callbacks &log_callbacks);
     90 
     91 
     92     static void
     93     EnableAllLogChannels (lldb::StreamSP &log_stream_sp,
     94                           uint32_t log_options,
     95                           const char **categories,
     96                           Stream *feedback_strm);
     97 
     98     static void
     99     DisableAllLogChannels (Stream *feedback_strm);
    100 
    101     static void
    102     ListAllLogChannels (Stream *strm);
    103 
    104     static void
    105     Initialize ();
    106 
    107     static void
    108     Terminate ();
    109 
    110     //------------------------------------------------------------------
    111     // Auto completion
    112     //------------------------------------------------------------------
    113     static void
    114     AutoCompleteChannelName (const char *channel_name,
    115                              StringList &matches);
    116 
    117     //------------------------------------------------------------------
    118     // Member functions
    119     //------------------------------------------------------------------
    120     Log ();
    121 
    122     Log (const lldb::StreamSP &stream_sp);
    123 
    124     ~Log ();
    125 
    126     void
    127     PutCString (const char *cstr);
    128 
    129     void
    130     Printf (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
    131 
    132     void
    133     VAPrintf (const char *format, va_list args);
    134 
    135     void
    136     PrintfWithFlags( uint32_t flags, const char *format, ...)  __attribute__ ((format (printf, 3, 4)));
    137 
    138     void
    139     LogIf (uint32_t mask, const char *fmt, ...)  __attribute__ ((format (printf, 3, 4)));
    140 
    141     void
    142     Debug (const char *fmt, ...)  __attribute__ ((format (printf, 2, 3)));
    143 
    144     void
    145     DebugVerbose (const char *fmt, ...)  __attribute__ ((format (printf, 2, 3)));
    146 
    147     void
    148     Error (const char *fmt, ...)  __attribute__ ((format (printf, 2, 3)));
    149 
    150     void
    151     FatalError (int err, const char *fmt, ...)  __attribute__ ((format (printf, 3, 4)));
    152 
    153     void
    154     Verbose (const char *fmt, ...)  __attribute__ ((format (printf, 2, 3)));
    155 
    156     void
    157     Warning (const char *fmt, ...)  __attribute__ ((format (printf, 2, 3)));
    158 
    159     void
    160     WarningVerbose (const char *fmt, ...)  __attribute__ ((format (printf, 2, 3)));
    161 
    162     Flags &
    163     GetOptions();
    164 
    165     const Flags &
    166     GetOptions() const;
    167 
    168     Flags &
    169     GetMask();
    170 
    171     const Flags &
    172     GetMask() const;
    173 
    174     bool
    175     GetVerbose() const;
    176 
    177     bool
    178     GetDebug() const;
    179 
    180     void
    181     SetStream (const lldb::StreamSP &stream_sp)
    182     {
    183         m_stream_sp = stream_sp;
    184     }
    185 
    186 protected:
    187     //------------------------------------------------------------------
    188     // Member variables
    189     //------------------------------------------------------------------
    190     lldb::StreamSP m_stream_sp;
    191     Flags m_options;
    192     Flags m_mask_bits;
    193 
    194     void
    195     PrintfWithFlagsVarArg (uint32_t flags, const char *format, va_list args);
    196 
    197 private:
    198     DISALLOW_COPY_AND_ASSIGN (Log);
    199 };
    200 
    201 
    202 class LogChannel : public PluginInterface
    203 {
    204 public:
    205     LogChannel ();
    206 
    207     virtual
    208     ~LogChannel ();
    209 
    210     static lldb::LogChannelSP
    211     FindPlugin (const char *plugin_name);
    212 
    213     // categories is a an array of chars that ends with a NULL element.
    214     virtual void
    215     Disable (const char **categories, Stream *feedback_strm) = 0;
    216 
    217     virtual bool
    218     Enable (lldb::StreamSP &log_stream_sp,
    219             uint32_t log_options,
    220             Stream *feedback_strm,      // Feedback stream for argument errors etc
    221             const char **categories) = 0;// The categories to enable within this logging stream, if empty, enable default set
    222 
    223     virtual void
    224     ListCategories (Stream *strm) = 0;
    225 
    226 protected:
    227     std::unique_ptr<Log> m_log_ap;
    228 
    229 private:
    230     DISALLOW_COPY_AND_ASSIGN (LogChannel);
    231 };
    232 
    233 
    234 } // namespace lldb_private
    235 
    236 #endif  // liblldb_Log_H_
    237