124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectTarget.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 "CommandObjectTarget.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <errno.h> 1681040f4101a9d47ef5b2860247f505e9bee5fddeGreg Clayton 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2084cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 22d60d94a5126b93fda98678a68322abc2164073dbJim Ingham#include "lldb/Core/InputReader.h" 2349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 25e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#include "lldb/Core/Section.h" 26abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton#include "lldb/Core/State.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 28801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton#include "lldb/Core/ValueObjectVariable.h" 29b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton#include "lldb/Host/Symbols.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 32e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#include "lldb/Interpreter/Options.h" 33abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton#include "lldb/Interpreter/OptionGroupArchitecture.h" 345beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton#include "lldb/Interpreter/OptionGroupBoolean.h" 35e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#include "lldb/Interpreter/OptionGroupFile.h" 36a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton#include "lldb/Interpreter/OptionGroupFormat.h" 37368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton#include "lldb/Interpreter/OptionGroupVariable.h" 38abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton#include "lldb/Interpreter/OptionGroupPlatform.h" 39e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#include "lldb/Interpreter/OptionGroupUInt64.h" 40e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#include "lldb/Interpreter/OptionGroupUUID.h" 41801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h" 4249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 435b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda#include "lldb/Symbol/FuncUnwinders.h" 44e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#include "lldb/Symbol/LineTable.h" 45e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#include "lldb/Symbol/ObjectFile.h" 46e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#include "lldb/Symbol/SymbolFile.h" 47e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#include "lldb/Symbol/SymbolVendor.h" 485b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda#include "lldb/Symbol/UnwindPlan.h" 49801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton#include "lldb/Symbol/VariableList.h" 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 53d60d94a5126b93fda98678a68322abc2164073dbJim Ingham#include "lldb/Target/ThreadSpec.h" 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 59abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 60abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonstatic void 61abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonDumpTargetInfo (uint32_t target_idx, Target *target, const char *prefix_cstr, bool show_stopped_process_status, Stream &strm) 62abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 6352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton const ArchSpec &target_arch = target->GetArchitecture(); 64abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 655beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *exe_module = target->GetExecutableModulePointer(); 66abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton char exe_path[PATH_MAX]; 67abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool exe_valid = false; 685beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (exe_module) 695beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton exe_valid = exe_module->GetFileSpec().GetPath (exe_path, sizeof(exe_path)); 70abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 71abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (!exe_valid) 72abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton ::strcpy (exe_path, "<none>"); 73abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 74abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("%starget #%u: %s", prefix_cstr ? prefix_cstr : "", target_idx, exe_path); 75abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 76abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t properties = 0; 77abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (target_arch.IsValid()) 78abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 79abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("%sarch=%s", properties++ > 0 ? ", " : " ( ", target_arch.GetTriple().str().c_str()); 80abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton properties++; 81abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 82abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton PlatformSP platform_sp (target->GetPlatform()); 83abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (platform_sp) 840e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton strm.Printf ("%splatform=%s", properties++ > 0 ? ", " : " ( ", platform_sp->GetName().GetCString()); 85abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 86abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton ProcessSP process_sp (target->GetProcessSP()); 87abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool show_process_status = false; 88abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (process_sp) 89abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 90abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton lldb::pid_t pid = process_sp->GetID(); 91abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton StateType state = process_sp->GetState(); 92abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (show_stopped_process_status) 93202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton show_process_status = StateIsStoppedState(state, true); 94abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const char *state_cstr = StateAsCString (state); 95abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (pid != LLDB_INVALID_PROCESS_ID) 965f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea strm.Printf ("%spid=%" PRIu64, properties++ > 0 ? ", " : " ( ", pid); 97abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("%sstate=%s", properties++ > 0 ? ", " : " ( ", state_cstr); 98abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 99abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (properties > 0) 100abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.PutCString (" )\n"); 101abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 102abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.EOL(); 103abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (show_process_status) 104abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 105abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const bool only_threads_with_stop_reason = true; 106abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const uint32_t start_frame = 0; 107abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const uint32_t num_frames = 1; 108abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const uint32_t num_frames_with_source = 1; 109abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton process_sp->GetStatus (strm); 110abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton process_sp->GetThreadStatus (strm, 111abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton only_threads_with_stop_reason, 112abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton start_frame, 113abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames, 114abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames_with_source); 115abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 116abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 117abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 118abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 119abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonstatic uint32_t 120abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonDumpTargetList (TargetList &target_list, bool show_stopped_process_status, Stream &strm) 121abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 122abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const uint32_t num_targets = target_list.GetNumTargets(); 123abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (num_targets) 124abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 125abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton TargetSP selected_target_sp (target_list.GetSelectedTarget()); 126abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.PutCString ("Current targets:\n"); 127abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton for (uint32_t i=0; i<num_targets; ++i) 128abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 129abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton TargetSP target_sp (target_list.GetTargetAtIndex (i)); 130abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (target_sp) 131abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 132abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool is_selected = target_sp.get() == selected_target_sp.get(); 133abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton DumpTargetInfo (i, 134abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton target_sp.get(), 135abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton is_selected ? "* " : " ", 136abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton show_stopped_process_status, 137abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm); 138abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 139abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 140abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 141abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return num_targets; 142abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 143abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton#pragma mark CommandObjectTargetCreate 144abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 145abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//------------------------------------------------------------------------- 146abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton// "target create" 147abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//------------------------------------------------------------------------- 148abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 149da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetCreate : public CommandObjectParsed 150abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 151abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonpublic: 152abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton CommandObjectTargetCreate(CommandInterpreter &interpreter) : 153da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 154da26bd203cbb104291b39891febf7481794f205fJim Ingham "target create", 155da26bd203cbb104291b39891febf7481794f205fJim Ingham "Create a target using the argument as the main executable.", 156da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL), 157abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_option_group (interpreter), 158801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_arch_option (), 15946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_platform_options(true), // Do include the "--platform" option in the platform settings by passing true 160ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton m_core_file (LLDB_OPT_SET_1, false, "core", 'c', 0, eArgTypeFilename, "Fullpath to a core file to use for this target."), 161ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton m_symbol_file (LLDB_OPT_SET_1, false, "symfile", 's', 0, eArgTypeFilename, "Fullpath to a stand alone debug symbols file for when debug symbols are not in the executable."), 162737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham m_remote_file (LLDB_OPT_SET_1, false, "remote-file", 'r', 0, eArgTypeFilename, "Fullpath to the file on the remote host if debugging remotely."), 163ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton m_add_dependents (LLDB_OPT_SET_1, false, "no-dependents", 'd', "Don't load dependent files when creating the target, just add the specified executable.", true, true) 164abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 165abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton CommandArgumentEntry arg; 166abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton CommandArgumentData file_arg; 167abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 168abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton // Define the first (and only) variant of this arg. 169abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton file_arg.arg_type = eArgTypeFilename; 170abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton file_arg.arg_repetition = eArgRepeatPlain; 171abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 172abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton // There is only one variant this argument could be; put it into the argument entry. 173abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton arg.push_back (file_arg); 174abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 175abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton // Push the data for the first argument into the m_arguments vector. 176abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_arguments.push_back (arg); 177abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 178801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_option_group.Append (&m_arch_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 179abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_option_group.Append (&m_platform_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 18046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_option_group.Append (&m_core_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 181ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton m_option_group.Append (&m_symbol_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 182737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham m_option_group.Append (&m_remote_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 183ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton m_option_group.Append (&m_add_dependents, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 184abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_option_group.Finalize(); 185abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 186abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 187abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton ~CommandObjectTargetCreate () 188abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 189abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 190abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 191abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Options * 192abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton GetOptions () 193abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 194abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return &m_option_group; 195abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 196abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 19736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton virtual int 198da26bd203cbb104291b39891febf7481794f205fJim Ingham HandleArgumentCompletion (Args &input, 199da26bd203cbb104291b39891febf7481794f205fJim Ingham int &cursor_index, 200da26bd203cbb104291b39891febf7481794f205fJim Ingham int &cursor_char_position, 201da26bd203cbb104291b39891febf7481794f205fJim Ingham OptionElementVector &opt_element_vector, 202da26bd203cbb104291b39891febf7481794f205fJim Ingham int match_start_point, 203da26bd203cbb104291b39891febf7481794f205fJim Ingham int max_return_elements, 204da26bd203cbb104291b39891febf7481794f205fJim Ingham bool &word_complete, 205da26bd203cbb104291b39891febf7481794f205fJim Ingham StringList &matches) 206da26bd203cbb104291b39891febf7481794f205fJim Ingham { 207da26bd203cbb104291b39891febf7481794f205fJim Ingham std::string completion_str (input.GetArgumentAtIndex(cursor_index)); 208da26bd203cbb104291b39891febf7481794f205fJim Ingham completion_str.erase (cursor_char_position); 209da26bd203cbb104291b39891febf7481794f205fJim Ingham 210da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 211da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandCompletions::eDiskFileCompletion, 212da26bd203cbb104291b39891febf7481794f205fJim Ingham completion_str.c_str(), 213da26bd203cbb104291b39891febf7481794f205fJim Ingham match_start_point, 214da26bd203cbb104291b39891febf7481794f205fJim Ingham max_return_elements, 215da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 216da26bd203cbb104291b39891febf7481794f205fJim Ingham word_complete, 217da26bd203cbb104291b39891febf7481794f205fJim Ingham matches); 218da26bd203cbb104291b39891febf7481794f205fJim Ingham return matches.GetSize(); 219da26bd203cbb104291b39891febf7481794f205fJim Ingham } 220da26bd203cbb104291b39891febf7481794f205fJim Ingham 221da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 222abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool 223da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 224abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 22536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t argc = command.GetArgumentCount(); 22646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton FileSpec core_file (m_core_file.GetOptionValue().GetCurrentValue()); 227737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham FileSpec remote_file (m_remote_file.GetOptionValue().GetCurrentValue()); 22846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 22946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (argc == 1 || core_file) 230abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 231ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton FileSpec symfile (m_symbol_file.GetOptionValue().GetCurrentValue()); 232ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton if (symfile) 233ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton { 234ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton if (!symfile.Exists()) 235ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton { 236ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton char symfile_path[PATH_MAX]; 237ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton symfile.GetPath(symfile_path, sizeof(symfile_path)); 238ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton result.AppendErrorWithFormat("invalid symbol file path '%s'", symfile_path); 239ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton result.SetStatus (eReturnStatusFailed); 240ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton return false; 241ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton } 242ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton } 243ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton 244abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const char *file_path = command.GetArgumentAtIndex(0); 245abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, "(lldb) target create '%s'", file_path); 246abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton TargetSP target_sp; 247abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Debugger &debugger = m_interpreter.GetDebugger(); 2483e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton const char *arch_cstr = m_arch_option.GetArchitectureName(); 249ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton const bool get_dependent_files = m_add_dependents.GetOptionValue().GetCurrentValue(); 2503e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton Error error (debugger.GetTargetList().CreateTarget (debugger, 251ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton file_path, 2523e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton arch_cstr, 2533e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton get_dependent_files, 2543e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton &m_platform_options, 2553e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton target_sp)); 2563e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton 257abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (target_sp) 258abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 259737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham if (symfile || remote_file) 260ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton { 261ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton ModuleSP module_sp (target_sp->GetExecutableModule()); 262ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton if (module_sp) 263737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham { 264737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham if (symfile) 265737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham module_sp->SetSymbolFileFileSpec(symfile); 266737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham if (remote_file) 267737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham { 268737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham std::string remote_path = remote_file.GetPath(); 269737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham target_sp->SetArg0(remote_path.c_str()); 270737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham module_sp->SetPlatformFileSpec(remote_file); 271737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham } 272737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham } 273ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton } 274ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton 275abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton debugger.GetTargetList().SetSelectedTarget(target_sp.get()); 27646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_file) 27746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 27846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton char core_path[PATH_MAX]; 27946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton core_file.GetPath(core_path, sizeof(core_path)); 2809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (core_file.Exists()) 28146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton FileSpec core_file_dir; 2839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton core_file_dir.GetDirectory() = core_file.GetDirectory(); 2849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton target_sp->GetExecutableSearchPaths ().Append (core_file_dir); 28546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 2869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ProcessSP process_sp (target_sp->CreateProcess (m_interpreter.GetDebugger().GetListener(), NULL, &core_file)); 2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (process_sp) 28946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 2909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Seems wierd that we Launch a core file, but that is 2919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // what we do! 2929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton error = process_sp->LoadCore(); 2939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (error.Fail()) 2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton result.AppendError(error.AsCString("can't find plug-in for core file")); 2979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton result.SetStatus (eReturnStatusFailed); 2989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return false; 2999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 3019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton result.AppendMessageWithFormat ("Core file '%s' (%s) was loaded.\n", core_path, target_sp->GetArchitecture().GetArchitectureName()); 3039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton result.SetStatus (eReturnStatusSuccessFinishNoResult); 3049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 30546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 30646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 30746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 3089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton result.AppendErrorWithFormat ("Unable to find process plug-in for core file '%s'\n", core_path); 3099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton result.SetStatus (eReturnStatusFailed); 31046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 31146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 31246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 31346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 3149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton result.AppendErrorWithFormat ("Core file '%s' does not exist\n", core_path); 31546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton result.SetStatus (eReturnStatusFailed); 31646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 31746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 31846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 31946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 32046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton result.AppendMessageWithFormat ("Current executable set to '%s' (%s).\n", file_path, target_sp->GetArchitecture().GetArchitectureName()); 32146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton result.SetStatus (eReturnStatusSuccessFinishNoResult); 32246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 323abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 324abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 325abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 326abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError(error.AsCString()); 327abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.SetStatus (eReturnStatusFailed); 328abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 329abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 330abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 331abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 33246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton result.AppendErrorWithFormat("'%s' takes exactly one executable path argument, or use the --core-file option.\n", m_cmd_name.c_str()); 333abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.SetStatus (eReturnStatusFailed); 334abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 335abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return result.Succeeded(); 336abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 337abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 338abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 339abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonprivate: 340abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton OptionGroupOptions m_option_group; 341801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton OptionGroupArchitecture m_arch_option; 342abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton OptionGroupPlatform m_platform_options; 34346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton OptionGroupFile m_core_file; 344ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton OptionGroupFile m_symbol_file; 345737579d38d7c032c303847fe4a250b7ed42ec55dJim Ingham OptionGroupFile m_remote_file; 346ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton OptionGroupBoolean m_add_dependents; 347abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton}; 348abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 349abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton#pragma mark CommandObjectTargetList 350abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 351abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//---------------------------------------------------------------------- 352abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton// "target list" 353abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//---------------------------------------------------------------------- 354abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 355da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetList : public CommandObjectParsed 356abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 357abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonpublic: 358abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton CommandObjectTargetList (CommandInterpreter &interpreter) : 359da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 360da26bd203cbb104291b39891febf7481794f205fJim Ingham "target list", 361da26bd203cbb104291b39891febf7481794f205fJim Ingham "List all current targets in the current debug session.", 362da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 363da26bd203cbb104291b39891febf7481794f205fJim Ingham 0) 364abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 365abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 366abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 367abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton virtual 368abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton ~CommandObjectTargetList () 369abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 370abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 371abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 372da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 373abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton virtual bool 374da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& args, CommandReturnObject &result) 375abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 376abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (args.GetArgumentCount() == 0) 377abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 378abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Stream &strm = result.GetOutputStream(); 379abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 380abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool show_stopped_process_status = false; 381abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (DumpTargetList (m_interpreter.GetDebugger().GetTargetList(), show_stopped_process_status, strm) == 0) 382abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 383abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.PutCString ("No targets.\n"); 384abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 38544dc9d3b86cacd550e01a0c3ec7dd28126cf6ca4Johnny Chen result.SetStatus (eReturnStatusSuccessFinishResult); 386abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 387abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 388abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 389abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("the 'target list' command takes no arguments\n"); 390abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.SetStatus (eReturnStatusFailed); 391abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 392abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return result.Succeeded(); 393abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 394abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton}; 395abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 396abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 397abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton#pragma mark CommandObjectTargetSelect 398abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 399abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//---------------------------------------------------------------------- 400abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton// "target select" 401abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//---------------------------------------------------------------------- 402abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 403da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetSelect : public CommandObjectParsed 404abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 405abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonpublic: 406abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton CommandObjectTargetSelect (CommandInterpreter &interpreter) : 407da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 408da26bd203cbb104291b39891febf7481794f205fJim Ingham "target select", 409da26bd203cbb104291b39891febf7481794f205fJim Ingham "Select a target as the current target by target index.", 410da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 411da26bd203cbb104291b39891febf7481794f205fJim Ingham 0) 412abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 413abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 414abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 415abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton virtual 416abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton ~CommandObjectTargetSelect () 417abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 418abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 419abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 420da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 421abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton virtual bool 422da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& args, CommandReturnObject &result) 423abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 424abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (args.GetArgumentCount() == 1) 425abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 426abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool success = false; 427abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const char *target_idx_arg = args.GetArgumentAtIndex(0); 428abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t target_idx = Args::StringToUInt32 (target_idx_arg, UINT32_MAX, 0, &success); 429abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (success) 430abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 431abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton TargetList &target_list = m_interpreter.GetDebugger().GetTargetList(); 432abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const uint32_t num_targets = target_list.GetNumTargets(); 433abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (target_idx < num_targets) 434abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 435abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton TargetSP target_sp (target_list.GetTargetAtIndex (target_idx)); 436abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (target_sp) 437abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 438abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Stream &strm = result.GetOutputStream(); 439abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton target_list.SetSelectedTarget (target_sp.get()); 440abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool show_stopped_process_status = false; 441abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton DumpTargetList (target_list, show_stopped_process_status, strm); 44244dc9d3b86cacd550e01a0c3ec7dd28126cf6ca4Johnny Chen result.SetStatus (eReturnStatusSuccessFinishResult); 443abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 444abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 445abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 446abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendErrorWithFormat ("target #%u is NULL in target list\n", target_idx); 447abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.SetStatus (eReturnStatusFailed); 448abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 449abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 450abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 451abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 452abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendErrorWithFormat ("index %u is out of range, valid target indexes are 0 - %u\n", 453abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton target_idx, 454abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_targets - 1); 455abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.SetStatus (eReturnStatusFailed); 456abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 457abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 458abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 459abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 460abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendErrorWithFormat("invalid index string value '%s'\n", target_idx_arg); 461abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.SetStatus (eReturnStatusFailed); 462abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 463abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 464abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 465abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 466abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("'target select' takes a single argument: a target index\n"); 467abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.SetStatus (eReturnStatusFailed); 468abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 469abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return result.Succeeded(); 470abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 471abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton}; 472abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 473153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton#pragma mark CommandObjectTargetSelect 474153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton 475153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton//---------------------------------------------------------------------- 476153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton// "target delete" 477153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton//---------------------------------------------------------------------- 478153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton 479da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetDelete : public CommandObjectParsed 480153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton{ 481153ccd72f52a6cc3595d7614558e2954f67833ebGreg Claytonpublic: 482153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton CommandObjectTargetDelete (CommandInterpreter &interpreter) : 483da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 484da26bd203cbb104291b39891febf7481794f205fJim Ingham "target delete", 485da26bd203cbb104291b39891febf7481794f205fJim Ingham "Delete one or more targets by target index.", 486da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 487da26bd203cbb104291b39891febf7481794f205fJim Ingham 0), 4885beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton m_option_group (interpreter), 489437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton m_cleanup_option (LLDB_OPT_SET_1, false, "clean", 'c', "Perform extra cleanup to minimize memory consumption after deleting the target.", false, false) 490153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 4915beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton m_option_group.Append (&m_cleanup_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 4925beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton m_option_group.Finalize(); 493153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 494153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton 495153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton virtual 496153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton ~CommandObjectTargetDelete () 497153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 498153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 499153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton 500da26bd203cbb104291b39891febf7481794f205fJim Ingham Options * 501da26bd203cbb104291b39891febf7481794f205fJim Ingham GetOptions () 502da26bd203cbb104291b39891febf7481794f205fJim Ingham { 503da26bd203cbb104291b39891febf7481794f205fJim Ingham return &m_option_group; 504da26bd203cbb104291b39891febf7481794f205fJim Ingham } 505da26bd203cbb104291b39891febf7481794f205fJim Ingham 506da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 507153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton virtual bool 508da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& args, CommandReturnObject &result) 509153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 510153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton const size_t argc = args.GetArgumentCount(); 511153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton std::vector<TargetSP> delete_target_list; 512153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton TargetList &target_list = m_interpreter.GetDebugger().GetTargetList(); 513153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton bool success = true; 514153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton TargetSP target_sp; 515153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton if (argc > 0) 516153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 517153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton const uint32_t num_targets = target_list.GetNumTargets(); 518aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas // Bail out if don't have any targets. 519aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas if (num_targets == 0) { 520aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas result.AppendError("no targets to delete"); 521aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas result.SetStatus(eReturnStatusFailed); 522aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas success = false; 523aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas } 524aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas 525153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton for (uint32_t arg_idx = 0; success && arg_idx < argc; ++arg_idx) 526153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 527153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton const char *target_idx_arg = args.GetArgumentAtIndex(arg_idx); 528153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton uint32_t target_idx = Args::StringToUInt32 (target_idx_arg, UINT32_MAX, 0, &success); 529153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton if (success) 530153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 531153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton if (target_idx < num_targets) 532153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 533153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton target_sp = target_list.GetTargetAtIndex (target_idx); 534153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton if (target_sp) 535153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 536153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton delete_target_list.push_back (target_sp); 537153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton continue; 538153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 539153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 540aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas if (num_targets > 1) 541aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas result.AppendErrorWithFormat ("target index %u is out of range, valid target indexes are 0 - %u\n", 542aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas target_idx, 543aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas num_targets - 1); 544aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas else 545aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas result.AppendErrorWithFormat("target index %u is out of range, the only valid index is 0\n", 546aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas target_idx); 547aa3d89e4c8b477fd8520f45ef43f175265837cadFilipe Cabecinhas 548153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton result.SetStatus (eReturnStatusFailed); 549153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton success = false; 550153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 551153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton else 552153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 553153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton result.AppendErrorWithFormat("invalid target index '%s'\n", target_idx_arg); 554153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton result.SetStatus (eReturnStatusFailed); 555153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton success = false; 556153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 557153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 558153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton 559153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 560153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton else 561153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 562153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton target_sp = target_list.GetSelectedTarget(); 563153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton if (target_sp) 564153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 565153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton delete_target_list.push_back (target_sp); 566153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 567153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton else 568153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 569153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton result.AppendErrorWithFormat("no target is currently selected\n"); 570153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton result.SetStatus (eReturnStatusFailed); 571153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton success = false; 572153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 573153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 574153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton if (success) 575153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 576153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton const size_t num_targets_to_delete = delete_target_list.size(); 577153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton for (size_t idx = 0; idx < num_targets_to_delete; ++idx) 578153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 579153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton target_sp = delete_target_list[idx]; 580153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton target_list.DeleteTarget(target_sp); 581153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton target_sp->Destroy(); 582153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 5835beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton // If "--clean" was specified, prune any orphaned shared modules from 5845beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton // the global shared module list 5855beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (m_cleanup_option.GetOptionValue ()) 5865beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton { 587860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton const bool mandatory = true; 588860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 5895beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton } 590153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton result.GetOutputStream().Printf("%u targets deleted.\n", (uint32_t)num_targets_to_delete); 591153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton result.SetStatus(eReturnStatusSuccessFinishResult); 592153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 593153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton 594153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton return result.Succeeded(); 595153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 5965beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton 5975beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton OptionGroupOptions m_option_group; 5985beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton OptionGroupBoolean m_cleanup_option; 599153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton}; 600153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton 601abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 602801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton#pragma mark CommandObjectTargetVariable 603801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 604801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton//---------------------------------------------------------------------- 605801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton// "target variable" 606801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton//---------------------------------------------------------------------- 607801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 608da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetVariable : public CommandObjectParsed 609801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{ 610801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonpublic: 611801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton CommandObjectTargetVariable (CommandInterpreter &interpreter) : 612da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 613da26bd203cbb104291b39891febf7481794f205fJim Ingham "target variable", 614f72bd8b9ad44d99ac3dd55cfb622da27daa49b0cGreg Clayton "Read global variable(s) prior to, or while running your binary.", 615da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 616ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresTarget), 617801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_option_group (interpreter), 618368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton m_option_variable (false), // Don't include frame options 619a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_format (eFormatDefault), 6206475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton m_option_compile_units (LLDB_OPT_SET_1, false, "file", 'file', 0, eArgTypeFilename, "A basename or fullpath to a file that contains global variables. This option can be specified multiple times."), 6216475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton m_option_shared_libraries (LLDB_OPT_SET_1, false, "shlib",'shlb', 0, eArgTypeFilename, "A basename or fullpath to a shared library to use in the search for global variables. This option can be specified multiple times."), 622801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_varobj_options() 623801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 62424b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen CommandArgumentEntry arg; 62524b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen CommandArgumentData var_name_arg; 62624b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen 62724b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen // Define the first (and only) variant of this arg. 62824b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen var_name_arg.arg_type = eArgTypeVarName; 62924b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen var_name_arg.arg_repetition = eArgRepeatPlus; 63024b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen 63124b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen // There is only one variant this argument could be; put it into the argument entry. 63224b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen arg.push_back (var_name_arg); 63324b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen 63424b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen // Push the data for the first argument into the m_arguments vector. 63524b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen m_arguments.push_back (arg); 63624b81e3f87b90d99670a92eaf4d782abd608c8b8Johnny Chen 637801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 638368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton m_option_group.Append (&m_option_variable, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 63924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_option_group.Append (&m_option_format, OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_GDB_FMT, LLDB_OPT_SET_1); 640801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_option_group.Append (&m_option_compile_units, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 641801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_option_group.Append (&m_option_shared_libraries, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 642801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_option_group.Finalize(); 643801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 644801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 645801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton virtual 646801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton ~CommandObjectTargetVariable () 647801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 648801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 6495d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 6505d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton void 6515d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton DumpValueObject (Stream &s, VariableSP &var_sp, ValueObjectSP &valobj_sp, const char *root_name) 6525d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton { 653c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata ValueObject::DumpValueObjectOptions options(m_varobj_options.GetAsDumpOptions()); 65419030d8e5545e0edbd59d8e44a16a11728089afaEnrico Granata 6555d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton switch (var_sp->GetScope()) 6565d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton { 6575d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton case eValueTypeVariableGlobal: 6585d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton if (m_option_variable.show_scope) 6595d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton s.PutCString("GLOBAL: "); 6605d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton break; 6615d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 6625d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton case eValueTypeVariableStatic: 6635d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton if (m_option_variable.show_scope) 6645d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton s.PutCString("STATIC: "); 6655d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton break; 6665d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 6675d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton case eValueTypeVariableArgument: 6685d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton if (m_option_variable.show_scope) 6695d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton s.PutCString(" ARG: "); 6705d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton break; 6715d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 6725d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton case eValueTypeVariableLocal: 6735d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton if (m_option_variable.show_scope) 6745d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton s.PutCString(" LOCAL: "); 6755d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton break; 6765d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 6775d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton default: 6785d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton break; 6795d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton } 6805d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 681fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton if (m_option_variable.show_decl) 6825d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton { 683fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton bool show_fullpaths = false; 684fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton bool show_module = true; 685fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton if (var_sp->DumpDeclaration(&s, show_fullpaths, show_module)) 686fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton s.PutCString (": "); 6875d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton } 6885d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 689a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton const Format format = m_option_format.GetFormat(); 6905d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton if (format != eFormatDefault) 6913069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.SetFormat(format); 6923069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 6933069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.SetRootValueObjectName(root_name); 6945d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 6955d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton ValueObject::DumpValueObject (s, 6965d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton valobj_sp.get(), 6973069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options); 6985d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 6995d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton } 700801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 7015d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 70236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton static size_t GetVariableCallback (void *baton, 70336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const char *name, 70436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton VariableList &variable_list) 7055d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton { 7065d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton Target *target = static_cast<Target *>(baton); 7075d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton if (target) 7085d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton { 7095d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton return target->GetImages().FindGlobalVariables (ConstString(name), 7105d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton true, 7115d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton UINT32_MAX, 7125d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton variable_list); 7135d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton } 7145d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton return 0; 7155d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton } 7165d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 7175d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 7185d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 719da26bd203cbb104291b39891febf7481794f205fJim Ingham Options * 720da26bd203cbb104291b39891febf7481794f205fJim Ingham GetOptions () 721da26bd203cbb104291b39891febf7481794f205fJim Ingham { 722da26bd203cbb104291b39891febf7481794f205fJim Ingham return &m_option_group; 723da26bd203cbb104291b39891febf7481794f205fJim Ingham } 724da26bd203cbb104291b39891febf7481794f205fJim Ingham 725da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 7266475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton 7276475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton void 7286475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton DumpGlobalVariableList(const ExecutionContext &exe_ctx, const SymbolContext &sc, const VariableList &variable_list, Stream &s) 7296475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 7306475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton size_t count = variable_list.GetSize(); 7316475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton if (count > 0) 7326475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 7336475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton if (sc.module_sp) 7346475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 7356475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton if (sc.comp_unit) 7366475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 73797a19b21dacd9063bb5475812df7781777262198Greg Clayton s.Printf ("Global variables for %s in %s:\n", 73897a19b21dacd9063bb5475812df7781777262198Greg Clayton sc.comp_unit->GetPath().c_str(), 73997a19b21dacd9063bb5475812df7781777262198Greg Clayton sc.module_sp->GetFileSpec().GetPath().c_str()); 7406475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 7416475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton else 7426475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 74397a19b21dacd9063bb5475812df7781777262198Greg Clayton s.Printf ("Global variables for %s\n", 74497a19b21dacd9063bb5475812df7781777262198Greg Clayton sc.module_sp->GetFileSpec().GetPath().c_str()); 7456475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 7466475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 7476475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton else if (sc.comp_unit) 7486475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 74997a19b21dacd9063bb5475812df7781777262198Greg Clayton s.Printf ("Global variables for %s\n", 75097a19b21dacd9063bb5475812df7781777262198Greg Clayton sc.comp_unit->GetPath().c_str()); 7516475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 7526475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton 7536475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton for (uint32_t i=0; i<count; ++i) 7546475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 7556475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton VariableSP var_sp (variable_list.GetVariableAtIndex(i)); 7566475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton if (var_sp) 7576475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 7586475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton ValueObjectSP valobj_sp (ValueObjectVariable::Create (exe_ctx.GetBestExecutionContextScope(), var_sp)); 7596475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton 7606475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton if (valobj_sp) 7616475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton DumpValueObject (s, var_sp, valobj_sp, var_sp->GetName().GetCString()); 7626475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 7636475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 7646475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 7656475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton 7666475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 767801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton virtual bool 768da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& args, CommandReturnObject &result) 769801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 770ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 771ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const size_t argc = args.GetArgumentCount(); 772ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Stream &s = result.GetOutputStream(); 773ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 774ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (argc > 0) 775801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 776ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 777ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (size_t idx = 0; idx < argc; ++idx) 778801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 779ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton VariableList variable_list; 780ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ValueObjectList valobj_list; 7815d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 782ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *arg = args.GetArgumentAtIndex(idx); 78336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t matches = 0; 784ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool use_var_name = false; 785ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_option_variable.use_regex) 786801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 787ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton RegularExpression regex(arg); 788ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (!regex.IsValid ()) 789368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton { 790ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.GetErrorStream().Printf ("error: invalid regular expression: '%s'\n", arg); 791368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton result.SetStatus (eReturnStatusFailed); 792368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton return false; 793801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 794ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton use_var_name = true; 795ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton matches = target->GetImages().FindGlobalVariables (regex, 796ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton true, 797ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton UINT32_MAX, 798ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton variable_list); 799ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 800ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 801ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 802ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Error error (Variable::GetValuesForVariableExpressionPath (arg, 803ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_exe_ctx.GetBestExecutionContextScope(), 804ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton GetVariableCallback, 805ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton target, 806ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton variable_list, 807ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton valobj_list)); 808ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton matches = variable_list.GetSize(); 809ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 810ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 811ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (matches == 0) 812ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 813ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.GetErrorStream().Printf ("error: can't find global variable '%s'\n", arg); 814ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 815ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 816ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 817ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 818ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 819ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (uint32_t global_idx=0; global_idx<matches; ++global_idx) 820801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 821ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton VariableSP var_sp (variable_list.GetVariableAtIndex(global_idx)); 822ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (var_sp) 823801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 824ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ValueObjectSP valobj_sp (valobj_list.GetValueObjectAtIndex(global_idx)); 825ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (!valobj_sp) 826ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton valobj_sp = ValueObjectVariable::Create (m_exe_ctx.GetBestExecutionContextScope(), var_sp); 827ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 828ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (valobj_sp) 829ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton DumpValueObject (s, var_sp, valobj_sp, use_var_name ? var_sp->GetName().GetCString() : arg); 830801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 831801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 832801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 833801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 834ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 835ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 836ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 837ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const FileSpecList &compile_units = m_option_compile_units.GetOptionValue().GetCurrentValue(); 838ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const FileSpecList &shlibs = m_option_shared_libraries.GetOptionValue().GetCurrentValue(); 839ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton SymbolContextList sc_list; 840ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const size_t num_compile_units = compile_units.GetSize(); 841ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const size_t num_shlibs = shlibs.GetSize(); 842ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (num_compile_units == 0 && num_shlibs == 0) 843801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 844ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool success = false; 845ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrame *frame = m_exe_ctx.GetFramePtr(); 846ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton CompileUnit *comp_unit = NULL; 847ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame) 848fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton { 849ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton SymbolContext sc = frame->GetSymbolContext (eSymbolContextCompUnit); 850ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (sc.comp_unit) 851fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton { 852ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool can_create = true; 853ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton VariableListSP comp_unit_varlist_sp (sc.comp_unit->GetVariableList(can_create)); 854ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (comp_unit_varlist_sp) 855fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton { 856ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton size_t count = comp_unit_varlist_sp->GetSize(); 857ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (count > 0) 858fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton { 859ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton DumpGlobalVariableList(m_exe_ctx, sc, *comp_unit_varlist_sp, s); 860ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton success = true; 861fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton } 862fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton } 863fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton } 864ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 865ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (!success) 866ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 867ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame) 8686475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 869ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (comp_unit) 87097a19b21dacd9063bb5475812df7781777262198Greg Clayton result.AppendErrorWithFormat ("no global variables in current compile unit: %s\n", 87197a19b21dacd9063bb5475812df7781777262198Greg Clayton comp_unit->GetPath().c_str()); 8726475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton else 873ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("no debug information for frame %u\n", frame->GetFrameIndex()); 874ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 875ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 876ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("'target variable' takes one or more global variable names as arguments\n"); 877ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 878fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton } 879ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 880ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 881ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 882ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton SymbolContextList sc_list; 883ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool append = true; 884ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // We have one or more compile unit or shlib 885ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (num_shlibs > 0) 886fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton { 887ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (size_t shlib_idx=0; shlib_idx<num_shlibs; ++shlib_idx) 888fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton { 889ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const FileSpec module_file(shlibs.GetFileSpecAtIndex(shlib_idx)); 890ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ModuleSpec module_spec (module_file); 891ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 892ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ModuleSP module_sp (target->GetImages().FindFirstModule(module_spec)); 893ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (module_sp) 8946475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 895ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (num_compile_units > 0) 8966475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 897ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (size_t cu_idx=0; cu_idx<num_compile_units; ++cu_idx) 898ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_sp->FindCompileUnits(compile_units.GetFileSpecAtIndex(cu_idx), append, sc_list); 8996475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 9006475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton else 9016475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 902ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton SymbolContext sc; 903ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton sc.module_sp = module_sp; 904ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton sc_list.Append(sc); 9056475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 9066475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 907ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 908ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 909ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // Didn't find matching shlib/module in target... 91097a19b21dacd9063bb5475812df7781777262198Greg Clayton result.AppendErrorWithFormat ("target doesn't contain the specified shared library: %s\n", 91197a19b21dacd9063bb5475812df7781777262198Greg Clayton module_file.GetPath().c_str()); 912ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 9136475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 914ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 915ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 916ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 917ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // No shared libraries, we just want to find globals for the compile units files that were specified 918ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (size_t cu_idx=0; cu_idx<num_compile_units; ++cu_idx) 919ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton target->GetImages().FindCompileUnits(compile_units.GetFileSpecAtIndex(cu_idx), append, sc_list); 920ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 921ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 922ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t num_scs = sc_list.GetSize(); 923ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (num_scs > 0) 924ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 925ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton SymbolContext sc; 926ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (uint32_t sc_idx=0; sc_idx<num_scs; ++sc_idx) 9276475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 928ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (sc_list.GetContextAtIndex(sc_idx, sc)) 9296475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 930ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (sc.comp_unit) 9316475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton { 932ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool can_create = true; 933ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton VariableListSP comp_unit_varlist_sp (sc.comp_unit->GetVariableList(can_create)); 934ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (comp_unit_varlist_sp) 935ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton DumpGlobalVariableList(m_exe_ctx, sc, *comp_unit_varlist_sp, s); 936ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 937ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (sc.module_sp) 938ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 939ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // Get all global variables for this module 940ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton lldb_private::RegularExpression all_globals_regex("."); // Any global with at least one character 941ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton VariableList variable_list; 942ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton sc.module_sp->FindGlobalVariables(all_globals_regex, append, UINT32_MAX, variable_list); 943ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton DumpGlobalVariableList(m_exe_ctx, sc, variable_list, s); 9446475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 9456475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 9466475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton } 947fac9388b4bb4d7305a8b290d2686e6b5f04a49b6Greg Clayton } 948801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 949801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 950ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 951db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata if (m_interpreter.TruncationWarningNecessary()) 952db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata { 953db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata result.GetOutputStream().Printf(m_interpreter.TruncationWarningText(), 954db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata m_cmd_name.c_str()); 955db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata m_interpreter.TruncationWarningGiven(); 956db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata } 957db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata 958801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton return result.Succeeded(); 959801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 960801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 961801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton OptionGroupOptions m_option_group; 962368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton OptionGroupVariable m_option_variable; 963a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupFormat m_option_format; 964801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton OptionGroupFileList m_option_compile_units; 965801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton OptionGroupFileList m_option_shared_libraries; 966801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton OptionGroupValueObjectDisplay m_varobj_options; 967801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 968801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton}; 969801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 970801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 971e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesSearchPathsAdd 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 973da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesSearchPathsAdd : public CommandObjectParsed 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 977e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesSearchPathsAdd (CommandInterpreter &interpreter) : 978da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 979da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules search-paths add", 980da26bd203cbb104291b39891febf7481794f205fJim Ingham "Add new image search paths substitution pairs to the current target.", 981da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL) 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 98443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData old_prefix_arg; 98543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData new_prefix_arg; 98643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 98743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first variant of this arg pair. 98843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice old_prefix_arg.arg_type = eArgTypeOldPathPrefix; 98943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice old_prefix_arg.arg_repetition = eArgRepeatPairPlus; 99043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 99143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first variant of this arg pair. 99243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice new_prefix_arg.arg_type = eArgTypeNewPathPrefix; 99343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice new_prefix_arg.arg_repetition = eArgRepeatPairPlus; 99443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 99543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There are two required arguments that must always occur together, i.e. an argument "pair". Because they 99643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // must always occur together, they are treated as two variants of one argument rather than two independent 99743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // arguments. Push them both into the first argument position for m_arguments... 99843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 99943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (old_prefix_arg); 100043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (new_prefix_arg); 100143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 100243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1005e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesSearchPathsAdd () 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1009da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 1011da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1014238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target) 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t argc = command.GetArgumentCount(); 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc & 1) 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1020abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("add requires an even number of arguments\n"); 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 102536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i=0; i<argc; i+=2) 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *from = command.GetArgumentAtIndex(i); 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *to = command.GetArgumentAtIndex(i+1); 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (from[0] && to[0]) 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool last_pair = ((argc - i) == 2); 103363094e0bb161580564954dee512955c1c79d3476Greg Clayton target->GetImageSearchPathList().Append (ConstString(from), 103463094e0bb161580564954dee512955c1c79d3476Greg Clayton ConstString(to), 103563094e0bb161580564954dee512955c1c79d3476Greg Clayton last_pair); // Notify if this is the last pair 10364d661357f2d535c8243ae8433ba030058fb698c7Johnny Chen result.SetStatus (eReturnStatusSuccessFinishNoResult); 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (from[0]) 1041abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("<path-prefix> can't be empty\n"); 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 1043abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("<new-path-prefix> can't be empty\n"); 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1051abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("invalid target\n"); 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1058e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesSearchPathsClear 1059e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1060da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesSearchPathsClear : public CommandObjectParsed 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1064e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesSearchPathsClear (CommandInterpreter &interpreter) : 1065da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 1066da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules search-paths clear", 1067da26bd203cbb104291b39891febf7481794f205fJim Ingham "Clear all current image search path substitution pairs from the current target.", 1068da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules search-paths clear") 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1072e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesSearchPathsClear () 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1076da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 1078da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1081238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target) 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool notify = true; 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner target->GetImageSearchPathList().Clear(notify); 10864d661357f2d535c8243ae8433ba030058fb698c7Johnny Chen result.SetStatus (eReturnStatusSuccessFinishNoResult); 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1090abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("invalid target\n"); 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1097e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesSearchPathsInsert 1098e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1099da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesSearchPathsInsert : public CommandObjectParsed 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1103e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesSearchPathsInsert (CommandInterpreter &interpreter) : 1104da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 1105da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules search-paths insert", 1106da26bd203cbb104291b39891febf7481794f205fJim Ingham "Insert a new image search path substitution pair into the current target at the specified index.", 1107da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL) 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg1; 111043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg2; 111143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData index_arg; 111243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData old_prefix_arg; 111343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData new_prefix_arg; 111443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 111543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first and only variant of this arg. 111643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice index_arg.arg_type = eArgTypeIndex; 111743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice index_arg.arg_repetition = eArgRepeatPlain; 111843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 111943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Put the one and only variant into the first arg for m_arguments: 112043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg1.push_back (index_arg); 112143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 112243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first variant of this arg pair. 112343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice old_prefix_arg.arg_type = eArgTypeOldPathPrefix; 112443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice old_prefix_arg.arg_repetition = eArgRepeatPairPlus; 112543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 112643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first variant of this arg pair. 112743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice new_prefix_arg.arg_type = eArgTypeNewPathPrefix; 112843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice new_prefix_arg.arg_repetition = eArgRepeatPairPlus; 112943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 113043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There are two required arguments that must always occur together, i.e. an argument "pair". Because they 113143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // must always occur together, they are treated as two variants of one argument rather than two independent 113243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // arguments. Push them both into the same argument position for m_arguments... 113343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 113443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg2.push_back (old_prefix_arg); 113543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg2.push_back (new_prefix_arg); 113643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 113743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Add arguments to m_arguments. 113843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg1); 113943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg2); 114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1142e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesSearchPathsInsert () 114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1146da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 1148da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1151238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target) 115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 115436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t argc = command.GetArgumentCount(); 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // check for at least 3 arguments and an odd nubmer of parameters 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc >= 3 && argc & 1) 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool success = false; 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t insert_idx = Args::StringToUInt32(command.GetArgumentAtIndex(0), UINT32_MAX, 0, &success); 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("<index> parameter is not an integer: '%s'.\n", command.GetArgumentAtIndex(0)); 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // shift off the index 117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner command.Shift(); 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner argc = command.GetArgumentCount(); 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<argc; i+=2, ++insert_idx) 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *from = command.GetArgumentAtIndex(i); 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *to = command.GetArgumentAtIndex(i+1); 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (from[0] && to[0]) 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool last_pair = ((argc - i) == 2); 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner target->GetImageSearchPathList().Insert (ConstString(from), 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString(to), 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner insert_idx, 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner last_pair); 11854d661357f2d535c8243ae8433ba030058fb698c7Johnny Chen result.SetStatus (eReturnStatusSuccessFinishNoResult); 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (from[0]) 1190abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("<path-prefix> can't be empty\n"); 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 1192abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("<new-path-prefix> can't be empty\n"); 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1200abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("insert requires at least three arguments\n"); 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1208abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("invalid target\n"); 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1215e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1216e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesSearchPathsList 1217e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1218e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1219da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesSearchPathsList : public CommandObjectParsed 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1223e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesSearchPathsList (CommandInterpreter &interpreter) : 1224da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 1225da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules search-paths list", 1226da26bd203cbb104291b39891febf7481794f205fJim Ingham "List all current image search path substitution pairs in the current target.", 1227da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules search-paths list") 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1231e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesSearchPathsList () 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1235da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 1237da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1240238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target) 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (command.GetArgumentCount() != 0) 124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1245abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("list takes no arguments\n"); 124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner target->GetImageSearchPathList().Dump(&result.GetOutputStream()); 12514d661357f2d535c8243ae8433ba030058fb698c7Johnny Chen result.SetStatus (eReturnStatusSuccessFinishResult); 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1255abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("invalid target\n"); 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1262e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesSearchPathsQuery 1263e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1264da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesSearchPathsQuery : public CommandObjectParsed 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1268e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesSearchPathsQuery (CommandInterpreter &interpreter) : 1269da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 1270da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules search-paths query", 1271da26bd203cbb104291b39891febf7481794f205fJim Ingham "Transform a path using the first applicable image search path.", 1272da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL) 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 127543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData path_arg; 127643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 127743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 12789a91ef68c2650113da5488e09e9cb5f6aa88f6abSean Callanan path_arg.arg_type = eArgTypeDirectoryName; 127943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice path_arg.arg_repetition = eArgRepeatPlain; 128043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 128143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 128243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (path_arg); 128343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 128443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 128543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1288e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesSearchPathsQuery () 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1292da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 1294da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result) 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1297238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target) 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (command.GetArgumentCount() != 1) 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1302abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("query requires one argument\n"); 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString orig(command.GetArgumentAtIndex(0)); 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString transformed; 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target->GetImageSearchPathList().RemapPath(orig, transformed)) 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.GetOutputStream().Printf("%s\n", transformed.GetCString()); 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.GetOutputStream().Printf("%s\n", orig.GetCString()); 13134d661357f2d535c8243ae8433ba030058fb698c7Johnny Chen 13144d661357f2d535c8243ae8433ba030058fb698c7Johnny Chen result.SetStatus (eReturnStatusSuccessFinishResult); 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1318abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("invalid target\n"); 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1325e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 1326e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// Static Helper functions 1327e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 1328e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic void 1329e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonDumpModuleArchitecture (Stream &strm, Module *module, bool full_triple, uint32_t width) 1330e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1331e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module) 1332e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1333e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *arch_cstr; 1334e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (full_triple) 1335e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton arch_cstr = module->GetArchitecture().GetTriple().str().c_str(); 1336e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 1337e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton arch_cstr = module->GetArchitecture().GetArchitectureName(); 1338e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (width) 1339e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Printf("%-*s", width, arch_cstr); 1340e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 1341e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.PutCString(arch_cstr); 1342e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1343e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1345e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic void 1346e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonDumpModuleUUID (Stream &strm, Module *module) 1347e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 13486f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (module && module->GetUUID().IsValid()) 1349153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton module->GetUUID().Dump (&strm); 1350153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton else 1351153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton strm.PutCString(" "); 1352e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1354e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic uint32_t 1355ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg ClaytonDumpCompileUnitLineTable (CommandInterpreter &interpreter, 1356ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton Stream &strm, 1357ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton Module *module, 1358ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton const FileSpec &file_spec, 1359ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton bool load_addresses) 1360e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1361e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t num_matches = 0; 1362e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module) 1363e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1364e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SymbolContextList sc_list; 1365e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_matches = module->ResolveSymbolContextsForFileSpec (file_spec, 1366e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 0, 1367e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton false, 1368e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eSymbolContextCompUnit, 1369e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton sc_list); 1370e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1371e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (uint32_t i=0; i<num_matches; ++i) 1372e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1373e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SymbolContext sc; 1374e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (sc_list.GetContextAtIndex(i, sc)) 1375e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1376e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (i > 0) 1377e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm << "\n\n"; 1378e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1379e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm << "Line table for " << *static_cast<FileSpec*> (sc.comp_unit) << " in `" 1380e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton << module->GetFileSpec().GetFilename() << "\n"; 1381e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LineTable *line_table = sc.comp_unit->GetLineTable(); 1382e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (line_table) 1383e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton line_table->GetDescription (&strm, 1384567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton interpreter.GetExecutionContext().GetTargetPtr(), 1385e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton lldb::eDescriptionLevelBrief); 1386e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 1387e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm << "No line table"; 1388e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1389e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1390e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1391e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return num_matches; 1392e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1394e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic void 1395e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonDumpFullpath (Stream &strm, const FileSpec *file_spec_ptr, uint32_t width) 1396e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1397e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (file_spec_ptr) 1398e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1399e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (width > 0) 1400e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 14015581a7e69714aa6c08833e060de85237ec2a690aJason Molenda std::string fullpath = file_spec_ptr->GetPath(); 14025581a7e69714aa6c08833e060de85237ec2a690aJason Molenda strm.Printf("%-*s", width, fullpath.c_str()); 14035581a7e69714aa6c08833e060de85237ec2a690aJason Molenda return; 1404e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1405e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 1406e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1407e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton file_spec_ptr->Dump(&strm); 1408e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return; 1409e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1410e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1411e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Keep the width spacing correct if things go wrong... 1412e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (width > 0) 1413e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Printf("%-*s", width, ""); 1414e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1416e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic void 1417e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonDumpDirectory (Stream &strm, const FileSpec *file_spec_ptr, uint32_t width) 141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1419e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (file_spec_ptr) 1420e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1421e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (width > 0) 1422e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Printf("%-*s", width, file_spec_ptr->GetDirectory().AsCString("")); 1423e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 1424e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton file_spec_ptr->GetDirectory().Dump(&strm); 1425e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return; 1426e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1427e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Keep the width spacing correct if things go wrong... 1428e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (width > 0) 1429e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Printf("%-*s", width, ""); 1430e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1432e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic void 1433e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonDumpBasename (Stream &strm, const FileSpec *file_spec_ptr, uint32_t width) 1434e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1435e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (file_spec_ptr) 1436e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1437e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (width > 0) 1438e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Printf("%-*s", width, file_spec_ptr->GetFilename().AsCString("")); 1439e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 1440e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton file_spec_ptr->GetFilename().Dump(&strm); 1441e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return; 1442e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1443e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Keep the width spacing correct if things go wrong... 1444e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (width > 0) 1445e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Printf("%-*s", width, ""); 1446e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1447e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1448e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1449e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic void 1450e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonDumpModuleSymtab (CommandInterpreter &interpreter, Stream &strm, Module *module, SortOrder sort_order) 1451e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1452e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module) 1453e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1454a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SymbolVendor *sym_vendor = module->GetSymbolVendor (); 1455a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (sym_vendor) 1456e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1457a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = sym_vendor->GetSymtab(); 1458e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (symtab) 1459567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton symtab->Dump(&strm, interpreter.GetExecutionContext().GetTargetPtr(), sort_order); 1460e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1461e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1462e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1463e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1464e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic void 1465e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonDumpModuleSections (CommandInterpreter &interpreter, Stream &strm, Module *module) 1466e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1467e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module) 1468e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 14697940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *section_list = module->GetSectionList(); 1470a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_list) 1471e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1472a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain strm.Printf ("Sections for '%s' (%s):\n", 1473a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain module->GetSpecificationDescription().c_str(), 1474a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain module->GetArchitecture().GetArchitectureName()); 1475a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain strm.IndentMore(); 1476a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain section_list->Dump(&strm, interpreter.GetExecutionContext().GetTargetPtr(), true, UINT32_MAX); 1477a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain strm.IndentLess(); 1478e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1479e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1480e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1481e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1482e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic bool 1483e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonDumpModuleSymbolVendor (Stream &strm, Module *module) 1484e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1485e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module) 1486e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1487e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SymbolVendor *symbol_vendor = module->GetSymbolVendor(true); 1488e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (symbol_vendor) 1489e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1490e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton symbol_vendor->Dump(&strm); 1491e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return true; 1492e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1493e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1494e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 1495e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1496e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 14972ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Claytonstatic void 14982ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg ClaytonDumpAddress (ExecutionContextScope *exe_scope, const Address &so_addr, bool verbose, Stream &strm) 14992ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton{ 15002ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm.IndentMore(); 15012ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm.Indent (" Address: "); 15022ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton so_addr.Dump (&strm, exe_scope, Address::DumpStyleModuleWithFileAddress); 15032ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm.PutCString (" ("); 15042ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton so_addr.Dump (&strm, exe_scope, Address::DumpStyleSectionNameOffset); 15052ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm.PutCString (")\n"); 15062ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm.Indent (" Summary: "); 15072ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton const uint32_t save_indent = strm.GetIndentLevel (); 15082ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm.SetIndentLevel (save_indent + 13); 15092ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton so_addr.Dump (&strm, exe_scope, Address::DumpStyleResolvedDescription); 15102ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm.SetIndentLevel (save_indent); 15112ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton // Print out detailed address information when verbose is enabled 15122ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (verbose) 15132ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { 15142ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm.EOL(); 15152ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton so_addr.Dump (&strm, exe_scope, Address::DumpStyleDetailedSymbolContext); 15162ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton } 15172ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm.IndentLess(); 15182ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton} 15192ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton 1520e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic bool 15213508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonLookupAddressInModule (CommandInterpreter &interpreter, 15223508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Stream &strm, 15233508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Module *module, 15243508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton uint32_t resolve_mask, 15253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton lldb::addr_t raw_addr, 15263508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton lldb::addr_t offset, 15273508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton bool verbose) 1528e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1529e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module) 1530e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1531e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton lldb::addr_t addr = raw_addr - offset; 1532e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Address so_addr; 1533e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SymbolContext sc; 1534567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = interpreter.GetExecutionContext().GetTargetPtr(); 1535e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (target && !target->GetSectionLoadList().IsEmpty()) 1536e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1537e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (!target->GetSectionLoadList().ResolveLoadAddress (addr, so_addr)) 1538e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 15393508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton else if (so_addr.GetModule().get() != module) 1540e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 1541e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1542e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 1543e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1544e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (!module->ResolveFileAddress (addr, so_addr)) 1545e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 1546e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1547e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1548e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ExecutionContextScope *exe_scope = interpreter.GetExecutionContext().GetBestExecutionContextScope(); 15492ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton DumpAddress (exe_scope, so_addr, verbose, strm); 15502ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.IndentMore(); 15512ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.Indent (" Address: "); 15522ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// so_addr.Dump (&strm, exe_scope, Address::DumpStyleModuleWithFileAddress); 15532ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.PutCString (" ("); 15542ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// so_addr.Dump (&strm, exe_scope, Address::DumpStyleSectionNameOffset); 15552ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.PutCString (")\n"); 15562ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.Indent (" Summary: "); 15572ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// const uint32_t save_indent = strm.GetIndentLevel (); 15582ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.SetIndentLevel (save_indent + 13); 15592ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// so_addr.Dump (&strm, exe_scope, Address::DumpStyleResolvedDescription); 15602ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.SetIndentLevel (save_indent); 15612ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// // Print out detailed address information when verbose is enabled 15622ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// if (verbose) 15632ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// { 15642ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.EOL(); 15652ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// so_addr.Dump (&strm, exe_scope, Address::DumpStyleDetailedSymbolContext); 15662ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// } 15672ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.IndentLess(); 1568e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return true; 1569e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1570e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1571e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 1572e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1573e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1574e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic uint32_t 15752ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg ClaytonLookupSymbolInModule (CommandInterpreter &interpreter, Stream &strm, Module *module, const char *name, bool name_is_regex, bool verbose) 1576e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1577e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module) 1578e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1579e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SymbolContext sc; 1580e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1581a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SymbolVendor *sym_vendor = module->GetSymbolVendor (); 1582a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (sym_vendor) 1583e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1584a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = sym_vendor->GetSymtab(); 1585e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (symtab) 1586e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1587e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t i; 1588e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton std::vector<uint32_t> match_indexes; 1589e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ConstString symbol_name (name); 1590e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t num_matches = 0; 1591e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (name_is_regex) 1592e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1593e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton RegularExpression name_regexp(name); 1594e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_matches = symtab->AppendSymbolIndexesMatchingRegExAndType (name_regexp, 1595e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eSymbolTypeAny, 1596e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton match_indexes); 1597e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1598e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 1599e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1600e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_matches = symtab->AppendSymbolIndexesWithName (symbol_name, match_indexes); 1601e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1602e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1603e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1604e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_matches > 0) 1605e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1606e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Indent (); 1607e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Printf("%u symbols match %s'%s' in ", num_matches, 1608e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton name_is_regex ? "the regular expression " : "", name); 1609e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton DumpFullpath (strm, &module->GetFileSpec(), 0); 1610e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.PutCString(":\n"); 1611e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.IndentMore (); 16122ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton //Symtab::DumpSymbolHeader (&strm); 1613e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (i=0; i < num_matches; ++i) 1614e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1615e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Symbol *symbol = symtab->SymbolAtIndex(match_indexes[i]); 16162ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton DumpAddress (interpreter.GetExecutionContext().GetBestExecutionContextScope(), 16172ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton symbol->GetAddress(), 16182ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton verbose, 16192ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton strm); 16202ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton 16212ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// strm.Indent (); 16222ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton// symbol->Dump (&strm, interpreter.GetExecutionContext().GetTargetPtr(), i); 1623e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1624e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.IndentLess (); 1625e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return num_matches; 1626e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1627e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1628e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1629e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1630e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return 0; 1631e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1632e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1633e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1634e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic void 16352ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg ClaytonDumpSymbolContextList (ExecutionContextScope *exe_scope, Stream &strm, SymbolContextList &sc_list, bool verbose) 1636e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1637e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.IndentMore (); 1638e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t i; 1639e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 1640e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1641e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (i=0; i<num_matches; ++i) 1642e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1643e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SymbolContext sc; 1644e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (sc_list.GetContextAtIndex(i, sc)) 1645e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1646d7793d27bb8b3402f6a0e7d8fdd90324bf875ed0Sean Callanan AddressRange range; 1647d7793d27bb8b3402f6a0e7d8fdd90324bf875ed0Sean Callanan 1648d7793d27bb8b3402f6a0e7d8fdd90324bf875ed0Sean Callanan sc.GetAddressRange(eSymbolContextEverything, 1649d7793d27bb8b3402f6a0e7d8fdd90324bf875ed0Sean Callanan 0, 1650d7793d27bb8b3402f6a0e7d8fdd90324bf875ed0Sean Callanan true, 1651d7793d27bb8b3402f6a0e7d8fdd90324bf875ed0Sean Callanan range); 1652d7793d27bb8b3402f6a0e7d8fdd90324bf875ed0Sean Callanan 16532ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton DumpAddress (exe_scope, range.GetBaseAddress(), verbose, strm); 1654e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1655e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1656e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.IndentLess (); 1657e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1658e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 165936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonstatic size_t 16602ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg ClaytonLookupFunctionInModule (CommandInterpreter &interpreter, 16612ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton Stream &strm, 16622ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton Module *module, 16632ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton const char *name, 16642ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton bool name_is_regex, 16652ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton bool include_inlines, 16662ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton bool include_symbols, 16672ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton bool verbose) 1668e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1669e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module && name && name[0]) 1670e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1671e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SymbolContextList sc_list; 1672e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const bool append = true; 167336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_matches = 0; 1674e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (name_is_regex) 1675e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1676e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton RegularExpression function_name_regex (name); 1677e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_matches = module->FindFunctions (function_name_regex, 1678e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton include_symbols, 1679302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 1680e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton append, 1681e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton sc_list); 1682e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1683e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 1684e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1685e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ConstString function_name (name); 16863e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan num_matches = module->FindFunctions (function_name, 16873e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan NULL, 168883d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton eFunctionNameTypeAuto, 1689e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton include_symbols, 1690302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 1691e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton append, 1692e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton sc_list); 1693e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1694e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1695e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_matches) 1696e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1697e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Indent (); 169836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("%zu match%s found in ", num_matches, num_matches > 1 ? "es" : ""); 1699e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton DumpFullpath (strm, &module->GetFileSpec(), 0); 1700e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.PutCString(":\n"); 17012ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton DumpSymbolContextList (interpreter.GetExecutionContext().GetBestExecutionContextScope(), strm, sc_list, verbose); 1702e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1703e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return num_matches; 1704e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1705e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return 0; 1706e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1707e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 170836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonstatic size_t 17090cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg ClaytonLookupTypeInModule (CommandInterpreter &interpreter, 1710801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton Stream &strm, 1711801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton Module *module, 1712801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const char *name_cstr, 1713801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton bool name_is_regex) 1714e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1715e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module && name_cstr && name_cstr[0]) 1716e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 171737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton TypeList type_list; 1718dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const uint32_t max_num_matches = UINT32_MAX; 171936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_matches = 0; 1720dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton bool name_is_fully_qualified = false; 172137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton SymbolContext sc; 172237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton 172337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton ConstString name(name_cstr); 1724dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton num_matches = module->FindTypes(sc, name, name_is_fully_qualified, max_num_matches, type_list); 1725e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 172637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton if (num_matches) 172737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton { 172837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton strm.Indent (); 172936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("%zu match%s found in ", num_matches, num_matches > 1 ? "es" : ""); 173037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton DumpFullpath (strm, &module->GetFileSpec(), 0); 173137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton strm.PutCString(":\n"); 173237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton const uint32_t num_types = type_list.GetSize(); 173337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton for (uint32_t i=0; i<num_types; ++i) 1734e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 173537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton TypeSP type_sp (type_list.GetTypeAtIndex(i)); 173637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton if (type_sp) 1737e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 173837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton // Resolve the clang type so that any forward references 173937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton // to types that haven't yet been parsed will get parsed. 174037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton type_sp->GetClangFullType (); 174137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton type_sp->GetDescription (&strm, eDescriptionLevelFull, true); 17420cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton // Print all typedef chains 17430cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton TypeSP typedef_type_sp (type_sp); 17440cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton TypeSP typedefed_type_sp (typedef_type_sp->GetTypedefType()); 17450cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton while (typedefed_type_sp) 17460cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton { 17470cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton strm.EOL(); 17480cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton strm.Printf(" typedef '%s': ", typedef_type_sp->GetName().GetCString()); 17490cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton typedefed_type_sp->GetClangFullType (); 17500cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton typedefed_type_sp->GetDescription (&strm, eDescriptionLevelFull, true); 17510cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton typedef_type_sp = typedefed_type_sp; 17520cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton typedefed_type_sp = typedef_type_sp->GetTypedefType(); 17530cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton } 1754e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 175537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton strm.EOL(); 1756e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 175737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton } 175837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton return num_matches; 1759e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1760e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return 0; 1761e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1762e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 176336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonstatic size_t 176456d31ec9d107b50a694892944749f82d483e0e8fSean CallananLookupTypeHere (CommandInterpreter &interpreter, 176556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan Stream &strm, 176656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan const SymbolContext &sym_ctx, 176756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan const char *name_cstr, 176856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan bool name_is_regex) 176956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan{ 177056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (!sym_ctx.module_sp) 177156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan return 0; 177256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 177356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan TypeList type_list; 177456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan const uint32_t max_num_matches = UINT32_MAX; 177536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_matches = 1; 177656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan bool name_is_fully_qualified = false; 177756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 177856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan ConstString name(name_cstr); 177956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan num_matches = sym_ctx.module_sp->FindTypes(sym_ctx, name, name_is_fully_qualified, max_num_matches, type_list); 178056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 178156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (num_matches) 178256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 178356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan strm.Indent (); 178456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan strm.PutCString("Best match found in "); 178556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan DumpFullpath (strm, &sym_ctx.module_sp->GetFileSpec(), 0); 178656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan strm.PutCString(":\n"); 178756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 178856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan TypeSP type_sp (type_list.GetTypeAtIndex(0)); 178956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (type_sp) 179056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 179156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan // Resolve the clang type so that any forward references 179256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan // to types that haven't yet been parsed will get parsed. 179356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan type_sp->GetClangFullType (); 179456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan type_sp->GetDescription (&strm, eDescriptionLevelFull, true); 179556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan // Print all typedef chains 179656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan TypeSP typedef_type_sp (type_sp); 179756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan TypeSP typedefed_type_sp (typedef_type_sp->GetTypedefType()); 179856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan while (typedefed_type_sp) 179956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 180056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan strm.EOL(); 180156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan strm.Printf(" typedef '%s': ", typedef_type_sp->GetName().GetCString()); 180256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan typedefed_type_sp->GetClangFullType (); 180356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan typedefed_type_sp->GetDescription (&strm, eDescriptionLevelFull, true); 180456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan typedef_type_sp = typedefed_type_sp; 180556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan typedefed_type_sp = typedef_type_sp->GetTypedefType(); 180656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 180756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 180856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan strm.EOL(); 180956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 181056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan return num_matches; 181156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan} 181256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 181356d31ec9d107b50a694892944749f82d483e0e8fSean Callananstatic uint32_t 1814e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonLookupFileAndLineInModule (CommandInterpreter &interpreter, 181556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan Stream &strm, 1816e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Module *module, 1817e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const FileSpec &file_spec, 1818e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t line, 1819e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton bool check_inlines, 1820e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton bool verbose) 1821e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1822e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module && file_spec) 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1824e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SymbolContextList sc_list; 1825e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const uint32_t num_matches = module->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines, 1826e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eSymbolContextEverything, sc_list); 1827e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_matches > 0) 1828e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1829e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Indent (); 1830e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Printf("%u match%s found in ", num_matches, num_matches > 1 ? "es" : ""); 1831e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm << file_spec; 1832e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (line > 0) 1833e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.Printf (":%u", line); 1834e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm << " in "; 1835e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton DumpFullpath (strm, &module->GetFileSpec(), 0); 1836e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton strm.PutCString(":\n"); 18372ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton DumpSymbolContextList (interpreter.GetExecutionContext().GetBestExecutionContextScope(), strm, sc_list, verbose); 1838e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return num_matches; 1839e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1841e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return 0; 1842e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1843e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton} 1844e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 184591048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton 184691048ef6b6de725b5277eff781c695e60983ce9aGreg Claytonstatic size_t 184791048ef6b6de725b5277eff781c695e60983ce9aGreg ClaytonFindModulesByName (Target *target, 184891048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton const char *module_name, 184991048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton ModuleList &module_list, 185091048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton bool check_global_list) 185191048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton{ 185291048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton// Dump specified images (by basename or fullpath) 185391048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton FileSpec module_file_spec(module_name, false); 1854444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (module_file_spec); 185591048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton 185691048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton const size_t initial_size = module_list.GetSize (); 185791048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton 1858316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton if (check_global_list) 185991048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton { 186091048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton // Check the global list 1861c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton Mutex::Locker locker(Module::GetAllocationModuleCollectionMutex()); 186236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_modules = Module::GetNumberAllocatedModules(); 186391048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton ModuleSP module_sp; 186436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t image_idx = 0; image_idx<num_modules; ++image_idx) 186591048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton { 186691048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton Module *module = Module::GetAllocatedModuleAtIndex(image_idx); 186791048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton 186891048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (module) 186991048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton { 1870444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module->MatchesModuleSpec (module_spec)) 187191048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton { 187213d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton module_sp = module->shared_from_this(); 187391048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton module_list.AppendIfNeeded(module_sp); 187491048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton } 187591048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton } 187691048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton } 187791048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton } 1878316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton else 1879316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton { 1880316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton if (target) 1881316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton { 1882316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton const size_t num_matches = target->GetImages().FindModules (module_spec, module_list); 1883316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton 1884316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton // Not found in our module list for our target, check the main 1885316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton // shared module list in case it is a extra file used somewhere 1886316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton // else 1887316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton if (num_matches == 0) 1888316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton { 1889316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton module_spec.GetArchitecture() = target->GetArchitecture(); 1890316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton ModuleList::FindSharedModules (module_spec, module_list); 1891316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton } 1892316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton } 1893316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton else 1894316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton { 1895316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton ModuleList::FindSharedModules (module_spec,module_list); 1896316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton } 1897316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton } 1898316f57f18061c8366ff3c82a7a8517b2c2a42887Greg Clayton 189991048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton return module_list.GetSize () - initial_size; 190091048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton} 190191048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton 1902e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesModuleAutoComplete 1903e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1904e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 1905e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// A base command object class that can auto complete with module file 1906e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// paths 1907e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 190824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1909da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesModuleAutoComplete : public CommandObjectParsed 1910e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1911e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 1912e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1913e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesModuleAutoComplete (CommandInterpreter &interpreter, 1914e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *name, 1915e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *help, 1916e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *syntax) : 1917da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, name, help, syntax) 1918e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1919e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandArgumentEntry arg; 1920e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandArgumentData file_arg; 1921e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1922e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Define the first (and only) variant of this arg. 1923e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton file_arg.arg_type = eArgTypeFilename; 1924e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton file_arg.arg_repetition = eArgRepeatStar; 1925e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1926e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // There is only one variant this argument could be; put it into the argument entry. 1927e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton arg.push_back (file_arg); 1928e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1929e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Push the data for the first argument into the m_arguments vector. 1930e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_arguments.push_back (arg); 1931e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1932e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1933e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 1934e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesModuleAutoComplete () 1935e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1936e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1937e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1938e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual int 1939e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton HandleArgumentCompletion (Args &input, 1940e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton int &cursor_index, 1941e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton int &cursor_char_position, 1942e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton OptionElementVector &opt_element_vector, 1943e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton int match_start_point, 1944e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton int max_return_elements, 1945e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton bool &word_complete, 1946e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton StringList &matches) 194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1948e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Arguments are the standard module completer. 1949e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton std::string completion_str (input.GetArgumentAtIndex(cursor_index)); 1950e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton completion_str.erase (cursor_char_position); 1951e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1952e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 1953e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandCompletions::eModuleCompletion, 1954e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton completion_str.c_str(), 1955e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton match_start_point, 1956e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton max_return_elements, 1957e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton NULL, 1958e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton word_complete, 1959e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton matches); 1960e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return matches.GetSize(); 196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1964e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesSourceFileAutoComplete 1965e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1966e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 1967e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// A base command object class that can auto complete with module source 1968e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// file paths 1969e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 1970e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1971da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesSourceFileAutoComplete : public CommandObjectParsed 1972e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 1973e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 1974e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1975e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesSourceFileAutoComplete (CommandInterpreter &interpreter, 1976ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *name, 1977ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *help, 1978ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *syntax, 1979ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton uint32_t flags) : 1980ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton CommandObjectParsed (interpreter, name, help, syntax, flags) 1981e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1982e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandArgumentEntry arg; 1983e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandArgumentData source_file_arg; 1984e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1985e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Define the first (and only) variant of this arg. 1986e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton source_file_arg.arg_type = eArgTypeSourceFile; 1987e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton source_file_arg.arg_repetition = eArgRepeatPlus; 1988e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1989e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // There is only one variant this argument could be; put it into the argument entry. 1990e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton arg.push_back (source_file_arg); 1991e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1992e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Push the data for the first argument into the m_arguments vector. 1993e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_arguments.push_back (arg); 1994e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 1995e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 1996e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 1997e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesSourceFileAutoComplete () 1998e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 1999e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2000e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2001e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual int 2002e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton HandleArgumentCompletion (Args &input, 2003e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton int &cursor_index, 2004e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton int &cursor_char_position, 2005e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton OptionElementVector &opt_element_vector, 2006e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton int match_start_point, 2007e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton int max_return_elements, 2008e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton bool &word_complete, 2009e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton StringList &matches) 2010e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2011e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Arguments are the standard source file completer. 2012e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton std::string completion_str (input.GetArgumentAtIndex(cursor_index)); 2013e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton completion_str.erase (cursor_char_position); 2014e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2015e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 2016e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandCompletions::eSourceFileCompletion, 2017e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton completion_str.c_str(), 2018e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton match_start_point, 2019e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton max_return_elements, 2020e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton NULL, 2021e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton word_complete, 2022e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton matches); 2023e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return matches.GetSize(); 2024e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2025e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2026e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2027e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2028e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesDumpSymtab 2029e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2030e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2031e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonclass CommandObjectTargetModulesDumpSymtab : public CommandObjectTargetModulesModuleAutoComplete 2032e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2033e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 2034e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesDumpSymtab (CommandInterpreter &interpreter) : 2035e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesModuleAutoComplete (interpreter, 2036e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules dump symtab", 2037e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "Dump the symbol table from one or more target modules.", 2038e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton NULL), 2039e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options (interpreter) 2040e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2041e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2042e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2043e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 2044e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesDumpSymtab () 2045e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2046e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2047e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2048da26bd203cbb104291b39891febf7481794f205fJim Ingham virtual Options * 2049da26bd203cbb104291b39891febf7481794f205fJim Ingham GetOptions () 2050da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2051da26bd203cbb104291b39891febf7481794f205fJim Ingham return &m_options; 2052da26bd203cbb104291b39891febf7481794f205fJim Ingham } 2053da26bd203cbb104291b39891febf7481794f205fJim Ingham 2054da26bd203cbb104291b39891febf7481794f205fJim Ingham class CommandOptions : public Options 2055da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2056da26bd203cbb104291b39891febf7481794f205fJim Ingham public: 2057da26bd203cbb104291b39891febf7481794f205fJim Ingham 2058da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandOptions (CommandInterpreter &interpreter) : 2059da26bd203cbb104291b39891febf7481794f205fJim Ingham Options(interpreter), 2060da26bd203cbb104291b39891febf7481794f205fJim Ingham m_sort_order (eSortOrderNone) 2061da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2062da26bd203cbb104291b39891febf7481794f205fJim Ingham } 2063da26bd203cbb104291b39891febf7481794f205fJim Ingham 2064da26bd203cbb104291b39891febf7481794f205fJim Ingham virtual 2065da26bd203cbb104291b39891febf7481794f205fJim Ingham ~CommandOptions () 2066da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2067da26bd203cbb104291b39891febf7481794f205fJim Ingham } 2068da26bd203cbb104291b39891febf7481794f205fJim Ingham 2069da26bd203cbb104291b39891febf7481794f205fJim Ingham virtual Error 2070da26bd203cbb104291b39891febf7481794f205fJim Ingham SetOptionValue (uint32_t option_idx, const char *option_arg) 2071da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2072da26bd203cbb104291b39891febf7481794f205fJim Ingham Error error; 20736475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 2074da26bd203cbb104291b39891febf7481794f205fJim Ingham 2075da26bd203cbb104291b39891febf7481794f205fJim Ingham switch (short_option) 2076da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2077da26bd203cbb104291b39891febf7481794f205fJim Ingham case 's': 2078da26bd203cbb104291b39891febf7481794f205fJim Ingham m_sort_order = (SortOrder) Args::StringToOptionEnum (option_arg, 2079da26bd203cbb104291b39891febf7481794f205fJim Ingham g_option_table[option_idx].enum_values, 2080da26bd203cbb104291b39891febf7481794f205fJim Ingham eSortOrderNone, 2081da26bd203cbb104291b39891febf7481794f205fJim Ingham error); 2082da26bd203cbb104291b39891febf7481794f205fJim Ingham break; 2083da26bd203cbb104291b39891febf7481794f205fJim Ingham 2084da26bd203cbb104291b39891febf7481794f205fJim Ingham default: 2085da26bd203cbb104291b39891febf7481794f205fJim Ingham error.SetErrorStringWithFormat("invalid short option character '%c'", short_option); 2086da26bd203cbb104291b39891febf7481794f205fJim Ingham break; 2087da26bd203cbb104291b39891febf7481794f205fJim Ingham 2088da26bd203cbb104291b39891febf7481794f205fJim Ingham } 2089da26bd203cbb104291b39891febf7481794f205fJim Ingham return error; 2090da26bd203cbb104291b39891febf7481794f205fJim Ingham } 2091da26bd203cbb104291b39891febf7481794f205fJim Ingham 2092da26bd203cbb104291b39891febf7481794f205fJim Ingham void 2093da26bd203cbb104291b39891febf7481794f205fJim Ingham OptionParsingStarting () 2094da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2095da26bd203cbb104291b39891febf7481794f205fJim Ingham m_sort_order = eSortOrderNone; 2096da26bd203cbb104291b39891febf7481794f205fJim Ingham } 2097da26bd203cbb104291b39891febf7481794f205fJim Ingham 2098da26bd203cbb104291b39891febf7481794f205fJim Ingham const OptionDefinition* 2099da26bd203cbb104291b39891febf7481794f205fJim Ingham GetDefinitions () 2100da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2101da26bd203cbb104291b39891febf7481794f205fJim Ingham return g_option_table; 2102da26bd203cbb104291b39891febf7481794f205fJim Ingham } 2103da26bd203cbb104291b39891febf7481794f205fJim Ingham 2104da26bd203cbb104291b39891febf7481794f205fJim Ingham // Options table: Required for subclasses of Options. 2105da26bd203cbb104291b39891febf7481794f205fJim Ingham static OptionDefinition g_option_table[]; 2106da26bd203cbb104291b39891febf7481794f205fJim Ingham 2107da26bd203cbb104291b39891febf7481794f205fJim Ingham SortOrder m_sort_order; 2108da26bd203cbb104291b39891febf7481794f205fJim Ingham }; 2109da26bd203cbb104291b39891febf7481794f205fJim Ingham 2110da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 2111e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual bool 2112da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 2113e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandReturnObject &result) 2114e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2115e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 2116e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (target == NULL) 2117e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2118e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 2119e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2120e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2121e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2122e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2123e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2124e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t num_dumped = 0; 2125e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2126e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize(); 2127e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().SetAddressByteSize(addr_byte_size); 2128e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetErrorStream().SetAddressByteSize(addr_byte_size); 2129e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2130e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (command.GetArgumentCount() == 0) 2131e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2132e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Dump all sections for all modules images 21339336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham Mutex::Locker modules_locker(target->GetImages().GetMutex()); 213436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_modules = target->GetImages().GetSize(); 2135e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_modules > 0) 2136e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 213736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton result.GetOutputStream().Printf("Dumping symbol table for %zu modules.\n", num_modules); 213836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t image_idx = 0; image_idx<num_modules; ++image_idx) 2139e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2140e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_dumped > 0) 2141e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2142e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().EOL(); 2143e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().EOL(); 2144e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2145e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_dumped++; 21469336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham DumpModuleSymtab (m_interpreter, 21479336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham result.GetOutputStream(), 21489336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham target->GetImages().GetModulePointerAtIndexUnlocked(image_idx), 21499336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham m_options.m_sort_order); 2150e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2151e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2152e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2153e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2154e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("the target has no associated executable images"); 2155e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2156e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2157e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2158e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2159e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2160e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2161e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Dump specified images (by basename or fullpath) 2162e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *arg_cstr; 2163e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != NULL; ++arg_idx) 2164e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 216591048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton ModuleList module_list; 216691048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, true); 216791048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (num_matches > 0) 2168e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 216991048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton for (size_t i=0; i<num_matches; ++i) 2170e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 217191048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton Module *module = module_list.GetModulePointerAtIndex(i); 217291048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (module) 2173e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2174e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_dumped > 0) 2175e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2176e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().EOL(); 2177e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().EOL(); 2178e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2179e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_dumped++; 218091048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton DumpModuleSymtab (m_interpreter, result.GetOutputStream(), module, m_options.m_sort_order); 2181e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2182e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2183e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2184e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2185e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr); 2186e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2187e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2188e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2189e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_dumped > 0) 2190e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 2191e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2192e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2193e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("no matching executable images found"); 2194e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2195e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2196e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2197e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return result.Succeeded(); 2198e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2199e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2200e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2201e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandOptions m_options; 2202e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2203e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2204e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonstatic OptionEnumValueElement 2205e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytong_sort_option_enumeration[4] = 2206e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2207e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { eSortOrderNone, "none", "No sorting, use the original symbol table order."}, 2208e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { eSortOrderByAddress, "address", "Sort output by symbol address."}, 2209e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { eSortOrderByName, "name", "Sort output by symbol name."}, 2210e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 0, NULL, NULL } 2211e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2212e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2213e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2214e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonOptionDefinition 2215e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonCommandObjectTargetModulesDumpSymtab::CommandOptions::g_option_table[] = 2216e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2217e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { LLDB_OPT_SET_1, false, "sort", 's', required_argument, g_sort_option_enumeration, 0, eArgTypeSortOrder, "Supply a sort order when dumping the symbol table."}, 2218e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 2219e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2220e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2221e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesDumpSections 2222e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2223e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2224e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// Image section dumping command 2225e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2226e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2227e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonclass CommandObjectTargetModulesDumpSections : public CommandObjectTargetModulesModuleAutoComplete 2228e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2229e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 2230e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesDumpSections (CommandInterpreter &interpreter) : 2231e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesModuleAutoComplete (interpreter, 2232e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules dump sections", 2233e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "Dump the sections from one or more target modules.", 2234e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton //"target modules dump sections [<file1> ...]") 2235e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton NULL) 2236e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2237e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2238e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2239e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 2240e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesDumpSections () 2241e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2242e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2243e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2244da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 2245e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual bool 2246da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 2247e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandReturnObject &result) 2248e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2249e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 2250e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (target == NULL) 2251e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2252e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 2253e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2254e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2255e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2256e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2257e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2258e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t num_dumped = 0; 2259e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2260e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize(); 2261e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().SetAddressByteSize(addr_byte_size); 2262e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetErrorStream().SetAddressByteSize(addr_byte_size); 2263e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2264e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (command.GetArgumentCount() == 0) 2265e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2266e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Dump all sections for all modules images 226736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_modules = target->GetImages().GetSize(); 2268e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_modules > 0) 2269e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 227036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton result.GetOutputStream().Printf("Dumping sections for %zu modules.\n", num_modules); 227136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t image_idx = 0; image_idx<num_modules; ++image_idx) 2272e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2273e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_dumped++; 2274e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton DumpModuleSections (m_interpreter, result.GetOutputStream(), target->GetImages().GetModulePointerAtIndex(image_idx)); 2275e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2276e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2277e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2278e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2279e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("the target has no associated executable images"); 2280e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2281e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2282e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2283e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2284e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2285e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2286e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Dump specified images (by basename or fullpath) 2287e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *arg_cstr; 2288e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != NULL; ++arg_idx) 2289e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 229091048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton ModuleList module_list; 229191048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, true); 229291048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (num_matches > 0) 2293e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 229491048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton for (size_t i=0; i<num_matches; ++i) 2295e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 229691048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton Module *module = module_list.GetModulePointerAtIndex(i); 229791048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (module) 2298e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2299e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_dumped++; 230091048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton DumpModuleSections (m_interpreter, result.GetOutputStream(), module); 2301e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2302e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2303e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2304e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 230591048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton { 230691048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton // Check the global list 2307c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton Mutex::Locker locker(Module::GetAllocationModuleCollectionMutex()); 230891048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton 2309e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr); 231091048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton } 2311e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2312e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2313e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2314e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_dumped > 0) 2315e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 2316e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2317e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2318e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("no matching executable images found"); 2319e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2320e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2321e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2322e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return result.Succeeded(); 2323e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2324e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2325e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2326e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2327e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesDumpSymfile 2328e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2329e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2330e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// Image debug symbol dumping command 2331e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2332e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2333e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonclass CommandObjectTargetModulesDumpSymfile : public CommandObjectTargetModulesModuleAutoComplete 2334e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2335e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 2336e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesDumpSymfile (CommandInterpreter &interpreter) : 2337e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesModuleAutoComplete (interpreter, 2338e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules dump symfile", 2339e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "Dump the debug symbol file for one or more target modules.", 2340e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton //"target modules dump symfile [<file1> ...]") 2341e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton NULL) 2342e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2343e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2344e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2345e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 2346e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesDumpSymfile () 2347e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2348e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2349e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2350da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 2351e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual bool 2352da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 2353e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandReturnObject &result) 2354e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2355e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 2356e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (target == NULL) 2357e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2358e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 2359e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2360e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2361e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2362e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2363e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2364e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t num_dumped = 0; 2365e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2366e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize(); 2367e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().SetAddressByteSize(addr_byte_size); 2368e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetErrorStream().SetAddressByteSize(addr_byte_size); 2369e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2370e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (command.GetArgumentCount() == 0) 2371e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2372e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Dump all sections for all modules images 2373146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata const ModuleList &target_modules = target->GetImages(); 23749336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham Mutex::Locker modules_locker (target_modules.GetMutex()); 237536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_modules = target_modules.GetSize(); 2376e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_modules > 0) 2377e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 237836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton result.GetOutputStream().Printf("Dumping debug symbols for %zu modules.\n", num_modules); 2379e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (uint32_t image_idx = 0; image_idx<num_modules; ++image_idx) 2380e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 23819336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham if (DumpModuleSymbolVendor (result.GetOutputStream(), target_modules.GetModulePointerAtIndexUnlocked(image_idx))) 2382e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_dumped++; 2383e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2384e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2385e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2386e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2387e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("the target has no associated executable images"); 2388e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2389e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2390e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2391e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2392e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2393e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2394e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Dump specified images (by basename or fullpath) 2395e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *arg_cstr; 2396e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != NULL; ++arg_idx) 2397e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 239891048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton ModuleList module_list; 239991048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, true); 240091048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (num_matches > 0) 2401e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 240291048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton for (size_t i=0; i<num_matches; ++i) 2403e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 240491048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton Module *module = module_list.GetModulePointerAtIndex(i); 240591048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (module) 2406e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 240791048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (DumpModuleSymbolVendor (result.GetOutputStream(), module)) 2408e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_dumped++; 2409e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2410e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2411e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2412e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2413e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr); 2414e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2415e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2416e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2417e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_dumped > 0) 2418e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 2419e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2420e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2421e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("no matching executable images found"); 2422e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2423e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2424e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2425e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return result.Succeeded(); 2426e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2427e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2428e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2429e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2430e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesDumpLineTable 2431e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2432e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2433e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// Image debug line table dumping command 2434e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2435e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2436e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonclass CommandObjectTargetModulesDumpLineTable : public CommandObjectTargetModulesSourceFileAutoComplete 2437e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2438e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 2439e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesDumpLineTable (CommandInterpreter &interpreter) : 2440e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesSourceFileAutoComplete (interpreter, 2441ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton "target modules dump line-table", 2442e515076546361b9784630ad8c838aab0ee231718Jim Ingham "Dump the line table for one or more compilation units.", 2443ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton NULL, 2444ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresTarget) 2445e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2446e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2447e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2448e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 2449e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesDumpLineTable () 2450e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2451e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2452e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2453da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 2454e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual bool 2455da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 2456e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandReturnObject &result) 2457e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2458ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 2459ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton uint32_t total_num_dumped = 0; 2460ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 2461ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize(); 2462ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.GetOutputStream().SetAddressByteSize(addr_byte_size); 2463ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.GetErrorStream().SetAddressByteSize(addr_byte_size); 2464ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 2465ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (command.GetArgumentCount() == 0) 2466e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2467ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("\nSyntax: %s\n", m_cmd_syntax.c_str()); 2468e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2469e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2470e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2471e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2472ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // Dump specified images (by basename or fullpath) 2473ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *arg_cstr; 2474ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != NULL; ++arg_idx) 2475e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2476ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton FileSpec file_spec(arg_cstr, false); 2477ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 2478ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const ModuleList &target_modules = target->GetImages(); 2479ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Mutex::Locker modules_locker(target_modules.GetMutex()); 248036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_modules = target_modules.GetSize(); 2481ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (num_modules > 0) 2482e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2483ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton uint32_t num_dumped = 0; 2484ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (uint32_t i = 0; i<num_modules; ++i) 2485e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2486ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (DumpCompileUnitLineTable (m_interpreter, 2487ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.GetOutputStream(), 2488ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton target_modules.GetModulePointerAtIndexUnlocked(i), 2489ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton file_spec, 2490ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_exe_ctx.GetProcessPtr() && m_exe_ctx.GetProcessRef().IsAlive())) 2491ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton num_dumped++; 2492e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2493ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (num_dumped == 0) 2494ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendWarningWithFormat ("No source filenames matched '%s'.\n", arg_cstr); 2495ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 2496ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton total_num_dumped += num_dumped; 2497e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2498e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2499ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 2500ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 2501ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (total_num_dumped > 0) 2502ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 2503ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 2504ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 2505ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("no source filenames matched any command arguments"); 2506ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 2507e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2508e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return result.Succeeded(); 2509e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2510e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2511e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2512e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2513e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModulesDump 2514e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2515e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2516e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// Dump multi-word command for target modules 2517e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2518e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2519e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonclass CommandObjectTargetModulesDump : public CommandObjectMultiword 2520e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2521e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 2522e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2523e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton //------------------------------------------------------------------ 2524e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Constructors and Destructors 2525e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton //------------------------------------------------------------------ 2526e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesDump(CommandInterpreter &interpreter) : 2527e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectMultiword (interpreter, 2528e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules dump", 2529e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "A set of commands for dumping information about one or more target modules.", 2530e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules dump [symtab|sections|symfile|line-table] [<file1> <file2> ...]") 2531e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2532e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("symtab", CommandObjectSP (new CommandObjectTargetModulesDumpSymtab (interpreter))); 2533e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("sections", CommandObjectSP (new CommandObjectTargetModulesDumpSections (interpreter))); 2534e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("symfile", CommandObjectSP (new CommandObjectTargetModulesDumpSymfile (interpreter))); 2535e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("line-table", CommandObjectSP (new CommandObjectTargetModulesDumpLineTable (interpreter))); 2536e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2537e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2538e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 2539e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesDump() 2540e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2541e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2542e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2543e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2544da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesAdd : public CommandObjectParsed 2545e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2546e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 2547e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesAdd (CommandInterpreter &interpreter) : 2548da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 2549da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules add", 2550da26bd203cbb104291b39891febf7481794f205fJim Ingham "Add a new module to the current target's modules.", 25511649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton "target modules add [<module>]"), 2552ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton m_option_group (interpreter), 2553ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton m_symbol_file (LLDB_OPT_SET_1, false, "symfile", 's', 0, eArgTypeFilename, "Fullpath to a stand alone debug symbols file for when debug symbols are not in the executable.") 2554e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 25551649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton m_option_group.Append (&m_uuid_option_group, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 2556ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton m_option_group.Append (&m_symbol_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 25571649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton m_option_group.Finalize(); 2558e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2559e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2560e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 2561e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesAdd () 2562e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2563e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 25641649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton 25651649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton virtual Options * 25661649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton GetOptions () 25671649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 25681649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton return &m_option_group; 25691649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 2570e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 257136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton virtual int 2572da26bd203cbb104291b39891febf7481794f205fJim Ingham HandleArgumentCompletion (Args &input, 2573da26bd203cbb104291b39891febf7481794f205fJim Ingham int &cursor_index, 2574da26bd203cbb104291b39891febf7481794f205fJim Ingham int &cursor_char_position, 2575da26bd203cbb104291b39891febf7481794f205fJim Ingham OptionElementVector &opt_element_vector, 2576da26bd203cbb104291b39891febf7481794f205fJim Ingham int match_start_point, 2577da26bd203cbb104291b39891febf7481794f205fJim Ingham int max_return_elements, 2578da26bd203cbb104291b39891febf7481794f205fJim Ingham bool &word_complete, 2579da26bd203cbb104291b39891febf7481794f205fJim Ingham StringList &matches) 2580da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2581da26bd203cbb104291b39891febf7481794f205fJim Ingham std::string completion_str (input.GetArgumentAtIndex(cursor_index)); 2582da26bd203cbb104291b39891febf7481794f205fJim Ingham completion_str.erase (cursor_char_position); 2583da26bd203cbb104291b39891febf7481794f205fJim Ingham 2584da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 2585da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandCompletions::eDiskFileCompletion, 2586da26bd203cbb104291b39891febf7481794f205fJim Ingham completion_str.c_str(), 2587da26bd203cbb104291b39891febf7481794f205fJim Ingham match_start_point, 2588da26bd203cbb104291b39891febf7481794f205fJim Ingham max_return_elements, 2589da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 2590da26bd203cbb104291b39891febf7481794f205fJim Ingham word_complete, 2591da26bd203cbb104291b39891febf7481794f205fJim Ingham matches); 2592da26bd203cbb104291b39891febf7481794f205fJim Ingham return matches.GetSize(); 2593da26bd203cbb104291b39891febf7481794f205fJim Ingham } 2594da26bd203cbb104291b39891febf7481794f205fJim Ingham 2595da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 25961649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton 25971649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton OptionGroupOptions m_option_group; 25981649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton OptionGroupUUID m_uuid_option_group; 2599ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton OptionGroupFile m_symbol_file; 26001649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton 26011649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton 2602e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual bool 2603da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& args, 2604e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandReturnObject &result) 2605e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2606e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 2607e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (target == NULL) 2608e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2609e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 2610e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2611e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2612e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2613e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2614e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2615e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan bool flush = false; 2616e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan 2617e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const size_t argc = args.GetArgumentCount(); 2618e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (argc == 0) 2619e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 26201649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton if (m_uuid_option_group.GetOptionValue ().OptionWasSet()) 26211649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 26221649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton // We are given a UUID only, go locate the file 26231649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton ModuleSpec module_spec; 26241649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton module_spec.GetUUID() = m_uuid_option_group.GetOptionValue ().GetCurrentValue(); 2625ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton if (m_symbol_file.GetOptionValue().OptionWasSet()) 2626ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton module_spec.GetSymbolFileSpec() = m_symbol_file.GetOptionValue().GetCurrentValue(); 26271649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton if (Symbols::DownloadObjectAndSymbolFile (module_spec)) 26281649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 26291649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton ModuleSP module_sp (target->GetSharedModule (module_spec)); 26301649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton if (module_sp) 26311649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 26321649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 26331649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton return true; 26341649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 26351649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton else 26361649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 2637e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan flush = true; 2638e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan 26391649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton StreamString strm; 26401649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton module_spec.GetUUID().Dump (&strm); 26411649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton if (module_spec.GetFileSpec()) 26421649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 26431649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton if (module_spec.GetSymbolFileSpec()) 26441649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 264597a19b21dacd9063bb5475812df7781777262198Greg Clayton result.AppendErrorWithFormat ("Unable to create the executable or symbol file with UUID %s with path %s and symbol file %s", 26461649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton strm.GetString().c_str(), 264797a19b21dacd9063bb5475812df7781777262198Greg Clayton module_spec.GetFileSpec().GetPath().c_str(), 264897a19b21dacd9063bb5475812df7781777262198Greg Clayton module_spec.GetSymbolFileSpec().GetPath().c_str()); 26491649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 26501649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton else 26511649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 265297a19b21dacd9063bb5475812df7781777262198Greg Clayton result.AppendErrorWithFormat ("Unable to create the executable or symbol file with UUID %s with path %s", 26531649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton strm.GetString().c_str(), 265497a19b21dacd9063bb5475812df7781777262198Greg Clayton module_spec.GetFileSpec().GetPath().c_str()); 26551649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 26561649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 26571649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton else 26581649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 26591649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton result.AppendErrorWithFormat ("Unable to create the executable or symbol file with UUID %s", 26601649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton strm.GetString().c_str()); 26611649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 26621649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton result.SetStatus (eReturnStatusFailed); 26631649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton return false; 26641649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 26651649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 26661649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton else 26671649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 26681649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton StreamString strm; 26691649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton module_spec.GetUUID().Dump (&strm); 26701649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton result.AppendErrorWithFormat ("Unable to locate the executable or symbol file with UUID %s", strm.GetString().c_str()); 26711649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton result.SetStatus (eReturnStatusFailed); 26721649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton return false; 26731649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 26741649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 26751649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton else 26761649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton { 26771649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton result.AppendError ("one or more executable image paths must be specified"); 26781649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton result.SetStatus (eReturnStatusFailed); 26791649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton return false; 26801649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton } 2681e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2682e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2683e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2684e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (size_t i=0; i<argc; ++i) 2685e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2686e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *path = args.GetArgumentAtIndex(i); 2687e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (path) 2688e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2689e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton FileSpec file_spec(path, true); 2690e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (file_spec.Exists()) 2691e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2692444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (file_spec); 26931649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton if (m_uuid_option_group.GetOptionValue ().OptionWasSet()) 26941649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton module_spec.GetUUID() = m_uuid_option_group.GetOptionValue ().GetCurrentValue(); 2695ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton if (m_symbol_file.GetOptionValue().OptionWasSet()) 2696ec9c2d2785c9c035e36c504618488a8764ecfddbGreg Clayton module_spec.GetSymbolFileSpec() = m_symbol_file.GetOptionValue().GetCurrentValue(); 26971649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton Error error; 26981649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton ModuleSP module_sp (target->GetSharedModule (module_spec, &error)); 2699e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (!module_sp) 2700e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 27011649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton const char *error_cstr = error.AsCString(); 27021649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton if (error_cstr) 27031649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton result.AppendError (error_cstr); 27041649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton else 27051649a72647bd3c90b5a6e89772b713f7ae79d932Greg Clayton result.AppendErrorWithFormat ("unsupported module: %s", path); 2706e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2707e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2708e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2709e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan else 2710e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan { 2711e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan flush = true; 2712e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan } 271336f6fb9a16d066f6f27f0538bfc4df5b3f9d403fJason Molenda result.SetStatus (eReturnStatusSuccessFinishResult); 2714e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2715e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2716e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2717e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton char resolved_path[PATH_MAX]; 2718e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2719e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (file_spec.GetPath (resolved_path, sizeof(resolved_path))) 2720e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2721e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (strcmp (resolved_path, path) != 0) 2722e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2723e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendErrorWithFormat ("invalid module path '%s' with resolved path '%s'\n", path, resolved_path); 2724e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 2725e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2726e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2727e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendErrorWithFormat ("invalid module path '%s'\n", path); 2728e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 2729e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2730e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2731e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2732e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2733e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan 2734e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan if (flush) 2735e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan { 2736e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan ProcessSP process = target->GetProcessSP(); 2737e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan if (process) 2738e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan process->Flush(); 2739e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan } 2740e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2741e3f0661ba5a523c4d5f31afce2bed47161aebde4Sean Callanan 2742e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return result.Succeeded(); 2743e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2744e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2745e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2746e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2747e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonclass CommandObjectTargetModulesLoad : public CommandObjectTargetModulesModuleAutoComplete 2748e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2749e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 2750e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesLoad (CommandInterpreter &interpreter) : 2751e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesModuleAutoComplete (interpreter, 2752e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules load", 2753e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "Set the load addresses for one or more sections in a target module.", 2754e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules load [--file <module> --uuid <uuid>] <sect-name> <address> [<sect-name> <address> ....]"), 2755e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_option_group (interpreter), 27569a91ef68c2650113da5488e09e9cb5f6aa88f6abSean Callanan m_file_option (LLDB_OPT_SET_1, false, "file", 'f', 0, eArgTypeFilename, "Fullpath or basename for module to load."), 2757e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_slide_option(LLDB_OPT_SET_1, false, "slide", 's', 0, eArgTypeOffset, "Set the load address for all sections to be the virtual address in the file plus the offset.", 0) 2758e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2759e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_option_group.Append (&m_uuid_option_group, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 2760e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_option_group.Append (&m_file_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 2761e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_option_group.Append (&m_slide_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 2762e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_option_group.Finalize(); 2763e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2764e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2765e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 2766e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesLoad () 2767e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2768e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2769e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2770da26bd203cbb104291b39891febf7481794f205fJim Ingham virtual Options * 2771da26bd203cbb104291b39891febf7481794f205fJim Ingham GetOptions () 2772da26bd203cbb104291b39891febf7481794f205fJim Ingham { 2773da26bd203cbb104291b39891febf7481794f205fJim Ingham return &m_option_group; 2774da26bd203cbb104291b39891febf7481794f205fJim Ingham } 2775da26bd203cbb104291b39891febf7481794f205fJim Ingham 2776da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 2777e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual bool 2778da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& args, 2779e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandReturnObject &result) 2780e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2781e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 2782e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (target == NULL) 2783e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2784e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 2785e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2786e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2787e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2788e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2789e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2790e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const size_t argc = args.GetArgumentCount(); 2791444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec; 2792444fe998bf707bd076a70c3a779db8575533695eGreg Clayton bool search_using_module_spec = false; 2793e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (m_file_option.GetOptionValue().OptionWasSet()) 2794444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 2795444fe998bf707bd076a70c3a779db8575533695eGreg Clayton search_using_module_spec = true; 2796444fe998bf707bd076a70c3a779db8575533695eGreg Clayton module_spec.GetFileSpec() = m_file_option.GetOptionValue().GetCurrentValue(); 2797444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 2798e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2799e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (m_uuid_option_group.GetOptionValue().OptionWasSet()) 2800444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 2801444fe998bf707bd076a70c3a779db8575533695eGreg Clayton search_using_module_spec = true; 2802444fe998bf707bd076a70c3a779db8575533695eGreg Clayton module_spec.GetUUID() = m_uuid_option_group.GetOptionValue().GetCurrentValue(); 2803444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 2804e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2805444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (search_using_module_spec) 2806e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2807e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2808e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ModuleList matching_modules; 2809444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const size_t num_matches = target->GetImages().FindModules (module_spec, matching_modules); 2810e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2811e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton char path[PATH_MAX]; 2812e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_matches == 1) 2813e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2814e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Module *module = matching_modules.GetModulePointerAtIndex(0); 2815e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (module) 2816e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2817e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ObjectFile *objfile = module->GetObjectFile(); 2818e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (objfile) 2819e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 28207940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *section_list = module->GetSectionList(); 2821e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (section_list) 2822e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 28239ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton bool changed = false; 2824e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (argc == 0) 2825e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2826e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (m_slide_option.GetOptionValue().OptionWasSet()) 2827e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 28289ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton const addr_t slide = m_slide_option.GetOptionValue().GetCurrentValue(); 28299ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton module->SetLoadAddress (*target, slide, changed); 2830e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2831e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2832e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2833e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("one or more section name + load address pair must be specified"); 2834e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2835e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2836e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2837e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2838e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2839e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2840e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (m_slide_option.GetOptionValue().OptionWasSet()) 2841e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2842e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("The \"--slide <offset>\" option can't be used in conjunction with setting section load addresses.\n"); 2843e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2844e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2845e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2846e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2847e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (size_t i=0; i<argc; i += 2) 2848e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2849e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *sect_name = args.GetArgumentAtIndex(i); 2850e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *load_addr_cstr = args.GetArgumentAtIndex(i+1); 2851e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (sect_name && load_addr_cstr) 2852e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2853e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ConstString const_sect_name(sect_name); 2854e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton bool success = false; 2855e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton addr_t load_addr = Args::StringToUInt64(load_addr_cstr, LLDB_INVALID_ADDRESS, 0, &success); 2856e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (success) 2857e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2858e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SectionSP section_sp (section_list->FindSectionByName(const_sect_name)); 2859e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (section_sp) 2860e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 28619ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton if (section_sp->IsThreadSpecific()) 28629ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton { 28639ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton result.AppendErrorWithFormat ("thread specific sections are not yet supported (section '%s')\n", sect_name); 28649ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton result.SetStatus (eReturnStatusFailed); 28659ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton break; 28669ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton } 28679ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton else 28689ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton { 2869545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton if (target->GetSectionLoadList().SetSectionLoadAddress (section_sp, load_addr)) 28709ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton changed = true; 28715f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat("section '%s' loaded at 0x%" PRIx64 "\n", sect_name, load_addr); 28729ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton } 2873e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2874e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2875e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2876e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendErrorWithFormat ("no section found that matches the section name '%s'\n", sect_name); 2877e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2878e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 2879e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2880e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2881e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2882e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2883e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendErrorWithFormat ("invalid load address string '%s'\n", load_addr_cstr); 2884e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2885e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 2886e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2887e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2888e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2889e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2890e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (sect_name) 2891e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("section names must be followed by a load address.\n"); 2892e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2893e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("one or more section name + load address pair must be specified.\n"); 2894e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2895e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 2896e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2897e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2898e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 28999ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton 29009ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton if (changed) 29011f71bcf1b4dd9993b7e93c2dc80ef2697c2f6ecaGreg Clayton { 29029ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton target->ModulesDidLoad (matching_modules); 29031f71bcf1b4dd9993b7e93c2dc80ef2697c2f6ecaGreg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 29041f71bcf1b4dd9993b7e93c2dc80ef2697c2f6ecaGreg Clayton if (process) 29051f71bcf1b4dd9993b7e93c2dc80ef2697c2f6ecaGreg Clayton process->Flush(); 29061f71bcf1b4dd9993b7e93c2dc80ef2697c2f6ecaGreg Clayton } 2907e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2908e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2909e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2910e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton module->GetFileSpec().GetPath (path, sizeof(path)); 2911e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendErrorWithFormat ("no sections in object file '%s'\n", path); 2912e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2913e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2914e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2915e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2916e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2917e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton module->GetFileSpec().GetPath (path, sizeof(path)); 2918e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendErrorWithFormat ("no object file for module '%s'\n", path); 2919e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2920e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2921e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2922e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2923e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 29246f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham FileSpec *module_spec_file = module_spec.GetFileSpecPtr(); 29256f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (module_spec_file) 29266f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham { 29276f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham module_spec_file->GetPath (path, sizeof(path)); 29286f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham result.AppendErrorWithFormat ("invalid module '%s'.\n", path); 29296f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham } 29306f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham else 29316f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham result.AppendError ("no module spec"); 2932e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2933e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2934e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2935e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2936e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 293742b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda std::string uuid_str; 2938444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 2939444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_spec.GetFileSpec()) 2940444fe998bf707bd076a70c3a779db8575533695eGreg Clayton module_spec.GetFileSpec().GetPath (path, sizeof(path)); 2941e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2942e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton path[0] = '\0'; 2943e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2944444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_spec.GetUUIDPtr()) 294542b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda uuid_str = module_spec.GetUUID().GetAsString(); 2946e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_matches > 1) 2947e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2948e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendErrorWithFormat ("multiple modules match%s%s%s%s:\n", 2949e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton path[0] ? " file=" : "", 2950e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton path, 295142b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda !uuid_str.empty() ? " uuid=" : "", 295242b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda uuid_str.c_str()); 2953e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (size_t i=0; i<num_matches; ++i) 2954e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2955e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (matching_modules.GetModulePointerAtIndex(i)->GetFileSpec().GetPath (path, sizeof(path))) 2956e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendMessageWithFormat("%s\n", path); 2957e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2958e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2959e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2960e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2961e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendErrorWithFormat ("no modules were found that match%s%s%s%s.\n", 2962e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton path[0] ? " file=" : "", 2963e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton path, 296442b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda !uuid_str.empty() ? " uuid=" : "", 296542b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda uuid_str.c_str()); 2966e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2967e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2968e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2969e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2970e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 2971e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2972e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("either the \"--file <module>\" or the \"--uuid <uuid>\" option must be specified.\n"); 2973e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 2974e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 2975e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2976e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2977e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return result.Succeeded(); 2978e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 2979e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2980e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton OptionGroupOptions m_option_group; 2981e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton OptionGroupUUID m_uuid_option_group; 2982e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton OptionGroupFile m_file_option; 2983e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton OptionGroupUInt64 m_slide_option; 2984e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 2985e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2986e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2987e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// List images with associated information 2988e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 2989da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesList : public CommandObjectParsed 2990e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 2991e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 2992e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2993e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton class CommandOptions : public Options 2994e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 2995e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton public: 2996e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 2997e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandOptions (CommandInterpreter &interpreter) : 2998899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Options(interpreter), 29996bdea829b768b23209dae50c8cc801cef396dceaJim Ingham m_format_array(), 300097c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_use_global_module_list (false), 30016bdea829b768b23209dae50c8cc801cef396dceaJim Ingham m_module_addr (LLDB_INVALID_ADDRESS) 3002e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3003e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3004e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3005e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 3006e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandOptions () 3007e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3008e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3009e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3010e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual Error 3011e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 3012e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 301349d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton Error error; 301449d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton 30156475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 3016899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (short_option == 'g') 3017899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 3018899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton m_use_global_module_list = true; 3019899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 30206bdea829b768b23209dae50c8cc801cef396dceaJim Ingham else if (short_option == 'a') 30216bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3022d86cf81b39a562bf2400bd9af83ef112adcd93bdJim Ingham ExecutionContext exe_ctx (m_interpreter.GetExecutionContext()); 3023d86cf81b39a562bf2400bd9af83ef112adcd93bdJim Ingham m_module_addr = Args::StringToAddress(&exe_ctx, option_arg, LLDB_INVALID_ADDRESS, &error); 30246bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 3025899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton else 3026899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 302736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton unsigned long width = 0; 3028899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (option_arg) 3029899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton width = strtoul (option_arg, NULL, 0); 3030899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton m_format_array.push_back(std::make_pair(short_option, width)); 3031899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 3032e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return error; 3033e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3034e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3035e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton void 3036e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton OptionParsingStarting () 3037e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3038e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_format_array.clear(); 3039899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton m_use_global_module_list = false; 30406bdea829b768b23209dae50c8cc801cef396dceaJim Ingham m_module_addr = LLDB_INVALID_ADDRESS; 3041e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3042e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3043e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const OptionDefinition* 3044e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton GetDefinitions () 3045e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3046e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return g_option_table; 3047e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3048e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3049e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Options table: Required for subclasses of Options. 3050e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3051e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton static OptionDefinition g_option_table[]; 3052e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3053e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Instance variables to hold the values for command options. 3054e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton typedef std::vector< std::pair<char, uint32_t> > FormatWidthCollection; 3055e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton FormatWidthCollection m_format_array; 3056899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton bool m_use_global_module_list; 30576bdea829b768b23209dae50c8cc801cef396dceaJim Ingham lldb::addr_t m_module_addr; 3058e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton }; 3059e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3060e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesList (CommandInterpreter &interpreter) : 3061da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 3062da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules list", 3063da26bd203cbb104291b39891febf7481794f205fJim Ingham "List current executable and dependent shared library images.", 3064da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules list [<cmd-options>]"), 3065e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options (interpreter) 3066e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3067e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3068e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3069e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 3070e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesList () 3071e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3072e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3073e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3074e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 3075e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Options * 3076e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton GetOptions () 3077e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3078e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return &m_options; 3079e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3080e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3081da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 3082e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual bool 3083da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 3084e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandReturnObject &result) 3085e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3086e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 3087153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton const bool use_global_module_list = m_options.m_use_global_module_list; 308811fb921b24bf5bf9e43069dba881d13e665f2a80Greg Clayton // Define a local module list here to ensure it lives longer than any "locker" 308911fb921b24bf5bf9e43069dba881d13e665f2a80Greg Clayton // object which might lock its contents below (through the "module_list_ptr" 309011fb921b24bf5bf9e43069dba881d13e665f2a80Greg Clayton // variable). 309111fb921b24bf5bf9e43069dba881d13e665f2a80Greg Clayton ModuleList module_list; 3092153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton if (target == NULL && use_global_module_list == false) 3093e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3094e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 3095e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 3096e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 3097e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3098e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 3099e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3100153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton if (target) 3101153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { 3102153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize(); 3103153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton result.GetOutputStream().SetAddressByteSize(addr_byte_size); 3104153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton result.GetErrorStream().SetAddressByteSize(addr_byte_size); 3105153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton } 3106e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Dump all sections for all modules images 31076bdea829b768b23209dae50c8cc801cef396dceaJim Ingham Stream &strm = result.GetOutputStream(); 31086bdea829b768b23209dae50c8cc801cef396dceaJim Ingham 31096bdea829b768b23209dae50c8cc801cef396dceaJim Ingham if (m_options.m_module_addr != LLDB_INVALID_ADDRESS) 31106bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 31116bdea829b768b23209dae50c8cc801cef396dceaJim Ingham if (target) 31126bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 31136bdea829b768b23209dae50c8cc801cef396dceaJim Ingham Address module_address; 31146bdea829b768b23209dae50c8cc801cef396dceaJim Ingham if (module_address.SetLoadAddress(m_options.m_module_addr, target)) 31156bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 31163508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP module_sp (module_address.GetModule()); 31173508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 31186bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 311936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton PrintModule (target, module_sp.get(), 0, strm); 31206bdea829b768b23209dae50c8cc801cef396dceaJim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 31216bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 31226bdea829b768b23209dae50c8cc801cef396dceaJim Ingham else 31236bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3124bb04be12f8762500c1c308b0d1b93fe8f69c667fJim Ingham result.AppendErrorWithFormat ("Couldn't find module matching address: 0x%" PRIx64 ".", m_options.m_module_addr); 31256bdea829b768b23209dae50c8cc801cef396dceaJim Ingham result.SetStatus (eReturnStatusFailed); 31266bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 31276bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 31286bdea829b768b23209dae50c8cc801cef396dceaJim Ingham else 31296bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3130bb04be12f8762500c1c308b0d1b93fe8f69c667fJim Ingham result.AppendErrorWithFormat ("Couldn't find module containing address: 0x%" PRIx64 ".", m_options.m_module_addr); 31316bdea829b768b23209dae50c8cc801cef396dceaJim Ingham result.SetStatus (eReturnStatusFailed); 31326bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 31336bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 31346bdea829b768b23209dae50c8cc801cef396dceaJim Ingham else 31356bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 31366bdea829b768b23209dae50c8cc801cef396dceaJim Ingham result.AppendError ("Can only look up modules by address with a valid target."); 31376bdea829b768b23209dae50c8cc801cef396dceaJim Ingham result.SetStatus (eReturnStatusFailed); 31386bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 31396bdea829b768b23209dae50c8cc801cef396dceaJim Ingham return result.Succeeded(); 31406bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 31416bdea829b768b23209dae50c8cc801cef396dceaJim Ingham 314236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_modules = 0; 31439336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham Mutex::Locker locker; // This locker will be locked on the mutex in module_list_ptr if it is non-NULL. 31449336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham // Otherwise it will lock the AllocationModuleCollectionMutex when accessing 31459336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham // the global module list directly. 3146146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata const ModuleList *module_list_ptr = NULL; 31472ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton const size_t argc = command.GetArgumentCount(); 31482ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (argc == 0) 3149899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 31502ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (use_global_module_list) 31512ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { 31522ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton locker.Lock (Module::GetAllocationModuleCollectionMutex()); 31532ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton num_modules = Module::GetNumberAllocatedModules(); 31542ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton } 31552ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton else 31562ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { 31572ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton module_list_ptr = &target->GetImages(); 31582ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton } 3159899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 3160899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton else 31612ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { 31622ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton for (size_t i=0; i<argc; ++i) 31632ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { 31642ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton // Dump specified images (by basename or fullpath) 31652ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton const char *arg_cstr = command.GetArgumentAtIndex(i); 31662ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, use_global_module_list); 31672ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (num_matches == 0) 31682ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { 31692ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (argc == 1) 31702ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { 31712ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton result.AppendErrorWithFormat ("no modules found that match '%s'", arg_cstr); 31722ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton result.SetStatus (eReturnStatusFailed); 31732ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton return false; 31742ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton } 31752ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton } 31762ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton } 31772ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton 31782ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton module_list_ptr = &module_list; 31792ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton } 31809336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham 31819336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham if (module_list_ptr != NULL) 31829336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham { 31839336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham locker.Lock(module_list_ptr->GetMutex()); 31849336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham num_modules = module_list_ptr->GetSize(); 31859336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham } 3186899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 3187e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_modules > 0) 31886bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3189e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (uint32_t image_idx = 0; image_idx<num_modules; ++image_idx) 3190e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3191153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton ModuleSP module_sp; 3192899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Module *module; 31932ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (module_list_ptr) 3194899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 31959336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham module_sp = module_list_ptr->GetModuleAtIndexUnlocked(image_idx); 31962ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton module = module_sp.get(); 3197899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 3198899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton else 3199899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 32002ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton module = Module::GetAllocatedModuleAtIndex(image_idx); 32012ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton module_sp = module->shared_from_this(); 3202899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 32036bdea829b768b23209dae50c8cc801cef396dceaJim Ingham 320436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t indent = strm.Printf("[%3u] ", image_idx); 320536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton PrintModule (target, module, indent, strm); 3206153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton 3207e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3208e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 3209e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3210e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 3211e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 32122ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (argc) 32132ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { 32142ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (use_global_module_list) 32152ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton result.AppendError ("the global module list has no matching modules"); 32162ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton else 32172ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton result.AppendError ("the target has no matching modules"); 32182ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton } 3219153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton else 32202ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { 32212ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (use_global_module_list) 32222ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton result.AppendError ("the global module list is empty"); 32232ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton else 32242ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton result.AppendError ("the target has no associated executable images"); 32252ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton } 3226e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 3227e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 3228e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3229e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3230e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return result.Succeeded(); 3231e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 32326bdea829b768b23209dae50c8cc801cef396dceaJim Ingham 32336bdea829b768b23209dae50c8cc801cef396dceaJim Ingham void 323436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton PrintModule (Target *target, Module *module, int indent, Stream &strm) 32356bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 32366bdea829b768b23209dae50c8cc801cef396dceaJim Ingham 32376f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (module == NULL) 32386f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham { 32396f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham strm.PutCString("Null module"); 32406f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham return; 32416f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham } 32426f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham 32436bdea829b768b23209dae50c8cc801cef396dceaJim Ingham bool dump_object_name = false; 32446bdea829b768b23209dae50c8cc801cef396dceaJim Ingham if (m_options.m_format_array.empty()) 32456bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3246b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_options.m_format_array.push_back(std::make_pair('u', 0)); 3247b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_options.m_format_array.push_back(std::make_pair('h', 0)); 3248b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_options.m_format_array.push_back(std::make_pair('f', 0)); 3249b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_options.m_format_array.push_back(std::make_pair('S', 0)); 3250b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3251b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const size_t num_entries = m_options.m_format_array.size(); 3252b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton bool print_space = false; 3253b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton for (size_t i=0; i<num_entries; ++i) 3254b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3255b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (print_space) 3256b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton strm.PutChar(' '); 3257b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton print_space = true; 3258b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const char format_char = m_options.m_format_array[i].first; 3259b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton uint32_t width = m_options.m_format_array[i].second; 3260b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton switch (format_char) 32616bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3262b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'A': 3263b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DumpModuleArchitecture (strm, module, false, width); 3264b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3265b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3266b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 't': 3267b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DumpModuleArchitecture (strm, module, true, width); 3268b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3269b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3270b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'f': 3271b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DumpFullpath (strm, &module->GetFileSpec(), width); 3272b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton dump_object_name = true; 3273b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3274b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3275b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'd': 3276b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DumpDirectory (strm, &module->GetFileSpec(), width); 3277b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3278b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3279b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'b': 3280b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DumpBasename (strm, &module->GetFileSpec(), width); 3281b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton dump_object_name = true; 3282b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3283b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3284b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'h': 3285b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'o': 3286b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Image header address 3287b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3288b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton uint32_t addr_nibble_width = target ? (target->GetArchitecture().GetAddressByteSize() * 2) : 16; 3289b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3290b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ObjectFile *objfile = module->GetObjectFile (); 3291b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (objfile) 32926bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3293b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Address header_addr(objfile->GetHeaderAddress()); 3294b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (header_addr.IsValid()) 32956bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3296b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (target && !target->GetSectionLoadList().IsEmpty()) 3297b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3298b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton lldb::addr_t header_load_addr = header_addr.GetLoadAddress (target); 3299b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (header_load_addr == LLDB_INVALID_ADDRESS) 3300b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3301b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton header_addr.Dump (&strm, target, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleFileAddress); 3302b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3303b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton else 3304b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3305b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (format_char == 'o') 3306b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3307b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Show the offset of slide for the image 33085f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea strm.Printf ("0x%*.*" PRIx64, addr_nibble_width, addr_nibble_width, header_load_addr - header_addr.GetFileAddress()); 3309b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3310b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton else 3311b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3312b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Show the load address of the image 33135f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea strm.Printf ("0x%*.*" PRIx64, addr_nibble_width, addr_nibble_width, header_load_addr); 3314b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3315b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3316b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3317b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3318b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // The address was valid, but the image isn't loaded, output the address in an appropriate format 3319b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton header_addr.Dump (&strm, target, Address::DumpStyleFileAddress); 3320b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 33216bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 33226bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 3323b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton strm.Printf ("%*s", addr_nibble_width + 2, ""); 3324b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3325b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3326b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'r': 3327b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 332836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t ref_count = 0; 3329b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ModuleSP module_sp (module->shared_from_this()); 3330b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (module_sp) 3331b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3332b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Take one away to make sure we don't count our local "module_sp" 3333b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ref_count = module_sp.use_count() - 1; 3334b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3335b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (width) 333636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("{%*zu}", width, ref_count); 3337b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton else 333836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("{%zu}", ref_count); 3339b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3340b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 33416bdea829b768b23209dae50c8cc801cef396dceaJim Ingham 3342b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 's': 3343b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'S': 3344b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3345b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton SymbolVendor *symbol_vendor = module->GetSymbolVendor(); 3346b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (symbol_vendor) 33476bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3348b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton SymbolFile *symbol_file = symbol_vendor->GetSymbolFile(); 3349b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (symbol_file) 33506bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3351b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (format_char == 'S') 33526bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { 3353b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton FileSpec &symfile_spec = symbol_file->GetObjectFile()->GetFileSpec(); 3354b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Dump symbol file only if different from module file 3355b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (!symfile_spec || symfile_spec == module->GetFileSpec()) 3356b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3357b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton print_space = false; 3358b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3359b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3360b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Add a newline and indent past the index 3361b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton strm.Printf ("\n%*s", indent, ""); 33626bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 3363b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DumpFullpath (strm, &symbol_file->GetObjectFile()->GetFileSpec(), width); 3364b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton dump_object_name = true; 3365b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 33666bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 33676bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 3368b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton strm.Printf("%.*s", width, "<NONE>"); 3369b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3370b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3371b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3372b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'm': 3373b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton module->GetModificationTime().Dump(&strm, width); 3374b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3375b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3376b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'p': 3377b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton strm.Printf("%p", module); 3378b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3379b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3380b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton case 'u': 3381b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DumpModuleUUID(strm, module); 3382b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 3383b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3384b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton default: 3385b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton break; 33866bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 3387b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 3388b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 3389b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (dump_object_name) 3390b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 3391b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const char *object_name = module->GetObjectName().GetCString(); 3392b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (object_name) 3393b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton strm.Printf ("(%s)", object_name); 33946bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 33956bdea829b768b23209dae50c8cc801cef396dceaJim Ingham strm.EOL(); 33966bdea829b768b23209dae50c8cc801cef396dceaJim Ingham } 33976bdea829b768b23209dae50c8cc801cef396dceaJim Ingham 3398e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandOptions m_options; 3399e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 3400e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3401e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonOptionDefinition 3402e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonCommandObjectTargetModulesList::CommandOptions::g_option_table[] = 3403e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 34044968ad817597891cc02c195d4b3e7c3cde1fc391Enrico Granata { LLDB_OPT_SET_1, false, "address", 'a', required_argument, NULL, 0, eArgTypeAddressOrExpression, "Display the image at this address."}, 34056bdea829b768b23209dae50c8cc801cef396dceaJim Ingham { LLDB_OPT_SET_1, false, "arch", 'A', optional_argument, NULL, 0, eArgTypeWidth, "Display the architecture when listing images."}, 3406e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { LLDB_OPT_SET_1, false, "triple", 't', optional_argument, NULL, 0, eArgTypeWidth, "Display the triple when listing images."}, 3407b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { LLDB_OPT_SET_1, false, "header", 'h', no_argument, NULL, 0, eArgTypeNone, "Display the image header address as a load address if debugging, a file address otherwise."}, 3408b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { LLDB_OPT_SET_1, false, "offset", 'o', no_argument, NULL, 0, eArgTypeNone, "Display the image header address offset from the header file address (the slide amount)."}, 3409e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { LLDB_OPT_SET_1, false, "uuid", 'u', no_argument, NULL, 0, eArgTypeNone, "Display the UUID when listing images."}, 3410e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { LLDB_OPT_SET_1, false, "fullpath", 'f', optional_argument, NULL, 0, eArgTypeWidth, "Display the fullpath to the image object file."}, 3411e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { LLDB_OPT_SET_1, false, "directory", 'd', optional_argument, NULL, 0, eArgTypeWidth, "Display the directory with optional width for the image object file."}, 3412e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { LLDB_OPT_SET_1, false, "basename", 'b', optional_argument, NULL, 0, eArgTypeWidth, "Display the basename with optional width for the image object file."}, 3413e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { LLDB_OPT_SET_1, false, "symfile", 's', optional_argument, NULL, 0, eArgTypeWidth, "Display the fullpath to the image symbol file with optional width."}, 3414b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { LLDB_OPT_SET_1, false, "symfile-unique", 'S', optional_argument, NULL, 0, eArgTypeWidth, "Display the symbol file with optional width only if it is different from the executable object file."}, 3415153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { LLDB_OPT_SET_1, false, "mod-time", 'm', optional_argument, NULL, 0, eArgTypeWidth, "Display the modification time with optional width of the module."}, 3416153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { LLDB_OPT_SET_1, false, "ref-count", 'r', optional_argument, NULL, 0, eArgTypeWidth, "Display the reference count if the module is still in the shared module cache."}, 3417153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton { LLDB_OPT_SET_1, false, "pointer", 'p', optional_argument, NULL, 0, eArgTypeNone, "Display the module pointer."}, 3418899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { LLDB_OPT_SET_1, false, "global", 'g', no_argument, NULL, 0, eArgTypeNone, "Display the modules from the global module list, not just the current target."}, 3419e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 3420e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 3421e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 34225b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda#pragma mark CommandObjectTargetModulesShowUnwind 3423e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 34245b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda//---------------------------------------------------------------------- 34255b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda// Lookup unwind information in images 34265b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda//---------------------------------------------------------------------- 34275b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34285b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molendaclass CommandObjectTargetModulesShowUnwind : public CommandObjectParsed 34295b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda{ 34305b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molendapublic: 34315b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34325b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda enum 34335b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 34345b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda eLookupTypeInvalid = -1, 34355b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda eLookupTypeAddress = 0, 34365b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda eLookupTypeSymbol, 34375b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda eLookupTypeFunction, 34385b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda eLookupTypeFunctionOrSymbol, 34395b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda kNumLookupTypes 34405b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda }; 34415b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34425b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda class CommandOptions : public Options 34435b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 34445b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda public: 34455b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34465b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda CommandOptions (CommandInterpreter &interpreter) : 3447ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Options(interpreter), 3448ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_type(eLookupTypeInvalid), 3449ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_str(), 3450ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_addr(LLDB_INVALID_ADDRESS) 34515b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 34525b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 34535b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34545b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda virtual 34555b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda ~CommandOptions () 34565b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 34575b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 34585b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34595b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda virtual Error 34605b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda SetOptionValue (uint32_t option_idx, const char *option_arg) 34615b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 34625b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda Error error; 34635b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34646475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 34655b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34665b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda switch (short_option) 34675b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 34685b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda case 'a': 34695a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { 34705a559060fbba9ee1404881d9764953639ac71f37Jason Molenda ExecutionContext exe_ctx (m_interpreter.GetExecutionContext()); 34715b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda m_type = eLookupTypeAddress; 34725a559060fbba9ee1404881d9764953639ac71f37Jason Molenda m_addr = Args::StringToAddress(&exe_ctx, option_arg, LLDB_INVALID_ADDRESS, &error); 34735b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda if (m_addr == LLDB_INVALID_ADDRESS) 34745b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda error.SetErrorStringWithFormat ("invalid address string '%s'", option_arg); 34755b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda break; 34765a559060fbba9ee1404881d9764953639ac71f37Jason Molenda } 34775b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34785b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda case 'n': 34795a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { 34805b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda m_str = option_arg; 34815b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda m_type = eLookupTypeFunctionOrSymbol; 34825b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda break; 34835a559060fbba9ee1404881d9764953639ac71f37Jason Molenda } 34845b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 34855b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34865b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda return error; 34875b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 34885b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34895b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda void 34905b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda OptionParsingStarting () 34915b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 34925b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda m_type = eLookupTypeInvalid; 34935b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda m_str.clear(); 34945b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda m_addr = LLDB_INVALID_ADDRESS; 34955b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 34965b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 34975b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda const OptionDefinition* 34985b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda GetDefinitions () 34995b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35005b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda return g_option_table; 35015b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 35025b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35035b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda // Options table: Required for subclasses of Options. 35045b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35055b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda static OptionDefinition g_option_table[]; 35065b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35075b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda // Instance variables to hold the values for command options. 35085b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35095b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda int m_type; // Should be a eLookupTypeXXX enum after parsing options 35105b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda std::string m_str; // Holds name lookup 35115b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda lldb::addr_t m_addr; // Holds the address to lookup 35125b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda }; 35135b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35145b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda CommandObjectTargetModulesShowUnwind (CommandInterpreter &interpreter) : 35155b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda CommandObjectParsed (interpreter, 35165b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda "target modules show-unwind", 35175b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda "Show synthesized unwind instructions for a function.", 3518ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton NULL, 3519ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresTarget | 3520ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | 3521ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 3522ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ), 35235b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda m_options (interpreter) 35245b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35255b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 35265b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35275b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda virtual 35285b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda ~CommandObjectTargetModulesShowUnwind () 35295b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35305b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 35315b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35325b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda virtual 35335b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda Options * 35345b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda GetOptions () 35355b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35365b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda return &m_options; 35375b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 35385b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35395b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molendaprotected: 35405b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda bool 35415b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda DoExecute (Args& command, 35425b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda CommandReturnObject &result) 35435b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 3544ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 3545ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 35465b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda ABI *abi = NULL; 35475b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda if (process) 35485b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda abi = process->GetABI().get(); 35495b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35505b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda if (process == NULL) 35515b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35525b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda result.AppendError ("You must have a process running to use this command."); 35535b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda result.SetStatus (eReturnStatusFailed); 35545b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda return false; 35555b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 35565b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35575b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda ThreadList threads(process->GetThreadList()); 35585b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda if (threads.GetSize() == 0) 35595b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35605b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda result.AppendError ("The process must be paused to use this command."); 35615b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda result.SetStatus (eReturnStatusFailed); 35625b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda return false; 35635b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 35645b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35655b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda ThreadSP thread(threads.GetThreadAtIndex(0)); 35665b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda if (thread.get() == NULL) 35675b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35685b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda result.AppendError ("The process must be paused to use this command."); 35695b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda result.SetStatus (eReturnStatusFailed); 35705b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda return false; 35715b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 35725b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35735a559060fbba9ee1404881d9764953639ac71f37Jason Molenda SymbolContextList sc_list; 35745a559060fbba9ee1404881d9764953639ac71f37Jason Molenda 35755b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda if (m_options.m_type == eLookupTypeFunctionOrSymbol) 35765b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35775b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda ConstString function_name (m_options.m_str.c_str()); 35785a559060fbba9ee1404881d9764953639ac71f37Jason Molenda target->GetImages().FindFunctions (function_name, eFunctionNameTypeAuto, true, false, true, sc_list); 35795a559060fbba9ee1404881d9764953639ac71f37Jason Molenda } 35805a559060fbba9ee1404881d9764953639ac71f37Jason Molenda else if (m_options.m_type == eLookupTypeAddress && target) 35815a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { 35825a559060fbba9ee1404881d9764953639ac71f37Jason Molenda Address addr; 35835a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (target->GetSectionLoadList().ResolveLoadAddress (m_options.m_addr, addr)) 35845b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35855b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda SymbolContext sc; 35865a559060fbba9ee1404881d9764953639ac71f37Jason Molenda ModuleSP module_sp (addr.GetModule()); 35875a559060fbba9ee1404881d9764953639ac71f37Jason Molenda module_sp->ResolveSymbolContextForAddress (addr, eSymbolContextEverything, sc); 35885a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (sc.function || sc.symbol) 35895b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 35905a559060fbba9ee1404881d9764953639ac71f37Jason Molenda sc_list.Append(sc); 35915b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 35925a559060fbba9ee1404881d9764953639ac71f37Jason Molenda } 35935a559060fbba9ee1404881d9764953639ac71f37Jason Molenda } 35945b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 35955a559060fbba9ee1404881d9764953639ac71f37Jason Molenda size_t num_matches = sc_list.GetSize(); 35965a559060fbba9ee1404881d9764953639ac71f37Jason Molenda for (uint32_t idx = 0; idx < num_matches; idx++) 35975a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { 35985a559060fbba9ee1404881d9764953639ac71f37Jason Molenda SymbolContext sc; 35995a559060fbba9ee1404881d9764953639ac71f37Jason Molenda sc_list.GetContextAtIndex(idx, sc); 36005a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (sc.symbol == NULL && sc.function == NULL) 36015a559060fbba9ee1404881d9764953639ac71f37Jason Molenda continue; 36025a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (sc.module_sp.get() == NULL || sc.module_sp->GetObjectFile() == NULL) 36035a559060fbba9ee1404881d9764953639ac71f37Jason Molenda continue; 36045a559060fbba9ee1404881d9764953639ac71f37Jason Molenda AddressRange range; 36055a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (!sc.GetAddressRange (eSymbolContextFunction | eSymbolContextSymbol, 0, false, range)) 36065a559060fbba9ee1404881d9764953639ac71f37Jason Molenda continue; 36075a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (!range.GetBaseAddress().IsValid()) 36085a559060fbba9ee1404881d9764953639ac71f37Jason Molenda continue; 36095a559060fbba9ee1404881d9764953639ac71f37Jason Molenda ConstString funcname(sc.GetFunctionName()); 36105a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (funcname.IsEmpty()) 36115a559060fbba9ee1404881d9764953639ac71f37Jason Molenda continue; 36125a559060fbba9ee1404881d9764953639ac71f37Jason Molenda addr_t start_addr = range.GetBaseAddress().GetLoadAddress(target); 36135a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (abi) 36145a559060fbba9ee1404881d9764953639ac71f37Jason Molenda start_addr = abi->FixCodeAddress(start_addr); 36155a559060fbba9ee1404881d9764953639ac71f37Jason Molenda 36165a559060fbba9ee1404881d9764953639ac71f37Jason Molenda FuncUnwindersSP func_unwinders_sp (sc.module_sp->GetObjectFile()->GetUnwindTable().GetUncachedFuncUnwindersContainingAddress(start_addr, sc)); 36175a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (func_unwinders_sp.get() == NULL) 36185a559060fbba9ee1404881d9764953639ac71f37Jason Molenda continue; 36195a559060fbba9ee1404881d9764953639ac71f37Jason Molenda 36205a559060fbba9ee1404881d9764953639ac71f37Jason Molenda Address first_non_prologue_insn (func_unwinders_sp->GetFirstNonPrologueInsn(*target)); 36215a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (first_non_prologue_insn.IsValid()) 36225a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { 36235a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf("First non-prologue instruction is at address 0x%" PRIx64 " or offset %" PRId64 " into the function.\n", first_non_prologue_insn.GetLoadAddress(target), first_non_prologue_insn.GetLoadAddress(target) - start_addr); 36245a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf ("\n"); 36255a559060fbba9ee1404881d9764953639ac71f37Jason Molenda } 36265b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 36275a559060fbba9ee1404881d9764953639ac71f37Jason Molenda UnwindPlanSP non_callsite_unwind_plan = func_unwinders_sp->GetUnwindPlanAtNonCallSite(*thread.get()); 36285a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (non_callsite_unwind_plan.get()) 36295a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { 36305a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf("Asynchronous (not restricted to call-sites) UnwindPlan for %s`%s (start addr 0x%" PRIx64 "):\n", sc.module_sp->GetPlatformFileSpec().GetFilename().AsCString(), funcname.AsCString(), start_addr); 36315a559060fbba9ee1404881d9764953639ac71f37Jason Molenda non_callsite_unwind_plan->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS); 36325a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf ("\n"); 36335a559060fbba9ee1404881d9764953639ac71f37Jason Molenda } 36345b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 36355a559060fbba9ee1404881d9764953639ac71f37Jason Molenda UnwindPlanSP callsite_unwind_plan = func_unwinders_sp->GetUnwindPlanAtCallSite(-1); 36365a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (callsite_unwind_plan.get()) 36375a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { 36385a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf("Synchronous (restricted to call-sites) UnwindPlan for %s`%s (start addr 0x%" PRIx64 "):\n", sc.module_sp->GetPlatformFileSpec().GetFilename().AsCString(), funcname.AsCString(), start_addr); 36395a559060fbba9ee1404881d9764953639ac71f37Jason Molenda callsite_unwind_plan->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS); 36405a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf ("\n"); 36415a559060fbba9ee1404881d9764953639ac71f37Jason Molenda } 36425b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 36435a559060fbba9ee1404881d9764953639ac71f37Jason Molenda UnwindPlanSP arch_default_unwind_plan = func_unwinders_sp->GetUnwindPlanArchitectureDefault(*thread.get()); 36445a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (arch_default_unwind_plan.get()) 36455a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { 36465a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf("Architecture default UnwindPlan for %s`%s (start addr 0x%" PRIx64 "):\n", sc.module_sp->GetPlatformFileSpec().GetFilename().AsCString(), funcname.AsCString(), start_addr); 36475a559060fbba9ee1404881d9764953639ac71f37Jason Molenda arch_default_unwind_plan->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS); 36485a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf ("\n"); 36495a559060fbba9ee1404881d9764953639ac71f37Jason Molenda } 36505b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 36515a559060fbba9ee1404881d9764953639ac71f37Jason Molenda UnwindPlanSP fast_unwind_plan = func_unwinders_sp->GetUnwindPlanFastUnwind(*thread.get()); 36525a559060fbba9ee1404881d9764953639ac71f37Jason Molenda if (fast_unwind_plan.get()) 36535a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { 36545a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf("Fast UnwindPlan for %s`%s (start addr 0x%" PRIx64 "):\n", sc.module_sp->GetPlatformFileSpec().GetFilename().AsCString(), funcname.AsCString(), start_addr); 36555a559060fbba9ee1404881d9764953639ac71f37Jason Molenda fast_unwind_plan->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS); 36565b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda result.GetOutputStream().Printf ("\n"); 36575b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 36585a559060fbba9ee1404881d9764953639ac71f37Jason Molenda 36595a559060fbba9ee1404881d9764953639ac71f37Jason Molenda 36605a559060fbba9ee1404881d9764953639ac71f37Jason Molenda result.GetOutputStream().Printf ("\n"); 36615b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 36625b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda return result.Succeeded(); 36635b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda } 36645b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 36655b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda CommandOptions m_options; 36665b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda}; 36675b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda 36685b0afcceea3807fa8f518e0138f0a8043dfc3315Jason MolendaOptionDefinition 36695b0afcceea3807fa8f518e0138f0a8043dfc3315Jason MolendaCommandObjectTargetModulesShowUnwind::CommandOptions::g_option_table[] = 36705b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda{ 36715a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { LLDB_OPT_SET_1, false, "name", 'n', required_argument, NULL, 0, eArgTypeFunctionName, "Show unwind instructions for a function or symbol name."}, 36725a559060fbba9ee1404881d9764953639ac71f37Jason Molenda { LLDB_OPT_SET_2, false, "address", 'a', required_argument, NULL, 0, eArgTypeAddressOrExpression, "Show unwind instructions for a function or symbol containing an address"}, 36735b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 36745b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda}; 3675e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3676e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 3677e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// Lookup information in images 3678e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//---------------------------------------------------------------------- 3679da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetModulesLookup : public CommandObjectParsed 3680e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 3681e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 3682e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3683e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton enum 3684e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3685e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eLookupTypeInvalid = -1, 3686e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eLookupTypeAddress = 0, 3687e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eLookupTypeSymbol, 3688e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eLookupTypeFileLine, // Line is optional 3689e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eLookupTypeFunction, 36902ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton eLookupTypeFunctionOrSymbol, 3691e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eLookupTypeType, 3692e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton kNumLookupTypes 3693e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton }; 3694e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3695e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton class CommandOptions : public Options 3696e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3697e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton public: 3698e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3699e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandOptions (CommandInterpreter &interpreter) : 3700e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Options(interpreter) 3701e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3702e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton OptionParsingStarting(); 3703e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3704e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3705e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 3706e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandOptions () 3707e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3708e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3709e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3710e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual Error 3711e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 3712e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3713e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Error error; 3714e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 37156475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 3716e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3717e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton switch (short_option) 3718e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3719e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case 'a': 3720d86cf81b39a562bf2400bd9af83ef112adcd93bdJim Ingham { 3721d86cf81b39a562bf2400bd9af83ef112adcd93bdJim Ingham m_type = eLookupTypeAddress; 3722d86cf81b39a562bf2400bd9af83ef112adcd93bdJim Ingham ExecutionContext exe_ctx (m_interpreter.GetExecutionContext()); 3723d86cf81b39a562bf2400bd9af83ef112adcd93bdJim Ingham m_addr = Args::StringToAddress(&exe_ctx, option_arg, LLDB_INVALID_ADDRESS, &error); 3724d86cf81b39a562bf2400bd9af83ef112adcd93bdJim Ingham } 3725e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3726e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3727e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case 'o': 3728e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_offset = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS); 3729e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (m_offset == LLDB_INVALID_ADDRESS) 37309c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid offset string '%s'", option_arg); 3731e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3732e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3733e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case 's': 3734e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_str = option_arg; 3735e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_type = eLookupTypeSymbol; 3736e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3737e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3738e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case 'f': 3739e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_file.SetFile (option_arg, false); 3740e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_type = eLookupTypeFileLine; 3741e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3742e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3743e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case 'i': 37449ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan m_include_inlines = false; 3745e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3746e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3747e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case 'l': 3748e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_line_number = Args::StringToUInt32(option_arg, UINT32_MAX); 3749e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (m_line_number == UINT32_MAX) 37509c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid line number string '%s'", option_arg); 3751e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else if (m_line_number == 0) 37529c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorString ("zero is an invalid line number"); 3753e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_type = eLookupTypeFileLine; 3754e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3755e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 37562ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton case 'F': 3757e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_str = option_arg; 3758e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_type = eLookupTypeFunction; 3759e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 37602ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton 37612ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton case 'n': 37622ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton m_str = option_arg; 37632ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton m_type = eLookupTypeFunctionOrSymbol; 37642ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton break; 37652ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton 3766e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case 't': 3767e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_str = option_arg; 3768e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_type = eLookupTypeType; 3769e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3770e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3771e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case 'v': 3772e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_verbose = 1; 3773e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 377456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 377556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan case 'A': 377656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan m_print_all = true; 377756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan break; 3778e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3779e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case 'r': 3780e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_use_regex = true; 3781e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3782e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3783e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3784e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return error; 3785e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3786e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3787e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton void 3788e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton OptionParsingStarting () 3789e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3790e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_type = eLookupTypeInvalid; 3791e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_str.clear(); 3792e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_file.Clear(); 3793e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_addr = LLDB_INVALID_ADDRESS; 3794e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_offset = 0; 3795e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_line_number = 0; 3796e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_use_regex = false; 37979ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan m_include_inlines = true; 3798e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_verbose = false; 379956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan m_print_all = false; 3800e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3801e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3802e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const OptionDefinition* 3803e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton GetDefinitions () 3804e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3805e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return g_option_table; 3806e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3807e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3808e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Options table: Required for subclasses of Options. 3809e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3810e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton static OptionDefinition g_option_table[]; 3811e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton int m_type; // Should be a eLookupTypeXXX enum after parsing options 3812e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton std::string m_str; // Holds name lookup 3813e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton FileSpec m_file; // Files for file lookups 3814e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton lldb::addr_t m_addr; // Holds the address to lookup 3815e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton lldb::addr_t m_offset; // Subtract this offset from m_addr before doing lookups. 3816e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t m_line_number; // Line number for file+line lookups 3817e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton bool m_use_regex; // Name lookups in m_str are regular expressions. 38189ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan bool m_include_inlines;// Check for inline entries when looking up by file/line. 3819e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton bool m_verbose; // Enable verbose lookup info 382056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan bool m_print_all; // Print all matches, even in cases where there's a best match. 3821e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3822e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton }; 3823e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3824e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesLookup (CommandInterpreter &interpreter) : 3825da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 3826da26bd203cbb104291b39891febf7481794f205fJim Ingham "target modules lookup", 3827da26bd203cbb104291b39891febf7481794f205fJim Ingham "Look up information within executable and dependent shared library images.", 3828ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton NULL, 3829ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresTarget), 3830da26bd203cbb104291b39891febf7481794f205fJim Ingham m_options (interpreter) 3831e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3832e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandArgumentEntry arg; 3833e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandArgumentData file_arg; 3834e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3835e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Define the first (and only) variant of this arg. 3836e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton file_arg.arg_type = eArgTypeFilename; 3837e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton file_arg.arg_repetition = eArgRepeatStar; 3838e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3839e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // There is only one variant this argument could be; put it into the argument entry. 3840e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton arg.push_back (file_arg); 3841e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3842e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Push the data for the first argument into the m_arguments vector. 3843e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_arguments.push_back (arg); 3844e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3845e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3846e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 3847e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesLookup () 3848e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3849e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3850e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3851e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual Options * 3852e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton GetOptions () 3853e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3854e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return &m_options; 3855e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3856e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 385756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan bool 385856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan LookupHere (CommandInterpreter &interpreter, CommandReturnObject &result, bool &syntax_error) 385956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 386056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan switch (m_options.m_type) 386156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 386256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan case eLookupTypeAddress: 386356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan case eLookupTypeFileLine: 386456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan case eLookupTypeFunction: 386556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan case eLookupTypeFunctionOrSymbol: 386656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan case eLookupTypeSymbol: 386756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan default: 386856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan return false; 386956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan case eLookupTypeType: 387056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan break; 387156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 387256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 3873ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrameSP frame = m_exe_ctx.GetFrameSP(); 387456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 387556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (!frame) 387656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan return false; 387756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 387856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan const SymbolContext &sym_ctx(frame->GetSymbolContext(eSymbolContextModule)); 387956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 388056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (!sym_ctx.module_sp) 388156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan return false; 388256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 388356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan switch (m_options.m_type) 388456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 388556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan default: 388656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan return false; 388756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan case eLookupTypeType: 388856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (!m_options.m_str.empty()) 388956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 389056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (LookupTypeHere (m_interpreter, 389156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan result.GetOutputStream(), 389256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan sym_ctx, 389356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan m_options.m_str.c_str(), 389456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan m_options.m_use_regex)) 389556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 389656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan result.SetStatus(eReturnStatusSuccessFinishResult); 389756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan return true; 389856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 389956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 390056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan break; 390156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 390256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 390356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan return true; 390456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 3905e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3906e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton bool 3907e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LookupInModule (CommandInterpreter &interpreter, Module *module, CommandReturnObject &result, bool &syntax_error) 3908e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3909e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton switch (m_options.m_type) 3910e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3911e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case eLookupTypeAddress: 3912e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (m_options.m_addr != LLDB_INVALID_ADDRESS) 3913e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3914e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (LookupAddressInModule (m_interpreter, 3915e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream(), 3916e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton module, 3917e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton eSymbolContextEverything, 3918e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_addr, 3919e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_offset, 3920e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_verbose)) 3921e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3922e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus(eReturnStatusSuccessFinishResult); 3923e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return true; 3924e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3925e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3926e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3927e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3928e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case eLookupTypeSymbol: 3929e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (!m_options.m_str.empty()) 3930e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 39312ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton if (LookupSymbolInModule (m_interpreter, 39322ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton result.GetOutputStream(), 39332ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton module, 39342ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton m_options.m_str.c_str(), 39352ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton m_options.m_use_regex, 39362ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton m_options.m_verbose)) 3937e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3938e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus(eReturnStatusSuccessFinishResult); 3939e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return true; 3940e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3941e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3942e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3943e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3944e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case eLookupTypeFileLine: 3945e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (m_options.m_file) 3946e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3947e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3948e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (LookupFileAndLineInModule (m_interpreter, 3949e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream(), 3950e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton module, 3951e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_file, 3952e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_line_number, 39539ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan m_options.m_include_inlines, 3954e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_verbose)) 3955e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3956e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus(eReturnStatusSuccessFinishResult); 3957e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return true; 3958e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3959e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3960e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 39612ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton 39622ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton case eLookupTypeFunctionOrSymbol: 3963e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case eLookupTypeFunction: 3964e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (!m_options.m_str.empty()) 3965e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3966e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (LookupFunctionInModule (m_interpreter, 3967e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream(), 3968e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton module, 3969e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_str.c_str(), 3970e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_use_regex, 39719ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan m_options.m_include_inlines, 39722ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton m_options.m_type == eLookupTypeFunctionOrSymbol, // include symbols 3973e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_verbose)) 3974e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3975e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus(eReturnStatusSuccessFinishResult); 3976e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return true; 3977e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3978e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3979e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3980e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 39812ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton 3982e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton case eLookupTypeType: 3983e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (!m_options.m_str.empty()) 3984e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3985e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (LookupTypeInModule (m_interpreter, 3986e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream(), 3987e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton module, 3988e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_str.c_str(), 3989e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.m_use_regex)) 3990e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 3991e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus(eReturnStatusSuccessFinishResult); 3992e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return true; 3993e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3994e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 3995e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 3996e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 3997e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton default: 3998e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton m_options.GenerateOptionUsage (result.GetErrorStream(), this); 3999e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton syntax_error = true; 4000e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 4001e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4002e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4003e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 4004e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 4005e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4006e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4007da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 4008e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual bool 4009da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, 4010e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandReturnObject &result) 4011e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4012e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 4013e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (target == NULL) 4014e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4015e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 4016e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 4017e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 4018e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4019e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 4020e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4021e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton bool syntax_error = false; 4022e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t i; 4023e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t num_successful_lookups = 0; 4024e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize(); 4025e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().SetAddressByteSize(addr_byte_size); 4026e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetErrorStream().SetAddressByteSize(addr_byte_size); 4027e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Dump all sections for all modules images 4028e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4029e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (command.GetArgumentCount() == 0) 4030e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 403156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan ModuleSP current_module; 403256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 403356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan // Where it is possible to look in the current symbol context 403456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan // first, try that. If this search was successful and --all 403556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan // was not passed, don't print anything else. 403656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (LookupHere (m_interpreter, result, syntax_error)) 403756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 403856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan result.GetOutputStream().EOL(); 403956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan num_successful_lookups++; 404056d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (!m_options.m_print_all) 404156d31ec9d107b50a694892944749f82d483e0e8fSean Callanan { 404256d31ec9d107b50a694892944749f82d483e0e8fSean Callanan result.SetStatus (eReturnStatusSuccessFinishResult); 404356d31ec9d107b50a694892944749f82d483e0e8fSean Callanan return result.Succeeded(); 404456d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 404556d31ec9d107b50a694892944749f82d483e0e8fSean Callanan } 404656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 404756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan // Dump all sections for all other modules 404856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 4049146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata const ModuleList &target_modules = target->GetImages(); 40509336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham Mutex::Locker modules_locker(target_modules.GetMutex()); 405136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_modules = target_modules.GetSize(); 4052e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_modules > 0) 4053e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4054e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (i = 0; i<num_modules && syntax_error == false; ++i) 4055e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 405656d31ec9d107b50a694892944749f82d483e0e8fSean Callanan Module *module_pointer = target_modules.GetModulePointerAtIndexUnlocked(i); 405756d31ec9d107b50a694892944749f82d483e0e8fSean Callanan 405856d31ec9d107b50a694892944749f82d483e0e8fSean Callanan if (module_pointer != current_module.get() && 405956d31ec9d107b50a694892944749f82d483e0e8fSean Callanan LookupInModule (m_interpreter, target_modules.GetModulePointerAtIndexUnlocked(i), result, syntax_error)) 4060e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4061e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().EOL(); 4062e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_successful_lookups++; 4063e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4064e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4065e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4066e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 4067e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4068e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("the target has no associated executable images"); 4069e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 4070e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return false; 4071e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4072e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4073e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 4074e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4075e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Dump specified images (by basename or fullpath) 4076e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton const char *arg_cstr; 4077e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton for (i = 0; (arg_cstr = command.GetArgumentAtIndex(i)) != NULL && syntax_error == false; ++i) 4078e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 407991048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton ModuleList module_list; 408091048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, false); 408191048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (num_matches > 0) 4082e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4083bf41e19c78f0c84671d21eadec3954ab6db550c1Jason Molenda for (size_t j=0; j<num_matches; ++j) 4084e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4085bf41e19c78f0c84671d21eadec3954ab6db550c1Jason Molenda Module *module = module_list.GetModulePointerAtIndex(j); 408691048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (module) 4087e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 408891048ef6b6de725b5277eff781c695e60983ce9aGreg Clayton if (LookupInModule (m_interpreter, module, result, syntax_error)) 4089e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4090e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.GetOutputStream().EOL(); 4091e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton num_successful_lookups++; 4092e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4093e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4094e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4095e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4096e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 4097e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr); 4098e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4099e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4100e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4101e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton if (num_successful_lookups > 0) 4102e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 4103e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton else 4104e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.SetStatus (eReturnStatusFailed); 4105e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4106e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton return result.Succeeded(); 4107e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4108e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4109e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandOptions m_options; 4110e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 4111e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4112e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonOptionDefinition 4113e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg ClaytonCommandObjectTargetModulesLookup::CommandOptions::g_option_table[] = 4114e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 4115d86cf81b39a562bf2400bd9af83ef112adcd93bdJim Ingham { LLDB_OPT_SET_1, true, "address", 'a', required_argument, NULL, 0, eArgTypeAddressOrExpression, "Lookup an address in one or more target modules."}, 41163bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { LLDB_OPT_SET_1, false, "offset", 'o', required_argument, NULL, 0, eArgTypeOffset, "When looking up an address subtract <offset> from any addresses before doing the lookup."}, 41172ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton { LLDB_OPT_SET_2| LLDB_OPT_SET_4 | LLDB_OPT_SET_5 41182ad894b66a6b5e689d98a7d4d2b7d037ca271b3bGreg Clayton /* FIXME: re-enable this for types when the LookupTypeInModule actually uses the regex option: | LLDB_OPT_SET_6 */ , 41193bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan false, "regex", 'r', no_argument, NULL, 0, eArgTypeNone, "The <name> argument for name lookups are regular expressions."}, 41203bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { LLDB_OPT_SET_2, true, "symbol", 's', required_argument, NULL, 0, eArgTypeSymbol, "Lookup a symbol by name in the symbol tables in one or more target modules."}, 41213bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { LLDB_OPT_SET_3, true, "file", 'f', required_argument, NULL, 0, eArgTypeFilename, "Lookup a file by fullpath or basename in one or more target modules."}, 41223bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { LLDB_OPT_SET_3, false, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum, "Lookup a line number in a file (must be used in conjunction with --file)."}, 4123f081dab9d9457b70feab868560b9d88cdcdcc92fJim Ingham { LLDB_OPT_SET_FROM_TO(3,5), 41243bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan false, "no-inlines", 'i', no_argument, NULL, 0, eArgTypeNone, "Ignore inline entries (must be used in conjunction with --file or --function)."}, 41253bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { LLDB_OPT_SET_4, true, "function", 'F', required_argument, NULL, 0, eArgTypeFunctionName, "Lookup a function by name in the debug symbols in one or more target modules."}, 41263bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { LLDB_OPT_SET_5, true, "name", 'n', required_argument, NULL, 0, eArgTypeFunctionOrSymbol, "Lookup a function or symbol by name in one or more target modules."}, 41273bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { LLDB_OPT_SET_6, true, "type", 't', required_argument, NULL, 0, eArgTypeName, "Lookup a type by name in the debug symbols in one or more target modules."}, 41283bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { LLDB_OPT_SET_ALL, false, "verbose", 'v', no_argument, NULL, 0, eArgTypeNone, "Enable verbose lookup information."}, 41293bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { LLDB_OPT_SET_ALL, false, "all", 'A', no_argument, NULL, 0, eArgTypeNone, "Print all matches, not just the best match, if a best match is available."}, 41303bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 4131e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 4132e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4133e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4134e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectMultiwordImageSearchPaths 4135e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4136e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//------------------------------------------------------------------------- 4137e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// CommandObjectMultiwordImageSearchPaths 4138e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//------------------------------------------------------------------------- 4139e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4140e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonclass CommandObjectTargetModulesImageSearchPaths : public CommandObjectMultiword 4141e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 4142e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 4143e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4144e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModulesImageSearchPaths (CommandInterpreter &interpreter) : 4145e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectMultiword (interpreter, 4146e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules search-paths", 4147e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "A set of commands for operating on debugger target image search paths.", 4148e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules search-paths <subcommand> [<subcommand-options>]") 4149e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4150e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetModulesSearchPathsAdd (interpreter))); 4151e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("clear", CommandObjectSP (new CommandObjectTargetModulesSearchPathsClear (interpreter))); 4152e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("insert", CommandObjectSP (new CommandObjectTargetModulesSearchPathsInsert (interpreter))); 4153e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectTargetModulesSearchPathsList (interpreter))); 4154e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("query", CommandObjectSP (new CommandObjectTargetModulesSearchPathsQuery (interpreter))); 4155e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4156e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4157e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModulesImageSearchPaths() 4158e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4159e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4160e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 4161e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4162e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4163e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4164e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton#pragma mark CommandObjectTargetModules 4165e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4166e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//------------------------------------------------------------------------- 4167e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton// CommandObjectTargetModules 4168e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton//------------------------------------------------------------------------- 4169e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4170e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonclass CommandObjectTargetModules : public CommandObjectMultiword 4171e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton{ 4172e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonpublic: 4173e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton //------------------------------------------------------------------ 4174e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // Constructors and Destructors 4175e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton //------------------------------------------------------------------ 4176e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectTargetModules(CommandInterpreter &interpreter) : 4177e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton CommandObjectMultiword (interpreter, 4178e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules", 4179e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "A set of commands for accessing information for one or more target modules.", 4180e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton "target modules <sub-command> ...") 4181e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4182e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetModulesAdd (interpreter))); 4183e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("load", CommandObjectSP (new CommandObjectTargetModulesLoad (interpreter))); 4184e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("dump", CommandObjectSP (new CommandObjectTargetModulesDump (interpreter))); 4185e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectTargetModulesList (interpreter))); 4186e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("lookup", CommandObjectSP (new CommandObjectTargetModulesLookup (interpreter))); 4187e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("search-paths", CommandObjectSP (new CommandObjectTargetModulesImageSearchPaths (interpreter))); 41885b0afcceea3807fa8f518e0138f0a8043dfc3315Jason Molenda LoadSubCommand ("show-unwind", CommandObjectSP (new CommandObjectTargetModulesShowUnwind (interpreter))); 4189e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4190e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4191e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton virtual 4192e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton ~CommandObjectTargetModules() 4193e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton { 4194e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton } 4195e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4196e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Claytonprivate: 4197e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton //------------------------------------------------------------------ 4198e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton // For CommandObjectTargetModules only 4199e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton //------------------------------------------------------------------ 4200e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton DISALLOW_COPY_AND_ASSIGN (CommandObjectTargetModules); 4201e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton}; 4202e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 4203e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton 42043508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 4205da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetSymbolsAdd : public CommandObjectParsed 42063508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton{ 42073508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Claytonpublic: 42083508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton CommandObjectTargetSymbolsAdd (CommandInterpreter &interpreter) : 4209da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 4210da26bd203cbb104291b39891febf7481794f205fJim Ingham "target symbols add", 4211437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton "Add a debug symbol file to one of the target's current modules by specifying a path to a debug symbols file, or using the options to specify a module to download symbols for.", 42121ab639cd373175e7cabfc2408e926712f3c93e61Jason Molenda "target symbols add [<symfile>]", eFlagRequiresTarget), 4213437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton m_option_group (interpreter), 4214437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton m_file_option (LLDB_OPT_SET_1, false, "shlib", 's', CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Fullpath or basename for module to find debug symbols for."), 4215437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton m_current_frame_option (LLDB_OPT_SET_2, false, "frame", 'F', "Locate the debug symbols the currently selected frame.", false, true) 4216437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 42173508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4218437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton m_option_group.Append (&m_uuid_option_group, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 4219437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton m_option_group.Append (&m_file_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 4220437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton m_option_group.Append (&m_current_frame_option, LLDB_OPT_SET_2, LLDB_OPT_SET_2); 4221437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton m_option_group.Finalize(); 42223508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 42233508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 42243508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton virtual 42253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ~CommandObjectTargetSymbolsAdd () 42263508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 42273508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 42283508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 422936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton virtual int 4230da26bd203cbb104291b39891febf7481794f205fJim Ingham HandleArgumentCompletion (Args &input, 4231da26bd203cbb104291b39891febf7481794f205fJim Ingham int &cursor_index, 4232da26bd203cbb104291b39891febf7481794f205fJim Ingham int &cursor_char_position, 4233da26bd203cbb104291b39891febf7481794f205fJim Ingham OptionElementVector &opt_element_vector, 4234da26bd203cbb104291b39891febf7481794f205fJim Ingham int match_start_point, 4235da26bd203cbb104291b39891febf7481794f205fJim Ingham int max_return_elements, 4236da26bd203cbb104291b39891febf7481794f205fJim Ingham bool &word_complete, 4237da26bd203cbb104291b39891febf7481794f205fJim Ingham StringList &matches) 4238da26bd203cbb104291b39891febf7481794f205fJim Ingham { 4239da26bd203cbb104291b39891febf7481794f205fJim Ingham std::string completion_str (input.GetArgumentAtIndex(cursor_index)); 4240da26bd203cbb104291b39891febf7481794f205fJim Ingham completion_str.erase (cursor_char_position); 4241da26bd203cbb104291b39891febf7481794f205fJim Ingham 4242da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 4243da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandCompletions::eDiskFileCompletion, 4244da26bd203cbb104291b39891febf7481794f205fJim Ingham completion_str.c_str(), 4245da26bd203cbb104291b39891febf7481794f205fJim Ingham match_start_point, 4246da26bd203cbb104291b39891febf7481794f205fJim Ingham max_return_elements, 4247da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 4248da26bd203cbb104291b39891febf7481794f205fJim Ingham word_complete, 4249da26bd203cbb104291b39891febf7481794f205fJim Ingham matches); 4250da26bd203cbb104291b39891febf7481794f205fJim Ingham return matches.GetSize(); 4251da26bd203cbb104291b39891febf7481794f205fJim Ingham } 4252da26bd203cbb104291b39891febf7481794f205fJim Ingham 4253437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton virtual Options * 4254437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton GetOptions () 4255437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4256437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton return &m_option_group; 4257437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4258437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 4259437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 4260da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 4261437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 4262437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton bool 4263437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton AddModuleSymbols (Target *target, 4264c92fded462447b410694cd1927432231d33f2a42Greg Clayton ModuleSpec &module_spec, 4265437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton bool &flush, 4266437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton CommandReturnObject &result) 4267437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4268c92fded462447b410694cd1927432231d33f2a42Greg Clayton const FileSpec &symbol_fspec = module_spec.GetSymbolFileSpec(); 4269c92fded462447b410694cd1927432231d33f2a42Greg Clayton if (symbol_fspec) 4270437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4271437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton char symfile_path[PATH_MAX]; 4272c92fded462447b410694cd1927432231d33f2a42Greg Clayton symbol_fspec.GetPath (symfile_path, sizeof(symfile_path)); 4273c92fded462447b410694cd1927432231d33f2a42Greg Clayton 4274c92fded462447b410694cd1927432231d33f2a42Greg Clayton if (!module_spec.GetUUID().IsValid()) 4275c92fded462447b410694cd1927432231d33f2a42Greg Clayton { 4276c92fded462447b410694cd1927432231d33f2a42Greg Clayton if (!module_spec.GetFileSpec() && !module_spec.GetPlatformFileSpec()) 4277c92fded462447b410694cd1927432231d33f2a42Greg Clayton module_spec.GetFileSpec().GetFilename() = symbol_fspec.GetFilename(); 4278c92fded462447b410694cd1927432231d33f2a42Greg Clayton } 4279437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton // We now have a module that represents a symbol file 4280437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton // that can be used for a module that might exist in the 4281437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton // current target, so we need to find that module in the 4282437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton // target 4283c92fded462447b410694cd1927432231d33f2a42Greg Clayton ModuleList matching_module_list; 428495fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton 428595fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton size_t num_matches = 0; 428695fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton // First extract all module specs from the symbol file 428795fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton lldb_private::ModuleSpecList symfile_module_specs; 42887980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton if (ObjectFile::GetModuleSpecifications(module_spec.GetSymbolFileSpec(), 0, 0, symfile_module_specs)) 428995fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton { 429095fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton // Now extract the module spec that matches the target architecture 429195fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton ModuleSpec target_arch_module_spec; 429295fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton ModuleSpec symfile_module_spec; 429395fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton target_arch_module_spec.GetArchitecture() = target->GetArchitecture(); 429495fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton if (symfile_module_specs.FindMatchingModuleSpec(target_arch_module_spec, symfile_module_spec)) 429595fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton { 429695fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton // See if it has a UUID? 429795fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton if (symfile_module_spec.GetUUID().IsValid()) 429895fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton { 429995fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton // It has a UUID, look for this UUID in the target modules 430095fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton ModuleSpec symfile_uuid_module_spec; 430195fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton symfile_uuid_module_spec.GetUUID() = symfile_module_spec.GetUUID(); 430295fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton num_matches = target->GetImages().FindModules (symfile_uuid_module_spec, matching_module_list); 430395fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton } 430495fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton } 430595fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton 430695fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton if (num_matches == 0) 430795fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton { 430895fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton // No matches yet, iterate through the module specs to find a UUID value that 430995fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton // we can match up to an image in our target 431095fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton const size_t num_symfile_module_specs = symfile_module_specs.GetSize(); 431195fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton for (size_t i=0; i<num_symfile_module_specs && num_matches == 0; ++i) 431295fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton { 431395fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton if (symfile_module_specs.GetModuleSpecAtIndex(i, symfile_module_spec)) 431495fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton { 431595fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton if (symfile_module_spec.GetUUID().IsValid()) 431695fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton { 431795fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton // It has a UUID, look for this UUID in the target modules 431895fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton ModuleSpec symfile_uuid_module_spec; 431995fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton symfile_uuid_module_spec.GetUUID() = symfile_module_spec.GetUUID(); 432095fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton num_matches = target->GetImages().FindModules (symfile_uuid_module_spec, matching_module_list); 432195fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton } 432295fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton } 432395fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton } 432495fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton } 432595fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton } 432695fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton 432795fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton // Just try to match up the file by basename if we have no matches at this point 432895fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton if (num_matches == 0) 432995fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton num_matches = target->GetImages().FindModules (module_spec, matching_module_list); 433095fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton 4331d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton while (num_matches == 0) 4332d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 4333d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton ConstString filename_no_extension(module_spec.GetFileSpec().GetFileNameStrippingExtension()); 4334d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton // Empty string returned, lets bail 4335d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (!filename_no_extension) 4336d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton break; 4337d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 4338d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton // Check if there was no extension to strip and the basename is the same 4339d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (filename_no_extension == module_spec.GetFileSpec().GetFilename()) 4340d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton break; 4341d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 4342d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton // Replace basename with one less extension 4343d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton module_spec.GetFileSpec().GetFilename() = filename_no_extension; 4344d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 4345d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton num_matches = target->GetImages().FindModules (module_spec, matching_module_list); 434695fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton 4347d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 4348d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 4349c92fded462447b410694cd1927432231d33f2a42Greg Clayton if (num_matches > 1) 4350437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4351c92fded462447b410694cd1927432231d33f2a42Greg Clayton result.AppendErrorWithFormat ("multiple modules match symbol file '%s', use the --uuid option to resolve the ambiguity.\n", symfile_path); 4352c92fded462447b410694cd1927432231d33f2a42Greg Clayton } 4353c92fded462447b410694cd1927432231d33f2a42Greg Clayton else if (num_matches == 1) 4354c92fded462447b410694cd1927432231d33f2a42Greg Clayton { 4355c92fded462447b410694cd1927432231d33f2a42Greg Clayton ModuleSP module_sp (matching_module_list.GetModuleAtIndex(0)); 4356c92fded462447b410694cd1927432231d33f2a42Greg Clayton 4357437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton // The module has not yet created its symbol vendor, we can just 4358437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton // give the existing target module the symfile path to use for 4359437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton // when it decides to create it! 4360c92fded462447b410694cd1927432231d33f2a42Greg Clayton module_sp->SetSymbolFileFileSpec (symbol_fspec); 4361437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 4362188091899842b140313b54e097f16efbe165c998Greg Clayton SymbolVendor *symbol_vendor = module_sp->GetSymbolVendor(true, &result.GetErrorStream()); 4363c92fded462447b410694cd1927432231d33f2a42Greg Clayton if (symbol_vendor) 4364c92fded462447b410694cd1927432231d33f2a42Greg Clayton { 4365c92fded462447b410694cd1927432231d33f2a42Greg Clayton SymbolFile *symbol_file = symbol_vendor->GetSymbolFile(); 4366c92fded462447b410694cd1927432231d33f2a42Greg Clayton 4367c92fded462447b410694cd1927432231d33f2a42Greg Clayton if (symbol_file) 4368c92fded462447b410694cd1927432231d33f2a42Greg Clayton { 4369c92fded462447b410694cd1927432231d33f2a42Greg Clayton ObjectFile *object_file = symbol_file->GetObjectFile(); 4370c92fded462447b410694cd1927432231d33f2a42Greg Clayton 4371c92fded462447b410694cd1927432231d33f2a42Greg Clayton if (object_file && object_file->GetFileSpec() == symbol_fspec) 4372c92fded462447b410694cd1927432231d33f2a42Greg Clayton { 4373c92fded462447b410694cd1927432231d33f2a42Greg Clayton // Provide feedback that the symfile has been successfully added. 4374c92fded462447b410694cd1927432231d33f2a42Greg Clayton const FileSpec &module_fs = module_sp->GetFileSpec(); 437597a19b21dacd9063bb5475812df7781777262198Greg Clayton result.AppendMessageWithFormat("symbol file '%s' has been added to '%s'\n", 4376c92fded462447b410694cd1927432231d33f2a42Greg Clayton symfile_path, 437797a19b21dacd9063bb5475812df7781777262198Greg Clayton module_fs.GetPath().c_str()); 4378c92fded462447b410694cd1927432231d33f2a42Greg Clayton 4379c92fded462447b410694cd1927432231d33f2a42Greg Clayton // Let clients know something changed in the module 4380c92fded462447b410694cd1927432231d33f2a42Greg Clayton // if it is currently loaded 4381c92fded462447b410694cd1927432231d33f2a42Greg Clayton ModuleList module_list; 4382c92fded462447b410694cd1927432231d33f2a42Greg Clayton module_list.Append (module_sp); 438312fbcf5bdbc54e49bf565ec067b3b484c28a52feEnrico Granata target->SymbolsDidLoad (module_list); 4384d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 4385d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton // Make sure we load any scripting resources that may be embedded 4386d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton // in the debug info files in case the platform supports that. 4387d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton Error error; 438802af494c397d62f22bea65d36ad47080b6adc8afEnrico Granata StreamString feedback_stream; 438902af494c397d62f22bea65d36ad47080b6adc8afEnrico Granata module_sp->LoadScriptingResourceInTarget (target, error,&feedback_stream); 439037c43e4d6611770f531ee9ca2d4037b02cfe39d9Enrico Granata if (error.Fail() && error.AsCString()) 43911d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata result.AppendWarningWithFormat("unable to load scripting data for module %s - error reported was %s", 43921d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(), 43931d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata error.AsCString()); 439402af494c397d62f22bea65d36ad47080b6adc8afEnrico Granata else if (feedback_stream.GetSize()) 439502af494c397d62f22bea65d36ad47080b6adc8afEnrico Granata result.AppendWarningWithFormat("%s",feedback_stream.GetData()); 4396d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 4397c92fded462447b410694cd1927432231d33f2a42Greg Clayton flush = true; 4398c92fded462447b410694cd1927432231d33f2a42Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 4399c92fded462447b410694cd1927432231d33f2a42Greg Clayton return true; 4400c92fded462447b410694cd1927432231d33f2a42Greg Clayton } 4401c92fded462447b410694cd1927432231d33f2a42Greg Clayton } 4402c92fded462447b410694cd1927432231d33f2a42Greg Clayton } 4403c92fded462447b410694cd1927432231d33f2a42Greg Clayton // Clear the symbol file spec if anything went wrong 4404c92fded462447b410694cd1927432231d33f2a42Greg Clayton module_sp->SetSymbolFileFileSpec (FileSpec()); 4405c92fded462447b410694cd1927432231d33f2a42Greg Clayton } 4406c92fded462447b410694cd1927432231d33f2a42Greg Clayton 4407c92fded462447b410694cd1927432231d33f2a42Greg Clayton if (module_spec.GetUUID().IsValid()) 4408c92fded462447b410694cd1927432231d33f2a42Greg Clayton { 4409c92fded462447b410694cd1927432231d33f2a42Greg Clayton StreamString ss_symfile_uuid; 4410c92fded462447b410694cd1927432231d33f2a42Greg Clayton module_spec.GetUUID().Dump(&ss_symfile_uuid); 4411c92fded462447b410694cd1927432231d33f2a42Greg Clayton result.AppendErrorWithFormat ("symbol file '%s' (%s) does not match any existing module%s\n", 4412c92fded462447b410694cd1927432231d33f2a42Greg Clayton symfile_path, 4413c92fded462447b410694cd1927432231d33f2a42Greg Clayton ss_symfile_uuid.GetData(), 4414c92fded462447b410694cd1927432231d33f2a42Greg Clayton (symbol_fspec.GetFileType() != FileSpec::eFileTypeRegular) 4415c92fded462447b410694cd1927432231d33f2a42Greg Clayton ? "\n please specify the full path to the symbol file" 4416c92fded462447b410694cd1927432231d33f2a42Greg Clayton : ""); 4417437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4418437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton else 4419437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4420c92fded462447b410694cd1927432231d33f2a42Greg Clayton result.AppendErrorWithFormat ("symbol file '%s' does not match any existing module%s\n", 4421c92fded462447b410694cd1927432231d33f2a42Greg Clayton symfile_path, 4422c92fded462447b410694cd1927432231d33f2a42Greg Clayton (symbol_fspec.GetFileType() != FileSpec::eFileTypeRegular) 4423c92fded462447b410694cd1927432231d33f2a42Greg Clayton ? "\n please specify the full path to the symbol file" 4424c92fded462447b410694cd1927432231d33f2a42Greg Clayton : ""); 4425437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4426437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4427437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton else 4428437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4429437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton result.AppendError ("one or more executable image paths must be specified"); 4430437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4431c92fded462447b410694cd1927432231d33f2a42Greg Clayton result.SetStatus (eReturnStatusFailed); 4432c92fded462447b410694cd1927432231d33f2a42Greg Clayton return false; 4433437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4434437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 44353508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton virtual bool 4436da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& args, 44373508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton CommandReturnObject &result) 44383508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4439ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 4440437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton result.SetStatus (eReturnStatusFailed); 4441ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool flush = false; 4442ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ModuleSpec module_spec; 4443ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool uuid_option_set = m_uuid_option_group.GetOptionValue().OptionWasSet(); 4444ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool file_option_set = m_file_option.GetOptionValue().OptionWasSet(); 4445ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool frame_option_set = m_current_frame_option.GetOptionValue().OptionWasSet(); 4446437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 4447ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const size_t argc = args.GetArgumentCount(); 4448ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (argc == 0) 4449ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4450ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (uuid_option_set || file_option_set || frame_option_set) 44513508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4452ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool success = false; 4453ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool error_set = false; 4454ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame_option_set) 44553508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4456ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 4457ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (process) 44583508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4459ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const StateType process_state = process->GetState(); 4460ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (StateIsStoppedState (process_state, true)) 44613508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4462ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrame *frame = m_exe_ctx.GetFramePtr(); 4463ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame) 44643508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4465ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ModuleSP frame_module_sp (frame->GetSymbolContext(eSymbolContextModule).module_sp); 4466ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame_module_sp) 44673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4468ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame_module_sp->GetPlatformFileSpec().Exists()) 4469437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4470ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetArchitecture() = frame_module_sp->GetArchitecture(); 4471ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetFileSpec() = frame_module_sp->GetPlatformFileSpec(); 4472437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4473ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetUUID() = frame_module_sp->GetUUID(); 4474ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton success = module_spec.GetUUID().IsValid() || module_spec.GetFileSpec(); 44753508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 44769262cd52e254fb261334254a80a1b316d59b555cJohnny Chen else 44779262cd52e254fb261334254a80a1b316d59b555cJohnny Chen { 4478ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("frame has no module"); 4479437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton error_set = true; 44809262cd52e254fb261334254a80a1b316d59b555cJohnny Chen } 44813508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 44823508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton else 44833508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4484ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("invalid current frame"); 4485437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton error_set = true; 44863508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 44873508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 44883508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton else 44893508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4490ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("process is not stopped: %s", StateAsCString(process_state)); 4491437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton error_set = true; 4492437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4493437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4494437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton else 4495437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4496ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("a process must exist in order to use the --frame option"); 4497ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton error_set = true; 4498437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4499ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4500ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 4501ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4502ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (uuid_option_set) 4503437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4504ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetUUID() = m_uuid_option_group.GetOptionValue().GetCurrentValue(); 4505ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton success |= module_spec.GetUUID().IsValid(); 4506437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4507ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (file_option_set) 4508437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4509ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetFileSpec() = m_file_option.GetOptionValue().GetCurrentValue(); 4510ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ModuleSP module_sp (target->GetImages().FindFirstModule(module_spec)); 4511ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (module_sp) 4512437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4513ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetFileSpec() = module_sp->GetFileSpec(); 4514ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetPlatformFileSpec() = module_sp->GetPlatformFileSpec(); 4515ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetUUID() = module_sp->GetUUID(); 4516ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetArchitecture() = module_sp->GetArchitecture(); 4517437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4518ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 4519437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4520ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetArchitecture() = target->GetArchitecture(); 4521437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4522ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton success |= module_spec.GetFileSpec().Exists(); 4523437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4524437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4525ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 4526ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (success) 4527ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4528ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (Symbols::DownloadObjectAndSymbolFile (module_spec)) 4529ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4530ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (module_spec.GetSymbolFileSpec()) 4531ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton success = AddModuleSymbols (target, module_spec, flush, result); 4532ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4533ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4534ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 4535ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (!success && !error_set) 4536437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4537ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StreamString error_strm; 4538ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (uuid_option_set) 4539ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4540ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton error_strm.PutCString("unable to find debug symbols for UUID "); 4541ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetUUID().Dump (&error_strm); 4542ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4543ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (file_option_set) 4544ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4545ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton error_strm.PutCString("unable to find debug symbols for the executable file "); 4546ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton error_strm << module_spec.GetFileSpec(); 4547ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4548ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (frame_option_set) 4549ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4550ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton error_strm.PutCString("unable to find debug symbols for the current frame"); 4551ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4552ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError (error_strm.GetData()); 4553437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4554437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton } 4555437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton else 4556437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4557ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("one or more symbol file paths must be specified, or options must be specified"); 4558ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4559ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4560ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 4561ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4562ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (uuid_option_set) 4563ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4564ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("specify either one or more paths to symbol files or use the --uuid option without arguments"); 4565ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4566ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (file_option_set) 4567ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4568ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("specify either one or more paths to symbol files or use the --file option without arguments"); 4569ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4570ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (frame_option_set) 4571ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4572ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("specify either one or more paths to symbol files or use the --frame option without arguments"); 4573ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4574ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 4575ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4576ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton PlatformSP platform_sp (target->GetPlatform()); 4577437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 4578ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (size_t i=0; i<argc; ++i) 4579ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4580ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *symfile_path = args.GetArgumentAtIndex(i); 4581ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (symfile_path) 4582437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4583ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetSymbolFileSpec().SetFile(symfile_path, true); 4584ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (platform_sp) 4585437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4586ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton FileSpec symfile_spec; 4587ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (platform_sp->ResolveSymbolFile(*target, module_spec, symfile_spec).Success()) 4588ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton module_spec.GetSymbolFileSpec() = symfile_spec; 4589ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4590ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 4591ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ArchSpec arch; 4592ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool symfile_exists = module_spec.GetSymbolFileSpec().Exists(); 4593437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 4594ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (symfile_exists) 4595ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4596ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (!AddModuleSymbols (target, module_spec, flush, result)) 4597ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton break; 4598ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4599ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 4600ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4601ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton char resolved_symfile_path[PATH_MAX]; 4602ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (module_spec.GetSymbolFileSpec().GetPath (resolved_symfile_path, sizeof(resolved_symfile_path))) 4603437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4604ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (strcmp (resolved_symfile_path, symfile_path) != 0) 4605437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton { 4606ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("invalid module path '%s' with resolved path '%s'\n", symfile_path, resolved_symfile_path); 4607ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton break; 46083508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 46093508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 4610ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("invalid module path '%s'\n", symfile_path); 4611ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton break; 46123508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 46133508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 46143508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 46153508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 4616ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 4617cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton 4618ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (flush) 4619ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 4620ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 4621ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (process) 4622ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->Flush(); 46233508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 46243508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton return result.Succeeded(); 46253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 46263508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 4627437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton OptionGroupOptions m_option_group; 4628437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton OptionGroupUUID m_uuid_option_group; 4629437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton OptionGroupFile m_file_option; 4630437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton OptionGroupBoolean m_current_frame_option; 4631437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 4632437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton 46333508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton}; 46343508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 46353508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 46363508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton#pragma mark CommandObjectTargetSymbols 46373508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 46383508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton//------------------------------------------------------------------------- 46393508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton// CommandObjectTargetSymbols 46403508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton//------------------------------------------------------------------------- 46413508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 46423508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Claytonclass CommandObjectTargetSymbols : public CommandObjectMultiword 46433508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton{ 46443508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Claytonpublic: 46453508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton //------------------------------------------------------------------ 46463508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton // Constructors and Destructors 46473508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton //------------------------------------------------------------------ 46483508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton CommandObjectTargetSymbols(CommandInterpreter &interpreter) : 46493508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton CommandObjectMultiword (interpreter, 46503508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton "target symbols", 46513508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton "A set of commands for adding and managing debug symbol files.", 46523508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton "target symbols <sub-command> ...") 46533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 46543508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetSymbolsAdd (interpreter))); 46553508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 46563508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 46573508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton virtual 46583508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ~CommandObjectTargetSymbols() 46593508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 46603508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 46613508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 46623508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Claytonprivate: 46633508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton //------------------------------------------------------------------ 46643508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton // For CommandObjectTargetModules only 46653508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton //------------------------------------------------------------------ 46663508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton DISALLOW_COPY_AND_ASSIGN (CommandObjectTargetSymbols); 46673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton}; 46683508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 46693508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 4670d60d94a5126b93fda98678a68322abc2164073dbJim Ingham#pragma mark CommandObjectTargetStopHookAdd 4671d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4672d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 4673d60d94a5126b93fda98678a68322abc2164073dbJim Ingham// CommandObjectTargetStopHookAdd 4674d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 4675d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4676da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetStopHookAdd : public CommandObjectParsed 4677d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{ 4678d60d94a5126b93fda98678a68322abc2164073dbJim Inghampublic: 4679d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4680d60d94a5126b93fda98678a68322abc2164073dbJim Ingham class CommandOptions : public Options 4681d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4682d60d94a5126b93fda98678a68322abc2164073dbJim Ingham public: 4683f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 4684f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options(interpreter), 4685d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_line_start(0), 4686d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_line_end (UINT_MAX), 4687d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_func_name_type_mask (eFunctionNameTypeAuto), 4688d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_sym_ctx_specified (false), 468960fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen m_thread_specified (false), 469060fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen m_use_one_liner (false), 469160fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen m_one_liner() 4692d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4693d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4694d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4695d60d94a5126b93fda98678a68322abc2164073dbJim Ingham ~CommandOptions () {} 4696d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4697b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 4698d60d94a5126b93fda98678a68322abc2164073dbJim Ingham GetDefinitions () 4699d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4700d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return g_option_table; 4701d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4702d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4703d60d94a5126b93fda98678a68322abc2164073dbJim Ingham virtual Error 4704143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 4705d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4706d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Error error; 47076475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 4708d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool success; 4709d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4710d60d94a5126b93fda98678a68322abc2164073dbJim Ingham switch (short_option) 4711d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4712d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 'c': 4713d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_class_name = option_arg; 4714d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_sym_ctx_specified = true; 4715d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4716d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4717d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 'e': 4718d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_line_end = Args::StringToUInt32 (option_arg, UINT_MAX, 0, &success); 4719d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!success) 4720d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 47219c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid end line number: \"%s\"", option_arg); 4722d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4723d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4724d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_sym_ctx_specified = true; 4725d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4726d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4727d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 'l': 4728d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_line_start = Args::StringToUInt32 (option_arg, 0, 0, &success); 4729d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!success) 4730d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 47319c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid start line number: \"%s\"", option_arg); 4732d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4733d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4734d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_sym_ctx_specified = true; 4735d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 47369ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan 47379ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan case 'i': 47389ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan m_no_inlines = true; 47399ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan break; 4740d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4741d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 'n': 4742d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_function_name = option_arg; 4743d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_func_name_type_mask |= eFunctionNameTypeAuto; 4744d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_sym_ctx_specified = true; 4745d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4746d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4747d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 'f': 4748d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_file_name = option_arg; 4749d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_sym_ctx_specified = true; 4750d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4751d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 's': 4752d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_module_name = option_arg; 4753d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_sym_ctx_specified = true; 4754d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4755d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 't' : 4756d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 47577a4c8ea70d28d03fb6ae0d262d9fc46fb42753e3Jim Ingham m_thread_id = Args::StringToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0); 4758d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (m_thread_id == LLDB_INVALID_THREAD_ID) 47599c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg); 4760d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_thread_specified = true; 4761d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4762d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4763d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 'T': 4764d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_thread_name = option_arg; 4765d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_thread_specified = true; 4766d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4767d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 'q': 4768d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_queue_name = option_arg; 4769d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_thread_specified = true; 4770d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4771d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case 'x': 4772d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 47737a4c8ea70d28d03fb6ae0d262d9fc46fb42753e3Jim Ingham m_thread_index = Args::StringToUInt32(option_arg, UINT32_MAX, 0); 4774d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (m_thread_id == UINT32_MAX) 47759c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg); 4776d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_thread_specified = true; 4777d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4778d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 477960fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen case 'o': 478060fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen m_use_one_liner = true; 478160fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen m_one_liner = option_arg; 478260fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen break; 4783d60d94a5126b93fda98678a68322abc2164073dbJim Ingham default: 47849c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("unrecognized option %c.", short_option); 4785d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4786d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4787d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return error; 4788d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4789d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4790d60d94a5126b93fda98678a68322abc2164073dbJim Ingham void 4791143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 4792d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4793d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_class_name.clear(); 4794d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_function_name.clear(); 4795d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_line_start = 0; 4796d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_line_end = UINT_MAX; 4797d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_file_name.clear(); 4798d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_module_name.clear(); 4799d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_func_name_type_mask = eFunctionNameTypeAuto; 4800d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_thread_id = LLDB_INVALID_THREAD_ID; 4801d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_thread_index = UINT32_MAX; 4802d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_thread_name.clear(); 4803d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_queue_name.clear(); 48049ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan 48059ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan m_no_inlines = false; 4806d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_sym_ctx_specified = false; 4807d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_thread_specified = false; 480860fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen 480960fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen m_use_one_liner = false; 481060fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen m_one_liner.clear(); 4811d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4812d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4813d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4814b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 4815d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4816d60d94a5126b93fda98678a68322abc2164073dbJim Ingham std::string m_class_name; 4817d60d94a5126b93fda98678a68322abc2164073dbJim Ingham std::string m_function_name; 4818d60d94a5126b93fda98678a68322abc2164073dbJim Ingham uint32_t m_line_start; 4819d60d94a5126b93fda98678a68322abc2164073dbJim Ingham uint32_t m_line_end; 4820d60d94a5126b93fda98678a68322abc2164073dbJim Ingham std::string m_file_name; 4821d60d94a5126b93fda98678a68322abc2164073dbJim Ingham std::string m_module_name; 4822d60d94a5126b93fda98678a68322abc2164073dbJim Ingham uint32_t m_func_name_type_mask; // A pick from lldb::FunctionNameType. 4823d60d94a5126b93fda98678a68322abc2164073dbJim Ingham lldb::tid_t m_thread_id; 4824d60d94a5126b93fda98678a68322abc2164073dbJim Ingham uint32_t m_thread_index; 4825d60d94a5126b93fda98678a68322abc2164073dbJim Ingham std::string m_thread_name; 4826d60d94a5126b93fda98678a68322abc2164073dbJim Ingham std::string m_queue_name; 4827d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool m_sym_ctx_specified; 48289ad19538acc3790484d12f655dbfdcece8a4e60bSean Callanan bool m_no_inlines; 4829d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool m_thread_specified; 483060fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen // Instance variables to hold the values for one_liner options. 483160fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen bool m_use_one_liner; 483260fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen std::string m_one_liner; 4833d60d94a5126b93fda98678a68322abc2164073dbJim Ingham }; 4834d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4835d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Options * 4836d60d94a5126b93fda98678a68322abc2164073dbJim Ingham GetOptions () 4837d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4838d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return &m_options; 4839d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4840d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4841d60d94a5126b93fda98678a68322abc2164073dbJim Ingham CommandObjectTargetStopHookAdd (CommandInterpreter &interpreter) : 4842da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 4843da26bd203cbb104291b39891febf7481794f205fJim Ingham "target stop-hook add ", 4844da26bd203cbb104291b39891febf7481794f205fJim Ingham "Add a hook to be executed when the target stops.", 4845da26bd203cbb104291b39891febf7481794f205fJim Ingham "target stop-hook add"), 4846f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 4847d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4848d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4849d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4850d60d94a5126b93fda98678a68322abc2164073dbJim Ingham ~CommandObjectTargetStopHookAdd () 4851d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4852d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4853d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4854d60d94a5126b93fda98678a68322abc2164073dbJim Ingham static size_t 4855d60d94a5126b93fda98678a68322abc2164073dbJim Ingham ReadCommandsCallbackFunction (void *baton, 4856d60d94a5126b93fda98678a68322abc2164073dbJim Ingham InputReader &reader, 4857d60d94a5126b93fda98678a68322abc2164073dbJim Ingham lldb::InputReaderAction notification, 4858d60d94a5126b93fda98678a68322abc2164073dbJim Ingham const char *bytes, 4859d60d94a5126b93fda98678a68322abc2164073dbJim Ingham size_t bytes_len) 4860d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4861892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream(); 4862d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Target::StopHook *new_stop_hook = ((Target::StopHook *) baton); 4863e15511a3a0a3ce0f52b7cc2b6090ad4ec732b530Jim Ingham static bool got_interrupted; 4864892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode(); 4865d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4866d60d94a5126b93fda98678a68322abc2164073dbJim Ingham switch (notification) 4867d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4868d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case eInputReaderActivate: 4869892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice if (!batch_mode) 4870892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice { 4871892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Printf ("%s\n", "Enter your stop hook command(s). Type 'DONE' to end."); 4872892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice if (reader.GetPrompt()) 4873892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Printf ("%s", reader.GetPrompt()); 4874892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Flush(); 4875892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice } 4876e15511a3a0a3ce0f52b7cc2b6090ad4ec732b530Jim Ingham got_interrupted = false; 4877d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4878d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4879d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case eInputReaderDeactivate: 4880d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4881d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4882d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case eInputReaderReactivate: 4883892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice if (reader.GetPrompt() && !batch_mode) 4884d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4885892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Printf ("%s", reader.GetPrompt()); 4886892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Flush(); 4887d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4888e15511a3a0a3ce0f52b7cc2b6090ad4ec732b530Jim Ingham got_interrupted = false; 4889d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4890d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 48914a348081030cdd2af758fddc869518357d9befd3Caroline Tice case eInputReaderAsynchronousOutputWritten: 48924a348081030cdd2af758fddc869518357d9befd3Caroline Tice break; 48934a348081030cdd2af758fddc869518357d9befd3Caroline Tice 4894d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case eInputReaderGotToken: 4895d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (bytes && bytes_len && baton) 4896d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4897d60d94a5126b93fda98678a68322abc2164073dbJim Ingham StringList *commands = new_stop_hook->GetCommandPointer(); 4898d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (commands) 4899d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4900d60d94a5126b93fda98678a68322abc2164073dbJim Ingham commands->AppendString (bytes, bytes_len); 4901d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4902d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4903892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice if (!reader.IsDone() && reader.GetPrompt() && !batch_mode) 4904d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4905892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Printf ("%s", reader.GetPrompt()); 4906892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Flush(); 4907d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4908d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4909d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4910d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case eInputReaderInterrupt: 4911d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4912d60d94a5126b93fda98678a68322abc2164073dbJim Ingham // Finish, and cancel the stop hook. 4913d60d94a5126b93fda98678a68322abc2164073dbJim Ingham new_stop_hook->GetTarget()->RemoveStopHookByID(new_stop_hook->GetID()); 4914892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice if (!batch_mode) 4915892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice { 4916892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Printf ("Stop hook cancelled.\n"); 4917892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Flush(); 4918892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice } 4919892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice 4920d60d94a5126b93fda98678a68322abc2164073dbJim Ingham reader.SetIsDone (true); 4921d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4922e15511a3a0a3ce0f52b7cc2b6090ad4ec732b530Jim Ingham got_interrupted = true; 4923d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4924d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4925d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case eInputReaderEndOfFile: 4926d60d94a5126b93fda98678a68322abc2164073dbJim Ingham reader.SetIsDone (true); 4927d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4928d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4929d60d94a5126b93fda98678a68322abc2164073dbJim Ingham case eInputReaderDone: 4930892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice if (!got_interrupted && !batch_mode) 4931892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice { 49325f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea out_stream->Printf ("Stop hook #%" PRIu64 " added.\n", new_stop_hook->GetID()); 4933892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice out_stream->Flush(); 4934892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice } 4935d60d94a5126b93fda98678a68322abc2164073dbJim Ingham break; 4936d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4937d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4938d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return bytes_len; 4939d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4940d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4941da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 4942d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool 4943da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 4944d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4945d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 4946d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (target) 4947d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4948d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Target::StopHookSP new_hook_sp; 4949d60d94a5126b93fda98678a68322abc2164073dbJim Ingham target->AddStopHook (new_hook_sp); 4950d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4951d60d94a5126b93fda98678a68322abc2164073dbJim Ingham // First step, make the specifier. 4952102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<SymbolContextSpecifier> specifier_ap; 4953d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (m_options.m_sym_ctx_specified) 4954d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4955d60d94a5126b93fda98678a68322abc2164073dbJim Ingham specifier_ap.reset(new SymbolContextSpecifier(m_interpreter.GetDebugger().GetSelectedTarget())); 4956d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4957d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!m_options.m_module_name.empty()) 4958d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4959d60d94a5126b93fda98678a68322abc2164073dbJim Ingham specifier_ap->AddSpecification (m_options.m_module_name.c_str(), SymbolContextSpecifier::eModuleSpecified); 4960d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4961d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4962d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!m_options.m_class_name.empty()) 4963d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4964d60d94a5126b93fda98678a68322abc2164073dbJim Ingham specifier_ap->AddSpecification (m_options.m_class_name.c_str(), SymbolContextSpecifier::eClassOrNamespaceSpecified); 4965d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4966d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4967d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!m_options.m_file_name.empty()) 4968d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4969d60d94a5126b93fda98678a68322abc2164073dbJim Ingham specifier_ap->AddSpecification (m_options.m_file_name.c_str(), SymbolContextSpecifier::eFileSpecified); 4970d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4971d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4972d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (m_options.m_line_start != 0) 4973d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4974d60d94a5126b93fda98678a68322abc2164073dbJim Ingham specifier_ap->AddLineSpecification (m_options.m_line_start, SymbolContextSpecifier::eLineStartSpecified); 4975d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4976d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4977d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (m_options.m_line_end != UINT_MAX) 4978d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4979d60d94a5126b93fda98678a68322abc2164073dbJim Ingham specifier_ap->AddLineSpecification (m_options.m_line_end, SymbolContextSpecifier::eLineEndSpecified); 4980d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4981d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4982d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!m_options.m_function_name.empty()) 4983d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4984d60d94a5126b93fda98678a68322abc2164073dbJim Ingham specifier_ap->AddSpecification (m_options.m_function_name.c_str(), SymbolContextSpecifier::eFunctionSpecified); 4985d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4986d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 4987d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4988d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (specifier_ap.get()) 4989d60d94a5126b93fda98678a68322abc2164073dbJim Ingham new_hook_sp->SetSpecifier (specifier_ap.release()); 4990d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4991d60d94a5126b93fda98678a68322abc2164073dbJim Ingham // Next see if any of the thread options have been entered: 4992d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4993d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (m_options.m_thread_specified) 4994d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4995d60d94a5126b93fda98678a68322abc2164073dbJim Ingham ThreadSpec *thread_spec = new ThreadSpec(); 4996d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 4997d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (m_options.m_thread_id != LLDB_INVALID_THREAD_ID) 4998d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 4999d60d94a5126b93fda98678a68322abc2164073dbJim Ingham thread_spec->SetTID (m_options.m_thread_id); 5000d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5001d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5002d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (m_options.m_thread_index != UINT32_MAX) 5003d60d94a5126b93fda98678a68322abc2164073dbJim Ingham thread_spec->SetIndex (m_options.m_thread_index); 5004d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5005d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!m_options.m_thread_name.empty()) 5006d60d94a5126b93fda98678a68322abc2164073dbJim Ingham thread_spec->SetName (m_options.m_thread_name.c_str()); 5007d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5008d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!m_options.m_queue_name.empty()) 5009d60d94a5126b93fda98678a68322abc2164073dbJim Ingham thread_spec->SetQueueName (m_options.m_queue_name.c_str()); 5010d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5011d60d94a5126b93fda98678a68322abc2164073dbJim Ingham new_hook_sp->SetThreadSpecifier (thread_spec); 5012d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5013d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 501460fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen if (m_options.m_use_one_liner) 5015d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 501660fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen // Use one-liner. 501760fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen new_hook_sp->GetCommandPointer()->AppendString (m_options.m_one_liner.c_str()); 50185f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat("Stop hook #%" PRIu64 " added.\n", new_hook_sp->GetID()); 5019d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 502060fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen else 5021d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 502260fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen // Otherwise gather up the command list, we'll push an input reader and suck the data from that directly into 502360fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen // the new stop hook's command string. 502460fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger())); 502560fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen if (!reader_sp) 502660fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen { 502760fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen result.AppendError("out of memory\n"); 502860fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen result.SetStatus (eReturnStatusFailed); 502960fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen target->RemoveStopHookByID (new_hook_sp->GetID()); 503060fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen return false; 503160fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen } 503260fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen 503360fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen Error err (reader_sp->Initialize (CommandObjectTargetStopHookAdd::ReadCommandsCallbackFunction, 503460fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen new_hook_sp.get(), // baton 503560fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen eInputReaderGranularityLine, // token size, to pass to callback function 503660fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen "DONE", // end token 503760fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen "> ", // prompt 503860fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen true)); // echo input 503960fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen if (!err.Success()) 504060fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen { 504160fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen result.AppendError (err.AsCString()); 504260fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen result.SetStatus (eReturnStatusFailed); 504360fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen target->RemoveStopHookByID (new_hook_sp->GetID()); 504460fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen return false; 504560fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen } 504660fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen m_interpreter.GetDebugger().PushInputReader (reader_sp); 5047d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5048d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 5049d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5050d60d94a5126b93fda98678a68322abc2164073dbJim Ingham else 5051d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5052abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("invalid target\n"); 5053d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus (eReturnStatusFailed); 5054d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5055d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5056d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return result.Succeeded(); 5057d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5058d60d94a5126b93fda98678a68322abc2164073dbJim Inghamprivate: 5059d60d94a5126b93fda98678a68322abc2164073dbJim Ingham CommandOptions m_options; 5060d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}; 5061d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5062b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 5063d60d94a5126b93fda98678a68322abc2164073dbJim InghamCommandObjectTargetStopHookAdd::CommandOptions::g_option_table[] = 5064d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{ 5065560c51483461697b2f78c145d70d0cd285012c4dFilipe Cabecinhas { LLDB_OPT_SET_ALL, false, "one-liner", 'o', required_argument, NULL, 0, eArgTypeOneLiner, 506660fe60e01f63e54f08cf306fae6cbc513de848b4Johnny Chen "Specify a one-line breakpoint command inline. Be sure to surround it with quotes." }, 5067d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { LLDB_OPT_SET_ALL, false, "shlib", 's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, 5068d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "Set the module within which the stop-hook is to be run."}, 5069560c51483461697b2f78c145d70d0cd285012c4dFilipe Cabecinhas { LLDB_OPT_SET_ALL, false, "thread-index", 'x', required_argument, NULL, 0, eArgTypeThreadIndex, 5070d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "The stop hook is run only for the thread whose index matches this argument."}, 5071560c51483461697b2f78c145d70d0cd285012c4dFilipe Cabecinhas { LLDB_OPT_SET_ALL, false, "thread-id", 't', required_argument, NULL, 0, eArgTypeThreadID, 5072d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "The stop hook is run only for the thread whose TID matches this argument."}, 5073560c51483461697b2f78c145d70d0cd285012c4dFilipe Cabecinhas { LLDB_OPT_SET_ALL, false, "thread-name", 'T', required_argument, NULL, 0, eArgTypeThreadName, 5074d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "The stop hook is run only for the thread whose thread name matches this argument."}, 5075560c51483461697b2f78c145d70d0cd285012c4dFilipe Cabecinhas { LLDB_OPT_SET_ALL, false, "queue-name", 'q', required_argument, NULL, 0, eArgTypeQueueName, 5076d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "The stop hook is run only for threads in the queue whose name is given by this argument."}, 5077d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, 5078d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "Specify the source file within which the stop-hook is to be run." }, 5079d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { LLDB_OPT_SET_1, false, "start-line", 'l', required_argument, NULL, 0, eArgTypeLineNum, 5080d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "Set the start of the line range for which the stop-hook is to be run."}, 5081d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { LLDB_OPT_SET_1, false, "end-line", 'e', required_argument, NULL, 0, eArgTypeLineNum, 5082d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "Set the end of the line range for which the stop-hook is to be run."}, 5083560c51483461697b2f78c145d70d0cd285012c4dFilipe Cabecinhas { LLDB_OPT_SET_2, false, "classname", 'c', required_argument, NULL, 0, eArgTypeClassName, 5084d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "Specify the class within which the stop-hook is to be run." }, 5085d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { LLDB_OPT_SET_3, false, "name", 'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeFunctionName, 5086d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "Set the function name within which the stop hook will be run." }, 5087d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 5088d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}; 5089d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5090d60d94a5126b93fda98678a68322abc2164073dbJim Ingham#pragma mark CommandObjectTargetStopHookDelete 5091d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5092d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 5093d60d94a5126b93fda98678a68322abc2164073dbJim Ingham// CommandObjectTargetStopHookDelete 5094d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 5095d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5096da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetStopHookDelete : public CommandObjectParsed 5097d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{ 5098d60d94a5126b93fda98678a68322abc2164073dbJim Inghampublic: 5099d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5100d60d94a5126b93fda98678a68322abc2164073dbJim Ingham CommandObjectTargetStopHookDelete (CommandInterpreter &interpreter) : 5101da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 5102da26bd203cbb104291b39891febf7481794f205fJim Ingham "target stop-hook delete", 5103da26bd203cbb104291b39891febf7481794f205fJim Ingham "Delete a stop-hook.", 5104da26bd203cbb104291b39891febf7481794f205fJim Ingham "target stop-hook delete [<idx>]") 5105d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5106d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5107d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5108d60d94a5126b93fda98678a68322abc2164073dbJim Ingham ~CommandObjectTargetStopHookDelete () 5109d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5110d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5111d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5112da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 5113d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool 5114da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 5115d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5116d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 5117d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (target) 5118d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5119d60d94a5126b93fda98678a68322abc2164073dbJim Ingham // FIXME: see if we can use the breakpoint id style parser? 5120d60d94a5126b93fda98678a68322abc2164073dbJim Ingham size_t num_args = command.GetArgumentCount(); 5121d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (num_args == 0) 5122d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5123d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!m_interpreter.Confirm ("Delete all stop hooks?", true)) 5124d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5125d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus (eReturnStatusFailed); 5126d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return false; 5127d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5128d60d94a5126b93fda98678a68322abc2164073dbJim Ingham else 5129d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5130d60d94a5126b93fda98678a68322abc2164073dbJim Ingham target->RemoveAllStopHooks(); 5131d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5132d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5133d60d94a5126b93fda98678a68322abc2164073dbJim Ingham else 5134d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5135d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool success; 5136d60d94a5126b93fda98678a68322abc2164073dbJim Ingham for (size_t i = 0; i < num_args; i++) 5137d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5138d60d94a5126b93fda98678a68322abc2164073dbJim Ingham lldb::user_id_t user_id = Args::StringToUInt32 (command.GetArgumentAtIndex(i), 0, 0, &success); 5139d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!success) 5140d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5141abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendErrorWithFormat ("invalid stop hook id: \"%s\".\n", command.GetArgumentAtIndex(i)); 5142d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus(eReturnStatusFailed); 5143d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return false; 5144d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5145d60d94a5126b93fda98678a68322abc2164073dbJim Ingham success = target->RemoveStopHookByID (user_id); 5146d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!success) 5147d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5148abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendErrorWithFormat ("unknown stop hook id: \"%s\".\n", command.GetArgumentAtIndex(i)); 5149d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus(eReturnStatusFailed); 5150d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return false; 5151d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5152d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5153d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5154d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 5155d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5156d60d94a5126b93fda98678a68322abc2164073dbJim Ingham else 5157d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5158abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("invalid target\n"); 5159d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus (eReturnStatusFailed); 5160d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5161d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5162d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return result.Succeeded(); 5163d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5164d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}; 5165d60d94a5126b93fda98678a68322abc2164073dbJim Ingham#pragma mark CommandObjectTargetStopHookEnableDisable 5166d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5167d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 5168d60d94a5126b93fda98678a68322abc2164073dbJim Ingham// CommandObjectTargetStopHookEnableDisable 5169d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 5170d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5171da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetStopHookEnableDisable : public CommandObjectParsed 5172d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{ 5173d60d94a5126b93fda98678a68322abc2164073dbJim Inghampublic: 5174d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5175d60d94a5126b93fda98678a68322abc2164073dbJim Ingham CommandObjectTargetStopHookEnableDisable (CommandInterpreter &interpreter, bool enable, const char *name, const char *help, const char *syntax) : 5176da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 5177da26bd203cbb104291b39891febf7481794f205fJim Ingham name, 5178da26bd203cbb104291b39891febf7481794f205fJim Ingham help, 5179da26bd203cbb104291b39891febf7481794f205fJim Ingham syntax), 5180d60d94a5126b93fda98678a68322abc2164073dbJim Ingham m_enable (enable) 5181d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5182d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5183d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5184d60d94a5126b93fda98678a68322abc2164073dbJim Ingham ~CommandObjectTargetStopHookEnableDisable () 5185d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5186d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5187d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5188da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 5189d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool 5190da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 5191d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5192d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 5193d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (target) 5194d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5195d60d94a5126b93fda98678a68322abc2164073dbJim Ingham // FIXME: see if we can use the breakpoint id style parser? 5196d60d94a5126b93fda98678a68322abc2164073dbJim Ingham size_t num_args = command.GetArgumentCount(); 5197d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool success; 5198d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5199d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (num_args == 0) 5200d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5201d60d94a5126b93fda98678a68322abc2164073dbJim Ingham target->SetAllStopHooksActiveState (m_enable); 5202d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5203d60d94a5126b93fda98678a68322abc2164073dbJim Ingham else 5204d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5205d60d94a5126b93fda98678a68322abc2164073dbJim Ingham for (size_t i = 0; i < num_args; i++) 5206d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5207d60d94a5126b93fda98678a68322abc2164073dbJim Ingham lldb::user_id_t user_id = Args::StringToUInt32 (command.GetArgumentAtIndex(i), 0, 0, &success); 5208d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!success) 5209d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5210abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendErrorWithFormat ("invalid stop hook id: \"%s\".\n", command.GetArgumentAtIndex(i)); 5211d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus(eReturnStatusFailed); 5212d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return false; 5213d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5214d60d94a5126b93fda98678a68322abc2164073dbJim Ingham success = target->SetStopHookActiveStateByID (user_id, m_enable); 5215d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (!success) 5216d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5217abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendErrorWithFormat ("unknown stop hook id: \"%s\".\n", command.GetArgumentAtIndex(i)); 5218d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus(eReturnStatusFailed); 5219d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return false; 5220d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5221d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5222d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5223d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 5224d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5225d60d94a5126b93fda98678a68322abc2164073dbJim Ingham else 5226d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5227abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("invalid target\n"); 5228d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus (eReturnStatusFailed); 5229d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5230d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return result.Succeeded(); 5231d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5232d60d94a5126b93fda98678a68322abc2164073dbJim Inghamprivate: 5233d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool m_enable; 5234d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}; 5235d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5236d60d94a5126b93fda98678a68322abc2164073dbJim Ingham#pragma mark CommandObjectTargetStopHookList 5237d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5238d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 5239d60d94a5126b93fda98678a68322abc2164073dbJim Ingham// CommandObjectTargetStopHookList 5240d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 5241d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5242da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectTargetStopHookList : public CommandObjectParsed 5243d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{ 5244d60d94a5126b93fda98678a68322abc2164073dbJim Inghampublic: 5245d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5246d60d94a5126b93fda98678a68322abc2164073dbJim Ingham CommandObjectTargetStopHookList (CommandInterpreter &interpreter) : 5247da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 5248da26bd203cbb104291b39891febf7481794f205fJim Ingham "target stop-hook list", 5249da26bd203cbb104291b39891febf7481794f205fJim Ingham "List all stop-hooks.", 5250da26bd203cbb104291b39891febf7481794f205fJim Ingham "target stop-hook list [<type>]") 5251d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5252d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5253d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5254d60d94a5126b93fda98678a68322abc2164073dbJim Ingham ~CommandObjectTargetStopHookList () 5255d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5256d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5257d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5258da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 5259d60d94a5126b93fda98678a68322abc2164073dbJim Ingham bool 5260da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 5261d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5262d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 52639fc1692b43fee52ba3f7e0fff2f0086b89d93145Johnny Chen if (!target) 5264d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5265abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton result.AppendError ("invalid target\n"); 5266d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.SetStatus (eReturnStatusFailed); 52676e3a24167f817567393682271af2ab2700cbdcbfJason Molenda return result.Succeeded(); 5268d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5269d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5270d60d94a5126b93fda98678a68322abc2164073dbJim Ingham size_t num_hooks = target->GetNumStopHooks (); 5271d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (num_hooks == 0) 5272d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5273d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.GetOutputStream().PutCString ("No stop hooks.\n"); 5274d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5275d60d94a5126b93fda98678a68322abc2164073dbJim Ingham else 5276d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5277d60d94a5126b93fda98678a68322abc2164073dbJim Ingham for (size_t i = 0; i < num_hooks; i++) 5278d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5279d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Target::StopHookSP this_hook = target->GetStopHookAtIndex (i); 5280d60d94a5126b93fda98678a68322abc2164073dbJim Ingham if (i > 0) 5281d60d94a5126b93fda98678a68322abc2164073dbJim Ingham result.GetOutputStream().PutCString ("\n"); 5282d60d94a5126b93fda98678a68322abc2164073dbJim Ingham this_hook->GetDescription (&(result.GetOutputStream()), eDescriptionLevelFull); 5283d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5284d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 52856c7c390d60a24600328f251cad61b8fd8a60fefbJohnny Chen result.SetStatus (eReturnStatusSuccessFinishResult); 5286d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return result.Succeeded(); 5287d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5288d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}; 5289d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5290d60d94a5126b93fda98678a68322abc2164073dbJim Ingham#pragma mark CommandObjectMultiwordTargetStopHooks 5291d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 5292d60d94a5126b93fda98678a68322abc2164073dbJim Ingham// CommandObjectMultiwordTargetStopHooks 5293d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//------------------------------------------------------------------------- 5294d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5295d60d94a5126b93fda98678a68322abc2164073dbJim Inghamclass CommandObjectMultiwordTargetStopHooks : public CommandObjectMultiword 5296d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{ 5297d60d94a5126b93fda98678a68322abc2164073dbJim Inghampublic: 5298d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5299d60d94a5126b93fda98678a68322abc2164073dbJim Ingham CommandObjectMultiwordTargetStopHooks (CommandInterpreter &interpreter) : 5300d60d94a5126b93fda98678a68322abc2164073dbJim Ingham CommandObjectMultiword (interpreter, 5301d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "target stop-hook", 5302d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "A set of commands for operating on debugger target stop-hooks.", 5303d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "target stop-hook <subcommand> [<subcommand-options>]") 5304d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5305d60d94a5126b93fda98678a68322abc2164073dbJim Ingham LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetStopHookAdd (interpreter))); 5306d60d94a5126b93fda98678a68322abc2164073dbJim Ingham LoadSubCommand ("delete", CommandObjectSP (new CommandObjectTargetStopHookDelete (interpreter))); 5307d60d94a5126b93fda98678a68322abc2164073dbJim Ingham LoadSubCommand ("disable", CommandObjectSP (new CommandObjectTargetStopHookEnableDisable (interpreter, 5308d60d94a5126b93fda98678a68322abc2164073dbJim Ingham false, 5309d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "target stop-hook disable [<id>]", 5310d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "Disable a stop-hook.", 5311d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "target stop-hook disable"))); 5312d60d94a5126b93fda98678a68322abc2164073dbJim Ingham LoadSubCommand ("enable", CommandObjectSP (new CommandObjectTargetStopHookEnableDisable (interpreter, 5313d60d94a5126b93fda98678a68322abc2164073dbJim Ingham true, 5314d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "target stop-hook enable [<id>]", 5315d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "Enable a stop-hook.", 5316d60d94a5126b93fda98678a68322abc2164073dbJim Ingham "target stop-hook enable"))); 5317d60d94a5126b93fda98678a68322abc2164073dbJim Ingham LoadSubCommand ("list", CommandObjectSP (new CommandObjectTargetStopHookList (interpreter))); 5318d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5319d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5320d60d94a5126b93fda98678a68322abc2164073dbJim Ingham ~CommandObjectMultiwordTargetStopHooks() 5321d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 5322d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 5323d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}; 5324d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 5325d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 532624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 532724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectMultiwordTarget 532824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 532924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 533024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordTarget 533124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 533224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 533363094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiwordTarget::CommandObjectMultiwordTarget (CommandInterpreter &interpreter) : 5334238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 5335238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "target", 533624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "A set of commands for operating on debugger targets.", 533724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "target <subcommand> [<subcommand-options>]") 533824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5339abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 5340abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton LoadSubCommand ("create", CommandObjectSP (new CommandObjectTargetCreate (interpreter))); 5341153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton LoadSubCommand ("delete", CommandObjectSP (new CommandObjectTargetDelete (interpreter))); 5342abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectTargetList (interpreter))); 5343abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton LoadSubCommand ("select", CommandObjectSP (new CommandObjectTargetSelect (interpreter))); 5344d60d94a5126b93fda98678a68322abc2164073dbJim Ingham LoadSubCommand ("stop-hook", CommandObjectSP (new CommandObjectMultiwordTargetStopHooks (interpreter))); 5345e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton LoadSubCommand ("modules", CommandObjectSP (new CommandObjectTargetModules (interpreter))); 53463508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton LoadSubCommand ("symbols", CommandObjectSP (new CommandObjectTargetSymbols (interpreter))); 5347801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton LoadSubCommand ("variable", CommandObjectSP (new CommandObjectTargetVariable (interpreter))); 534824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 534924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 535024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiwordTarget::~CommandObjectMultiwordTarget () 535124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 535224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 535324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5354abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 5355