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