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
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectLog.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2084cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h"
225f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
2584cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Options.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3163094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h"
32705d6782f95a38caa5cddf8dcc32d6b13fab20fcSean Callanan#include "lldb/Interpreter/CommandInterpreter.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineTable.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectLogEnable : public CommandObjectParsed
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
53238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogEnable(CommandInterpreter &interpreter) :
54da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
55da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "log enable",
56da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Enable logging for a single log channel.",
57da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL),
58f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
607826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
617826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentEntry arg1;
627826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentEntry arg2;
6343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
647826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentData category_arg;
6543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
6643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
6743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
6843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_repetition = eArgRepeatPlain;
6943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
7043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
717826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        arg1.push_back (channel_arg);
7243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
737826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        category_arg.arg_type = eArgTypeLogCategory;
747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        category_arg.arg_repetition = eArgRepeatPlus;
757826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
767826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        arg2.push_back (category_arg);
777826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
7843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
797826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        m_arguments.push_back (arg1);
807826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        m_arguments.push_back (arg2);
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogEnable()
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Options *
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetOptions ()
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &m_options;
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
945e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//    int
955e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//    HandleArgumentCompletion (Args &input,
965e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              int &cursor_index,
975e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              int &cursor_char_position,
985e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              OptionElementVector &opt_element_vector,
995e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              int match_start_point,
1005e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              int max_return_elements,
1015e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              bool &word_complete,
1025e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              StringList &matches)
1035e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//    {
1045e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        std::string completion_str (input.GetArgumentAtIndex(cursor_index));
1055e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        completion_str.erase (cursor_char_position);
1065e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//
1075e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        if (cursor_index == 1)
1085e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        {
1095e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//            //
1105e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//            Log::AutoCompleteChannelName (completion_str.c_str(), matches);
1115e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        }
1125e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        return matches.GetSize();
1135e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//    }
1145e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class CommandOptions : public Options
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
121f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options (interpreter),
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_file (),
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_options (0)
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~CommandOptions ()
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual Error
134143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx, const char *option_arg)
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error;
1376475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton            const int short_option = m_getopt_table[option_idx].val;
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (short_option)
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
141f61e16bdedfb721e9c7dd94ae6b9eb1ce1d9bd5eGreg Clayton            case 'f':  log_file.SetFile(option_arg, true);                    break;
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 't':  log_options |= LLDB_LOG_OPTION_THREADSAFE;             break;
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'v':  log_options |= LLDB_LOG_OPTION_VERBOSE;                break;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'g':  log_options |= LLDB_LOG_OPTION_DEBUG;                  break;
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 's':  log_options |= LLDB_LOG_OPTION_PREPEND_SEQUENCE;       break;
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'T':  log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP;      break;
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'p':  log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break;
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'n':  log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME;    break;
149f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton            case 'S':  log_options |= LLDB_LOG_OPTION_BACKTRACE;              break;
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
1519c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
159143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
161f61e16bdedfb721e9c7dd94ae6b9eb1ce1d9bd5eGreg Clayton            log_file.Clear();
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_options = 0;
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetDefinitions ()
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return g_option_table;
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Options table: Required for subclasses of Options.
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Instance variables to hold the values for command options.
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177f61e16bdedfb721e9c7dd94ae6b9eb1ce1d9bd5eGreg Clayton        FileSpec log_file;
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t log_options;
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
182da26bd203cbb104291b39891febf7481794f205fJim Ingham    virtual bool
183da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args,
184da26bd203cbb104291b39891febf7481794f205fJim Ingham             CommandReturnObject &result)
185da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
186da26bd203cbb104291b39891febf7481794f205fJim Ingham        if (args.GetArgumentCount() < 2)
187da26bd203cbb104291b39891febf7481794f205fJim Ingham        {
188da26bd203cbb104291b39891febf7481794f205fJim Ingham            result.AppendErrorWithFormat("%s takes a log channel and one or more log types.\n", m_cmd_name.c_str());
189da26bd203cbb104291b39891febf7481794f205fJim Ingham        }
190da26bd203cbb104291b39891febf7481794f205fJim Ingham        else
191da26bd203cbb104291b39891febf7481794f205fJim Ingham        {
192da26bd203cbb104291b39891febf7481794f205fJim Ingham            std::string channel(args.GetArgumentAtIndex(0));
193da26bd203cbb104291b39891febf7481794f205fJim Ingham            args.Shift ();  // Shift off the channel
194f61e16bdedfb721e9c7dd94ae6b9eb1ce1d9bd5eGreg Clayton            char log_file[PATH_MAX];
195f61e16bdedfb721e9c7dd94ae6b9eb1ce1d9bd5eGreg Clayton            if (m_options.log_file)
196f61e16bdedfb721e9c7dd94ae6b9eb1ce1d9bd5eGreg Clayton                m_options.log_file.GetPath(log_file, sizeof(log_file));
197f61e16bdedfb721e9c7dd94ae6b9eb1ce1d9bd5eGreg Clayton            else
198f61e16bdedfb721e9c7dd94ae6b9eb1ce1d9bd5eGreg Clayton                log_file[0] = '\0';
199da26bd203cbb104291b39891febf7481794f205fJim Ingham            bool success = m_interpreter.GetDebugger().EnableLog (channel.c_str(),
200da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                                  args.GetConstArgumentVector(),
201f61e16bdedfb721e9c7dd94ae6b9eb1ce1d9bd5eGreg Clayton                                                                  log_file,
202da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                                  m_options.log_options,
203da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                                  result.GetErrorStream());
204da26bd203cbb104291b39891febf7481794f205fJim Ingham            if (success)
205da26bd203cbb104291b39891febf7481794f205fJim Ingham                result.SetStatus (eReturnStatusSuccessFinishNoResult);
206da26bd203cbb104291b39891febf7481794f205fJim Ingham            else
207da26bd203cbb104291b39891febf7481794f205fJim Ingham                result.SetStatus (eReturnStatusFailed);
208da26bd203cbb104291b39891febf7481794f205fJim Ingham        }
209da26bd203cbb104291b39891febf7481794f205fJim Ingham        return result.Succeeded();
210da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
211da26bd203cbb104291b39891febf7481794f205fJim Ingham
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandOptions m_options;
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLogEnable::CommandOptions::g_option_table[] =
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2184d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, 0, eArgTypeFilename,   "Set the destination file to log to."},
2194d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "threadsafe", 't', no_argument,       NULL, 0, eArgTypeNone,        "Enable thread safe logging to avoid interweaved log lines." },
2204d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "verbose",    'v', no_argument,       NULL, 0, eArgTypeNone,       "Enable verbose logging." },
2214d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "debug",      'g', no_argument,       NULL, 0, eArgTypeNone,       "Enable debug logging." },
2224d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "sequence",   's', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with an increasing integer sequence id." },
2234d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "timestamp",  'T', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with a timestamp." },
2244d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." },
2254d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." },
226f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton{ LLDB_OPT_SET_1, false, "stack",      'S', no_argument,       NULL, 0, eArgTypeNone,       "Append a stack backtrace to each log line." },
2274d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL,                       0,  0,                 NULL, 0, eArgTypeNone,       NULL }
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
230da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectLogDisable : public CommandObjectParsed
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
236238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogDisable(CommandInterpreter &interpreter) :
237da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
238da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "log disable",
239da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Disable one or more log channel categories.",
240da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL)
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2426a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentEntry arg1;
2436a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentEntry arg2;
24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
2456a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentData category_arg;
24643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
24743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
24843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
2496a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        channel_arg.arg_repetition = eArgRepeatPlain;
25043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
25143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
2526a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        arg1.push_back (channel_arg);
25343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
2546a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        category_arg.arg_type = eArgTypeLogCategory;
2556a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        category_arg.arg_repetition = eArgRepeatPlus;
2566a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice
2576a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        arg2.push_back (category_arg);
2586a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice
25943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
2606a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        m_arguments.push_back (arg1);
2616a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        m_arguments.push_back (arg2);
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogDisable()
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
269da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
271da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args,
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 0)
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2779721fe9795f5d34d10e6815902acc38dddd2722bJim Ingham            result.AppendErrorWithFormat("%s takes a log channel and one or more log types.\n", m_cmd_name.c_str());
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
281926060e198137f8a64face70455324a8cd4362a5Caroline Tice            Log::Callbacks log_callbacks;
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
283926060e198137f8a64face70455324a8cd4362a5Caroline Tice            std::string channel(args.GetArgumentAtIndex(0));
284926060e198137f8a64face70455324a8cd4362a5Caroline Tice            args.Shift ();  // Shift off the channel
2850e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton            if (Log::GetLogChannelCallbacks (ConstString(channel.c_str()), log_callbacks))
286926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
2876c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham                log_callbacks.disable (args.GetConstArgumentVector(), &result.GetErrorStream());
288926060e198137f8a64face70455324a8cd4362a5Caroline Tice                result.SetStatus(eReturnStatusSuccessFinishNoResult);
289926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
290926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (channel == "all")
291926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
292926060e198137f8a64face70455324a8cd4362a5Caroline Tice                Log::DisableAllLogChannels(&result.GetErrorStream());
293926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
294926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else
295926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
2965e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                LogChannelSP log_channel_sp (LogChannel::FindPlugin(channel.c_str()));
297926060e198137f8a64face70455324a8cd4362a5Caroline Tice                if (log_channel_sp)
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
2996c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham                    log_channel_sp->Disable(args.GetConstArgumentVector(), &result.GetErrorStream());
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
303926060e198137f8a64face70455324a8cd4362a5Caroline Tice                    result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0));
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
310da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectLogList : public CommandObjectParsed
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
316238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogList(CommandInterpreter &interpreter) :
317da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
318da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "log list",
319da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "List the log categories for one or more log channels.  If none specified, lists them all.",
320da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL)
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
32343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
32443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
32543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
32643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
32743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_repetition = eArgRepeatStar;
32843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
32943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
33043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (channel_arg);
33143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
33243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
33343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogList()
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
341da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
343da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args,
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 0)
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Log::ListAllLogChannels (&result.GetOutputStream());
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus(eReturnStatusSuccessFinishResult);
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (size_t i=0; i<argc; ++i)
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Log::Callbacks log_callbacks;
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::string channel(args.GetArgumentAtIndex(i));
3590e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                if (Log::GetLogChannelCallbacks (ConstString(channel.c_str()), log_callbacks))
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log_callbacks.list_categories (&result.GetOutputStream());
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishResult);
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (channel == "all")
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Log::ListAllLogChannels (&result.GetOutputStream());
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishResult);
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3715e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                    LogChannelSP log_channel_sp (LogChannel::FindPlugin(channel.c_str()));
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log_channel_sp)
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        log_channel_sp->ListCategories(&result.GetOutputStream());
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus(eReturnStatusSuccessFinishNoResult);
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0));
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
386da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectLogTimer : public CommandObjectParsed
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
392238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogTimer(CommandInterpreter &interpreter) :
393da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
394da26bd203cbb104291b39891febf7481794f205fJim Ingham                           "log timers",
395da26bd203cbb104291b39891febf7481794f205fJim Ingham                           "Enable, disable, dump, and reset LLDB internal performance timers.",
396da26bd203cbb104291b39891febf7481794f205fJim Ingham                           "log timers < enable <depth> | disable | dump | increment <bool> | reset >")
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogTimer()
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
405da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
407da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args,
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus(eReturnStatusFailed);
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 1)
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *sub_command = args.GetArgumentAtIndex(0);
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (strcasecmp(sub_command, "enable") == 0)
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::SetDisplayDepth (UINT32_MAX);
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishNoResult);
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "disable") == 0)
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::DumpCategoryTimes (&result.GetOutputStream());
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::SetDisplayDepth (0);
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "dump") == 0)
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::DumpCategoryTimes (&result.GetOutputStream());
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "reset") == 0)
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::ResetCategoryTimes ();
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        else if (argc == 2)
44119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        {
44219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            const char *sub_command = args.GetArgumentAtIndex(0);
44319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham
44419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            if (strcasecmp(sub_command, "enable") == 0)
44519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            {
44619e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                bool success;
44719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                uint32_t depth = Args::StringToUInt32(args.GetArgumentAtIndex(1), 0, 0, &success);
44819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                if (success)
44919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                {
45019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    Timer::SetDisplayDepth (depth);
45119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
45219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                }
45319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                else
45419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    result.AppendError("Could not convert enable depth to an unsigned integer.");
45519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            }
4564ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            if (strcasecmp(sub_command, "increment") == 0)
4574ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            {
4584ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                bool success;
4594ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                bool increment = Args::StringToBoolean(args.GetArgumentAtIndex(1), false, &success);
4604ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                if (success)
4614ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                {
4624ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    Timer::SetQuiet (!increment);
4634ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
4644ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                }
4654ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                else
4664ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    result.AppendError("Could not convert increment value to boolean.");
4674ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            }
46819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        }
46919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!result.Succeeded())
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError("Missing subcommand");
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str());
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectLog constructor
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
48263094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectLog::CommandObjectLog(CommandInterpreter &interpreter) :
483238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
484238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "log",
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "A set of commands for operating on logs.",
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "log <command> [<command-options>]")
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
488238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("enable",  CommandObjectSP (new CommandObjectLogEnable (interpreter)));
489238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("disable", CommandObjectSP (new CommandObjectLogDisable (interpreter)));
490238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",    CommandObjectSP (new CommandObjectLogList (interpreter)));
491238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("timers",  CommandObjectSP (new CommandObjectLogTimer (interpreter)));
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLog::~CommandObjectLog()
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
504