1254721Semaste//===-- ProcessPOSIXLog.h -----------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_ProcessPOSIXLog_h_
11254721Semaste#define liblldb_ProcessPOSIXLog_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste// C++ Includes
15254721Semaste// Other libraries and framework includes
16254721Semaste
17254721Semaste// Project includes
18254721Semaste#include "lldb/Core/Log.h"
19254721Semaste
20254721Semaste#define POSIX_LOG_VERBOSE                  (1u << 0)
21254721Semaste#define POSIX_LOG_PROCESS                  (1u << 1)
22254721Semaste#define POSIX_LOG_THREAD                   (1u << 2)
23254721Semaste#define POSIX_LOG_PACKETS                  (1u << 3)
24254721Semaste#define POSIX_LOG_MEMORY                   (1u << 4)    // Log memory reads/writes calls
25254721Semaste#define POSIX_LOG_MEMORY_DATA_SHORT        (1u << 5)    // Log short memory reads/writes bytes
26254721Semaste#define POSIX_LOG_MEMORY_DATA_LONG         (1u << 6)    // Log all memory reads/writes bytes
27254721Semaste#define POSIX_LOG_BREAKPOINTS              (1u << 7)
28254721Semaste#define POSIX_LOG_WATCHPOINTS              (1u << 8)
29254721Semaste#define POSIX_LOG_STEP                     (1u << 9)
30254721Semaste#define POSIX_LOG_COMM                     (1u << 10)
31254721Semaste#define POSIX_LOG_ASYNC                    (1u << 11)
32254721Semaste#define POSIX_LOG_PTRACE                   (1u << 12)
33254721Semaste#define POSIX_LOG_REGISTERS                (1u << 13)
34254721Semaste#define POSIX_LOG_ALL                      (UINT32_MAX)
35254721Semaste#define POSIX_LOG_DEFAULT                  POSIX_LOG_PACKETS
36254721Semaste
37254721Semaste// The size which determines "short memory reads/writes".
38254721Semaste#define POSIX_LOG_MEMORY_SHORT_BYTES       (4 * sizeof(ptrdiff_t))
39254721Semaste
40254721Semasteclass ProcessPOSIXLog
41254721Semaste{
42254721Semaste    static int m_nestinglevel;
43254721Semaste    static const char *m_pluginname;
44254721Semaste
45254721Semastepublic:
46254721Semaste    static void
47254721Semaste    RegisterPluginName(const char *pluginName)
48254721Semaste    {
49254721Semaste        m_pluginname = pluginName;
50254721Semaste    }
51254721Semaste
52254721Semaste    static void
53254721Semaste    RegisterPluginName(lldb_private::ConstString pluginName)
54254721Semaste        {
55254721Semaste            m_pluginname = pluginName.GetCString();
56254721Semaste        }
57254721Semaste
58254721Semaste    static lldb_private::Log *
59254721Semaste    GetLogIfAllCategoriesSet(uint32_t mask = 0);
60254721Semaste
61254721Semaste    static void
62254721Semaste    DisableLog (const char **args, lldb_private::Stream *feedback_strm);
63254721Semaste
64254721Semaste    static lldb_private::Log *
65254721Semaste    EnableLog (lldb::StreamSP &log_stream_sp, uint32_t log_options,
66254721Semaste               const char **args, lldb_private::Stream *feedback_strm);
67254721Semaste
68254721Semaste    static void
69254721Semaste    ListLogCategories (lldb_private::Stream *strm);
70254721Semaste
71254721Semaste    static void
72254721Semaste    LogIf (uint32_t mask, const char *format, ...);
73254721Semaste
74254721Semaste    // The following functions can be used to enable the client to limit
75254721Semaste    // logging to only the top level function calls.  This is useful for
76254721Semaste    // recursive functions.  FIXME: not thread safe!
77254721Semaste    //     Example:
78254721Semaste    //     void NestingFunc() {
79254721Semaste    //         LogSP log (ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_ALL));
80254721Semaste    //         if (log)
81254721Semaste    //         {
82254721Semaste    //             ProcessPOSIXLog::IncNestLevel();
83254721Semaste    //             if (ProcessPOSIXLog::AtTopNestLevel())
84254721Semaste    //                 log->Print(msg);
85254721Semaste    //         }
86254721Semaste    //         NestingFunc();
87254721Semaste    //         if (log)
88254721Semaste    //             ProcessPOSIXLog::DecNestLevel();
89254721Semaste    //     }
90254721Semaste
91254721Semaste    static bool
92254721Semaste    AtTopNestLevel()
93254721Semaste    {
94254721Semaste        return m_nestinglevel == 1;
95254721Semaste    }
96254721Semaste
97254721Semaste    static void
98254721Semaste    IncNestLevel()
99254721Semaste    {
100254721Semaste        ++m_nestinglevel;
101254721Semaste    }
102254721Semaste
103254721Semaste    static void
104254721Semaste    DecNestLevel()
105254721Semaste    {
106254721Semaste        --m_nestinglevel;
107254721Semaste        assert(m_nestinglevel >= 0);
108254721Semaste    }
109254721Semaste};
110254721Semaste
111254721Semaste#endif  // liblldb_ProcessPOSIXLog_h_
112