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