CommandObjectLog.cpp revision 5f54ac373b119a4c6693e4875c48aa761fba0c86
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; 116d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham StreamFile *log_file_ptr = NULL; // This will get put in the log_stream_sp, no need to free it. 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_options.log_file.empty()) 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 119d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham log_file_ptr = new StreamFile(m_interpreter.GetDebugger().GetOutputFileHandle()); 120d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham log_stream_sp.reset(log_file_ptr); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogStreamMap::iterator pos = m_log_streams.find(m_options.log_file); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos == m_log_streams.end()) 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham log_file_ptr = new StreamFile (m_options.log_file.c_str(), "w"); 128d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham log_stream_sp.reset (log_file_ptr); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_log_streams[m_options.log_file] = log_stream_sp; 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_stream_sp = pos->second; 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (log_stream_sp.get()); 135d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham 136d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham // If we ended up making a StreamFile for log output, line buffer it. 137d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham if (log_file_ptr != NULL) 138d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham log_file_ptr->SetLineBuffered(); 139d1eb73fc5aeab5bb9ab79a84780be83eba12a6ceJim Ingham 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t log_options = m_options.log_options; 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_options == 0) 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_callbacks.enable (log_stream_sp, log_options, args, &result.GetErrorStream()); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp) 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp->Enable (log_stream_sp, log_options, &result.GetErrorStream(), args)) 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class CommandOptions : public Options 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions () : 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options (), 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_file (), 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_options (0) 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandOptions () 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Error 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOptionValue (int option_idx, const char *option_arg) 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char short_option = (char) m_getopt_table[option_idx].val; 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (short_option) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'f': log_file = option_arg; break; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 't': log_options |= LLDB_LOG_OPTION_THREADSAFE; break; 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'v': log_options |= LLDB_LOG_OPTION_VERBOSE; break; 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'g': log_options |= LLDB_LOG_OPTION_DEBUG; break; 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 's': log_options |= LLDB_LOG_OPTION_PREPEND_SEQUENCE; break; 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'T': log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP; break; 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'p': log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break; 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'n': log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME; break; 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat ("Unrecognized option '%c'\n", short_option); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ResetOptionValues () 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options::ResetOptionValues(); 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_file.clear(); 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_options = 0; 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb::OptionDefinition* 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDefinitions () 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_option_table; 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Options table: Required for subclasses of Options. 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb::OptionDefinition g_option_table[]; 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Instance variables to hold the values for command options. 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string log_file; 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t log_options; 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::map<std::string, StreamSP> LogStreamMap; 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions m_options; 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogStreamMap m_log_streams; 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::OptionDefinition 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLogEnable::CommandOptions::g_option_table[] = 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2484d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, 0, eArgTypeFilename, "Set the destination file to log to."}, 2494d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "threadsafe", 't', no_argument, NULL, 0, eArgTypeNone, "Enable thread safe logging to avoid interweaved log lines." }, 2504d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "verbose", 'v', no_argument, NULL, 0, eArgTypeNone, "Enable verbose logging." }, 2514d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "debug", 'g', no_argument, NULL, 0, eArgTypeNone, "Enable debug logging." }, 2524d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "sequence", 's', no_argument, NULL, 0, eArgTypeNone, "Prepend all log lines with an increasing integer sequence id." }, 2534d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "timestamp", 'T', no_argument, NULL, 0, eArgTypeNone, "Prepend all log lines with a timestamp." }, 2544d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." }, 2554d6675c8e1cab6360f59865229835ae137d6f68aCaroline 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." }, 2564d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogDisable : public CommandObject 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 265238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectLogDisable(CommandInterpreter &interpreter) : 266238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 267238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "log disable", 2686a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice "Disable one or more log channel categories.", 26943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL) 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2716a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice CommandArgumentEntry arg1; 2726a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice CommandArgumentEntry arg2; 27343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData channel_arg; 2746a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice CommandArgumentData category_arg; 27543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 27643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 27743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice channel_arg.arg_type = eArgTypeLogChannel; 2786a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice channel_arg.arg_repetition = eArgRepeatPlain; 27943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 28043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 2816a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice arg1.push_back (channel_arg); 28243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 2836a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice category_arg.arg_type = eArgTypeLogCategory; 2846a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice category_arg.arg_repetition = eArgRepeatPlus; 2856a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice 2866a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice arg2.push_back (category_arg); 2876a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice 28843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 2896a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice m_arguments.push_back (arg1); 2906a9e5c27e33fc43ff282a94769463e4e1a40754fCaroline Tice m_arguments.push_back (arg2); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectLogDisable() 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 299238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Execute (Args& args, 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = args.GetArgumentCount(); 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc == 0) 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305abb507ae79e20ab2dd8365049921df73a24c95a5Caroline Tice result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309926060e198137f8a64face70455324a8cd4362a5Caroline Tice Log::Callbacks log_callbacks; 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311926060e198137f8a64face70455324a8cd4362a5Caroline Tice std::string channel(args.GetArgumentAtIndex(0)); 312926060e198137f8a64face70455324a8cd4362a5Caroline Tice args.Shift (); // Shift off the channel 313926060e198137f8a64face70455324a8cd4362a5Caroline Tice if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 314926060e198137f8a64face70455324a8cd4362a5Caroline Tice { 315926060e198137f8a64face70455324a8cd4362a5Caroline Tice log_callbacks.disable (args, &result.GetErrorStream()); 316926060e198137f8a64face70455324a8cd4362a5Caroline Tice result.SetStatus(eReturnStatusSuccessFinishNoResult); 317926060e198137f8a64face70455324a8cd4362a5Caroline Tice } 318926060e198137f8a64face70455324a8cd4362a5Caroline Tice else if (channel == "all") 319926060e198137f8a64face70455324a8cd4362a5Caroline Tice { 320926060e198137f8a64face70455324a8cd4362a5Caroline Tice Log::DisableAllLogChannels(&result.GetErrorStream()); 321926060e198137f8a64face70455324a8cd4362a5Caroline Tice } 322926060e198137f8a64face70455324a8cd4362a5Caroline Tice else 323926060e198137f8a64face70455324a8cd4362a5Caroline Tice { 324926060e198137f8a64face70455324a8cd4362a5Caroline Tice LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 325926060e198137f8a64face70455324a8cd4362a5Caroline Tice if (log_channel_sp) 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 327926060e198137f8a64face70455324a8cd4362a5Caroline Tice log_channel_sp->Disable(args, &result.GetErrorStream()); 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 331926060e198137f8a64face70455324a8cd4362a5Caroline Tice result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogList : public CommandObject 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 344238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectLogList(CommandInterpreter &interpreter) : 345238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 346238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "log list", 34743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice "List the log categories for one or more log channels. If none specified, lists them all.", 34843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL) 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 35143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData channel_arg; 35243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 35343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 35443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice channel_arg.arg_type = eArgTypeLogChannel; 35543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice channel_arg.arg_repetition = eArgRepeatStar; 35643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 35743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 35843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (channel_arg); 35943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 36043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 36143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectLogList() 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 370238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Execute (Args& args, 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = args.GetArgumentCount(); 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc == 0) 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<argc; ++i) 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log::Callbacks log_callbacks; 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string channel(args.GetArgumentAtIndex(i)); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_callbacks.list_categories (&result.GetOutputStream()); 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (channel == "all") 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log_channel_sp) 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log_channel_sp->ListCategories(&result.GetOutputStream()); 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectLogTimer : public CommandObject 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 419238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectLogTimer(CommandInterpreter &interpreter) : 420238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 421238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "log timers", 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Enable, disable, dump, and reset LLDB internal performance timers.", 4234ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham "log timers < enable <depth> | disable | dump | increment <bool> | reset >") 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectLogTimer() 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 433238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Execute (Args& args, 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = args.GetArgumentCount(); 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc == 1) 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *sub_command = args.GetArgumentAtIndex(0); 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (strcasecmp(sub_command, "enable") == 0) 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::SetDisplayDepth (UINT32_MAX); 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (strcasecmp(sub_command, "disable") == 0) 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::SetDisplayDepth (0); 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (strcasecmp(sub_command, "dump") == 0) 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (strcasecmp(sub_command, "reset") == 0) 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer::ResetCategoryTimes (); 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46619e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham else if (argc == 2) 46719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham { 46819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham const char *sub_command = args.GetArgumentAtIndex(0); 46919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham 47019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham if (strcasecmp(sub_command, "enable") == 0) 47119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham { 47219e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham bool success; 47319e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham uint32_t depth = Args::StringToUInt32(args.GetArgumentAtIndex(1), 0, 0, &success); 47419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham if (success) 47519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham { 47619e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham Timer::SetDisplayDepth (depth); 47719e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham result.SetStatus(eReturnStatusSuccessFinishNoResult); 47819e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham } 47919e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham else 48019e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham result.AppendError("Could not convert enable depth to an unsigned integer."); 48119e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham } 4824ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham if (strcasecmp(sub_command, "increment") == 0) 4834ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham { 4844ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham bool success; 4854ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham bool increment = Args::StringToBoolean(args.GetArgumentAtIndex(1), false, &success); 4864ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham if (success) 4874ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham { 4884ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham Timer::SetQuiet (!increment); 4894ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham result.SetStatus(eReturnStatusSuccessFinishNoResult); 4904ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham } 4914ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham else 4924ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham result.AppendError("Could not convert increment value to boolean."); 4934ba3999e714c73ef52a21b0d59f705c0cad98810Jim Ingham } 49419e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham } 49519e29a8acb45cac8de786fda01cfe091ca0122d0Jim Ingham 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!result.Succeeded()) 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError("Missing subcommand"); 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectLog constructor 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 50863094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectLog::CommandObjectLog(CommandInterpreter &interpreter) : 509238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 510238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "log", 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "A set of commands for operating on logs.", 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "log <command> [<command-options>]") 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 514238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("enable", CommandObjectSP (new CommandObjectLogEnable (interpreter))); 515238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("disable", CommandObjectSP (new CommandObjectLogDisable (interpreter))); 516238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectLogList (interpreter))); 517238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("timers", CommandObjectSP (new CommandObjectLogTimer (interpreter))); 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectLog::~CommandObjectLog() 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 530