//===-- ProcessWindowsLog.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_ProcessWindowsLog_h_
#define liblldb_ProcessWindowsLog_h_

#include "lldb/Core/Log.h"

#define WINDOWS_LOG_VERBOSE     (1u << 0)
#define WINDOWS_LOG_PROCESS     (1u << 1)    // Log process operations
#define WINDOWS_LOG_EXCEPTION   (1u << 1)    // Log exceptions
#define WINDOWS_LOG_THREAD      (1u << 2)    // Log thread operations
#define WINDOWS_LOG_MEMORY      (1u << 3)    // Log memory reads/writes calls
#define WINDOWS_LOG_BREAKPOINTS (1u << 4)    // Log breakpoint operations
#define WINDOWS_LOG_STEP        (1u << 5)    // Log step operations
#define WINDOWS_LOG_REGISTERS   (1u << 6)    // Log register operations
#define WINDOWS_LOG_EVENT       (1u << 7)    // Low level debug events
#define WINDOWS_LOG_ALL         (UINT32_MAX)

enum class LogMaskReq
{
    All,
    Any
};

class ProcessWindowsLog
{
    static const char *m_pluginname;

public:
    // ---------------------------------------------------------------------
    // Public Static Methods
    // ---------------------------------------------------------------------
    static void
    Initialize();

    static void
    Terminate();

    static void
    RegisterPluginName(const char *pluginName)
    {
        m_pluginname = pluginName;
    }

    static void
    RegisterPluginName(lldb_private::ConstString pluginName)
    {
        m_pluginname = pluginName.GetCString();
    }

    static bool
    TestLogFlags(uint32_t mask, LogMaskReq req);

    static lldb_private::Log *
    GetLog();

    static void
    DisableLog(const char **args, lldb_private::Stream *feedback_strm);

    static lldb_private::Log *
    EnableLog(lldb::StreamSP &log_stream_sp, uint32_t log_options,
               const char **args, lldb_private::Stream *feedback_strm);

    static void
    ListLogCategories(lldb_private::Stream *strm);
};

#define WINLOGF_IF(Flags, Req, Method, ...)              \
    {                                                    \
        if (ProcessWindowsLog::TestLogFlags(Flags, Req)) \
        {                                                \
            Log *log = ProcessWindowsLog::GetLog();      \
            if (log)                                     \
                log->Method(__VA_ARGS__);                \
        }                                                \
    }

#define WINLOG_IFANY(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::Any, Printf, __VA_ARGS__)
#define WINLOG_IFALL(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::All, Printf, __VA_ARGS__)
#define WINLOGV_IFANY(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::Any, Verbose, __VA_ARGS__)
#define WINLOGV_IFALL(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::All, Verbose, __VA_ARGS__)
#define WINLOGD_IFANY(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::Any, Debug, __VA_ARGS__)
#define WINLOGD_IFALL(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::All, Debug, __VA_ARGS__)
#define WINERR_IFANY(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::Any, Error, __VA_ARGS__)
#define WINERR_IFALL(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::All, Error, __VA_ARGS__)
#define WINWARN_IFANY(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::Any, Warning, __VA_ARGS__)
#define WINWARN_IFALL(Flags, ...) WINLOGF_IF(Flags, LogMaskReq::All, Warning, __VA_ARGS__)

#endif  // liblldb_ProcessWindowsLog_h_
