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