124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Log.cpp -------------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <pthread.h> 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdio.h> 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdarg.h> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdlib.h> 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <unistd.h> 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map> 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Host.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/TimeValue.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h" 33926060e198137f8a64face70455324a8cd4362a5Caroline Tice#include "lldb/Interpreter/Args.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Log () : 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stream_sp(), 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_options(0), 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mask_bits(0) 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg ClaytonLog::Log (const StreamSP &stream_sp) : 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stream_sp(stream_sp), 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_options(0), 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mask_bits(0) 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::~Log () 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFlags & 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetOptions() 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_options; 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Flags & 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetOptions() const 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_options; 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFlags & 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetMask() 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mask_bits; 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Flags & 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetMask() const 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mask_bits; 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// All logging eventually boils down to this function call. If we have 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a callback registered, then we call the logging callback. If we have 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a valid file handle, we also log to the file. 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::PrintfWithFlagsVarArg (uint32_t flags, const char *format, va_list args) 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_stream_sp) 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static uint32_t g_sequence_id = 0; 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString header; 92940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton // Enabling the thread safe logging actually deadlocks right now. 93940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton // Need to fix this at some point. 94940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// static Mutex g_LogThreadedMutex(Mutex::eMutexTypeRecursive); 95940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Mutex::Locker locker (g_LogThreadedMutex); 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Add a sequence ID if requested 98f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_PREPEND_SEQUENCE)) 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner header.Printf ("%u ", ++g_sequence_id); 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Timestamp if requested 102f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_PREPEND_TIMESTAMP)) 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct timeval tv = TimeValue::Now().GetAsTimeVal(); 105b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea header.Printf ("%9ld.%6.6d ", tv.tv_sec, (int32_t)tv.tv_usec); 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Add the process and thread if requested 109f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD)) 1105f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea header.Printf ("[%4.4x/%4.4" PRIx64 "]: ", getpid(), Host::GetCurrentThreadID()); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Add the process and thread if requested 113f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_PREPEND_THREAD_NAME)) 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1156f0165b3dc0ecc689f565c792e53dd3397b4a432Greg Clayton std::string thread_name (Host::GetThreadName (getpid(), Host::GetCurrentThreadID())); 1166f0165b3dc0ecc689f565c792e53dd3397b4a432Greg Clayton if (!thread_name.empty()) 1176f0165b3dc0ecc689f565c792e53dd3397b4a432Greg Clayton header.Printf ("%s ", thread_name.c_str()); 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner header.PrintfVarArg (format, args); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stream_sp->Printf("%s\n", header.GetData()); 122f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton 123f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_BACKTRACE)) 124f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton Host::Backtrace (*m_stream_sp, 1024); 1256c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_stream_sp->Flush(); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::PutCString (const char *cstr) 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Printf ("%s", cstr); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Simple variable argument logging with flags. 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Printf(const char *format, ...) 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (0, format, args); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::VAPrintf (const char *format, va_list args) 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (0, format, args); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Simple variable argument logging with flags. 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::PrintfWithFlags (uint32_t flags, const char *format, ...) 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (flags, format, args); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print debug strings if and only if the global debug option is set to 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a non-zero value. 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Debug (const char *format, ...) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 175f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (GetOptions().Test(LLDB_LOG_OPTION_DEBUG)) 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (LLDB_LOG_FLAG_DEBUG, format, args); 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print debug strings if and only if the global debug option is set to 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a non-zero value. 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::DebugVerbose (const char *format, ...) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 192f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (GetOptions().AllSet (LLDB_LOG_OPTION_DEBUG | LLDB_LOG_OPTION_VERBOSE)) 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (LLDB_LOG_FLAG_DEBUG | LLDB_LOG_FLAG_VERBOSE, format, args); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Log only if all of the bits are set 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::LogIf (uint32_t bits, const char *format, ...) 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 208f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.AllSet (bits)) 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (0, format, args); 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of errors that are not fatal. 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Error (const char *format, ...) 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlags (LLDB_LOG_FLAG_ERROR, "error: %s", arg_msg); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of errors that ARE fatal. Exit with ERR exit code 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// immediately. 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::FatalError (int err, const char *format, ...) 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlags (LLDB_LOG_FLAG_ERROR | LLDB_LOG_FLAG_FATAL, "error: %s", arg_msg); 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::free (arg_msg); 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::exit (err); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of warnings that are not fatal only if verbose mode is 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// enabled. 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Verbose (const char *format, ...) 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 266f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test(LLDB_LOG_OPTION_VERBOSE)) 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (LLDB_LOG_FLAG_VERBOSE, format, args); 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of warnings that are not fatal only if verbose mode is 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// enabled. 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::WarningVerbose (const char *format, ...) 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 282f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test(LLDB_LOG_OPTION_VERBOSE)) 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlags (LLDB_LOG_FLAG_WARNING | LLDB_LOG_FLAG_VERBOSE, "warning: %s", arg_msg); 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of warnings that are not fatal. 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Warning (const char *format, ...) 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlags (LLDB_LOG_FLAG_WARNING, "warning: %s", arg_msg); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3160e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytontypedef std::map <ConstString, Log::Callbacks> CallbackMap; 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertypedef CallbackMap::iterator CallbackMapIter; 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertypedef std::map <ConstString, LogChannelSP> LogChannelMap; 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertypedef LogChannelMap::iterator LogChannelMapIter; 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Surround our callback map with a singleton function so we don't have any 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// global initializers. 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic CallbackMap & 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetCallbackMap () 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static CallbackMap g_callback_map; 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_callback_map; 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic LogChannelMap & 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetChannelMap () 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static LogChannelMap g_channel_map; 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_channel_map; 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3400e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonLog::RegisterLogChannel (const ConstString &channel, const Log::Callbacks &log_callbacks) 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetCallbackMap().insert(std::make_pair(channel, log_callbacks)); 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3460e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonLog::UnregisterLogChannel (const ConstString &channel) 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetCallbackMap().erase(channel) != 0; 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3520e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonLog::GetLogChannelCallbacks (const ConstString &channel, Log::Callbacks &log_callbacks) 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMap &callback_map = GetCallbackMap (); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMapIter pos = callback_map.find(channel); 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != callback_map.end()) 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_callbacks = pos->second; 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 361ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton ::memset (&log_callbacks, 0, sizeof(log_callbacks)); 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::EnableAllLogChannels 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamSP &log_stream_sp, 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t log_options, 3706c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham const char **categories, 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Stream *feedback_strm 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMap &callback_map = GetCallbackMap (); 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMapIter pos, end = callback_map.end(); 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = callback_map.begin(); pos != end; ++pos) 3786c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham pos->second.enable (log_stream_sp, log_options, categories, feedback_strm); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMap &channel_map = GetChannelMap (); 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMapIter channel_pos, channel_end = channel_map.end(); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (channel_pos = channel_map.begin(); channel_pos != channel_end; ++channel_pos) 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3846c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham channel_pos->second->Enable (log_stream_sp, log_options, feedback_strm, categories); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3905e342f50b42b265d8568e1c926328858e74b2c0aGreg ClaytonLog::AutoCompleteChannelName (const char *channel_name, StringList &matches) 3915e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton{ 3925e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton LogChannelMap &map = GetChannelMap (); 3935e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton LogChannelMapIter pos, end = map.end(); 3945e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton for (pos = map.begin(); pos != end; ++pos) 3955e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { 3965e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton const char *pos_channel_name = pos->first.GetCString(); 3975e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (channel_name && channel_name[0]) 3985e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { 3995e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (NameMatches (channel_name, eNameMatchStartsWith, pos_channel_name)) 4005e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { 4015e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton matches.AppendString(pos_channel_name); 4025e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton } 4035e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton } 4045e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton else 4055e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton matches.AppendString(pos_channel_name); 4065e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 4075e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton } 4085e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton} 4095e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 4105e342f50b42b265d8568e1c926328858e74b2c0aGreg Claytonvoid 411926060e198137f8a64face70455324a8cd4362a5Caroline TiceLog::DisableAllLogChannels (Stream *feedback_strm) 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMap &callback_map = GetCallbackMap (); 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMapIter pos, end = callback_map.end(); 4156c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham const char *categories[1] = {NULL}; 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = callback_map.begin(); pos != end; ++pos) 4186c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham pos->second.disable (categories, feedback_strm); 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMap &channel_map = GetChannelMap (); 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMapIter channel_pos, channel_end = channel_map.end(); 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (channel_pos = channel_map.begin(); channel_pos != channel_end; ++channel_pos) 4236c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham channel_pos->second->Disable (categories, feedback_strm); 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 427990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonLog::Initialize() 428990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 429990de7bb41d3afec6b789155408ff322187d8682Greg Clayton Log::Callbacks log_callbacks = { DisableLog, EnableLog, ListLogCategories }; 4300e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton Log::RegisterLogChannel (ConstString("lldb"), log_callbacks); 431990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 432990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 433990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 434990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonLog::Terminate () 435990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 436990de7bb41d3afec6b789155408ff322187d8682Greg Clayton DisableAllLogChannels (NULL); 437990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 438990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 439990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::ListAllLogChannels (Stream *strm) 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMap &callback_map = GetCallbackMap (); 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMap &channel_map = GetChannelMap (); 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (callback_map.empty() && channel_map.empty()) 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm->PutCString ("No logging channels are currently registered.\n"); 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMapIter pos, end = callback_map.end(); 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = callback_map.begin(); pos != end; ++pos) 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->second.list_categories (strm); 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx = 0; 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name; 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; (name = PluginManager::GetLogChannelCreateNameAtIndex (idx)) != NULL; ++idx) 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelSP log_channel_sp(LogChannel::FindPlugin (name)); 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp) 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_channel_sp->ListCategories (strm); 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetVerbose() const 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 468931851cdd1231d102b8962ad4238d2157852e47fJim Ingham // FIXME: This has to be centralized between the stream and the log... 469931851cdd1231d102b8962ad4238d2157852e47fJim Ingham if (m_options.Test(LLDB_LOG_OPTION_VERBOSE)) 470931851cdd1231d102b8962ad4238d2157852e47fJim Ingham return true; 471931851cdd1231d102b8962ad4238d2157852e47fJim Ingham 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_stream_sp) 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stream_sp->GetVerbose(); 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if the debug flag bit is set in this stream. 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetDebug() const 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_stream_sp) 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stream_sp->GetDebug(); 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogChannelSP 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogChannel::FindPlugin (const char *plugin_name) 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelSP log_channel_sp; 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMap &channel_map = GetChannelMap (); 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString log_channel_name (plugin_name); 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMapIter pos = channel_map.find (log_channel_name); 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos == channel_map.end()) 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4980e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton ConstString const_plugin_name (plugin_name); 4990e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton LogChannelCreateInstance create_callback = PluginManager::GetLogChannelCreateCallbackForPluginName (const_plugin_name); 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (create_callback) 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_channel_sp.reset(create_callback()); 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp) 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the one and only loaded instance of each log channel 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // plug-in after it has been loaded once. 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner channel_map[log_channel_name] = log_channel_sp; 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have already loaded an instance of this log channel class, 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so just return the cached instance. 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_channel_sp = pos->second; 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return log_channel_sp; 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogChannel::LogChannel () : 521952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton m_log_ap () 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogChannel::~LogChannel () 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 530