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 18*40af72e1SJim 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" 23*40af72e1SJim 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 2930fdc8d8SChris Lattner #include "lldb/Interpreter/CommandContext.h" 3030fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h" 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner #include "lldb/Symbol/LineTable.h" 3330fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h" 3430fdc8d8SChris Lattner #include "lldb/Symbol/SymbolFile.h" 3530fdc8d8SChris Lattner #include "lldb/Symbol/SymbolVendor.h" 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3830fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner using namespace lldb; 4130fdc8d8SChris Lattner using namespace lldb_private; 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner static LogChannelSP 4530fdc8d8SChris Lattner GetLogChannelPluginForChannel (const char *channel) 4630fdc8d8SChris Lattner { 4730fdc8d8SChris Lattner std::string log_channel_plugin_name(channel); 4830fdc8d8SChris Lattner log_channel_plugin_name += LogChannel::GetPluginSuffix(); 4930fdc8d8SChris Lattner LogChannelSP log_channel_sp (LogChannel::FindPlugin (log_channel_plugin_name.c_str())); 5030fdc8d8SChris Lattner return log_channel_sp; 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner class CommandObjectLogEnable : public CommandObject 5530fdc8d8SChris Lattner { 5630fdc8d8SChris Lattner public: 5730fdc8d8SChris Lattner //------------------------------------------------------------------ 5830fdc8d8SChris Lattner // Constructors and Destructors 5930fdc8d8SChris Lattner //------------------------------------------------------------------ 6030fdc8d8SChris Lattner CommandObjectLogEnable() : 6130fdc8d8SChris Lattner CommandObject ("log enable", 6230fdc8d8SChris Lattner "Enable logging for a single log channel.", 6330fdc8d8SChris Lattner "log enable [<cmd-options>] <channel>") 6430fdc8d8SChris Lattner { 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 6730fdc8d8SChris Lattner virtual 6830fdc8d8SChris Lattner ~CommandObjectLogEnable() 6930fdc8d8SChris Lattner { 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 7230fdc8d8SChris Lattner Options * 7330fdc8d8SChris Lattner GetOptions () 7430fdc8d8SChris Lattner { 7530fdc8d8SChris Lattner return &m_options; 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 7830fdc8d8SChris Lattner virtual bool 7930fdc8d8SChris Lattner Execute (Args& args, 8030fdc8d8SChris Lattner CommandContext *context, 8130fdc8d8SChris Lattner CommandInterpreter *interpreter, 8230fdc8d8SChris Lattner CommandReturnObject &result) 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner if (args.GetArgumentCount() < 1) 8530fdc8d8SChris Lattner { 8630fdc8d8SChris Lattner result.GetErrorStream() << 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 { 9830fdc8d8SChris Lattner std::string log_file("<lldb.debugger>"); 9930fdc8d8SChris Lattner LogStreamMap::iterator pos = m_log_streams.find(log_file); 10030fdc8d8SChris Lattner if (pos == m_log_streams.end()) 10130fdc8d8SChris Lattner { 10230fdc8d8SChris Lattner log_stream_sp = Log::GetStreamForSTDOUT (); 10330fdc8d8SChris Lattner if (log_stream_sp) 10430fdc8d8SChris Lattner m_log_streams[log_file] = log_stream_sp; 10530fdc8d8SChris Lattner } 10630fdc8d8SChris Lattner else 10730fdc8d8SChris Lattner log_stream_sp = pos->second; 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner else 11030fdc8d8SChris Lattner { 11130fdc8d8SChris Lattner LogStreamMap::iterator pos = m_log_streams.find(m_options.log_file); 11230fdc8d8SChris Lattner if (pos == m_log_streams.end()) 11330fdc8d8SChris Lattner { 11430fdc8d8SChris Lattner log_stream_sp.reset (new StreamFile (m_options.log_file.c_str(), "w")); 11530fdc8d8SChris Lattner m_log_streams[m_options.log_file] = log_stream_sp; 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner else 11830fdc8d8SChris Lattner log_stream_sp = pos->second; 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner assert (log_stream_sp.get()); 12130fdc8d8SChris Lattner uint32_t log_options = m_options.log_options; 12230fdc8d8SChris Lattner if (log_options == 0) 12330fdc8d8SChris Lattner log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 12430fdc8d8SChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 12530fdc8d8SChris Lattner { 12630fdc8d8SChris Lattner log_callbacks.enable (log_stream_sp, log_options, args, &result.GetErrorStream()); 12730fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner else 13030fdc8d8SChris Lattner { 13130fdc8d8SChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 13230fdc8d8SChris Lattner if (log_channel_sp) 13330fdc8d8SChris Lattner { 13430fdc8d8SChris Lattner if (log_channel_sp->Enable (log_stream_sp, log_options, &result.GetErrorStream(), args)) 13530fdc8d8SChris Lattner { 13630fdc8d8SChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 13730fdc8d8SChris Lattner } 13830fdc8d8SChris Lattner else 13930fdc8d8SChris Lattner { 14030fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 14130fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 14230fdc8d8SChris Lattner } 14330fdc8d8SChris Lattner } 14430fdc8d8SChris Lattner else 14530fdc8d8SChris Lattner { 14630fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 14730fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 14830fdc8d8SChris Lattner } 14930fdc8d8SChris Lattner } 15030fdc8d8SChris Lattner } 15130fdc8d8SChris Lattner return result.Succeeded(); 15230fdc8d8SChris Lattner } 15330fdc8d8SChris Lattner 15430fdc8d8SChris Lattner 15530fdc8d8SChris Lattner class CommandOptions : public Options 15630fdc8d8SChris Lattner { 15730fdc8d8SChris Lattner public: 15830fdc8d8SChris Lattner 15930fdc8d8SChris Lattner CommandOptions () : 16030fdc8d8SChris Lattner Options (), 16130fdc8d8SChris Lattner log_file (), 16230fdc8d8SChris Lattner log_options (0) 16330fdc8d8SChris Lattner { 16430fdc8d8SChris Lattner } 16530fdc8d8SChris Lattner 16630fdc8d8SChris Lattner 16730fdc8d8SChris Lattner virtual 16830fdc8d8SChris Lattner ~CommandOptions () 16930fdc8d8SChris Lattner { 17030fdc8d8SChris Lattner } 17130fdc8d8SChris Lattner 17230fdc8d8SChris Lattner virtual Error 17330fdc8d8SChris Lattner SetOptionValue (int option_idx, const char *option_arg) 17430fdc8d8SChris Lattner { 17530fdc8d8SChris Lattner Error error; 17630fdc8d8SChris Lattner char short_option = (char) m_getopt_table[option_idx].val; 17730fdc8d8SChris Lattner 17830fdc8d8SChris Lattner switch (short_option) 17930fdc8d8SChris Lattner { 18030fdc8d8SChris Lattner case 'f': log_file = option_arg; break; 18130fdc8d8SChris Lattner case 't': log_options |= LLDB_LOG_OPTION_THREADSAFE; break; 18230fdc8d8SChris Lattner case 'v': log_options |= LLDB_LOG_OPTION_VERBOSE; break; 18330fdc8d8SChris Lattner case 'g': log_options |= LLDB_LOG_OPTION_DEBUG; break; 18430fdc8d8SChris Lattner case 's': log_options |= LLDB_LOG_OPTION_PREPEND_SEQUENCE; break; 18530fdc8d8SChris Lattner case 'T': log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP; break; 18630fdc8d8SChris Lattner case 'p': log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break; 18730fdc8d8SChris Lattner case 'n': log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME; break; 18830fdc8d8SChris Lattner default: 18930fdc8d8SChris Lattner error.SetErrorStringWithFormat ("Unrecognized option '%c'\n", short_option); 19030fdc8d8SChris Lattner break; 19130fdc8d8SChris Lattner } 19230fdc8d8SChris Lattner 19330fdc8d8SChris Lattner return error; 19430fdc8d8SChris Lattner } 19530fdc8d8SChris Lattner 19630fdc8d8SChris Lattner void 19730fdc8d8SChris Lattner ResetOptionValues () 19830fdc8d8SChris Lattner { 19930fdc8d8SChris Lattner Options::ResetOptionValues(); 20030fdc8d8SChris Lattner log_file.clear(); 20130fdc8d8SChris Lattner log_options = 0; 20230fdc8d8SChris Lattner } 20330fdc8d8SChris Lattner 20430fdc8d8SChris Lattner const lldb::OptionDefinition* 20530fdc8d8SChris Lattner GetDefinitions () 20630fdc8d8SChris Lattner { 20730fdc8d8SChris Lattner return g_option_table; 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner 21030fdc8d8SChris Lattner // Options table: Required for subclasses of Options. 21130fdc8d8SChris Lattner 21230fdc8d8SChris Lattner static lldb::OptionDefinition g_option_table[]; 21330fdc8d8SChris Lattner 21430fdc8d8SChris Lattner // Instance variables to hold the values for command options. 21530fdc8d8SChris Lattner 21630fdc8d8SChris Lattner std::string log_file; 21730fdc8d8SChris Lattner uint32_t log_options; 21830fdc8d8SChris Lattner }; 21930fdc8d8SChris Lattner 22030fdc8d8SChris Lattner protected: 22130fdc8d8SChris Lattner typedef std::map<std::string, StreamSP> LogStreamMap; 22230fdc8d8SChris Lattner CommandOptions m_options; 22330fdc8d8SChris Lattner LogStreamMap m_log_streams; 22430fdc8d8SChris Lattner }; 22530fdc8d8SChris Lattner 22630fdc8d8SChris Lattner lldb::OptionDefinition 22730fdc8d8SChris Lattner CommandObjectLogEnable::CommandOptions::g_option_table[] = 22830fdc8d8SChris Lattner { 2298651121cSJim Ingham { LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, 0, "<filename>", "Set the destination file to log to."}, 2308651121cSJim Ingham { LLDB_OPT_SET_1, false, "threadsafe", 't', no_argument, NULL, 0, NULL, "Enable thread safe logging to avoid interweaved log lines." }, 2318651121cSJim Ingham { LLDB_OPT_SET_1, false, "verbose", 'v', no_argument, NULL, 0, NULL, "Enable verbose logging." }, 2328651121cSJim Ingham { LLDB_OPT_SET_1, false, "debug", 'g', no_argument, NULL, 0, NULL, "Enable debug logging." }, 2338651121cSJim Ingham { LLDB_OPT_SET_1, false, "sequence", 's', no_argument, NULL, 0, NULL, "Prepend all log lines with an increasing integer sequence id." }, 2348651121cSJim Ingham { LLDB_OPT_SET_1, false, "timestamp", 'T', no_argument, NULL, 0, NULL, "Prepend all log lines with a timestamp." }, 2358651121cSJim Ingham { LLDB_OPT_SET_1, false, "pid-tid", 'p', no_argument, NULL, 0, NULL, "Prepend all log lines with the process and thread ID that generates the log line." }, 2368651121cSJim Ingham { LLDB_OPT_SET_1, false, "thread-name",'n', no_argument, NULL, 0, NULL, "Prepend all log lines with the thread name for the thread that generates the log line." }, 23730fdc8d8SChris Lattner { 0, false, NULL, 0, 0, NULL, 0, NULL, NULL } 23830fdc8d8SChris Lattner }; 23930fdc8d8SChris Lattner 24030fdc8d8SChris Lattner class CommandObjectLogDisable : public CommandObject 24130fdc8d8SChris Lattner { 24230fdc8d8SChris Lattner public: 24330fdc8d8SChris Lattner //------------------------------------------------------------------ 24430fdc8d8SChris Lattner // Constructors and Destructors 24530fdc8d8SChris Lattner //------------------------------------------------------------------ 24630fdc8d8SChris Lattner CommandObjectLogDisable() : 24730fdc8d8SChris Lattner CommandObject ("log disable", 24830fdc8d8SChris Lattner "Disable one or more log channels.", 24930fdc8d8SChris Lattner "log disable <channel> [<channel> ...]") 25030fdc8d8SChris Lattner { 25130fdc8d8SChris Lattner } 25230fdc8d8SChris Lattner 25330fdc8d8SChris Lattner virtual 25430fdc8d8SChris Lattner ~CommandObjectLogDisable() 25530fdc8d8SChris Lattner { 25630fdc8d8SChris Lattner } 25730fdc8d8SChris Lattner 25830fdc8d8SChris Lattner virtual bool 25930fdc8d8SChris Lattner Execute (Args& args, 26030fdc8d8SChris Lattner CommandContext *context, 26130fdc8d8SChris Lattner CommandInterpreter *interpreter, 26230fdc8d8SChris Lattner CommandReturnObject &result) 26330fdc8d8SChris Lattner { 26430fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 26530fdc8d8SChris Lattner if (argc == 0) 26630fdc8d8SChris Lattner { 26730fdc8d8SChris Lattner result.GetErrorStream() << m_cmd_syntax.c_str(); 26830fdc8d8SChris Lattner } 26930fdc8d8SChris Lattner else 27030fdc8d8SChris Lattner { 27130fdc8d8SChris Lattner for (size_t i=0; i<argc; ++i) 27230fdc8d8SChris Lattner { 27330fdc8d8SChris Lattner Log::Callbacks log_callbacks; 27430fdc8d8SChris Lattner 27530fdc8d8SChris Lattner std::string channel(args.GetArgumentAtIndex(i)); 27630fdc8d8SChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 27730fdc8d8SChris Lattner { 27830fdc8d8SChris Lattner log_callbacks.disable (); 27930fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 28030fdc8d8SChris Lattner } 28130fdc8d8SChris Lattner else if (channel == "all") 28230fdc8d8SChris Lattner { 28330fdc8d8SChris Lattner Log::DisableAllLogChannels(); 28430fdc8d8SChris Lattner } 28530fdc8d8SChris Lattner else 28630fdc8d8SChris Lattner { 28730fdc8d8SChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 28830fdc8d8SChris Lattner if (log_channel_sp) 28930fdc8d8SChris Lattner { 29030fdc8d8SChris Lattner log_channel_sp->Disable(); 29130fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 29230fdc8d8SChris Lattner } 29330fdc8d8SChris Lattner else 29430fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 29530fdc8d8SChris Lattner } 29630fdc8d8SChris Lattner } 29730fdc8d8SChris Lattner } 29830fdc8d8SChris Lattner return result.Succeeded(); 29930fdc8d8SChris Lattner } 30030fdc8d8SChris Lattner }; 30130fdc8d8SChris Lattner 30230fdc8d8SChris Lattner class CommandObjectLogList : public CommandObject 30330fdc8d8SChris Lattner { 30430fdc8d8SChris Lattner public: 30530fdc8d8SChris Lattner //------------------------------------------------------------------ 30630fdc8d8SChris Lattner // Constructors and Destructors 30730fdc8d8SChris Lattner //------------------------------------------------------------------ 30830fdc8d8SChris Lattner CommandObjectLogList() : 30930fdc8d8SChris Lattner CommandObject ("log list", 31030fdc8d8SChris Lattner "List the log categories for one or more log channels.", 31130fdc8d8SChris Lattner "log list <channel> [<channel> ...]") 31230fdc8d8SChris Lattner { 31330fdc8d8SChris Lattner } 31430fdc8d8SChris Lattner 31530fdc8d8SChris Lattner virtual 31630fdc8d8SChris Lattner ~CommandObjectLogList() 31730fdc8d8SChris Lattner { 31830fdc8d8SChris Lattner } 31930fdc8d8SChris Lattner 32030fdc8d8SChris Lattner virtual bool 32130fdc8d8SChris Lattner Execute (Args& args, 32230fdc8d8SChris Lattner CommandContext *context, 32330fdc8d8SChris Lattner CommandInterpreter *interpreter, 32430fdc8d8SChris Lattner CommandReturnObject &result) 32530fdc8d8SChris Lattner { 32630fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 32730fdc8d8SChris Lattner if (argc == 0) 32830fdc8d8SChris Lattner { 32930fdc8d8SChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 33030fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 33130fdc8d8SChris Lattner } 33230fdc8d8SChris Lattner else 33330fdc8d8SChris Lattner { 33430fdc8d8SChris Lattner for (size_t i=0; i<argc; ++i) 33530fdc8d8SChris Lattner { 33630fdc8d8SChris Lattner Log::Callbacks log_callbacks; 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner std::string channel(args.GetArgumentAtIndex(i)); 33930fdc8d8SChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 34030fdc8d8SChris Lattner { 34130fdc8d8SChris Lattner log_callbacks.list_categories (&result.GetOutputStream()); 34230fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 34330fdc8d8SChris Lattner } 34430fdc8d8SChris Lattner else if (channel == "all") 34530fdc8d8SChris Lattner { 34630fdc8d8SChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 34730fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 34830fdc8d8SChris Lattner } 34930fdc8d8SChris Lattner else 35030fdc8d8SChris Lattner { 35130fdc8d8SChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 35230fdc8d8SChris Lattner if (log_channel_sp) 35330fdc8d8SChris Lattner { 35430fdc8d8SChris Lattner log_channel_sp->ListCategories(&result.GetOutputStream()); 35530fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 35630fdc8d8SChris Lattner } 35730fdc8d8SChris Lattner else 35830fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 35930fdc8d8SChris Lattner } 36030fdc8d8SChris Lattner } 36130fdc8d8SChris Lattner } 36230fdc8d8SChris Lattner return result.Succeeded(); 36330fdc8d8SChris Lattner } 36430fdc8d8SChris Lattner }; 36530fdc8d8SChris Lattner 36630fdc8d8SChris Lattner class CommandObjectLogTimer : public CommandObject 36730fdc8d8SChris Lattner { 36830fdc8d8SChris Lattner public: 36930fdc8d8SChris Lattner //------------------------------------------------------------------ 37030fdc8d8SChris Lattner // Constructors and Destructors 37130fdc8d8SChris Lattner //------------------------------------------------------------------ 37230fdc8d8SChris Lattner CommandObjectLogTimer() : 37330fdc8d8SChris Lattner CommandObject ("log timers", 37430fdc8d8SChris Lattner "Enable, disable, dump, and reset LLDB internal performance timers.", 37530fdc8d8SChris Lattner "log timers < enable | disable | dump | reset >") 37630fdc8d8SChris Lattner { 37730fdc8d8SChris Lattner } 37830fdc8d8SChris Lattner 37930fdc8d8SChris Lattner virtual 38030fdc8d8SChris Lattner ~CommandObjectLogTimer() 38130fdc8d8SChris Lattner { 38230fdc8d8SChris Lattner } 38330fdc8d8SChris Lattner 38430fdc8d8SChris Lattner virtual bool 38530fdc8d8SChris Lattner Execute (Args& args, 38630fdc8d8SChris Lattner CommandContext *context, 38730fdc8d8SChris Lattner CommandInterpreter *interpreter, 38830fdc8d8SChris Lattner CommandReturnObject &result) 38930fdc8d8SChris Lattner { 39030fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 39130fdc8d8SChris Lattner result.SetStatus(eReturnStatusFailed); 39230fdc8d8SChris Lattner 39330fdc8d8SChris Lattner if (argc == 1) 39430fdc8d8SChris Lattner { 39530fdc8d8SChris Lattner const char *sub_command = args.GetArgumentAtIndex(0); 39630fdc8d8SChris Lattner 39730fdc8d8SChris Lattner if (strcasecmp(sub_command, "enable") == 0) 39830fdc8d8SChris Lattner { 39930fdc8d8SChris Lattner Timer::SetDisplayDepth (UINT32_MAX); 40030fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 40130fdc8d8SChris Lattner } 40230fdc8d8SChris Lattner else if (strcasecmp(sub_command, "disable") == 0) 40330fdc8d8SChris Lattner { 40430fdc8d8SChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 40530fdc8d8SChris Lattner Timer::SetDisplayDepth (0); 40630fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner else if (strcasecmp(sub_command, "dump") == 0) 40930fdc8d8SChris Lattner { 41030fdc8d8SChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 41130fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 41230fdc8d8SChris Lattner } 41330fdc8d8SChris Lattner else if (strcasecmp(sub_command, "reset") == 0) 41430fdc8d8SChris Lattner { 41530fdc8d8SChris Lattner Timer::ResetCategoryTimes (); 41630fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 41730fdc8d8SChris Lattner } 41830fdc8d8SChris Lattner 41930fdc8d8SChris Lattner } 42030fdc8d8SChris Lattner if (!result.Succeeded()) 42130fdc8d8SChris Lattner { 42230fdc8d8SChris Lattner result.AppendError("Missing subcommand"); 42330fdc8d8SChris Lattner result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 42430fdc8d8SChris Lattner } 42530fdc8d8SChris Lattner return result.Succeeded(); 42630fdc8d8SChris Lattner } 42730fdc8d8SChris Lattner }; 42830fdc8d8SChris Lattner 42930fdc8d8SChris Lattner //---------------------------------------------------------------------- 43030fdc8d8SChris Lattner // CommandObjectLog constructor 43130fdc8d8SChris Lattner //---------------------------------------------------------------------- 43230fdc8d8SChris Lattner CommandObjectLog::CommandObjectLog(CommandInterpreter *interpreter) : 43330fdc8d8SChris Lattner CommandObjectMultiword ("log", 43430fdc8d8SChris Lattner "A set of commands for operating on logs.", 43530fdc8d8SChris Lattner "log <command> [<command-options>]") 43630fdc8d8SChris Lattner { 43730fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectLogEnable), "enable", interpreter); 43830fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectLogDisable), "disable", interpreter); 43930fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectLogList), "list", interpreter); 44030fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectLogTimer), "timers", interpreter); 44130fdc8d8SChris Lattner } 44230fdc8d8SChris Lattner 44330fdc8d8SChris Lattner //---------------------------------------------------------------------- 44430fdc8d8SChris Lattner // Destructor 44530fdc8d8SChris Lattner //---------------------------------------------------------------------- 44630fdc8d8SChris Lattner CommandObjectLog::~CommandObjectLog() 44730fdc8d8SChris Lattner { 44830fdc8d8SChris Lattner } 44930fdc8d8SChris Lattner 45030fdc8d8SChris Lattner 45130fdc8d8SChris Lattner 45230fdc8d8SChris Lattner 453