CommandObjectLog.cpp revision b344843f75ef893762c93fd0a22d2d45712ce74d
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 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic LogChannelSP 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetLogChannelPluginForChannel (const char *channel) 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string log_channel_plugin_name(channel); 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_channel_plugin_name += LogChannel::GetPluginSuffix(); 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelSP log_channel_sp (LogChannel::FindPlugin (log_channel_plugin_name.c_str())); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return log_channel_sp; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogEnable : public CommandObject 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 61238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectLogEnable(CommandInterpreter &interpreter) : 62238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 63238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "log enable", 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Enable logging for a single log channel.", 6543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL) 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 677826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 687826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice CommandArgumentEntry arg1; 697826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice CommandArgumentEntry arg2; 7043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData channel_arg; 717826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice CommandArgumentData category_arg; 7243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 7343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 7443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice channel_arg.arg_type = eArgTypeLogChannel; 7543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice channel_arg.arg_repetition = eArgRepeatPlain; 7643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 7743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 787826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice arg1.push_back (channel_arg); 7943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 807826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice category_arg.arg_type = eArgTypeLogCategory; 817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice category_arg.arg_repetition = eArgRepeatPlus; 827826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 837826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice arg2.push_back (category_arg); 847826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 8543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 867826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice m_arguments.push_back (arg1); 877826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice m_arguments.push_back (arg2); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectLogEnable() 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options * 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions () 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_options; 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 102238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Execute (Args& args, 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (args.GetArgumentCount() < 1) 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 107abb507ae79e20ab2dd8365049921df73a24c95a5Caroline Tice result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log::Callbacks log_callbacks; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string channel(args.GetArgumentAtIndex(0)); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner args.Shift (); // Shift off the channel 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamSP log_stream_sp; 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_options.log_file.empty()) 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1185892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton log_stream_sp.reset(new StreamFile(m_interpreter.GetDebugger().GetOutputFile().GetDescriptor(), false)); 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogStreamMap::iterator pos = m_log_streams.find(m_options.log_file); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos == m_log_streams.end()) 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1255892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton log_stream_sp.reset (new StreamFile (m_options.log_file.c_str())); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_log_streams[m_options.log_file] = log_stream_sp; 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_stream_sp = pos->second; 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (log_stream_sp.get()); 132d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t log_options = m_options.log_options; 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_options == 0) 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_callbacks.enable (log_stream_sp, log_options, args, &result.GetErrorStream()); 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp) 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp->Enable (log_stream_sp, log_options, &result.GetErrorStream(), args)) 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class CommandOptions : public Options 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions () : 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options (), 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_file (), 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_options (0) 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandOptions () 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Error 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOptionValue (int option_idx, const char *option_arg) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char short_option = (char) m_getopt_table[option_idx].val; 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (short_option) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'f': log_file = option_arg; break; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 't': log_options |= LLDB_LOG_OPTION_THREADSAFE; break; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'v': log_options |= LLDB_LOG_OPTION_VERBOSE; break; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'g': log_options |= LLDB_LOG_OPTION_DEBUG; break; 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 's': log_options |= LLDB_LOG_OPTION_PREPEND_SEQUENCE; break; 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'T': log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP; break; 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'p': log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'n': log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME; break; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat ("Unrecognized option '%c'\n", short_option); 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ResetOptionValues () 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options::ResetOptionValues(); 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_file.clear(); 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_options = 0; 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDefinitions () 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_option_table; 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Options table: Required for subclasses of Options. 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 224b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Instance variables to hold the values for command options. 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string log_file; 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t log_options; 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::map<std::string, StreamSP> LogStreamMap; 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions m_options; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogStreamMap m_log_streams; 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 238b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLogEnable::CommandOptions::g_option_table[] = 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2414d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, 0, eArgTypeFilename, "Set the destination file to log to."}, 2424d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "threadsafe", 't', no_argument, NULL, 0, eArgTypeNone, "Enable thread safe logging to avoid interweaved log lines." }, 2434d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "verbose", 'v', no_argument, NULL, 0, eArgTypeNone, "Enable verbose logging." }, 2444d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "debug", 'g', no_argument, NULL, 0, eArgTypeNone, "Enable debug logging." }, 2454d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "sequence", 's', no_argument, NULL, 0, eArgTypeNone, "Prepend all log lines with an increasing integer sequence id." }, 2464d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "timestamp", 'T', no_argument, NULL, 0, eArgTypeNone, "Prepend all log lines with a timestamp." }, 2474d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." }, 2484d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." }, 2494d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogDisable : public CommandObject 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 258238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectLogDisable(CommandInterpreter &interpreter) : 259238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 260238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "log disable", 2616a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice "Disable one or more log channel categories.", 26243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL) 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2646a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice CommandArgumentEntry arg1; 2656a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice CommandArgumentEntry arg2; 26643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData channel_arg; 2676a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice CommandArgumentData category_arg; 26843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 26943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 27043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice channel_arg.arg_type = eArgTypeLogChannel; 2716a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice channel_arg.arg_repetition = eArgRepeatPlain; 27243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 27343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 2746a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice arg1.push_back (channel_arg); 27543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 2766a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice category_arg.arg_type = eArgTypeLogCategory; 2776a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice category_arg.arg_repetition = eArgRepeatPlus; 2786a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice 2796a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice arg2.push_back (category_arg); 2806a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice 28143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 2826a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice m_arguments.push_back (arg1); 2836a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice m_arguments.push_back (arg2); 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectLogDisable() 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 292238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Execute (Args& args, 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = args.GetArgumentCount(); 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc == 0) 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 298abb507ae79e20ab2dd8365049921df73a24c95a5Caroline Tice result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 302926060e198137f8a64face70455324a8cd4362a5Caroline Tice Log::Callbacks log_callbacks; 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304926060e198137f8a64face70455324a8cd4362a5Caroline Tice std::string channel(args.GetArgumentAtIndex(0)); 305926060e198137f8a64face70455324a8cd4362a5Caroline Tice args.Shift (); // Shift off the channel 306926060e198137f8a64face70455324a8cd4362a5Caroline Tice if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 307926060e198137f8a64face70455324a8cd4362a5Caroline Tice { 308926060e198137f8a64face70455324a8cd4362a5Caroline Tice log_callbacks.disable (args, &result.GetErrorStream()); 309926060e198137f8a64face70455324a8cd4362a5Caroline Tice result.SetStatus(eReturnStatusSuccessFinishNoResult); 310926060e198137f8a64face70455324a8cd4362a5Caroline Tice } 311926060e198137f8a64face70455324a8cd4362a5Caroline Tice else if (channel == "all") 312926060e198137f8a64face70455324a8cd4362a5Caroline Tice { 313926060e198137f8a64face70455324a8cd4362a5Caroline Tice Log::DisableAllLogChannels(&result.GetErrorStream()); 314926060e198137f8a64face70455324a8cd4362a5Caroline Tice } 315926060e198137f8a64face70455324a8cd4362a5Caroline Tice else 316926060e198137f8a64face70455324a8cd4362a5Caroline Tice { 317926060e198137f8a64face70455324a8cd4362a5Caroline Tice LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 318926060e198137f8a64face70455324a8cd4362a5Caroline Tice if (log_channel_sp) 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 320926060e198137f8a64face70455324a8cd4362a5Caroline Tice log_channel_sp->Disable(args, &result.GetErrorStream()); 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 324926060e198137f8a64face70455324a8cd4362a5Caroline Tice result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogList : public CommandObject 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 337238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectLogList(CommandInterpreter &interpreter) : 338238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 339238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "log list", 34043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice "List the log categories for one or more log channels. If none specified, lists them all.", 34143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL) 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 34443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData channel_arg; 34543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 34643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 34743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice channel_arg.arg_type = eArgTypeLogChannel; 34843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice channel_arg.arg_repetition = eArgRepeatStar; 34943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 35043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 35143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (channel_arg); 35243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 35343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 35443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectLogList() 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 363238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Execute (Args& args, 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = args.GetArgumentCount(); 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc == 0) 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<argc; ++i) 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log::Callbacks log_callbacks; 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string channel(args.GetArgumentAtIndex(i)); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_callbacks.list_categories (&result.GetOutputStream()); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (channel == "all") 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp) 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_channel_sp->ListCategories(&result.GetOutputStream()); 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogTimer : public CommandObject 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 412238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectLogTimer(CommandInterpreter &interpreter) : 413238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 414238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "log timers", 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Enable, disable, dump, and reset LLDB internal performance timers.", 4164ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham "log timers < enable <depth> | disable | dump | increment <bool> | reset >") 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectLogTimer() 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 426238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Execute (Args& args, 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = args.GetArgumentCount(); 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc == 1) 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *sub_command = args.GetArgumentAtIndex(0); 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (strcasecmp(sub_command, "enable") == 0) 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::SetDisplayDepth (UINT32_MAX); 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (strcasecmp(sub_command, "disable") == 0) 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::SetDisplayDepth (0); 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (strcasecmp(sub_command, "dump") == 0) 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (strcasecmp(sub_command, "reset") == 0) 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::ResetCategoryTimes (); 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham else if (argc == 2) 46019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham { 46119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham const char *sub_command = args.GetArgumentAtIndex(0); 46219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham 46319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham if (strcasecmp(sub_command, "enable") == 0) 46419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham { 46519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham bool success; 46619e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham uint32_t depth = Args::StringToUInt32(args.GetArgumentAtIndex(1), 0, 0, &success); 46719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham if (success) 46819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham { 46919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham Timer::SetDisplayDepth (depth); 47019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham result.SetStatus(eReturnStatusSuccessFinishNoResult); 47119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham } 47219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham else 47319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham result.AppendError("Could not convert enable depth to an unsigned integer."); 47419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham } 4754ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham if (strcasecmp(sub_command, "increment") == 0) 4764ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham { 4774ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham bool success; 4784ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham bool increment = Args::StringToBoolean(args.GetArgumentAtIndex(1), false, &success); 4794ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham if (success) 4804ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham { 4814ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham Timer::SetQuiet (!increment); 4824ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham result.SetStatus(eReturnStatusSuccessFinishNoResult); 4834ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham } 4844ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham else 4854ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham result.AppendError("Could not convert increment value to boolean."); 4864ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham } 48719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham } 48819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!result.Succeeded()) 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError("Missing subcommand"); 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectLog constructor 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 50163094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectLog::CommandObjectLog(CommandInterpreter &interpreter) : 502238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 503238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "log", 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "A set of commands for operating on logs.", 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "log <command> [<command-options>]") 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 507238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("enable", CommandObjectSP (new CommandObjectLogEnable (interpreter))); 508238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("disable", CommandObjectSP (new CommandObjectLogDisable (interpreter))); 509238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectLogList (interpreter))); 510238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("timers", CommandObjectSP (new CommandObjectLogTimer (interpreter))); 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLog::~CommandObjectLog() 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 523