Log.cpp revision ddff7cca4b3d2507706ed9011e6f0a503b984195
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 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <pthread.h> 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdio.h> 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdarg.h> 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdlib.h> 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <unistd.h> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map> 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Host.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/TimeValue.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h" 31926060e198137f8a64face70455324a8cd4362a5Caroline Tice#include "lldb/Interpreter/Args.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Log () : 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stream_sp(), 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_options(0), 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mask_bits(0) 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Log (StreamSP &stream_sp) : 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stream_sp(stream_sp), 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_options(0), 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mask_bits(0) 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::~Log () 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFlags & 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetOptions() 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_options; 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Flags & 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetOptions() const 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_options; 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFlags & 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetMask() 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mask_bits; 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Flags & 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetMask() const 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mask_bits; 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// All logging eventually boils down to this function call. If we have 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a callback registered, then we call the logging callback. If we have 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a valid file handle, we also log to the file. 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::PrintfWithFlagsVarArg (uint32_t flags, const char *format, va_list args) 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_stream_sp) 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static uint32_t g_sequence_id = 0; 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString header; 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static Mutex g_LogThreadedMutex(Mutex::eMutexTypeRecursive); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Lock the threaded logging mutex if we are doing thread safe logging 95f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_THREADSAFE)) 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner locker.Reset(g_LogThreadedMutex.GetMutex()); 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Add a sequence ID if requested 99f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_PREPEND_SEQUENCE)) 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner header.Printf ("%u ", ++g_sequence_id); 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Timestamp if requested 103f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_PREPEND_TIMESTAMP)) 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct timeval tv = TimeValue::Now().GetAsTimeVal(); 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner header.Printf ("%9llu.%6.6llu ", tv.tv_sec, tv.tv_usec); 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Add the process and thread if requested 110f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD)) 11118cba0c23df424580b1e13202493f531a91cc130Eli Friedman header.Printf ("[%4.4x/%4.4x]: ", getpid(), Host::GetCurrentThreadID()); 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Add the process and thread if requested 114f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test (LLDB_LOG_OPTION_PREPEND_THREAD_NAME)) 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11618cba0c23df424580b1e13202493f531a91cc130Eli Friedman const char *thread_name_str = Host::GetThreadName (getpid(), Host::GetCurrentThreadID()); 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread_name_str) 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner header.Printf ("%s ", thread_name_str); 11949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner header.PrintfVarArg (format, args); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stream_sp->Printf("%s\n", header.GetData()); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::PutCString (const char *cstr) 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Printf ("%s", cstr); 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Simple variable argument logging with flags. 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Printf(const char *format, ...) 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (0, format, args); 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::VAPrintf (const char *format, va_list args) 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (0, format, args); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Simple variable argument logging with flags. 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::PrintfWithFlags (uint32_t flags, const char *format, ...) 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (flags, format, args); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print debug strings if and only if the global debug option is set to 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a non-zero value. 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Debug (const char *format, ...) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 173f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (GetOptions().Test(LLDB_LOG_OPTION_DEBUG)) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (LLDB_LOG_FLAG_DEBUG, format, args); 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print debug strings if and only if the global debug option is set to 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a non-zero value. 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::DebugVerbose (const char *format, ...) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 190f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (GetOptions().AllSet (LLDB_LOG_OPTION_DEBUG | LLDB_LOG_OPTION_VERBOSE)) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (LLDB_LOG_FLAG_DEBUG | LLDB_LOG_FLAG_VERBOSE, format, args); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Log only if all of the bits are set 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::LogIf (uint32_t bits, const char *format, ...) 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 206f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.AllSet (bits)) 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (0, format, args); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of errors that are not fatal. 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Error (const char *format, ...) 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlags (LLDB_LOG_FLAG_ERROR, "error: %s", arg_msg); 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of errors that ARE fatal. Exit with ERR exit code 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// immediately. 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::FatalError (int err, const char *format, ...) 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlags (LLDB_LOG_FLAG_ERROR | LLDB_LOG_FLAG_FATAL, "error: %s", arg_msg); 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::free (arg_msg); 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::exit (err); 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of warnings that are not fatal only if verbose mode is 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// enabled. 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Verbose (const char *format, ...) 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 264f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test(LLDB_LOG_OPTION_VERBOSE)) 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlagsVarArg (LLDB_LOG_FLAG_VERBOSE, format, args); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of warnings that are not fatal only if verbose mode is 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// enabled. 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::WarningVerbose (const char *format, ...) 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 280f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_options.Test(LLDB_LOG_OPTION_VERBOSE)) 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlags (LLDB_LOG_FLAG_WARNING | LLDB_LOG_FLAG_VERBOSE, "warning: %s", arg_msg); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of warnings that are not fatal. 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::Warning (const char *format, ...) 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrintfWithFlags (LLDB_LOG_FLAG_WARNING, "warning: %s", arg_msg); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertypedef std::map <std::string, Log::Callbacks> CallbackMap; 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertypedef CallbackMap::iterator CallbackMapIter; 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertypedef std::map <ConstString, LogChannelSP> LogChannelMap; 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertypedef LogChannelMap::iterator LogChannelMapIter; 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Surround our callback map with a singleton function so we don't have any 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// global initializers. 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic CallbackMap & 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetCallbackMap () 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static CallbackMap g_callback_map; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_callback_map; 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic LogChannelMap & 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetChannelMap () 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static LogChannelMap g_channel_map; 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_channel_map; 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::RegisterLogChannel (const char *channel, const Log::Callbacks &log_callbacks) 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetCallbackMap().insert(std::make_pair(channel, log_callbacks)); 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::UnregisterLogChannel (const char *channel) 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetCallbackMap().erase(channel) != 0; 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetLogChannelCallbacks (const char *channel, Log::Callbacks &log_callbacks) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMap &callback_map = GetCallbackMap (); 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMapIter pos = callback_map.find(channel); 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != callback_map.end()) 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_callbacks = pos->second; 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton ::memset (&log_callbacks, 0, sizeof(log_callbacks)); 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::EnableAllLogChannels 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamSP &log_stream_sp, 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t log_options, 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Args &args, 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Stream *feedback_strm 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMap &callback_map = GetCallbackMap (); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMapIter pos, end = callback_map.end(); 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = callback_map.begin(); pos != end; ++pos) 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->second.enable (log_stream_sp, log_options, args, feedback_strm); 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMap &channel_map = GetChannelMap (); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMapIter channel_pos, channel_end = channel_map.end(); 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (channel_pos = channel_map.begin(); channel_pos != channel_end; ++channel_pos) 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner channel_pos->second->Enable (log_stream_sp, log_options, feedback_strm, args); 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 388926060e198137f8a64face70455324a8cd4362a5Caroline TiceLog::DisableAllLogChannels (Stream *feedback_strm) 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMap &callback_map = GetCallbackMap (); 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMapIter pos, end = callback_map.end(); 392990de7bb41d3afec6b789155408ff322187d8682Greg Clayton Args args; 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = callback_map.begin(); pos != end; ++pos) 395926060e198137f8a64face70455324a8cd4362a5Caroline Tice pos->second.disable (args, feedback_strm); 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMap &channel_map = GetChannelMap (); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMapIter channel_pos, channel_end = channel_map.end(); 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (channel_pos = channel_map.begin(); channel_pos != channel_end; ++channel_pos) 400926060e198137f8a64face70455324a8cd4362a5Caroline Tice channel_pos->second->Disable (args, feedback_strm); 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 404990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonLog::Initialize() 405990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 406990de7bb41d3afec6b789155408ff322187d8682Greg Clayton Log::Callbacks log_callbacks = { DisableLog, EnableLog, ListLogCategories }; 407990de7bb41d3afec6b789155408ff322187d8682Greg Clayton Log::RegisterLogChannel ("lldb", log_callbacks); 408990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 409990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 410990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 411990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonLog::Terminate () 412990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 413990de7bb41d3afec6b789155408ff322187d8682Greg Clayton DisableAllLogChannels (NULL); 414990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 415990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 416990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::ListAllLogChannels (Stream *strm) 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMap &callback_map = GetCallbackMap (); 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMap &channel_map = GetChannelMap (); 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (callback_map.empty() && channel_map.empty()) 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm->PutCString ("No logging channels are currently registered.\n"); 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CallbackMapIter pos, end = callback_map.end(); 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = callback_map.begin(); pos != end; ++pos) 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->second.list_categories (strm); 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx = 0; 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name; 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; (name = PluginManager::GetLogChannelCreateNameAtIndex (idx)) != NULL; ++idx) 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelSP log_channel_sp(LogChannel::FindPlugin (name)); 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp) 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_channel_sp->ListCategories (strm); 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetVerbose() const 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 445931851cdd1231d102b8962ad4238d2157852e47fJim Ingham // FIXME: This has to be centralized between the stream and the log... 446931851cdd1231d102b8962ad4238d2157852e47fJim Ingham if (m_options.Test(LLDB_LOG_OPTION_VERBOSE)) 447931851cdd1231d102b8962ad4238d2157852e47fJim Ingham return true; 448931851cdd1231d102b8962ad4238d2157852e47fJim Ingham 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_stream_sp) 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stream_sp->GetVerbose(); 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if the debug flag bit is set in this stream. 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog::GetDebug() const 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_stream_sp) 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stream_sp->GetDebug(); 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogChannelSP 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogChannel::FindPlugin (const char *plugin_name) 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelSP log_channel_sp; 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMap &channel_map = GetChannelMap (); 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString log_channel_name (plugin_name); 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelMapIter pos = channel_map.find (log_channel_name); 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos == channel_map.end()) 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelCreateInstance create_callback = PluginManager::GetLogChannelCreateCallbackForPluginName (plugin_name); 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (create_callback) 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_channel_sp.reset(create_callback()); 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp) 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the one and only loaded instance of each log channel 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // plug-in after it has been loaded once. 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner channel_map[log_channel_name] = log_channel_sp; 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have already loaded an instance of this log channel class, 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so just return the cached instance. 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_channel_sp = pos->second; 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return log_channel_sp; 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogChannel::LogChannel () : 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_log_sp () 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogChannel::~LogChannel () 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLogChannel::GetPluginSuffix () 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ".log-channel"; 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 512