//===-- Logging.cpp -------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

#include "lldb/Utility/Logging.h"
#include "lldb/Utility/Log.h"

#include "llvm/ADT/ArrayRef.h"

#include <stdarg.h>

using namespace lldb_private;

static constexpr Log::Category g_categories[] = {
  {{"api"}, {"log API calls and return values"}, LIBLLDB_LOG_API},
  {{"ast"}, {"log AST"}, LIBLLDB_LOG_AST},
  {{"break"}, {"log breakpoints"}, LIBLLDB_LOG_BREAKPOINTS},
  {{"commands"}, {"log command argument parsing"}, LIBLLDB_LOG_COMMANDS},
  {{"comm"}, {"log communication activities"}, LIBLLDB_LOG_COMMUNICATION},
  {{"conn"}, {"log connection details"}, LIBLLDB_LOG_CONNECTION},
  {{"demangle"}, {"log mangled names to catch demangler crashes"}, LIBLLDB_LOG_DEMANGLE},
  {{"dyld"}, {"log shared library related activities"}, LIBLLDB_LOG_DYNAMIC_LOADER},
  {{"event"}, {"log broadcaster, listener and event queue activities"}, LIBLLDB_LOG_EVENTS},
  {{"expr"}, {"log expressions"}, LIBLLDB_LOG_EXPRESSIONS},
  {{"formatters"}, {"log data formatters related activities"}, LIBLLDB_LOG_DATAFORMATTERS},
  {{"host"}, {"log host activities"}, LIBLLDB_LOG_HOST},
  {{"jit"}, {"log JIT events in the target"}, LIBLLDB_LOG_JIT_LOADER},
  {{"language"}, {"log language runtime events"}, LIBLLDB_LOG_LANGUAGE},
  {{"mmap"}, {"log mmap related activities"}, LIBLLDB_LOG_MMAP},
  {{"module"}, {"log module activities such as when modules are created, destroyed, replaced, and more"}, LIBLLDB_LOG_MODULES},
  {{"object"}, {"log object construction/destruction for important objects"}, LIBLLDB_LOG_OBJECT},
  {{"os"}, {"log OperatingSystem plugin related activities"}, LIBLLDB_LOG_OS},
  {{"platform"}, {"log platform events and activities"}, LIBLLDB_LOG_PLATFORM},
  {{"process"}, {"log process events and activities"}, LIBLLDB_LOG_PROCESS},
  {{"script"}, {"log events about the script interpreter"}, LIBLLDB_LOG_SCRIPT},
  {{"state"}, {"log private and public process state changes"}, LIBLLDB_LOG_STATE},
  {{"step"}, {"log step related activities"}, LIBLLDB_LOG_STEP},
  {{"symbol"}, {"log symbol related issues and warnings"}, LIBLLDB_LOG_SYMBOLS},
  {{"system-runtime"}, {"log system runtime events"}, LIBLLDB_LOG_SYSTEM_RUNTIME},
  {{"target"}, {"log target events and activities"}, LIBLLDB_LOG_TARGET},
  {{"temp"}, {"log internal temporary debug messages"}, LIBLLDB_LOG_TEMPORARY},
  {{"thread"}, {"log thread events and activities"}, LIBLLDB_LOG_THREAD},
  {{"types"}, {"log type system related activities"}, LIBLLDB_LOG_TYPES},
  {{"unwind"}, {"log stack unwind activities"}, LIBLLDB_LOG_UNWIND},
  {{"watch"}, {"log watchpoint related activities"}, LIBLLDB_LOG_WATCHPOINTS},
};

static Log::Channel g_log_channel(g_categories, LIBLLDB_LOG_DEFAULT);

void lldb_private::InitializeLldbChannel() {
  Log::Register("lldb", g_log_channel);
}

Log *lldb_private::GetLogIfAllCategoriesSet(uint32_t mask) {
  return g_log_channel.GetLogIfAll(mask);
}

Log *lldb_private::GetLogIfAnyCategoriesSet(uint32_t mask) {
  return g_log_channel.GetLogIfAny(mask);
}
