CommandObjectLog.cpp revision da26bd203cbb104291b39891febf7481794f205f
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
45da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectLogEnable : public CommandObjectParsed
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
51238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogEnable(CommandInterpreter &interpreter) :
52da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
53da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "log enable",
54da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Enable logging for a single log channel.",
55da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL),
56f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
587826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
597826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentEntry arg1;
607826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentEntry arg2;
6143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
627826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        CommandArgumentData category_arg;
6343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
6443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
6543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
6643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_repetition = eArgRepeatPlain;
6743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
6843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
697826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        arg1.push_back (channel_arg);
7043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
717826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        category_arg.arg_type = eArgTypeLogCategory;
727826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        category_arg.arg_repetition = eArgRepeatPlus;
737826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        arg2.push_back (category_arg);
757826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
7643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
777826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        m_arguments.push_back (arg1);
787826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        m_arguments.push_back (arg2);
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogEnable()
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Options *
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetOptions ()
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &m_options;
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
925e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//    int
935e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//    HandleArgumentCompletion (Args &input,
945e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              int &cursor_index,
955e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              int &cursor_char_position,
965e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              OptionElementVector &opt_element_vector,
975e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              int match_start_point,
985e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              int max_return_elements,
995e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              bool &word_complete,
1005e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//                              StringList &matches)
1015e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//    {
1025e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        std::string completion_str (input.GetArgumentAtIndex(cursor_index));
1035e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        completion_str.erase (cursor_char_position);
1045e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//
1055e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        if (cursor_index == 1)
1065e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        {
1075e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//            //
1085e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//            Log::AutoCompleteChannelName (completion_str.c_str(), matches);
1095e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        }
1105e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//        return matches.GetSize();
1115e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//    }
1125e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton//
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class CommandOptions : public Options
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
119f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options (interpreter),
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_file (),
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_options (0)
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~CommandOptions ()
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual Error
132143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx, const char *option_arg)
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            char short_option = (char) m_getopt_table[option_idx].val;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (short_option)
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'f':  log_file = option_arg;                                 break;
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 't':  log_options |= LLDB_LOG_OPTION_THREADSAFE;             break;
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'v':  log_options |= LLDB_LOG_OPTION_VERBOSE;                break;
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'g':  log_options |= LLDB_LOG_OPTION_DEBUG;                  break;
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 's':  log_options |= LLDB_LOG_OPTION_PREPEND_SEQUENCE;       break;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'T':  log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP;      break;
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'p':  log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break;
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case 'n':  log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME;    break;
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
1489c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
156143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_file.clear();
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log_options = 0;
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetDefinitions ()
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return g_option_table;
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Options table: Required for subclasses of Options.
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Instance variables to hold the values for command options.
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string log_file;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t log_options;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
179da26bd203cbb104291b39891febf7481794f205fJim Ingham    virtual bool
180da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args,
181da26bd203cbb104291b39891febf7481794f205fJim Ingham             CommandReturnObject &result)
182da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
183da26bd203cbb104291b39891febf7481794f205fJim Ingham        if (args.GetArgumentCount() < 2)
184da26bd203cbb104291b39891febf7481794f205fJim Ingham        {
185da26bd203cbb104291b39891febf7481794f205fJim Ingham            result.AppendErrorWithFormat("%s takes a log channel and one or more log types.\n", m_cmd_name.c_str());
186da26bd203cbb104291b39891febf7481794f205fJim Ingham        }
187da26bd203cbb104291b39891febf7481794f205fJim Ingham        else
188da26bd203cbb104291b39891febf7481794f205fJim Ingham        {
189da26bd203cbb104291b39891febf7481794f205fJim Ingham            std::string channel(args.GetArgumentAtIndex(0));
190da26bd203cbb104291b39891febf7481794f205fJim Ingham            args.Shift ();  // Shift off the channel
191da26bd203cbb104291b39891febf7481794f205fJim Ingham            bool success = m_interpreter.GetDebugger().EnableLog (channel.c_str(),
192da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                                  args.GetConstArgumentVector(),
193da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                                  m_options.log_file.c_str(),
194da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                                  m_options.log_options,
195da26bd203cbb104291b39891febf7481794f205fJim Ingham                                                                  result.GetErrorStream());
196da26bd203cbb104291b39891febf7481794f205fJim Ingham            if (success)
197da26bd203cbb104291b39891febf7481794f205fJim Ingham                result.SetStatus (eReturnStatusSuccessFinishNoResult);
198da26bd203cbb104291b39891febf7481794f205fJim Ingham            else
199da26bd203cbb104291b39891febf7481794f205fJim Ingham                result.SetStatus (eReturnStatusFailed);
200da26bd203cbb104291b39891febf7481794f205fJim Ingham        }
201da26bd203cbb104291b39891febf7481794f205fJim Ingham        return result.Succeeded();
202da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
203da26bd203cbb104291b39891febf7481794f205fJim Ingham
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandOptions m_options;
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLogEnable::CommandOptions::g_option_table[] =
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2104d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, 0, eArgTypeFilename,   "Set the destination file to log to."},
2114d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "threadsafe", 't', no_argument,       NULL, 0, eArgTypeNone,        "Enable thread safe logging to avoid interweaved log lines." },
2124d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "verbose",    'v', no_argument,       NULL, 0, eArgTypeNone,       "Enable verbose logging." },
2134d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "debug",      'g', no_argument,       NULL, 0, eArgTypeNone,       "Enable debug logging." },
2144d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "sequence",   's', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with an increasing integer sequence id." },
2154d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "timestamp",  'T', no_argument,       NULL, 0, eArgTypeNone,       "Prepend all log lines with a timestamp." },
2164d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." },
2174d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." },
2184d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL,                       0,  0,                 NULL, 0, eArgTypeNone,       NULL }
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
221da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectLogDisable : public CommandObjectParsed
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
227238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogDisable(CommandInterpreter &interpreter) :
228da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
229da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "log disable",
230da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Disable one or more log channel categories.",
231da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL)
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2336a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentEntry arg1;
2346a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentEntry arg2;
23543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
2366a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        CommandArgumentData category_arg;
23743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
23843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
23943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
2406a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        channel_arg.arg_repetition = eArgRepeatPlain;
24143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
24243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
2436a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        arg1.push_back (channel_arg);
24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
2456a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        category_arg.arg_type = eArgTypeLogCategory;
2466a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        category_arg.arg_repetition = eArgRepeatPlus;
2476a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice
2486a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        arg2.push_back (category_arg);
2496a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice
25043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
2516a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        m_arguments.push_back (arg1);
2526a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice        m_arguments.push_back (arg2);
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogDisable()
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
260da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
262da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args,
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 0)
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2689721fe9795f5d34d10e6815902acc38dddd2722bJim Ingham            result.AppendErrorWithFormat("%s takes a log channel and one or more log types.\n", m_cmd_name.c_str());
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
272926060e198137f8a64face70455324a8cd4362a5Caroline Tice            Log::Callbacks log_callbacks;
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
274926060e198137f8a64face70455324a8cd4362a5Caroline Tice            std::string channel(args.GetArgumentAtIndex(0));
275926060e198137f8a64face70455324a8cd4362a5Caroline Tice            args.Shift ();  // Shift off the channel
276926060e198137f8a64face70455324a8cd4362a5Caroline Tice            if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks))
277926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
2786c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham                log_callbacks.disable (args.GetConstArgumentVector(), &result.GetErrorStream());
279926060e198137f8a64face70455324a8cd4362a5Caroline Tice                result.SetStatus(eReturnStatusSuccessFinishNoResult);
280926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
281926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else if (channel == "all")
282926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
283926060e198137f8a64face70455324a8cd4362a5Caroline Tice                Log::DisableAllLogChannels(&result.GetErrorStream());
284926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
285926060e198137f8a64face70455324a8cd4362a5Caroline Tice            else
286926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
2875e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                LogChannelSP log_channel_sp (LogChannel::FindPlugin(channel.c_str()));
288926060e198137f8a64face70455324a8cd4362a5Caroline Tice                if (log_channel_sp)
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
2906c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham                    log_channel_sp->Disable(args.GetConstArgumentVector(), &result.GetErrorStream());
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
294926060e198137f8a64face70455324a8cd4362a5Caroline Tice                    result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0));
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
301da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectLogList : public CommandObjectParsed
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
307238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogList(CommandInterpreter &interpreter) :
308da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
309da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "log list",
310da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "List the log categories for one or more log channels.  If none specified, lists them all.",
311da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL)
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
31343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
31443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData channel_arg;
31543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
31643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
31743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_type = eArgTypeLogChannel;
31843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        channel_arg.arg_repetition = eArgRepeatStar;
31943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
32043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
32143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (channel_arg);
32243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
32343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
32443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogList()
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
332da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
334da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args,
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 0)
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Log::ListAllLogChannels (&result.GetOutputStream());
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus(eReturnStatusSuccessFinishResult);
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (size_t i=0; i<argc; ++i)
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Log::Callbacks log_callbacks;
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::string channel(args.GetArgumentAtIndex(i));
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks))
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log_callbacks.list_categories (&result.GetOutputStream());
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishResult);
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (channel == "all")
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Log::ListAllLogChannels (&result.GetOutputStream());
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus(eReturnStatusSuccessFinishResult);
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3625e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                    LogChannelSP log_channel_sp (LogChannel::FindPlugin(channel.c_str()));
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log_channel_sp)
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        log_channel_sp->ListCategories(&result.GetOutputStream());
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus(eReturnStatusSuccessFinishNoResult);
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0));
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
377da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectLogTimer : public CommandObjectParsed
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
383238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectLogTimer(CommandInterpreter &interpreter) :
384da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
385da26bd203cbb104291b39891febf7481794f205fJim Ingham                           "log timers",
386da26bd203cbb104291b39891febf7481794f205fJim Ingham                           "Enable, disable, dump, and reset LLDB internal performance timers.",
387da26bd203cbb104291b39891febf7481794f205fJim Ingham                           "log timers < enable <depth> | disable | dump | increment <bool> | reset >")
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectLogTimer()
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
396da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
398da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& args,
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t argc = args.GetArgumentCount();
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus(eReturnStatusFailed);
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (argc == 1)
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *sub_command = args.GetArgumentAtIndex(0);
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (strcasecmp(sub_command, "enable") == 0)
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::SetDisplayDepth (UINT32_MAX);
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishNoResult);
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "disable") == 0)
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::DumpCategoryTimes (&result.GetOutputStream());
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::SetDisplayDepth (0);
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "dump") == 0)
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::DumpCategoryTimes (&result.GetOutputStream());
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (strcasecmp(sub_command, "reset") == 0)
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Timer::ResetCategoryTimes ();
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus(eReturnStatusSuccessFinishResult);
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
43119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        else if (argc == 2)
43219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        {
43319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            const char *sub_command = args.GetArgumentAtIndex(0);
43419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham
43519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            if (strcasecmp(sub_command, "enable") == 0)
43619e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            {
43719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                bool success;
43819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                uint32_t depth = Args::StringToUInt32(args.GetArgumentAtIndex(1), 0, 0, &success);
43919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                if (success)
44019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                {
44119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    Timer::SetDisplayDepth (depth);
44219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
44319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                }
44419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                else
44519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham                    result.AppendError("Could not convert enable depth to an unsigned integer.");
44619e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham            }
4474ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            if (strcasecmp(sub_command, "increment") == 0)
4484ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            {
4494ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                bool success;
4504ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                bool increment = Args::StringToBoolean(args.GetArgumentAtIndex(1), false, &success);
4514ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                if (success)
4524ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                {
4534ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    Timer::SetQuiet (!increment);
4544ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    result.SetStatus(eReturnStatusSuccessFinishNoResult);
4554ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                }
4564ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                else
4574ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham                    result.AppendError("Could not convert increment value to boolean.");
4584ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham            }
45919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham        }
46019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!result.Succeeded())
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError("Missing subcommand");
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str());
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectLog constructor
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
47363094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectLog::CommandObjectLog(CommandInterpreter &interpreter) :
474238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
475238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "log",
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "A set of commands for operating on logs.",
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "log <command> [<command-options>]")
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
479238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("enable",  CommandObjectSP (new CommandObjectLogEnable (interpreter)));
480238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("disable", CommandObjectSP (new CommandObjectLogDisable (interpreter)));
481238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",    CommandObjectSP (new CommandObjectLogList (interpreter)));
482238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("timers",  CommandObjectSP (new CommandObjectLogTimer (interpreter)));
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLog::~CommandObjectLog()
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
495