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" 30*4be3990fSSean 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 //------------------------------------------------------------------ 6130fdc8d8SChris Lattner CommandObjectLogEnable() : 6230fdc8d8SChris Lattner CommandObject ("log enable", 6330fdc8d8SChris Lattner "Enable logging for a single log channel.", 6430fdc8d8SChris Lattner "log enable [<cmd-options>] <channel>") 6530fdc8d8SChris Lattner { 6630fdc8d8SChris Lattner } 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner virtual 6930fdc8d8SChris Lattner ~CommandObjectLogEnable() 7030fdc8d8SChris Lattner { 7130fdc8d8SChris Lattner } 7230fdc8d8SChris Lattner 7330fdc8d8SChris Lattner Options * 7430fdc8d8SChris Lattner GetOptions () 7530fdc8d8SChris Lattner { 7630fdc8d8SChris Lattner return &m_options; 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner virtual bool 806611103cSGreg Clayton Execute (CommandInterpreter &interpreter, 816611103cSGreg Clayton Args& args, 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 { 98*4be3990fSSean Callanan log_stream_sp.reset(new StreamFile(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 { 2208651121cSJim Ingham { LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, 0, "<filename>", "Set the destination file to log to."}, 2218651121cSJim Ingham { LLDB_OPT_SET_1, false, "threadsafe", 't', no_argument, NULL, 0, NULL, "Enable thread safe logging to avoid interweaved log lines." }, 2228651121cSJim Ingham { LLDB_OPT_SET_1, false, "verbose", 'v', no_argument, NULL, 0, NULL, "Enable verbose logging." }, 2238651121cSJim Ingham { LLDB_OPT_SET_1, false, "debug", 'g', no_argument, NULL, 0, NULL, "Enable debug logging." }, 2248651121cSJim Ingham { LLDB_OPT_SET_1, false, "sequence", 's', no_argument, NULL, 0, NULL, "Prepend all log lines with an increasing integer sequence id." }, 2258651121cSJim Ingham { LLDB_OPT_SET_1, false, "timestamp", 'T', no_argument, NULL, 0, NULL, "Prepend all log lines with a timestamp." }, 2268651121cSJim 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." }, 2278651121cSJim 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." }, 22830fdc8d8SChris Lattner { 0, false, NULL, 0, 0, NULL, 0, NULL, 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 //------------------------------------------------------------------ 23730fdc8d8SChris Lattner CommandObjectLogDisable() : 23830fdc8d8SChris Lattner CommandObject ("log disable", 23930fdc8d8SChris Lattner "Disable one or more log channels.", 24030fdc8d8SChris Lattner "log disable <channel> [<channel> ...]") 24130fdc8d8SChris Lattner { 24230fdc8d8SChris Lattner } 24330fdc8d8SChris Lattner 24430fdc8d8SChris Lattner virtual 24530fdc8d8SChris Lattner ~CommandObjectLogDisable() 24630fdc8d8SChris Lattner { 24730fdc8d8SChris Lattner } 24830fdc8d8SChris Lattner 24930fdc8d8SChris Lattner virtual bool 2506611103cSGreg Clayton Execute (CommandInterpreter &interpreter, 2516611103cSGreg Clayton Args& args, 25230fdc8d8SChris Lattner CommandReturnObject &result) 25330fdc8d8SChris Lattner { 25430fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 25530fdc8d8SChris Lattner if (argc == 0) 25630fdc8d8SChris Lattner { 25730fdc8d8SChris Lattner result.GetErrorStream() << 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 //------------------------------------------------------------------ 29830fdc8d8SChris Lattner CommandObjectLogList() : 29930fdc8d8SChris Lattner CommandObject ("log list", 30030fdc8d8SChris Lattner "List the log categories for one or more log channels.", 30130fdc8d8SChris Lattner "log list <channel> [<channel> ...]") 30230fdc8d8SChris Lattner { 30330fdc8d8SChris Lattner } 30430fdc8d8SChris Lattner 30530fdc8d8SChris Lattner virtual 30630fdc8d8SChris Lattner ~CommandObjectLogList() 30730fdc8d8SChris Lattner { 30830fdc8d8SChris Lattner } 30930fdc8d8SChris Lattner 31030fdc8d8SChris Lattner virtual bool 3116611103cSGreg Clayton Execute (CommandInterpreter &interpreter, 3126611103cSGreg Clayton 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 //------------------------------------------------------------------ 36130fdc8d8SChris Lattner CommandObjectLogTimer() : 36230fdc8d8SChris Lattner CommandObject ("log timers", 36330fdc8d8SChris Lattner "Enable, disable, dump, and reset LLDB internal performance timers.", 36430fdc8d8SChris Lattner "log timers < enable | disable | dump | reset >") 36530fdc8d8SChris Lattner { 36630fdc8d8SChris Lattner } 36730fdc8d8SChris Lattner 36830fdc8d8SChris Lattner virtual 36930fdc8d8SChris Lattner ~CommandObjectLogTimer() 37030fdc8d8SChris Lattner { 37130fdc8d8SChris Lattner } 37230fdc8d8SChris Lattner 37330fdc8d8SChris Lattner virtual bool 3746611103cSGreg Clayton Execute (CommandInterpreter &interpreter, 3756611103cSGreg Clayton 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) : 42130fdc8d8SChris Lattner CommandObjectMultiword ("log", 42230fdc8d8SChris Lattner "A set of commands for operating on logs.", 42330fdc8d8SChris Lattner "log <command> [<command-options>]") 42430fdc8d8SChris Lattner { 4256611103cSGreg Clayton LoadSubCommand (interpreter, "enable", CommandObjectSP (new CommandObjectLogEnable)); 4266611103cSGreg Clayton LoadSubCommand (interpreter, "disable", CommandObjectSP (new CommandObjectLogDisable)); 4276611103cSGreg Clayton LoadSubCommand (interpreter, "list", CommandObjectSP (new CommandObjectLogList)); 4286611103cSGreg Clayton LoadSubCommand (interpreter, "timers", CommandObjectSP (new CommandObjectLogTimer)); 42930fdc8d8SChris Lattner } 43030fdc8d8SChris Lattner 43130fdc8d8SChris Lattner //---------------------------------------------------------------------- 43230fdc8d8SChris Lattner // Destructor 43330fdc8d8SChris Lattner //---------------------------------------------------------------------- 43430fdc8d8SChris Lattner CommandObjectLog::~CommandObjectLog() 43530fdc8d8SChris Lattner { 43630fdc8d8SChris Lattner } 43730fdc8d8SChris Lattner 43830fdc8d8SChris Lattner 43930fdc8d8SChris Lattner 44030fdc8d8SChris Lattner 441