124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectFrame.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 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectFrame.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1610b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen#include <string> 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 20537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/Module.h" 21537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/StreamFile.h" 2210b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen#include "lldb/Core/StreamString.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 24537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/Value.h" 25537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/ValueObject.h" 26537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/ValueObjectVariable.h" 27f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/DataVisualization.h" 28cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Host.h" 29537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Interpreter/Args.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 32537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Interpreter/Options.h" 33a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton#include "lldb/Interpreter/OptionGroupFormat.h" 3410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h" 35368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton#include "lldb/Interpreter/OptionGroupVariable.h" 36537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/ClangASTType.h" 37537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/ClangASTContext.h" 38537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/ObjectFile.h" 39537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/SymbolContext.h" 40537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/Type.h" 41537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/Variable.h" 42537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/VariableList.h" 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 46537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Target/Target.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectFrameInfo 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectFrameInfo 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectFrameInfo : public CommandObjectParsed 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectFrameInfo (CommandInterpreter &interpreter) : 62da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 63da26bd203cbb104291b39891febf7481794f205fJim Ingham "frame info", 64da26bd203cbb104291b39891febf7481794f205fJim Ingham "List information about the currently selected frame in the current thread.", 65da26bd203cbb104291b39891febf7481794f205fJim Ingham "frame info", 66ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresFrame | 67ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 68ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 69ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ) 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectFrameInfo () 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 79ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton DoExecute (Args& command, CommandReturnObject &result) 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_exe_ctx.GetFrameRef().DumpUsingSettingsFormat (&result.GetOutputStream()); 82ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectFrameSelect 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectFrameSelect 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectFrameSelect : public CommandObjectParsed 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton class CommandOptions : public Options 98c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 99c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton public: 100c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 101f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 1029335643418cfaeba8e42a6c8e4084eae623b1acdJohnny Chen Options(interpreter) 103c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 104143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting (); 105c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 106c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 107c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton virtual 108c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton ~CommandOptions () 109c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 110c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 111c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 112c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton virtual Error 113143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 114c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 115c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton Error error; 116c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton bool success = false; 1176475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 118c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton switch (short_option) 119c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 120c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton case 'r': 121c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton relative_frame_offset = Args::StringToSInt32 (option_arg, INT32_MIN, 0, &success); 122c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton if (!success) 1239c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid frame offset argument '%s'", option_arg); 124c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton break; 125c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 126c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton default: 1279c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid short option character '%c'", short_option); 128c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton break; 129c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 130c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 131c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton return error; 132c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 133c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 134c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton void 135143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 136c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 137c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton relative_frame_offset = INT32_MIN; 138c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 139c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 140b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 141c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton GetDefinitions () 142c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 143c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton return g_option_table; 144c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 145c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 146c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton // Options table: Required for subclasses of Options. 147c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 148b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 149c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton int32_t relative_frame_offset; 150c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton }; 151c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 152238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectFrameSelect (CommandInterpreter &interpreter) : 153da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 154da26bd203cbb104291b39891febf7481794f205fJim Ingham "frame select", 155da26bd203cbb104291b39891febf7481794f205fJim Ingham "Select a frame by index from within the current thread and make it the current frame.", 156da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 157ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresThread | 158ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 159ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 160ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ), 161f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 16443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData index_arg; 16543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 16643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 16743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice index_arg.arg_type = eArgTypeFrameIndex; 168c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton index_arg.arg_repetition = eArgRepeatOptional; 16943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 17043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 17143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (index_arg); 17243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 17343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 17443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectFrameSelect () 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton virtual 182c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton Options * 183c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton GetOptions () 184c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 185c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton return &m_options; 186c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 187c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 188c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 189da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 191ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton DoExecute (Args& command, CommandReturnObject &result) 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 193ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // No need to check "thread" for validity as eFlagRequiresThread ensures it is valid 194ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Thread *thread = m_exe_ctx.GetThreadPtr(); 195ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 196ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton uint32_t frame_idx = UINT32_MAX; 197ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_options.relative_frame_offset != INT32_MIN) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 199ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // The one and only argument is a signed relative frame index 200ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame_idx = thread->GetSelectedFrameIndex (); 201ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame_idx == UINT32_MAX) 202ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame_idx = 0; 203ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 204ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_options.relative_frame_offset < 0) 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 206ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame_idx >= -m_options.relative_frame_offset) 207ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame_idx += m_options.relative_frame_offset; 208ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 209c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 210ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame_idx == 0) 211d9fa9d7c77adecaa22ae5dc8624a96afc6cf9edbJim Ingham { 212ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton //If you are already at the bottom of the stack, then just warn and don't reset the frame. 213ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError("Already at the bottom of the stack"); 214ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus(eReturnStatusFailed); 215ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 216d9fa9d7c77adecaa22ae5dc8624a96afc6cf9edbJim Ingham } 217c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton else 218ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame_idx = 0; 219c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 220c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 221ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_options.relative_frame_offset > 0) 222c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 223ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // I don't want "up 20" where "20" takes you past the top of the stack to produce 224ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // an error, but rather to just go to the top. So I have to count the stack here... 225ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t num_frames = thread->GetStackFrameCount(); 226ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (num_frames - frame_idx > m_options.relative_frame_offset) 227ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame_idx += m_options.relative_frame_offset; 228ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 229811ded5b244c20a9f39a04aba1a11ce02aa45f5eJason Molenda { 230ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame_idx == num_frames - 1) 2317685ccc99dd2f85aa596f92d9ccd8999b30b2e9fJason Molenda { 232ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton //If we are already at the top of the stack, just warn and don't reset the frame. 233ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError("Already at the top of the stack"); 234ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus(eReturnStatusFailed); 235ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 2367685ccc99dd2f85aa596f92d9ccd8999b30b2e9fJason Molenda } 237ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 238ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame_idx = num_frames - 1; 239811ded5b244c20a9f39a04aba1a11ce02aa45f5eJason Molenda } 240ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 241ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 242ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 243ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 244ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (command.GetArgumentCount() == 1) 245ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 246ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *frame_idx_cstr = command.GetArgumentAtIndex(0); 247ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame_idx = Args::StringToUInt32 (frame_idx_cstr, UINT32_MAX, 0); 248ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 249ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (command.GetArgumentCount() == 0) 250ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 251ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame_idx = thread->GetSelectedFrameIndex (); 252ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame_idx == UINT32_MAX) 253c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton { 254ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame_idx = 0; 255c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 256c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton } 257ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 258ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 259ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("invalid arguments.\n"); 260ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_options.GenerateOptionUsage (result.GetErrorStream(), this); 261ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 262ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 26394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 264be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham bool success = thread->SetSelectedFrameByIndexNoisily (frame_idx, result.GetOutputStream()); 265ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (success) 266ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 267ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_exe_ctx.SetFrameSP(thread->GetSelectedFrame ()); 268be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 270be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham else 271be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 272be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham result.AppendErrorWithFormat ("Frame index (%u) out of range.\n", frame_idx); 273be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham result.SetStatus (eReturnStatusFailed); 274be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 275be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 276be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham return result.Succeeded(); 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Claytonprotected: 279c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 280c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton CommandOptions m_options; 281c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton}; 282c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 283b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 284c12b6b40b93687539b0ca303f64eb77b6af6924dGreg ClaytonCommandObjectFrameSelect::CommandOptions::g_option_table[] = 285c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton{ 286c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton{ LLDB_OPT_SET_1, false, "relative", 'r', required_argument, NULL, 0, eArgTypeOffset, "A relative frame index offset from the current frame index."}, 287560c51483461697b2f78c145d70d0cd285012c4dFilipe Cabecinhas{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#pragma mark CommandObjectFrameVariable 291537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham//---------------------------------------------------------------------- 292537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham// List images with associated information 293537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham//---------------------------------------------------------------------- 294da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectFrameVariable : public CommandObjectParsed 295537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham{ 296537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Inghampublic: 297537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham 298238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectFrameVariable (CommandInterpreter &interpreter) : 299da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 300da26bd203cbb104291b39891febf7481794f205fJim Ingham "frame variable", 301da26bd203cbb104291b39891febf7481794f205fJim Ingham "Show frame variables. All argument and local variables " 302da26bd203cbb104291b39891febf7481794f205fJim Ingham "that are in scope will be shown when no arguments are given. " 303da26bd203cbb104291b39891febf7481794f205fJim Ingham "If any arguments are specified, they can be names of " 304da26bd203cbb104291b39891febf7481794f205fJim Ingham "argument, local, file static and file global variables. " 305da26bd203cbb104291b39891febf7481794f205fJim Ingham "Children of aggregate variables can be specified such as " 306da26bd203cbb104291b39891febf7481794f205fJim Ingham "'var->child.x'.", 307da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 308ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresFrame | 309ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 310ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 31176695d358405d1473c088309a5dfa5cf18970a00Enrico Granata eFlagProcessMustBePaused | 31276695d358405d1473c088309a5dfa5cf18970a00Enrico Granata eFlagRequiresProcess), 31310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham m_option_group (interpreter), 314368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton m_option_variable(true), // Include the frame specific options by passing "true" 315a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_format (eFormatDefault), 31610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham m_varobj_options() 317537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham { 31843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 31943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData var_name_arg; 32043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 32143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 32243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice var_name_arg.arg_type = eArgTypeVarName; 32343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice var_name_arg.arg_repetition = eArgRepeatStar; 32443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 32543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 32643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (var_name_arg); 32743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 32843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 32943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 33010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 331368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton m_option_group.Append (&m_option_variable, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 33224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_option_group.Append (&m_option_format, OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_GDB_FMT, LLDB_OPT_SET_1); 33310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 33410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham m_option_group.Finalize(); 335537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham } 336537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham 337537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham virtual 338537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham ~CommandObjectFrameVariable () 339537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham { 340537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham } 341537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham 342537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham virtual 343537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham Options * 344537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham GetOptions () 345537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham { 34610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return &m_option_group; 347537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham } 348946618a80e17d210e6592e94d10a15ad592572baGreg Clayton 349946618a80e17d210e6592e94d10a15ad592572baGreg Clayton 350946618a80e17d210e6592e94d10a15ad592572baGreg Clayton virtual int 351946618a80e17d210e6592e94d10a15ad592572baGreg Clayton HandleArgumentCompletion (Args &input, 352946618a80e17d210e6592e94d10a15ad592572baGreg Clayton int &cursor_index, 353946618a80e17d210e6592e94d10a15ad592572baGreg Clayton int &cursor_char_position, 354946618a80e17d210e6592e94d10a15ad592572baGreg Clayton OptionElementVector &opt_element_vector, 355946618a80e17d210e6592e94d10a15ad592572baGreg Clayton int match_start_point, 356946618a80e17d210e6592e94d10a15ad592572baGreg Clayton int max_return_elements, 357946618a80e17d210e6592e94d10a15ad592572baGreg Clayton bool &word_complete, 358946618a80e17d210e6592e94d10a15ad592572baGreg Clayton StringList &matches) 359946618a80e17d210e6592e94d10a15ad592572baGreg Clayton { 360946618a80e17d210e6592e94d10a15ad592572baGreg Clayton // Arguments are the standard source file completer. 361946618a80e17d210e6592e94d10a15ad592572baGreg Clayton std::string completion_str (input.GetArgumentAtIndex(cursor_index)); 362946618a80e17d210e6592e94d10a15ad592572baGreg Clayton completion_str.erase (cursor_char_position); 363946618a80e17d210e6592e94d10a15ad592572baGreg Clayton 364946618a80e17d210e6592e94d10a15ad592572baGreg Clayton CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 365946618a80e17d210e6592e94d10a15ad592572baGreg Clayton CommandCompletions::eVariablePathCompletion, 366946618a80e17d210e6592e94d10a15ad592572baGreg Clayton completion_str.c_str(), 367946618a80e17d210e6592e94d10a15ad592572baGreg Clayton match_start_point, 368946618a80e17d210e6592e94d10a15ad592572baGreg Clayton max_return_elements, 369946618a80e17d210e6592e94d10a15ad592572baGreg Clayton NULL, 370946618a80e17d210e6592e94d10a15ad592572baGreg Clayton word_complete, 371946618a80e17d210e6592e94d10a15ad592572baGreg Clayton matches); 372946618a80e17d210e6592e94d10a15ad592572baGreg Clayton return matches.GetSize(); 373946618a80e17d210e6592e94d10a15ad592572baGreg Clayton } 374537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham 375da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 376537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham virtual bool 377da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 378537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham { 379ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // No need to check "frame" for validity as eFlagRequiresFrame ensures it is valid 380ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrame *frame = m_exe_ctx.GetFramePtr(); 381649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 382649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen Stream &s = result.GetOutputStream(); 383649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 384649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen bool get_file_globals = true; 385649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 386649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen // Be careful about the stack frame, if any summary formatter runs code, it might clear the StackFrameList 387649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen // for the thread. So hold onto a shared pointer to the frame so it stays alive. 388649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 389567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableList *variable_list = frame->GetVariableList (get_file_globals); 390649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 391649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen VariableSP var_sp; 392649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen ValueObjectSP valobj_sp; 393649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 394649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen const char *name_cstr = NULL; 395649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen size_t idx; 396649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 39716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata TypeSummaryImplSP summary_format_sp; 398879de484c7ef1d0971ac6c007b319b8285723e69Enrico Granata if (!m_option_variable.summary.IsCurrentValueEmpty()) 399879de484c7ef1d0971ac6c007b319b8285723e69Enrico Granata DataVisualization::NamedSummaryFormats::GetSummaryFormat(ConstString(m_option_variable.summary.GetCurrentValue()), summary_format_sp); 400879de484c7ef1d0971ac6c007b319b8285723e69Enrico Granata else if (!m_option_variable.summary_string.IsCurrentValueEmpty()) 401879de484c7ef1d0971ac6c007b319b8285723e69Enrico Granata summary_format_sp.reset(new StringSummaryFormat(TypeSummaryImpl::Flags(),m_option_variable.summary_string.GetCurrentValue())); 402649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 403c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata ValueObject::DumpValueObjectOptions options(m_varobj_options.GetAsDumpOptions(false,eFormatDefault,summary_format_sp)); 404649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 405649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (variable_list) 406537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham { 407a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton const Format format = m_option_format.GetFormat(); 4083069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.SetFormat(format); 409a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 410649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (command.GetArgumentCount() > 0) 411649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen { 412649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen VariableList regex_var_list; 413649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 414649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen // If we have any args to the variable command, we will make 415649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen // variable objects from them... 416649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen for (idx = 0; (name_cstr = command.GetArgumentAtIndex(idx)) != NULL; ++idx) 417649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen { 418649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (m_option_variable.use_regex) 419537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham { 42036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t regex_start_index = regex_var_list.GetSize(); 421649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen RegularExpression regex (name_cstr); 422649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (regex.Compile(name_cstr)) 423c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton { 424649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen size_t num_matches = 0; 425649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen const size_t num_new_regex_vars = variable_list->AppendVariablesIfUnique(regex, 426649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen regex_var_list, 427649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen num_matches); 428649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (num_new_regex_vars > 0) 4296bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 43036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t regex_idx = regex_start_index, end_index = regex_var_list.GetSize(); 431649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen regex_idx < end_index; 432649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen ++regex_idx) 4336bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 434649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen var_sp = regex_var_list.GetVariableAtIndex (regex_idx); 435649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (var_sp) 4366bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 437567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton valobj_sp = frame->GetValueObjectForFrameVariable (var_sp, m_varobj_options.use_dynamic); 438649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (valobj_sp) 4396bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 440ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton// if (format != eFormatDefault) 441ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton// valobj_sp->SetFormat (format); 442649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 443649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (m_option_variable.show_decl && var_sp->GetDeclaration ().GetFile()) 444649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen { 445649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen bool show_fullpaths = false; 446649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen bool show_module = true; 447649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (var_sp->DumpDeclaration(&s, show_fullpaths, show_module)) 448649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen s.PutCString (": "); 4496bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 450649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen ValueObject::DumpValueObject (result.GetOutputStream(), 451649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen valobj_sp.get(), 4523069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options); 4536bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 4546bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 4556bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 4566bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 457649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen else if (num_matches == 0) 4586bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 459649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen result.GetErrorStream().Printf ("error: no variables matched the regular expression '%s'.\n", name_cstr); 4606bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 461c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton } 462649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen else 463537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham { 464649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen char regex_error[1024]; 465649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (regex.GetErrorAsCString(regex_error, sizeof(regex_error))) 466649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen result.GetErrorStream().Printf ("error: %s\n", regex_error); 467649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen else 468649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen result.GetErrorStream().Printf ("error: unkown regex error when compiling '%s'\n", name_cstr); 469649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen } 470649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen } 471649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen else // No regex, either exact variable names or variable expressions. 472649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen { 473649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen Error error; 474b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember | 475b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton StackFrame::eExpressionPathOptionsAllowDirectIVarAccess; 476649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen lldb::VariableSP var_sp; 477567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton valobj_sp = frame->GetValueForVariableExpressionPath (name_cstr, 478567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_varobj_options.use_dynamic, 479567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton expr_path_options, 480567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_sp, 481567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton error); 482649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (valobj_sp) 483649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen { 484ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton// if (format != eFormatDefault) 485ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton// valobj_sp->SetFormat (format); 486649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (m_option_variable.show_decl && var_sp && var_sp->GetDeclaration ().GetFile()) 4876bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 488649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen var_sp->GetDeclaration ().DumpStopContext (&s, false); 489649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen s.PutCString (": "); 490649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen } 4913069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 4923069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.SetFormat(format); 493649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 494649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen Stream &output_stream = result.GetOutputStream(); 4953069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.SetRootValueObjectName(valobj_sp->GetParent() ? name_cstr : NULL); 496649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen ValueObject::DumpValueObject (output_stream, 497649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen valobj_sp.get(), 4983069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options); 499649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen } 500649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen else 501649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen { 502649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen const char *error_cstr = error.AsCString(NULL); 503649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (error_cstr) 504649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen result.GetErrorStream().Printf("error: %s\n", error_cstr); 5056bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton else 506649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen result.GetErrorStream().Printf ("error: unable to find any variable expression path that matches '%s'\n", name_cstr); 507c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton } 508537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham } 509537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham } 510649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen } 511649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen else // No command arg specified. Use variable_list, instead. 512649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen { 51336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_variables = variable_list->GetSize(); 514649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (num_variables > 0) 515c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton { 51636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i=0; i<num_variables; i++) 517c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton { 518649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen var_sp = variable_list->GetVariableAtIndex(i); 519649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen bool dump_variable = true; 520649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen switch (var_sp->GetScope()) 521c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton { 522c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton case eValueTypeVariableGlobal: 523368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton dump_variable = m_option_variable.show_globals; 524368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton if (dump_variable && m_option_variable.show_scope) 525c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton s.PutCString("GLOBAL: "); 526c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton break; 527c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton 528c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton case eValueTypeVariableStatic: 529368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton dump_variable = m_option_variable.show_globals; 530368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton if (dump_variable && m_option_variable.show_scope) 531c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton s.PutCString("STATIC: "); 532c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton break; 533649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 534c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton case eValueTypeVariableArgument: 535368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton dump_variable = m_option_variable.show_args; 536368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton if (dump_variable && m_option_variable.show_scope) 537c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton s.PutCString(" ARG: "); 538c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton break; 539649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 540c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton case eValueTypeVariableLocal: 541368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton dump_variable = m_option_variable.show_locals; 542368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton if (dump_variable && m_option_variable.show_scope) 543c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton s.PutCString(" LOCAL: "); 544c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton break; 545c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton 546c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton default: 547c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton break; 548649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen } 549649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen 550649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (dump_variable) 551649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen { 552649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen // Use the variable object code to make sure we are 553649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen // using the same APIs as the the public API will be 554649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen // using... 555567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton valobj_sp = frame->GetValueObjectForFrameVariable (var_sp, 556567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_varobj_options.use_dynamic); 557649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (valobj_sp) 558c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton { 559ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton// if (format != eFormatDefault) 560ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton// valobj_sp->SetFormat (format); 561c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton 562649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen // When dumping all variables, don't print any variables 563649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen // that are not in scope to avoid extra unneeded output 564649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (valobj_sp->IsInScope ()) 565c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton { 566649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen if (m_option_variable.show_decl && var_sp->GetDeclaration ().GetFile()) 567c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton { 568649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen var_sp->GetDeclaration ().DumpStopContext (&s, false); 569649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen s.PutCString (": "); 570c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton } 5713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 5723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.SetFormat(format); 5733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.SetRootValueObjectName(name_cstr); 574649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen ValueObject::DumpValueObject (result.GetOutputStream(), 575649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen valobj_sp.get(), 5763069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options); 577c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton } 578c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton } 579c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton } 580c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton } 581c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton } 582537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham } 583649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen result.SetStatus (eReturnStatusSuccessFinishResult); 584537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham } 585db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata 586db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata if (m_interpreter.TruncationWarningNecessary()) 587db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata { 588db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata result.GetOutputStream().Printf(m_interpreter.TruncationWarningText(), 589db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata m_cmd_name.c_str()); 590db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata m_interpreter.TruncationWarningGiven(); 591db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata } 592db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata 593537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham return result.Succeeded(); 594537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham } 595537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Inghamprotected: 596537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham 59710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham OptionGroupOptions m_option_group; 598368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton OptionGroupVariable m_option_variable; 599a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupFormat m_option_format; 60010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham OptionGroupValueObjectDisplay m_varobj_options; 601537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham}; 602537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham 60310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectMultiwordFrame 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordFrame 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61063094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiwordFrame::CommandObjectMultiwordFrame (CommandInterpreter &interpreter) : 611238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 612238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "frame", 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "A set of commands for operating on the current thread's frames.", 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "frame <subcommand> [<subcommand-options>]") 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 616238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("info", CommandObjectSP (new CommandObjectFrameInfo (interpreter))); 617238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("select", CommandObjectSP (new CommandObjectFrameSelect (interpreter))); 618238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("variable", CommandObjectSP (new CommandObjectFrameVariable (interpreter))); 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiwordFrame::~CommandObjectMultiwordFrame () 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 625