CommandObjectLog.cpp revision f15996eea072cdaa8a092f22d3a1212b3d95f0ec
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectLog.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#include "CommandObjectLog.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1884cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h"
205f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
2384cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Options.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2963094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h"
30705d6782f95a38caa5cddf8dcc32d6b13fab20fcSean Callanan#include "lldb/Interpreter/CommandInterpreter.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineTable.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic LogChannelSP
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetLogChannelPluginForChannel (const char *channel)
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string log_channel_plugin_name(channel);
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    log_channel_plugin_name += LogChannel::GetPluginSuffix();
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogChannelSP log_channel_sp (LogChannel::FindPlugin (log_channel_plugin_name.c_str()));
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return log_channel_sp;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogEnable : public CommandObject
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
61238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogEnable(CommandInterpreter &interpreter) :
62238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
63238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "log enable",
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Enable logging for a single log channel.",
65f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton                        NULL),
66f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
687826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
697826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentEntry arg1;
707826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentEntry arg2;
7143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
727826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentData category_arg;
7343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
7443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
7543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
7643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_repetition = eArgRepeatPlain;
7743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
7843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
797826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        arg1.push_back (channel_arg);
8043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        category_arg.arg_type = eArgTypeLogCategory;
827826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        category_arg.arg_repetition = eArgRepeatPlus;
837826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
847826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        arg2.push_back (category_arg);
857826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
8643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
877826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        m_arguments.push_back (arg1);
887826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        m_arguments.push_back (arg2);
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogEnable()
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Options *
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetOptions ()
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &m_options;
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
103238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    Execute (Args& args,
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (args.GetArgumentCount() < 1)
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
108abb507ae79e20ab2dd8365049921df73a24c95a5Caroline Tice            result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str());
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Log::Callbacks log_callbacks;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string channel(args.GetArgumentAtIndex(0));
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            args.Shift ();  // Shift off the channel
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamSP log_stream_sp;
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_options.log_file.empty())
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1195892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton                log_stream_sp.reset(new StreamFile(m_interpreter.GetDebugger().GetOutputFile().GetDescriptor(), false));
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LogStreamMap::iterator pos = m_log_streams.find(m_options.log_file);
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (pos == m_log_streams.end())
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
1265892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton                    log_stream_sp.reset (new StreamFile (m_options.log_file.c_str()));
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_log_streams[m_options.log_file] = log_stream_sp;
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log_stream_sp = pos->second;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert (log_stream_sp.get());
133d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t log_options = m_options.log_options;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (log_options == 0)
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks))
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                log_callbacks.enable (log_stream_sp, log_options, args, &result.GetErrorStream());
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishNoResult);
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str()));
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (log_channel_sp)
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log_channel_sp->Enable (log_stream_sp, log_options, &result.GetErrorStream(), args))
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus (eReturnStatusSuccessFinishNoResult);
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str());
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus (eReturnStatusFailed);
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str());
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class CommandOptions : public Options
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
172f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
173f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options (interpreter),
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_file (),
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_options (0)
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~CommandOptions ()
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual Error
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetOptionValue (int option_idx, const char *option_arg)
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            char short_option = (char) m_getopt_table[option_idx].val;
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (short_option)
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'f':  log_file = option_arg;                                 break;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 't':  log_options |= LLDB_LOG_OPTION_THREADSAFE;             break;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'v':  log_options |= LLDB_LOG_OPTION_VERBOSE;                break;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'g':  log_options |= LLDB_LOG_OPTION_DEBUG;                  break;
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 's':  log_options |= LLDB_LOG_OPTION_PREPEND_SEQUENCE;       break;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'T':  log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP;      break;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'p':  log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'n':  log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME;    break;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                error.SetErrorStringWithFormat ("Unrecognized option '%c'\n", short_option);
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ResetOptionValues ()
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_file.clear();
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_options = 0;
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetDefinitions ()
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return g_option_table;
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Options table: Required for subclasses of Options.
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
224b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Instance variables to hold the values for command options.
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string log_file;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t log_options;
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::map<std::string, StreamSP> LogStreamMap;
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandOptions m_options;
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogStreamMap m_log_streams;
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLogEnable::CommandOptions::g_option_table[] =
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2414d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, 0, eArgTypeFilename,   "Set the destination file to log to."},
2424d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "threadsafe", 't', no_argument,       NULL, 0, eArgTypeNone,        "Enable thread safe logging to avoid interweaved log lines." },
2434d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "verbose",    'v', no_argument,       NULL, 0, eArgTypeNone,       "Enable verbose logging." },
2444d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "debug",      'g', no_argument,       NULL, 0, eArgTypeNone,       "Enable debug logging." },
2454d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "sequence",   's', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with an increasing integer sequence id." },
2464d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "timestamp",  'T', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with a timestamp." },
2474d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "pid-tid",    'p', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with the process and thread ID that generates the log line." },
2484d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "thread-name",'n', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with the thread name for the thread that generates the log line." },
2494d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL,                       0,  0,                 NULL, 0, eArgTypeNone,       NULL }
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogDisable : public CommandObject
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
258238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogDisable(CommandInterpreter &interpreter) :
259238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
260238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "log disable",
2616a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice                       "Disable one or more log channel categories.",
26243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                       NULL)
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2646a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentEntry arg1;
2656a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentEntry arg2;
26643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
2676a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentData category_arg;
26843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
26943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
27043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
2716a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        channel_arg.arg_repetition = eArgRepeatPlain;
27243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
27343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
2746a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        arg1.push_back (channel_arg);
27543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
2766a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        category_arg.arg_type = eArgTypeLogCategory;
2776a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        category_arg.arg_repetition = eArgRepeatPlus;
2786a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice
2796a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        arg2.push_back (category_arg);
2806a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice
28143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
2826a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        m_arguments.push_back (arg1);
2836a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        m_arguments.push_back (arg2);
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogDisable()
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
292238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    Execute (Args& args,
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 0)
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
298abb507ae79e20ab2dd8365049921df73a24c95a5Caroline Tice            result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str());
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
302926060e198137f8a64face70455324a8cd4362a5Caroline Tice            Log::Callbacks log_callbacks;
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
304926060e198137f8a64face70455324a8cd4362a5Caroline Tice            std::string channel(args.GetArgumentAtIndex(0));
305926060e198137f8a64face70455324a8cd4362a5Caroline Tice            args.Shift ();  // Shift off the channel
306926060e198137f8a64face70455324a8cd4362a5Caroline Tice            if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks))
307926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
308926060e198137f8a64face70455324a8cd4362a5Caroline Tice                log_callbacks.disable (args, &result.GetErrorStream());
309926060e198137f8a64face70455324a8cd4362a5Caroline Tice                result.SetStatus(eReturnStatusSuccessFinishNoResult);
310926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
311926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (channel == "all")
312926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
313926060e198137f8a64face70455324a8cd4362a5Caroline Tice                Log::DisableAllLogChannels(&result.GetErrorStream());
314926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
315926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else
316926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
317926060e198137f8a64face70455324a8cd4362a5Caroline Tice                LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str()));
318926060e198137f8a64face70455324a8cd4362a5Caroline Tice                if (log_channel_sp)
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
320926060e198137f8a64face70455324a8cd4362a5Caroline Tice                    log_channel_sp->Disable(args, &result.GetErrorStream());
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
324926060e198137f8a64face70455324a8cd4362a5Caroline Tice                    result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0));
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogList : public CommandObject
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
337238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogList(CommandInterpreter &interpreter) :
338238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
339238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "log list",
34043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                       "List the log categories for one or more log channels.  If none specified, lists them all.",
34143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                       NULL)
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
34443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
34543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
34643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
34743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
34843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_repetition = eArgRepeatStar;
34943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
35043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
35143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (channel_arg);
35243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
35343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
35443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogList()
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
363238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    Execute (Args& args,
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 0)
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Log::ListAllLogChannels (&result.GetOutputStream());
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus(eReturnStatusSuccessFinishResult);
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (size_t i=0; i<argc; ++i)
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Log::Callbacks log_callbacks;
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::string channel(args.GetArgumentAtIndex(i));
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks))
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log_callbacks.list_categories (&result.GetOutputStream());
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishResult);
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (channel == "all")
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Log::ListAllLogChannels (&result.GetOutputStream());
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishResult);
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str()));
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log_channel_sp)
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        log_channel_sp->ListCategories(&result.GetOutputStream());
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus(eReturnStatusSuccessFinishNoResult);
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0));
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogTimer : public CommandObject
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
412238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogTimer(CommandInterpreter &interpreter) :
413238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
414238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "log timers",
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Enable, disable, dump, and reset LLDB internal performance timers.",
4164ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                       "log timers < enable <depth> | disable | dump | increment <bool> | reset >")
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogTimer()
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
426238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    Execute (Args& args,
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus(eReturnStatusFailed);
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 1)
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *sub_command = args.GetArgumentAtIndex(0);
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (strcasecmp(sub_command, "enable") == 0)
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::SetDisplayDepth (UINT32_MAX);
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishNoResult);
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "disable") == 0)
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::DumpCategoryTimes (&result.GetOutputStream());
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::SetDisplayDepth (0);
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "dump") == 0)
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::DumpCategoryTimes (&result.GetOutputStream());
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "reset") == 0)
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::ResetCategoryTimes ();
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        else if (argc == 2)
46019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        {
46119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            const char *sub_command = args.GetArgumentAtIndex(0);
46219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham
46319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            if (strcasecmp(sub_command, "enable") == 0)
46419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            {
46519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                bool success;
46619e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                uint32_t depth = Args::StringToUInt32(args.GetArgumentAtIndex(1), 0, 0, &success);
46719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                if (success)
46819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                {
46919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    Timer::SetDisplayDepth (depth);
47019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
47119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                }
47219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                else
47319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    result.AppendError("Could not convert enable depth to an unsigned integer.");
47419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            }
4754ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            if (strcasecmp(sub_command, "increment") == 0)
4764ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            {
4774ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                bool success;
4784ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                bool increment = Args::StringToBoolean(args.GetArgumentAtIndex(1), false, &success);
4794ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                if (success)
4804ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                {
4814ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    Timer::SetQuiet (!increment);
4824ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
4834ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                }
4844ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                else
4854ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    result.AppendError("Could not convert increment value to boolean.");
4864ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            }
48719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        }
48819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!result.Succeeded())
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError("Missing subcommand");
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str());
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectLog constructor
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
50163094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectLog::CommandObjectLog(CommandInterpreter &interpreter) :
502238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
503238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "log",
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "A set of commands for operating on logs.",
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "log <command> [<command-options>]")
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
507238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("enable",  CommandObjectSP (new CommandObjectLogEnable (interpreter)));
508238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("disable", CommandObjectSP (new CommandObjectLogDisable (interpreter)));
509238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",    CommandObjectSP (new CommandObjectLogList (interpreter)));
510238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("timers",  CommandObjectSP (new CommandObjectLogTimer (interpreter)));
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLog::~CommandObjectLog()
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
523