CommandObjectLog.cpp revision 5f54ac373b119a4c6693e4875c48aa761fba0c86
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.",
6543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                        NULL)
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
677826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
687826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentEntry arg1;
697826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentEntry arg2;
7043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
717826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentData category_arg;
7243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
7343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
7443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
7543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_repetition = eArgRepeatPlain;
7643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
7743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
787826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        arg1.push_back (channel_arg);
7943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
807826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        category_arg.arg_type = eArgTypeLogCategory;
817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        category_arg.arg_repetition = eArgRepeatPlus;
827826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
837826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        arg2.push_back (category_arg);
847826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
8543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
867826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        m_arguments.push_back (arg1);
877826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        m_arguments.push_back (arg2);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogEnable()
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Options *
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetOptions ()
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &m_options;
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
102238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    Execute (Args& args,
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (args.GetArgumentCount() < 1)
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
107abb507ae79e20ab2dd8365049921df73a24c95a5Caroline Tice            result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str());
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Log::Callbacks log_callbacks;
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string channel(args.GetArgumentAtIndex(0));
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            args.Shift ();  // Shift off the channel
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamSP log_stream_sp;
116d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham            StreamFile *log_file_ptr = NULL;  // This will get put in the log_stream_sp, no need to free it.
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_options.log_file.empty())
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
119d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham                log_file_ptr = new StreamFile(m_interpreter.GetDebugger().GetOutputFileHandle());
120d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham                log_stream_sp.reset(log_file_ptr);
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LogStreamMap::iterator pos = m_log_streams.find(m_options.log_file);
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (pos == m_log_streams.end())
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
127d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham                    log_file_ptr = new StreamFile (m_options.log_file.c_str(), "w");
128d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham                    log_stream_sp.reset (log_file_ptr);
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_log_streams[m_options.log_file] = log_stream_sp;
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log_stream_sp = pos->second;
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert (log_stream_sp.get());
135d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham
136d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham            // If we ended up making a StreamFile for log output, line buffer it.
137d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham            if (log_file_ptr != NULL)
138d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham                log_file_ptr->SetLineBuffered();
139d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t log_options = m_options.log_options;
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (log_options == 0)
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE;
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks))
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                log_callbacks.enable (log_stream_sp, log_options, args, &result.GetErrorStream());
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishNoResult);
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str()));
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (log_channel_sp)
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log_channel_sp->Enable (log_stream_sp, log_options, &result.GetErrorStream(), args))
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus (eReturnStatusSuccessFinishNoResult);
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                else
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str());
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class CommandOptions : public Options
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandOptions () :
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Options (),
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_file (),
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_options (0)
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~CommandOptions ()
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual Error
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetOptionValue (int option_idx, const char *option_arg)
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            char short_option = (char) m_getopt_table[option_idx].val;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (short_option)
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'f':  log_file = option_arg;                                 break;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 't':  log_options |= LLDB_LOG_OPTION_THREADSAFE;             break;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'v':  log_options |= LLDB_LOG_OPTION_VERBOSE;                break;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'g':  log_options |= LLDB_LOG_OPTION_DEBUG;                  break;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 's':  log_options |= LLDB_LOG_OPTION_PREPEND_SEQUENCE;       break;
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'T':  log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP;      break;
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'p':  log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break;
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'n':  log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME;    break;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                error.SetErrorStringWithFormat ("Unrecognized option '%c'\n", short_option);
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ResetOptionValues ()
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Options::ResetOptionValues();
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_file.clear();
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_options = 0;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const lldb::OptionDefinition*
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetDefinitions ()
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return g_option_table;
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Options table: Required for subclasses of Options.
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        static lldb::OptionDefinition g_option_table[];
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Instance variables to hold the values for command options.
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string log_file;
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t log_options;
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::map<std::string, StreamSP> LogStreamMap;
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandOptions m_options;
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogStreamMap m_log_streams;
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::OptionDefinition
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLogEnable::CommandOptions::g_option_table[] =
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2484d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, 0, eArgTypeFilename,   "Set the destination file to log to."},
2494d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "threadsafe", 't', no_argument,       NULL, 0, eArgTypeNone,        "Enable thread safe logging to avoid interweaved log lines." },
2504d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "verbose",    'v', no_argument,       NULL, 0, eArgTypeNone,       "Enable verbose logging." },
2514d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "debug",      'g', no_argument,       NULL, 0, eArgTypeNone,       "Enable debug logging." },
2524d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "sequence",   's', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with an increasing integer sequence id." },
2534d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "timestamp",  'T', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with a timestamp." },
2544d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." },
2554d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." },
2564d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL,                       0,  0,                 NULL, 0, eArgTypeNone,       NULL }
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogDisable : public CommandObject
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
265238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogDisable(CommandInterpreter &interpreter) :
266238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
267238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "log disable",
2686a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice                       "Disable one or more log channel categories.",
26943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                       NULL)
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2716a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentEntry arg1;
2726a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentEntry arg2;
27343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
2746a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentData category_arg;
27543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
27643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
27743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
2786a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        channel_arg.arg_repetition = eArgRepeatPlain;
27943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
28043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
2816a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        arg1.push_back (channel_arg);
28243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
2836a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        category_arg.arg_type = eArgTypeLogCategory;
2846a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        category_arg.arg_repetition = eArgRepeatPlus;
2856a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice
2866a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        arg2.push_back (category_arg);
2876a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice
28843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
2896a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        m_arguments.push_back (arg1);
2906a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        m_arguments.push_back (arg2);
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogDisable()
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
299238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    Execute (Args& args,
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 0)
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
305abb507ae79e20ab2dd8365049921df73a24c95a5Caroline Tice            result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str());
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
309926060e198137f8a64face70455324a8cd4362a5Caroline Tice            Log::Callbacks log_callbacks;
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
311926060e198137f8a64face70455324a8cd4362a5Caroline Tice            std::string channel(args.GetArgumentAtIndex(0));
312926060e198137f8a64face70455324a8cd4362a5Caroline Tice            args.Shift ();  // Shift off the channel
313926060e198137f8a64face70455324a8cd4362a5Caroline Tice            if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks))
314926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
315926060e198137f8a64face70455324a8cd4362a5Caroline Tice                log_callbacks.disable (args, &result.GetErrorStream());
316926060e198137f8a64face70455324a8cd4362a5Caroline Tice                result.SetStatus(eReturnStatusSuccessFinishNoResult);
317926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
318926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (channel == "all")
319926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
320926060e198137f8a64face70455324a8cd4362a5Caroline Tice                Log::DisableAllLogChannels(&result.GetErrorStream());
321926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
322926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else
323926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
324926060e198137f8a64face70455324a8cd4362a5Caroline Tice                LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str()));
325926060e198137f8a64face70455324a8cd4362a5Caroline Tice                if (log_channel_sp)
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
327926060e198137f8a64face70455324a8cd4362a5Caroline Tice                    log_channel_sp->Disable(args, &result.GetErrorStream());
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
331926060e198137f8a64face70455324a8cd4362a5Caroline Tice                    result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0));
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogList : public CommandObject
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
344238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogList(CommandInterpreter &interpreter) :
345238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
346238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "log list",
34743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                       "List the log categories for one or more log channels.  If none specified, lists them all.",
34843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                       NULL)
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
35043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
35143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
35243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
35343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
35443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
35543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_repetition = eArgRepeatStar;
35643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
35743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
35843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (channel_arg);
35943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
36043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
36143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogList()
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
370238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    Execute (Args& args,
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 0)
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Log::ListAllLogChannels (&result.GetOutputStream());
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus(eReturnStatusSuccessFinishResult);
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (size_t i=0; i<argc; ++i)
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Log::Callbacks log_callbacks;
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::string channel(args.GetArgumentAtIndex(i));
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks))
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log_callbacks.list_categories (&result.GetOutputStream());
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishResult);
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (channel == "all")
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Log::ListAllLogChannels (&result.GetOutputStream());
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishResult);
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str()));
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log_channel_sp)
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        log_channel_sp->ListCategories(&result.GetOutputStream());
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus(eReturnStatusSuccessFinishNoResult);
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0));
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogTimer : public CommandObject
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
419238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogTimer(CommandInterpreter &interpreter) :
420238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
421238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "log timers",
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Enable, disable, dump, and reset LLDB internal performance timers.",
4234ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                       "log timers < enable <depth> | disable | dump | increment <bool> | reset >")
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogTimer()
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
433238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    Execute (Args& args,
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus(eReturnStatusFailed);
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 1)
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *sub_command = args.GetArgumentAtIndex(0);
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (strcasecmp(sub_command, "enable") == 0)
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::SetDisplayDepth (UINT32_MAX);
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishNoResult);
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "disable") == 0)
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::DumpCategoryTimes (&result.GetOutputStream());
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::SetDisplayDepth (0);
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "dump") == 0)
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::DumpCategoryTimes (&result.GetOutputStream());
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "reset") == 0)
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::ResetCategoryTimes ();
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
46619e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        else if (argc == 2)
46719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        {
46819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            const char *sub_command = args.GetArgumentAtIndex(0);
46919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham
47019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            if (strcasecmp(sub_command, "enable") == 0)
47119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            {
47219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                bool success;
47319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                uint32_t depth = Args::StringToUInt32(args.GetArgumentAtIndex(1), 0, 0, &success);
47419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                if (success)
47519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                {
47619e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    Timer::SetDisplayDepth (depth);
47719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
47819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                }
47919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                else
48019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    result.AppendError("Could not convert enable depth to an unsigned integer.");
48119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            }
4824ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            if (strcasecmp(sub_command, "increment") == 0)
4834ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            {
4844ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                bool success;
4854ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                bool increment = Args::StringToBoolean(args.GetArgumentAtIndex(1), false, &success);
4864ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                if (success)
4874ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                {
4884ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    Timer::SetQuiet (!increment);
4894ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
4904ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                }
4914ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                else
4924ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    result.AppendError("Could not convert increment value to boolean.");
4934ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            }
49419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        }
49519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!result.Succeeded())
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError("Missing subcommand");
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str());
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectLog constructor
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
50863094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectLog::CommandObjectLog(CommandInterpreter &interpreter) :
509238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
510238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "log",
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "A set of commands for operating on logs.",
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "log <command> [<command-options>]")
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
514238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("enable",  CommandObjectSP (new CommandObjectLogEnable (interpreter)));
515238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("disable", CommandObjectSP (new CommandObjectLogDisable (interpreter)));
516238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",    CommandObjectSP (new CommandObjectLogList (interpreter)));
517238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("timers",  CommandObjectSP (new CommandObjectLogTimer (interpreter)));
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLog::~CommandObjectLog()
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
530