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