xref: /llvm-project/lldb/tools/debugserver/source/MacOSX/OsLogger.cpp (revision 8b3af63b8993e45b1783853a3fcf6f36bfbed81b)
175930019STodd Fiala //===-- OsLogger.cpp --------------------------------------------*- C++ -*-===//
275930019STodd Fiala //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
675930019STodd Fiala //
775930019STodd Fiala //===----------------------------------------------------------------------===//
875930019STodd Fiala 
975930019STodd Fiala #include "OsLogger.h"
1095a6e6f6SSean Callanan #include <Availability.h>
1175930019STodd Fiala 
1295a6e6f6SSean Callanan #if (LLDB_USE_OS_LOG) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101200)
1375930019STodd Fiala 
1475930019STodd Fiala #include <os/log.h>
1575930019STodd Fiala 
1675930019STodd Fiala #include "DNBDefs.h"
1775930019STodd Fiala #include "DNBLog.h"
1875930019STodd Fiala 
1975930019STodd Fiala #define LLDB_OS_LOG_MAX_BUFFER_LENGTH 256
2075930019STodd Fiala 
21b9c1b51eSKate Stone namespace {
2275930019STodd Fiala // Darwin os_log logging callback that can be registered with
2375930019STodd Fiala // DNBLogSetLogCallback
DarwinLogCallback(void * baton,uint32_t flags,const char * format,va_list args)24b9c1b51eSKate Stone void DarwinLogCallback(void *baton, uint32_t flags, const char *format,
25b9c1b51eSKate Stone                        va_list args) {
2675930019STodd Fiala   if (format == nullptr)
2775930019STodd Fiala     return;
2875930019STodd Fiala 
2975930019STodd Fiala   static os_log_t g_logger;
30b9c1b51eSKate Stone   if (!g_logger) {
3175930019STodd Fiala     g_logger = os_log_create("com.apple.dt.lldb", "debugserver");
3275930019STodd Fiala     if (!g_logger)
3375930019STodd Fiala       return;
3475930019STodd Fiala   }
3575930019STodd Fiala 
3675930019STodd Fiala   os_log_type_t log_type;
37b9c1b51eSKate Stone   if (flags & DNBLOG_FLAG_FATAL)
38b9c1b51eSKate Stone     log_type = OS_LOG_TYPE_FAULT;
39b9c1b51eSKate Stone   else if (flags & DNBLOG_FLAG_ERROR)
40b9c1b51eSKate Stone     log_type = OS_LOG_TYPE_ERROR;
41b9c1b51eSKate Stone   else if (flags & DNBLOG_FLAG_WARNING)
42b9c1b51eSKate Stone     log_type = OS_LOG_TYPE_DEFAULT;
43b9c1b51eSKate Stone   else if (flags & DNBLOG_FLAG_VERBOSE)
44b9c1b51eSKate Stone     log_type = OS_LOG_TYPE_DEBUG;
45b9c1b51eSKate Stone   else
46b9c1b51eSKate Stone     log_type = OS_LOG_TYPE_DEFAULT;
4775930019STodd Fiala 
4875930019STodd Fiala   // This code is unfortunate.  os_log* only takes static strings, but
4975930019STodd Fiala   // our current log API isn't set up to make use of that style.
5075930019STodd Fiala   char buffer[LLDB_OS_LOG_MAX_BUFFER_LENGTH];
5175930019STodd Fiala   vsnprintf(buffer, sizeof(buffer), format, args);
5275930019STodd Fiala   os_log_with_type(g_logger, log_type, "%{public}s", buffer);
5375930019STodd Fiala }
5475930019STodd Fiala }
5575930019STodd Fiala 
GetLogFunction()56606908aaSVedant Kumar DNBCallbackLog OsLogger::GetLogFunction() { return DarwinLogCallback; }
5775930019STodd Fiala 
5875930019STodd Fiala #else
5975930019STodd Fiala 
GetLogFunction()60b9c1b51eSKate Stone DNBCallbackLog OsLogger::GetLogFunction() { return nullptr; }
6175930019STodd Fiala 
6275930019STodd Fiala #endif
6395a6e6f6SSean Callanan 
64