130fdc8d8SChris Lattner //===-- CommandObjectLog.cpp ------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "CommandObjectLog.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner // C Includes 1330fdc8d8SChris Lattner // C++ Includes 1430fdc8d8SChris Lattner // Other libraries and framework includes 1530fdc8d8SChris Lattner // Project includes 1630fdc8d8SChris Lattner #include "lldb/lldb-private-log.h" 1730fdc8d8SChris Lattner 1840af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Debugger.h" 2030fdc8d8SChris Lattner #include "lldb/Core/FileSpec.h" 2130fdc8d8SChris Lattner #include "lldb/Core/Log.h" 2230fdc8d8SChris Lattner #include "lldb/Core/Module.h" 2340af72e1SJim Ingham #include "lldb/Interpreter/Options.h" 2430fdc8d8SChris Lattner #include "lldb/Core/RegularExpression.h" 2530fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2630fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2730fdc8d8SChris Lattner #include "lldb/Core/Timer.h" 2830fdc8d8SChris Lattner 296611103cSGreg Clayton #include "lldb/Core/Debugger.h" 304be3990fSSean Callanan #include "lldb/Interpreter/CommandInterpreter.h" 3130fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h" 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner #include "lldb/Symbol/LineTable.h" 3430fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h" 3530fdc8d8SChris Lattner #include "lldb/Symbol/SymbolFile.h" 3630fdc8d8SChris Lattner #include "lldb/Symbol/SymbolVendor.h" 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3930fdc8d8SChris Lattner #include "lldb/Target/Target.h" 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner using namespace lldb; 4230fdc8d8SChris Lattner using namespace lldb_private; 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner 4530fdc8d8SChris Lattner static LogChannelSP 4630fdc8d8SChris Lattner GetLogChannelPluginForChannel (const char *channel) 4730fdc8d8SChris Lattner { 4830fdc8d8SChris Lattner std::string log_channel_plugin_name(channel); 4930fdc8d8SChris Lattner log_channel_plugin_name += LogChannel::GetPluginSuffix(); 5030fdc8d8SChris Lattner LogChannelSP log_channel_sp (LogChannel::FindPlugin (log_channel_plugin_name.c_str())); 5130fdc8d8SChris Lattner return log_channel_sp; 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner class CommandObjectLogEnable : public CommandObject 5630fdc8d8SChris Lattner { 5730fdc8d8SChris Lattner public: 5830fdc8d8SChris Lattner //------------------------------------------------------------------ 5930fdc8d8SChris Lattner // Constructors and Destructors 6030fdc8d8SChris Lattner //------------------------------------------------------------------ 61a7015092SGreg Clayton CommandObjectLogEnable(CommandInterpreter &interpreter) : 62a7015092SGreg Clayton CommandObject (interpreter, 63a7015092SGreg Clayton "log enable", 6430fdc8d8SChris Lattner "Enable logging for a single log channel.", 6530fdc8d8SChris Lattner "log enable [<cmd-options>] <channel>") 6630fdc8d8SChris Lattner { 6730fdc8d8SChris Lattner } 6830fdc8d8SChris Lattner 6930fdc8d8SChris Lattner virtual 7030fdc8d8SChris Lattner ~CommandObjectLogEnable() 7130fdc8d8SChris Lattner { 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 7430fdc8d8SChris Lattner Options * 7530fdc8d8SChris Lattner GetOptions () 7630fdc8d8SChris Lattner { 7730fdc8d8SChris Lattner return &m_options; 7830fdc8d8SChris Lattner } 7930fdc8d8SChris Lattner 8030fdc8d8SChris Lattner virtual bool 81a7015092SGreg Clayton Execute (Args& args, 8230fdc8d8SChris Lattner CommandReturnObject &result) 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner if (args.GetArgumentCount() < 1) 8530fdc8d8SChris Lattner { 86e3d26315SCaroline Tice result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 8730fdc8d8SChris Lattner } 8830fdc8d8SChris Lattner else 8930fdc8d8SChris Lattner { 9030fdc8d8SChris Lattner Log::Callbacks log_callbacks; 9130fdc8d8SChris Lattner 9230fdc8d8SChris Lattner std::string channel(args.GetArgumentAtIndex(0)); 9330fdc8d8SChris Lattner args.Shift (); // Shift off the channel 9430fdc8d8SChris Lattner StreamSP log_stream_sp; 9530fdc8d8SChris Lattner 9630fdc8d8SChris Lattner if (m_options.log_file.empty()) 9730fdc8d8SChris Lattner { 98a7015092SGreg Clayton log_stream_sp.reset(new StreamFile(m_interpreter.GetDebugger().GetOutputFileHandle())); 9930fdc8d8SChris Lattner } 10030fdc8d8SChris Lattner else 10130fdc8d8SChris Lattner { 10230fdc8d8SChris Lattner LogStreamMap::iterator pos = m_log_streams.find(m_options.log_file); 10330fdc8d8SChris Lattner if (pos == m_log_streams.end()) 10430fdc8d8SChris Lattner { 10530fdc8d8SChris Lattner log_stream_sp.reset (new StreamFile (m_options.log_file.c_str(), "w")); 10630fdc8d8SChris Lattner m_log_streams[m_options.log_file] = log_stream_sp; 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner else 10930fdc8d8SChris Lattner log_stream_sp = pos->second; 11030fdc8d8SChris Lattner } 11130fdc8d8SChris Lattner assert (log_stream_sp.get()); 11230fdc8d8SChris Lattner uint32_t log_options = m_options.log_options; 11330fdc8d8SChris Lattner if (log_options == 0) 11430fdc8d8SChris Lattner log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 11530fdc8d8SChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 11630fdc8d8SChris Lattner { 11730fdc8d8SChris Lattner log_callbacks.enable (log_stream_sp, log_options, args, &result.GetErrorStream()); 11830fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner else 12130fdc8d8SChris Lattner { 12230fdc8d8SChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 12330fdc8d8SChris Lattner if (log_channel_sp) 12430fdc8d8SChris Lattner { 12530fdc8d8SChris Lattner if (log_channel_sp->Enable (log_stream_sp, log_options, &result.GetErrorStream(), args)) 12630fdc8d8SChris Lattner { 12730fdc8d8SChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner else 13030fdc8d8SChris Lattner { 13130fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 13230fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 13330fdc8d8SChris Lattner } 13430fdc8d8SChris Lattner } 13530fdc8d8SChris Lattner else 13630fdc8d8SChris Lattner { 13730fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 13830fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 13930fdc8d8SChris Lattner } 14030fdc8d8SChris Lattner } 14130fdc8d8SChris Lattner } 14230fdc8d8SChris Lattner return result.Succeeded(); 14330fdc8d8SChris Lattner } 14430fdc8d8SChris Lattner 14530fdc8d8SChris Lattner 14630fdc8d8SChris Lattner class CommandOptions : public Options 14730fdc8d8SChris Lattner { 14830fdc8d8SChris Lattner public: 14930fdc8d8SChris Lattner 15030fdc8d8SChris Lattner CommandOptions () : 15130fdc8d8SChris Lattner Options (), 15230fdc8d8SChris Lattner log_file (), 15330fdc8d8SChris Lattner log_options (0) 15430fdc8d8SChris Lattner { 15530fdc8d8SChris Lattner } 15630fdc8d8SChris Lattner 15730fdc8d8SChris Lattner 15830fdc8d8SChris Lattner virtual 15930fdc8d8SChris Lattner ~CommandOptions () 16030fdc8d8SChris Lattner { 16130fdc8d8SChris Lattner } 16230fdc8d8SChris Lattner 16330fdc8d8SChris Lattner virtual Error 16430fdc8d8SChris Lattner SetOptionValue (int option_idx, const char *option_arg) 16530fdc8d8SChris Lattner { 16630fdc8d8SChris Lattner Error error; 16730fdc8d8SChris Lattner char short_option = (char) m_getopt_table[option_idx].val; 16830fdc8d8SChris Lattner 16930fdc8d8SChris Lattner switch (short_option) 17030fdc8d8SChris Lattner { 17130fdc8d8SChris Lattner case 'f': log_file = option_arg; break; 17230fdc8d8SChris Lattner case 't': log_options |= LLDB_LOG_OPTION_THREADSAFE; break; 17330fdc8d8SChris Lattner case 'v': log_options |= LLDB_LOG_OPTION_VERBOSE; break; 17430fdc8d8SChris Lattner case 'g': log_options |= LLDB_LOG_OPTION_DEBUG; break; 17530fdc8d8SChris Lattner case 's': log_options |= LLDB_LOG_OPTION_PREPEND_SEQUENCE; break; 17630fdc8d8SChris Lattner case 'T': log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP; break; 17730fdc8d8SChris Lattner case 'p': log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break; 17830fdc8d8SChris Lattner case 'n': log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME; break; 17930fdc8d8SChris Lattner default: 18030fdc8d8SChris Lattner error.SetErrorStringWithFormat ("Unrecognized option '%c'\n", short_option); 18130fdc8d8SChris Lattner break; 18230fdc8d8SChris Lattner } 18330fdc8d8SChris Lattner 18430fdc8d8SChris Lattner return error; 18530fdc8d8SChris Lattner } 18630fdc8d8SChris Lattner 18730fdc8d8SChris Lattner void 18830fdc8d8SChris Lattner ResetOptionValues () 18930fdc8d8SChris Lattner { 19030fdc8d8SChris Lattner Options::ResetOptionValues(); 19130fdc8d8SChris Lattner log_file.clear(); 19230fdc8d8SChris Lattner log_options = 0; 19330fdc8d8SChris Lattner } 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner const lldb::OptionDefinition* 19630fdc8d8SChris Lattner GetDefinitions () 19730fdc8d8SChris Lattner { 19830fdc8d8SChris Lattner return g_option_table; 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner 20130fdc8d8SChris Lattner // Options table: Required for subclasses of Options. 20230fdc8d8SChris Lattner 20330fdc8d8SChris Lattner static lldb::OptionDefinition g_option_table[]; 20430fdc8d8SChris Lattner 20530fdc8d8SChris Lattner // Instance variables to hold the values for command options. 20630fdc8d8SChris Lattner 20730fdc8d8SChris Lattner std::string log_file; 20830fdc8d8SChris Lattner uint32_t log_options; 20930fdc8d8SChris Lattner }; 21030fdc8d8SChris Lattner 21130fdc8d8SChris Lattner protected: 21230fdc8d8SChris Lattner typedef std::map<std::string, StreamSP> LogStreamMap; 21330fdc8d8SChris Lattner CommandOptions m_options; 21430fdc8d8SChris Lattner LogStreamMap m_log_streams; 21530fdc8d8SChris Lattner }; 21630fdc8d8SChris Lattner 21730fdc8d8SChris Lattner lldb::OptionDefinition 21830fdc8d8SChris Lattner CommandObjectLogEnable::CommandOptions::g_option_table[] = 21930fdc8d8SChris Lattner { 220*deaab222SCaroline Tice { LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, 0, eArgTypeFilename, "Set the destination file to log to."}, 221*deaab222SCaroline Tice { LLDB_OPT_SET_1, false, "threadsafe", 't', no_argument, NULL, 0, eArgTypeNone, "Enable thread safe logging to avoid interweaved log lines." }, 222*deaab222SCaroline Tice { LLDB_OPT_SET_1, false, "verbose", 'v', no_argument, NULL, 0, eArgTypeNone, "Enable verbose logging." }, 223*deaab222SCaroline Tice { LLDB_OPT_SET_1, false, "debug", 'g', no_argument, NULL, 0, eArgTypeNone, "Enable debug logging." }, 224*deaab222SCaroline Tice { LLDB_OPT_SET_1, false, "sequence", 's', no_argument, NULL, 0, eArgTypeNone, "Prepend all log lines with an increasing integer sequence id." }, 225*deaab222SCaroline Tice { LLDB_OPT_SET_1, false, "timestamp", 'T', no_argument, NULL, 0, eArgTypeNone, "Prepend all log lines with a timestamp." }, 226*deaab222SCaroline 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." }, 227*deaab222SCaroline 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." }, 228*deaab222SCaroline Tice { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 22930fdc8d8SChris Lattner }; 23030fdc8d8SChris Lattner 23130fdc8d8SChris Lattner class CommandObjectLogDisable : public CommandObject 23230fdc8d8SChris Lattner { 23330fdc8d8SChris Lattner public: 23430fdc8d8SChris Lattner //------------------------------------------------------------------ 23530fdc8d8SChris Lattner // Constructors and Destructors 23630fdc8d8SChris Lattner //------------------------------------------------------------------ 237a7015092SGreg Clayton CommandObjectLogDisable(CommandInterpreter &interpreter) : 238a7015092SGreg Clayton CommandObject (interpreter, 239a7015092SGreg Clayton "log disable", 24030fdc8d8SChris Lattner "Disable one or more log channels.", 24130fdc8d8SChris Lattner "log disable <channel> [<channel> ...]") 24230fdc8d8SChris Lattner { 24330fdc8d8SChris Lattner } 24430fdc8d8SChris Lattner 24530fdc8d8SChris Lattner virtual 24630fdc8d8SChris Lattner ~CommandObjectLogDisable() 24730fdc8d8SChris Lattner { 24830fdc8d8SChris Lattner } 24930fdc8d8SChris Lattner 25030fdc8d8SChris Lattner virtual bool 251a7015092SGreg Clayton Execute (Args& args, 25230fdc8d8SChris Lattner CommandReturnObject &result) 25330fdc8d8SChris Lattner { 25430fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 25530fdc8d8SChris Lattner if (argc == 0) 25630fdc8d8SChris Lattner { 257e3d26315SCaroline Tice result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 25830fdc8d8SChris Lattner } 25930fdc8d8SChris Lattner else 26030fdc8d8SChris Lattner { 26130fdc8d8SChris Lattner for (size_t i=0; i<argc; ++i) 26230fdc8d8SChris Lattner { 26330fdc8d8SChris Lattner Log::Callbacks log_callbacks; 26430fdc8d8SChris Lattner 26530fdc8d8SChris Lattner std::string channel(args.GetArgumentAtIndex(i)); 26630fdc8d8SChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 26730fdc8d8SChris Lattner { 26830fdc8d8SChris Lattner log_callbacks.disable (); 26930fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 27030fdc8d8SChris Lattner } 27130fdc8d8SChris Lattner else if (channel == "all") 27230fdc8d8SChris Lattner { 27330fdc8d8SChris Lattner Log::DisableAllLogChannels(); 27430fdc8d8SChris Lattner } 27530fdc8d8SChris Lattner else 27630fdc8d8SChris Lattner { 27730fdc8d8SChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 27830fdc8d8SChris Lattner if (log_channel_sp) 27930fdc8d8SChris Lattner { 28030fdc8d8SChris Lattner log_channel_sp->Disable(); 28130fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 28230fdc8d8SChris Lattner } 28330fdc8d8SChris Lattner else 28430fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 28530fdc8d8SChris Lattner } 28630fdc8d8SChris Lattner } 28730fdc8d8SChris Lattner } 28830fdc8d8SChris Lattner return result.Succeeded(); 28930fdc8d8SChris Lattner } 29030fdc8d8SChris Lattner }; 29130fdc8d8SChris Lattner 29230fdc8d8SChris Lattner class CommandObjectLogList : public CommandObject 29330fdc8d8SChris Lattner { 29430fdc8d8SChris Lattner public: 29530fdc8d8SChris Lattner //------------------------------------------------------------------ 29630fdc8d8SChris Lattner // Constructors and Destructors 29730fdc8d8SChris Lattner //------------------------------------------------------------------ 298a7015092SGreg Clayton CommandObjectLogList(CommandInterpreter &interpreter) : 299a7015092SGreg Clayton CommandObject (interpreter, 300a7015092SGreg Clayton "log list", 30130fdc8d8SChris Lattner "List the log categories for one or more log channels.", 30230fdc8d8SChris Lattner "log list <channel> [<channel> ...]") 30330fdc8d8SChris Lattner { 30430fdc8d8SChris Lattner } 30530fdc8d8SChris Lattner 30630fdc8d8SChris Lattner virtual 30730fdc8d8SChris Lattner ~CommandObjectLogList() 30830fdc8d8SChris Lattner { 30930fdc8d8SChris Lattner } 31030fdc8d8SChris Lattner 31130fdc8d8SChris Lattner virtual bool 312a7015092SGreg Clayton Execute (Args& args, 31330fdc8d8SChris Lattner CommandReturnObject &result) 31430fdc8d8SChris Lattner { 31530fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 31630fdc8d8SChris Lattner if (argc == 0) 31730fdc8d8SChris Lattner { 31830fdc8d8SChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 31930fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 32030fdc8d8SChris Lattner } 32130fdc8d8SChris Lattner else 32230fdc8d8SChris Lattner { 32330fdc8d8SChris Lattner for (size_t i=0; i<argc; ++i) 32430fdc8d8SChris Lattner { 32530fdc8d8SChris Lattner Log::Callbacks log_callbacks; 32630fdc8d8SChris Lattner 32730fdc8d8SChris Lattner std::string channel(args.GetArgumentAtIndex(i)); 32830fdc8d8SChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 32930fdc8d8SChris Lattner { 33030fdc8d8SChris Lattner log_callbacks.list_categories (&result.GetOutputStream()); 33130fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 33230fdc8d8SChris Lattner } 33330fdc8d8SChris Lattner else if (channel == "all") 33430fdc8d8SChris Lattner { 33530fdc8d8SChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 33630fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 33730fdc8d8SChris Lattner } 33830fdc8d8SChris Lattner else 33930fdc8d8SChris Lattner { 34030fdc8d8SChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 34130fdc8d8SChris Lattner if (log_channel_sp) 34230fdc8d8SChris Lattner { 34330fdc8d8SChris Lattner log_channel_sp->ListCategories(&result.GetOutputStream()); 34430fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 34530fdc8d8SChris Lattner } 34630fdc8d8SChris Lattner else 34730fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 34830fdc8d8SChris Lattner } 34930fdc8d8SChris Lattner } 35030fdc8d8SChris Lattner } 35130fdc8d8SChris Lattner return result.Succeeded(); 35230fdc8d8SChris Lattner } 35330fdc8d8SChris Lattner }; 35430fdc8d8SChris Lattner 35530fdc8d8SChris Lattner class CommandObjectLogTimer : public CommandObject 35630fdc8d8SChris Lattner { 35730fdc8d8SChris Lattner public: 35830fdc8d8SChris Lattner //------------------------------------------------------------------ 35930fdc8d8SChris Lattner // Constructors and Destructors 36030fdc8d8SChris Lattner //------------------------------------------------------------------ 361a7015092SGreg Clayton CommandObjectLogTimer(CommandInterpreter &interpreter) : 362a7015092SGreg Clayton CommandObject (interpreter, 363a7015092SGreg Clayton "log timers", 36430fdc8d8SChris Lattner "Enable, disable, dump, and reset LLDB internal performance timers.", 36530fdc8d8SChris Lattner "log timers < enable | disable | dump | reset >") 36630fdc8d8SChris Lattner { 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 36930fdc8d8SChris Lattner virtual 37030fdc8d8SChris Lattner ~CommandObjectLogTimer() 37130fdc8d8SChris Lattner { 37230fdc8d8SChris Lattner } 37330fdc8d8SChris Lattner 37430fdc8d8SChris Lattner virtual bool 375a7015092SGreg Clayton Execute (Args& args, 37630fdc8d8SChris Lattner CommandReturnObject &result) 37730fdc8d8SChris Lattner { 37830fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 37930fdc8d8SChris Lattner result.SetStatus(eReturnStatusFailed); 38030fdc8d8SChris Lattner 38130fdc8d8SChris Lattner if (argc == 1) 38230fdc8d8SChris Lattner { 38330fdc8d8SChris Lattner const char *sub_command = args.GetArgumentAtIndex(0); 38430fdc8d8SChris Lattner 38530fdc8d8SChris Lattner if (strcasecmp(sub_command, "enable") == 0) 38630fdc8d8SChris Lattner { 38730fdc8d8SChris Lattner Timer::SetDisplayDepth (UINT32_MAX); 38830fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 38930fdc8d8SChris Lattner } 39030fdc8d8SChris Lattner else if (strcasecmp(sub_command, "disable") == 0) 39130fdc8d8SChris Lattner { 39230fdc8d8SChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 39330fdc8d8SChris Lattner Timer::SetDisplayDepth (0); 39430fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 39530fdc8d8SChris Lattner } 39630fdc8d8SChris Lattner else if (strcasecmp(sub_command, "dump") == 0) 39730fdc8d8SChris Lattner { 39830fdc8d8SChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 39930fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 40030fdc8d8SChris Lattner } 40130fdc8d8SChris Lattner else if (strcasecmp(sub_command, "reset") == 0) 40230fdc8d8SChris Lattner { 40330fdc8d8SChris Lattner Timer::ResetCategoryTimes (); 40430fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 40530fdc8d8SChris Lattner } 40630fdc8d8SChris Lattner 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner if (!result.Succeeded()) 40930fdc8d8SChris Lattner { 41030fdc8d8SChris Lattner result.AppendError("Missing subcommand"); 41130fdc8d8SChris Lattner result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 41230fdc8d8SChris Lattner } 41330fdc8d8SChris Lattner return result.Succeeded(); 41430fdc8d8SChris Lattner } 41530fdc8d8SChris Lattner }; 41630fdc8d8SChris Lattner 41730fdc8d8SChris Lattner //---------------------------------------------------------------------- 41830fdc8d8SChris Lattner // CommandObjectLog constructor 41930fdc8d8SChris Lattner //---------------------------------------------------------------------- 4206611103cSGreg Clayton CommandObjectLog::CommandObjectLog(CommandInterpreter &interpreter) : 421a7015092SGreg Clayton CommandObjectMultiword (interpreter, 422a7015092SGreg Clayton "log", 42330fdc8d8SChris Lattner "A set of commands for operating on logs.", 42430fdc8d8SChris Lattner "log <command> [<command-options>]") 42530fdc8d8SChris Lattner { 426a7015092SGreg Clayton LoadSubCommand ("enable", CommandObjectSP (new CommandObjectLogEnable (interpreter))); 427a7015092SGreg Clayton LoadSubCommand ("disable", CommandObjectSP (new CommandObjectLogDisable (interpreter))); 428a7015092SGreg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectLogList (interpreter))); 429a7015092SGreg Clayton LoadSubCommand ("timers", CommandObjectSP (new CommandObjectLogTimer (interpreter))); 43030fdc8d8SChris Lattner } 43130fdc8d8SChris Lattner 43230fdc8d8SChris Lattner //---------------------------------------------------------------------- 43330fdc8d8SChris Lattner // Destructor 43430fdc8d8SChris Lattner //---------------------------------------------------------------------- 43530fdc8d8SChris Lattner CommandObjectLog::~CommandObjectLog() 43630fdc8d8SChris Lattner { 43730fdc8d8SChris Lattner } 43830fdc8d8SChris Lattner 43930fdc8d8SChris Lattner 44030fdc8d8SChris Lattner 44130fdc8d8SChris Lattner 442