blob: dc67e50ee723da52058a7c975751f3724e8d5219 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- CommandObjectTarget.cpp ---------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "CommandObjectTarget.h"
11
12// C Includes
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013// C++ Includes
Eugene Zelenkof13e6522016-02-25 19:02:39 +000014#include <cerrno>
15
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016// Other libraries and framework includes
17// Project includes
Jim Ingham40af72e2010-06-15 19:49:27 +000018#include "lldb/Interpreter/Args.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Core/Debugger.h"
Greg Clayton44d93782014-01-27 23:43:24 +000020#include "lldb/Core/IOHandler.h"
Greg Clayton1f746072012-08-29 21:13:06 +000021#include "lldb/Core/Module.h"
22#include "lldb/Core/ModuleSpec.h"
Greg Claytoneffe5c92011-05-03 22:09:39 +000023#include "lldb/Core/Section.h"
Greg Clayton7260f622011-04-18 08:33:37 +000024#include "lldb/Core/State.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025#include "lldb/Core/Timer.h"
Greg Clayton644247c2011-07-07 01:59:51 +000026#include "lldb/Core/ValueObjectVariable.h"
Enrico Granata4d93b8c2013-09-30 19:11:51 +000027#include "lldb/DataFormatters/ValueObjectPrinter.h"
Vince Harron5275aaa2015-01-15 20:08:35 +000028#include "lldb/Host/StringConvert.h"
Greg Claytonc8f814d2012-09-27 03:13:55 +000029#include "lldb/Host/Symbols.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030#include "lldb/Interpreter/CommandInterpreter.h"
31#include "lldb/Interpreter/CommandReturnObject.h"
Greg Claytoneffe5c92011-05-03 22:09:39 +000032#include "lldb/Interpreter/Options.h"
Greg Clayton7260f622011-04-18 08:33:37 +000033#include "lldb/Interpreter/OptionGroupArchitecture.h"
Greg Claytonaa149cb2011-08-11 02:48:45 +000034#include "lldb/Interpreter/OptionGroupBoolean.h"
Greg Claytoneffe5c92011-05-03 22:09:39 +000035#include "lldb/Interpreter/OptionGroupFile.h"
Greg Clayton1deb7962011-10-25 06:44:01 +000036#include "lldb/Interpreter/OptionGroupFormat.h"
Greg Clayton715c2362011-07-07 04:38:25 +000037#include "lldb/Interpreter/OptionGroupVariable.h"
Greg Clayton7260f622011-04-18 08:33:37 +000038#include "lldb/Interpreter/OptionGroupPlatform.h"
Greg Claytoneffe5c92011-05-03 22:09:39 +000039#include "lldb/Interpreter/OptionGroupUInt64.h"
40#include "lldb/Interpreter/OptionGroupUUID.h"
Jason Molendac6127dd2014-11-21 02:25:15 +000041#include "lldb/Interpreter/OptionGroupString.h"
Greg Clayton644247c2011-07-07 01:59:51 +000042#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
Greg Clayton1f746072012-08-29 21:13:06 +000043#include "lldb/Symbol/CompileUnit.h"
Jason Molenda380241a2012-07-12 00:20:07 +000044#include "lldb/Symbol/FuncUnwinders.h"
Greg Claytoneffe5c92011-05-03 22:09:39 +000045#include "lldb/Symbol/LineTable.h"
46#include "lldb/Symbol/ObjectFile.h"
47#include "lldb/Symbol/SymbolFile.h"
48#include "lldb/Symbol/SymbolVendor.h"
Jason Molenda380241a2012-07-12 00:20:07 +000049#include "lldb/Symbol/UnwindPlan.h"
Greg Clayton644247c2011-07-07 01:59:51 +000050#include "lldb/Symbol/VariableList.h"
Zachary Turner32abc6e2015-03-03 19:23:09 +000051#include "lldb/Target/ABI.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000052#include "lldb/Target/Process.h"
Greg Claytond5944cd2013-12-06 01:12:00 +000053#include "lldb/Target/SectionLoadList.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000054#include "lldb/Target/StackFrame.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055#include "lldb/Target/Thread.h"
Jim Ingham9575d842011-03-11 03:53:59 +000056#include "lldb/Target/ThreadSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057
58using namespace lldb;
59using namespace lldb_private;
60
Greg Clayton7260f622011-04-18 08:33:37 +000061static void
62DumpTargetInfo (uint32_t target_idx, Target *target, const char *prefix_cstr, bool show_stopped_process_status, Stream &strm)
63{
Greg Clayton176761e2011-04-19 04:19:37 +000064 const ArchSpec &target_arch = target->GetArchitecture();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000065
Greg Claytonaa149cb2011-08-11 02:48:45 +000066 Module *exe_module = target->GetExecutableModulePointer();
Greg Clayton7260f622011-04-18 08:33:37 +000067 char exe_path[PATH_MAX];
68 bool exe_valid = false;
Greg Claytonaa149cb2011-08-11 02:48:45 +000069 if (exe_module)
70 exe_valid = exe_module->GetFileSpec().GetPath (exe_path, sizeof(exe_path));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000071
Greg Clayton7260f622011-04-18 08:33:37 +000072 if (!exe_valid)
73 ::strcpy (exe_path, "<none>");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000074
Greg Clayton7260f622011-04-18 08:33:37 +000075 strm.Printf ("%starget #%u: %s", prefix_cstr ? prefix_cstr : "", target_idx, exe_path);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000076
Greg Clayton7260f622011-04-18 08:33:37 +000077 uint32_t properties = 0;
78 if (target_arch.IsValid())
79 {
Todd Fiala7df337f2015-10-13 23:41:19 +000080 strm.Printf ("%sarch=", properties++ > 0 ? ", " : " ( ");
81 target_arch.DumpTriple (strm);
Greg Clayton7260f622011-04-18 08:33:37 +000082 properties++;
83 }
84 PlatformSP platform_sp (target->GetPlatform());
85 if (platform_sp)
Greg Clayton57abc5d2013-05-10 21:47:16 +000086 strm.Printf ("%splatform=%s", properties++ > 0 ? ", " : " ( ", platform_sp->GetName().GetCString());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000087
Greg Clayton7260f622011-04-18 08:33:37 +000088 ProcessSP process_sp (target->GetProcessSP());
89 bool show_process_status = false;
90 if (process_sp)
91 {
92 lldb::pid_t pid = process_sp->GetID();
93 StateType state = process_sp->GetState();
94 if (show_stopped_process_status)
Greg Clayton2637f822011-11-17 01:23:07 +000095 show_process_status = StateIsStoppedState(state, true);
Greg Clayton7260f622011-04-18 08:33:37 +000096 const char *state_cstr = StateAsCString (state);
97 if (pid != LLDB_INVALID_PROCESS_ID)
Daniel Malead01b2952012-11-29 21:49:15 +000098 strm.Printf ("%spid=%" PRIu64, properties++ > 0 ? ", " : " ( ", pid);
Greg Clayton7260f622011-04-18 08:33:37 +000099 strm.Printf ("%sstate=%s", properties++ > 0 ? ", " : " ( ", state_cstr);
100 }
101 if (properties > 0)
102 strm.PutCString (" )\n");
103 else
104 strm.EOL();
105 if (show_process_status)
106 {
107 const bool only_threads_with_stop_reason = true;
108 const uint32_t start_frame = 0;
109 const uint32_t num_frames = 1;
110 const uint32_t num_frames_with_source = 1;
111 process_sp->GetStatus (strm);
112 process_sp->GetThreadStatus (strm,
113 only_threads_with_stop_reason,
114 start_frame,
115 num_frames,
116 num_frames_with_source);
117
118 }
119}
120
121static uint32_t
122DumpTargetList (TargetList &target_list, bool show_stopped_process_status, Stream &strm)
123{
124 const uint32_t num_targets = target_list.GetNumTargets();
125 if (num_targets)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000126 {
Greg Clayton7260f622011-04-18 08:33:37 +0000127 TargetSP selected_target_sp (target_list.GetSelectedTarget());
128 strm.PutCString ("Current targets:\n");
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000129 for (uint32_t i = 0; i < num_targets; ++i)
Greg Clayton7260f622011-04-18 08:33:37 +0000130 {
131 TargetSP target_sp (target_list.GetTargetAtIndex (i));
132 if (target_sp)
133 {
134 bool is_selected = target_sp.get() == selected_target_sp.get();
135 DumpTargetInfo (i,
136 target_sp.get(),
137 is_selected ? "* " : " ",
138 show_stopped_process_status,
139 strm);
140 }
141 }
142 }
143 return num_targets;
144}
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000145
Greg Clayton7260f622011-04-18 08:33:37 +0000146#pragma mark CommandObjectTargetCreate
147
148//-------------------------------------------------------------------------
149// "target create"
150//-------------------------------------------------------------------------
151
Jim Ingham5a988412012-06-08 21:56:10 +0000152class CommandObjectTargetCreate : public CommandObjectParsed
Greg Clayton7260f622011-04-18 08:33:37 +0000153{
154public:
155 CommandObjectTargetCreate(CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000156 CommandObjectParsed(interpreter,
157 "target create",
158 "Create a target using the argument as the main executable.",
159 nullptr),
Todd Fialae1cfbc72016-08-11 23:51:28 +0000160 m_option_group (),
Greg Clayton644247c2011-07-07 01:59:51 +0000161 m_arch_option (),
Greg Clayton1c5f1862012-11-30 19:05:35 +0000162 m_core_file (LLDB_OPT_SET_1, false, "core", 'c', 0, eArgTypeFilename, "Fullpath to a core file to use for this target."),
Daniel Maleae0f8f572013-08-26 23:57:52 +0000163 m_platform_path (LLDB_OPT_SET_1, false, "platform-path", 'P', 0, eArgTypePath, "Path to the remote file to use for this target."),
Greg Clayton1c5f1862012-11-30 19:05:35 +0000164 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."),
Jim Inghambf22b962013-07-11 01:47:46 +0000165 m_remote_file (LLDB_OPT_SET_1, false, "remote-file", 'r', 0, eArgTypeFilename, "Fullpath to the file on the remote host if debugging remotely."),
Greg Clayton1c5f1862012-11-30 19:05:35 +0000166 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)
Greg Clayton7260f622011-04-18 08:33:37 +0000167 {
168 CommandArgumentEntry arg;
169 CommandArgumentData file_arg;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000170
Greg Clayton7260f622011-04-18 08:33:37 +0000171 // Define the first (and only) variant of this arg.
172 file_arg.arg_type = eArgTypeFilename;
173 file_arg.arg_repetition = eArgRepeatPlain;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000174
Greg Clayton7260f622011-04-18 08:33:37 +0000175 // There is only one variant this argument could be; put it into the argument entry.
176 arg.push_back (file_arg);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000177
Greg Clayton7260f622011-04-18 08:33:37 +0000178 // Push the data for the first argument into the m_arguments vector.
179 m_arguments.push_back (arg);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000180
Greg Clayton644247c2011-07-07 01:59:51 +0000181 m_option_group.Append (&m_arch_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Greg Claytonc3776bf2012-02-09 06:16:32 +0000182 m_option_group.Append (&m_core_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Daniel Maleae0f8f572013-08-26 23:57:52 +0000183 m_option_group.Append (&m_platform_path, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Greg Clayton1c5f1862012-11-30 19:05:35 +0000184 m_option_group.Append (&m_symbol_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Jim Inghambf22b962013-07-11 01:47:46 +0000185 m_option_group.Append (&m_remote_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Greg Clayton1c5f1862012-11-30 19:05:35 +0000186 m_option_group.Append (&m_add_dependents, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Greg Clayton7260f622011-04-18 08:33:37 +0000187 m_option_group.Finalize();
188 }
189
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000190 ~CommandObjectTargetCreate() override = default;
Greg Clayton7260f622011-04-18 08:33:37 +0000191
192 Options *
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000193 GetOptions () override
Greg Clayton7260f622011-04-18 08:33:37 +0000194 {
195 return &m_option_group;
196 }
197
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000198 int
Jim Ingham5a988412012-06-08 21:56:10 +0000199 HandleArgumentCompletion (Args &input,
200 int &cursor_index,
201 int &cursor_char_position,
202 OptionElementVector &opt_element_vector,
203 int match_start_point,
204 int max_return_elements,
205 bool &word_complete,
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000206 StringList &matches) override
Jim Ingham5a988412012-06-08 21:56:10 +0000207 {
208 std::string completion_str (input.GetArgumentAtIndex(cursor_index));
209 completion_str.erase (cursor_char_position);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000210
Todd Fialae1cfbc72016-08-11 23:51:28 +0000211 CommandCompletions::InvokeCommonCompletionCallbacks(GetCommandInterpreter(),
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000212 CommandCompletions::eDiskFileCompletion,
213 completion_str.c_str(),
214 match_start_point,
215 max_return_elements,
216 nullptr,
217 word_complete,
218 matches);
Jim Ingham5a988412012-06-08 21:56:10 +0000219 return matches.GetSize();
220 }
221
222protected:
Greg Clayton7260f622011-04-18 08:33:37 +0000223 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000224 DoExecute (Args& command, CommandReturnObject &result) override
Greg Clayton7260f622011-04-18 08:33:37 +0000225 {
Greg Claytonc7bece562013-01-25 18:06:21 +0000226 const size_t argc = command.GetArgumentCount();
Greg Claytonc3776bf2012-02-09 06:16:32 +0000227 FileSpec core_file (m_core_file.GetOptionValue().GetCurrentValue());
Jim Inghambf22b962013-07-11 01:47:46 +0000228 FileSpec remote_file (m_remote_file.GetOptionValue().GetCurrentValue());
Greg Claytonc3776bf2012-02-09 06:16:32 +0000229
Greg Clayton5acc1252014-08-15 18:00:45 +0000230 if (core_file)
231 {
232 if (!core_file.Exists())
233 {
234 result.AppendErrorWithFormat("core file '%s' doesn't exist", core_file.GetPath().c_str());
235 result.SetStatus (eReturnStatusFailed);
236 return false;
237
238 }
239 if (!core_file.Readable())
240 {
241 result.AppendErrorWithFormat("core file '%s' is not readable", core_file.GetPath().c_str());
242 result.SetStatus (eReturnStatusFailed);
243 return false;
244 }
245 }
246
Daniel Maleae0f8f572013-08-26 23:57:52 +0000247 if (argc == 1 || core_file || remote_file)
Greg Clayton7260f622011-04-18 08:33:37 +0000248 {
Greg Clayton1c5f1862012-11-30 19:05:35 +0000249 FileSpec symfile (m_symbol_file.GetOptionValue().GetCurrentValue());
250 if (symfile)
251 {
Greg Clayton5acc1252014-08-15 18:00:45 +0000252 if (symfile.Exists())
253 {
254 if (!symfile.Readable())
255 {
Adrian McCarthyf7d18932015-11-20 23:09:11 +0000256 result.AppendErrorWithFormat("symbol file '%s' is not readable", symfile.GetPath().c_str());
Greg Clayton5acc1252014-08-15 18:00:45 +0000257 result.SetStatus (eReturnStatusFailed);
258 return false;
259 }
260 }
261 else
Greg Clayton1c5f1862012-11-30 19:05:35 +0000262 {
263 char symfile_path[PATH_MAX];
264 symfile.GetPath(symfile_path, sizeof(symfile_path));
265 result.AppendErrorWithFormat("invalid symbol file path '%s'", symfile_path);
266 result.SetStatus (eReturnStatusFailed);
267 return false;
268 }
269 }
270
Greg Clayton7260f622011-04-18 08:33:37 +0000271 const char *file_path = command.GetArgumentAtIndex(0);
Zachary Turnerf343968f2016-08-09 23:06:08 +0000272 Timer scoped_timer(LLVM_PRETTY_FUNCTION, "(lldb) target create '%s'", file_path);
Daniel Maleae0f8f572013-08-26 23:57:52 +0000273 FileSpec file_spec;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000274
Daniel Maleae0f8f572013-08-26 23:57:52 +0000275 if (file_path)
276 file_spec.SetFile (file_path, true);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000277
Daniel Maleae0f8f572013-08-26 23:57:52 +0000278 bool must_set_platform_path = false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000279
Greg Clayton7260f622011-04-18 08:33:37 +0000280 Debugger &debugger = m_interpreter.GetDebugger();
Daniel Maleae0f8f572013-08-26 23:57:52 +0000281
282 TargetSP target_sp;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000283 const char *arch_cstr = m_arch_option.GetArchitectureName();
Greg Clayton1c5f1862012-11-30 19:05:35 +0000284 const bool get_dependent_files = m_add_dependents.GetOptionValue().GetCurrentValue();
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000285 Error error(debugger.GetTargetList().CreateTarget(debugger,
286 file_path,
287 arch_cstr,
288 get_dependent_files,
289 nullptr,
290 target_sp));
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000291
Greg Clayton7260f622011-04-18 08:33:37 +0000292 if (target_sp)
293 {
Greg Claytond26a1e52015-01-28 22:08:17 +0000294 // Only get the platform after we create the target because we might have
295 // switched platforms depending on what the arguments were to CreateTarget()
296 // we can't rely on the selected platform.
297
298 PlatformSP platform_sp = target_sp->GetPlatform();
299
300 if (remote_file)
301 {
302 if (platform_sp)
303 {
304 // I have a remote file.. two possible cases
305 if (file_spec && file_spec.Exists())
306 {
307 // if the remote file does not exist, push it there
308 if (!platform_sp->GetFileExists (remote_file))
309 {
310 Error err = platform_sp->PutFile(file_spec, remote_file);
311 if (err.Fail())
312 {
313 result.AppendError(err.AsCString());
314 result.SetStatus (eReturnStatusFailed);
315 return false;
316 }
317 }
318 }
319 else
320 {
321 // there is no local file and we need one
322 // in order to make the remote ---> local transfer we need a platform
323 // TODO: if the user has passed in a --platform argument, use it to fetch the right platform
324 if (!platform_sp)
325 {
326 result.AppendError("unable to perform remote debugging without a platform");
327 result.SetStatus (eReturnStatusFailed);
328 return false;
329 }
330 if (file_path)
331 {
332 // copy the remote file to the local file
333 Error err = platform_sp->GetFile(remote_file, file_spec);
334 if (err.Fail())
335 {
336 result.AppendError(err.AsCString());
337 result.SetStatus (eReturnStatusFailed);
338 return false;
339 }
340 }
341 else
342 {
343 // make up a local file
344 result.AppendError("remote --> local transfer without local path is not implemented yet");
345 result.SetStatus (eReturnStatusFailed);
346 return false;
347 }
348 }
349 }
350 else
351 {
352 result.AppendError("no platform found for target");
353 result.SetStatus (eReturnStatusFailed);
354 return false;
355 }
356 }
357
Jim Inghambf22b962013-07-11 01:47:46 +0000358 if (symfile || remote_file)
Greg Clayton1c5f1862012-11-30 19:05:35 +0000359 {
360 ModuleSP module_sp (target_sp->GetExecutableModule());
361 if (module_sp)
Jim Inghambf22b962013-07-11 01:47:46 +0000362 {
363 if (symfile)
364 module_sp->SetSymbolFileFileSpec(symfile);
365 if (remote_file)
366 {
367 std::string remote_path = remote_file.GetPath();
368 target_sp->SetArg0(remote_path.c_str());
369 module_sp->SetPlatformFileSpec(remote_file);
370 }
371 }
Greg Clayton1c5f1862012-11-30 19:05:35 +0000372 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000373
Greg Clayton7260f622011-04-18 08:33:37 +0000374 debugger.GetTargetList().SetSelectedTarget(target_sp.get());
Daniel Maleae0f8f572013-08-26 23:57:52 +0000375 if (must_set_platform_path)
376 {
377 ModuleSpec main_module_spec(file_spec);
378 ModuleSP module_sp = target_sp->GetSharedModule(main_module_spec);
379 if (module_sp)
380 module_sp->SetPlatformFileSpec(remote_file);
381 }
Greg Claytonc3776bf2012-02-09 06:16:32 +0000382 if (core_file)
383 {
Greg Claytonc3776bf2012-02-09 06:16:32 +0000384 char core_path[PATH_MAX];
385 core_file.GetPath(core_path, sizeof(core_path));
Greg Claytonc859e2d2012-02-13 23:10:39 +0000386 if (core_file.Exists())
Greg Claytonc3776bf2012-02-09 06:16:32 +0000387 {
Jason Molenda25c91012015-06-26 02:16:48 +0000388 if (!core_file.Readable())
389 {
390 result.AppendMessageWithFormat ("Core file '%s' is not readable.\n", core_path);
391 result.SetStatus (eReturnStatusFailed);
392 return false;
393 }
Greg Claytonc859e2d2012-02-13 23:10:39 +0000394 FileSpec core_file_dir;
395 core_file_dir.GetDirectory() = core_file.GetDirectory();
396 target_sp->GetExecutableSearchPaths ().Append (core_file_dir);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000397
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000398 ProcessSP process_sp(target_sp->CreateProcess(m_interpreter.GetDebugger().GetListener(), nullptr, &core_file));
Greg Claytonc859e2d2012-02-13 23:10:39 +0000399
400 if (process_sp)
Greg Claytonc3776bf2012-02-09 06:16:32 +0000401 {
Bruce Mitchener4d31a482015-10-07 10:11:10 +0000402 // Seems weird that we Launch a core file, but that is
Greg Claytonc859e2d2012-02-13 23:10:39 +0000403 // what we do!
404 error = process_sp->LoadCore();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000405
Greg Claytonc859e2d2012-02-13 23:10:39 +0000406 if (error.Fail())
407 {
408 result.AppendError(error.AsCString("can't find plug-in for core file"));
409 result.SetStatus (eReturnStatusFailed);
410 return false;
411 }
412 else
413 {
414 result.AppendMessageWithFormat ("Core file '%s' (%s) was loaded.\n", core_path, target_sp->GetArchitecture().GetArchitectureName());
415 result.SetStatus (eReturnStatusSuccessFinishNoResult);
416 }
Greg Claytonc3776bf2012-02-09 06:16:32 +0000417 }
418 else
419 {
Greg Claytonc859e2d2012-02-13 23:10:39 +0000420 result.AppendErrorWithFormat ("Unable to find process plug-in for core file '%s'\n", core_path);
421 result.SetStatus (eReturnStatusFailed);
Greg Claytonc3776bf2012-02-09 06:16:32 +0000422 }
423 }
424 else
425 {
Greg Claytonc859e2d2012-02-13 23:10:39 +0000426 result.AppendErrorWithFormat ("Core file '%s' does not exist\n", core_path);
Greg Claytonc3776bf2012-02-09 06:16:32 +0000427 result.SetStatus (eReturnStatusFailed);
428 }
429 }
430 else
431 {
432 result.AppendMessageWithFormat ("Current executable set to '%s' (%s).\n", file_path, target_sp->GetArchitecture().GetArchitectureName());
433 result.SetStatus (eReturnStatusSuccessFinishNoResult);
434 }
Greg Clayton7260f622011-04-18 08:33:37 +0000435 }
436 else
437 {
438 result.AppendError(error.AsCString());
439 result.SetStatus (eReturnStatusFailed);
440 }
441 }
442 else
443 {
Jason Molenda65e06422015-01-20 03:06:17 +0000444 result.AppendErrorWithFormat("'%s' takes exactly one executable path argument, or use the --core option.\n", m_cmd_name.c_str());
Greg Clayton7260f622011-04-18 08:33:37 +0000445 result.SetStatus (eReturnStatusFailed);
446 }
447 return result.Succeeded();
Greg Clayton7260f622011-04-18 08:33:37 +0000448 }
449
Greg Clayton7260f622011-04-18 08:33:37 +0000450private:
451 OptionGroupOptions m_option_group;
Greg Clayton644247c2011-07-07 01:59:51 +0000452 OptionGroupArchitecture m_arch_option;
Greg Claytonc3776bf2012-02-09 06:16:32 +0000453 OptionGroupFile m_core_file;
Daniel Maleae0f8f572013-08-26 23:57:52 +0000454 OptionGroupFile m_platform_path;
Greg Clayton1c5f1862012-11-30 19:05:35 +0000455 OptionGroupFile m_symbol_file;
Jim Inghambf22b962013-07-11 01:47:46 +0000456 OptionGroupFile m_remote_file;
Greg Clayton1c5f1862012-11-30 19:05:35 +0000457 OptionGroupBoolean m_add_dependents;
Greg Clayton7260f622011-04-18 08:33:37 +0000458};
459
460#pragma mark CommandObjectTargetList
461
462//----------------------------------------------------------------------
463// "target list"
464//----------------------------------------------------------------------
465
Jim Ingham5a988412012-06-08 21:56:10 +0000466class CommandObjectTargetList : public CommandObjectParsed
Greg Clayton7260f622011-04-18 08:33:37 +0000467{
468public:
469 CommandObjectTargetList (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000470 CommandObjectParsed(interpreter,
471 "target list",
472 "List all current targets in the current debug session.",
473 nullptr)
Greg Clayton7260f622011-04-18 08:33:37 +0000474 {
475 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000476
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000477 ~CommandObjectTargetList() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000478
Jim Ingham5a988412012-06-08 21:56:10 +0000479protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000480 bool
481 DoExecute (Args& args, CommandReturnObject &result) override
Greg Clayton7260f622011-04-18 08:33:37 +0000482 {
483 if (args.GetArgumentCount() == 0)
484 {
485 Stream &strm = result.GetOutputStream();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000486
Greg Clayton7260f622011-04-18 08:33:37 +0000487 bool show_stopped_process_status = false;
488 if (DumpTargetList (m_interpreter.GetDebugger().GetTargetList(), show_stopped_process_status, strm) == 0)
489 {
490 strm.PutCString ("No targets.\n");
491 }
Johnny Chen1ee61a72011-04-18 21:08:05 +0000492 result.SetStatus (eReturnStatusSuccessFinishResult);
Greg Clayton7260f622011-04-18 08:33:37 +0000493 }
494 else
495 {
496 result.AppendError ("the 'target list' command takes no arguments\n");
497 result.SetStatus (eReturnStatusFailed);
498 }
499 return result.Succeeded();
500 }
501};
502
Greg Clayton7260f622011-04-18 08:33:37 +0000503#pragma mark CommandObjectTargetSelect
504
505//----------------------------------------------------------------------
506// "target select"
507//----------------------------------------------------------------------
508
Jim Ingham5a988412012-06-08 21:56:10 +0000509class CommandObjectTargetSelect : public CommandObjectParsed
Greg Clayton7260f622011-04-18 08:33:37 +0000510{
511public:
512 CommandObjectTargetSelect (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000513 CommandObjectParsed(interpreter,
514 "target select",
515 "Select a target as the current target by target index.",
516 nullptr)
Greg Clayton7260f622011-04-18 08:33:37 +0000517 {
518 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000519
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000520 ~CommandObjectTargetSelect() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000521
Jim Ingham5a988412012-06-08 21:56:10 +0000522protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000523 bool
524 DoExecute (Args& args, CommandReturnObject &result) override
Greg Clayton7260f622011-04-18 08:33:37 +0000525 {
526 if (args.GetArgumentCount() == 1)
527 {
528 bool success = false;
529 const char *target_idx_arg = args.GetArgumentAtIndex(0);
Vince Harron5275aaa2015-01-15 20:08:35 +0000530 uint32_t target_idx = StringConvert::ToUInt32 (target_idx_arg, UINT32_MAX, 0, &success);
Greg Clayton7260f622011-04-18 08:33:37 +0000531 if (success)
532 {
533 TargetList &target_list = m_interpreter.GetDebugger().GetTargetList();
534 const uint32_t num_targets = target_list.GetNumTargets();
535 if (target_idx < num_targets)
536 {
537 TargetSP target_sp (target_list.GetTargetAtIndex (target_idx));
538 if (target_sp)
539 {
540 Stream &strm = result.GetOutputStream();
541 target_list.SetSelectedTarget (target_sp.get());
542 bool show_stopped_process_status = false;
543 DumpTargetList (target_list, show_stopped_process_status, strm);
Johnny Chen1ee61a72011-04-18 21:08:05 +0000544 result.SetStatus (eReturnStatusSuccessFinishResult);
Greg Clayton7260f622011-04-18 08:33:37 +0000545 }
546 else
547 {
548 result.AppendErrorWithFormat ("target #%u is NULL in target list\n", target_idx);
549 result.SetStatus (eReturnStatusFailed);
550 }
551 }
552 else
553 {
Todd Fiala352237d2014-08-29 20:14:21 +0000554 if (num_targets > 0)
555 {
556 result.AppendErrorWithFormat ("index %u is out of range, valid target indexes are 0 - %u\n",
557 target_idx,
558 num_targets - 1);
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000559 }
560 else
Todd Fiala352237d2014-08-29 20:14:21 +0000561 {
562 result.AppendErrorWithFormat ("index %u is out of range since there are no active targets\n",
563 target_idx);
564 }
Greg Clayton7260f622011-04-18 08:33:37 +0000565 result.SetStatus (eReturnStatusFailed);
566 }
567 }
568 else
569 {
570 result.AppendErrorWithFormat("invalid index string value '%s'\n", target_idx_arg);
571 result.SetStatus (eReturnStatusFailed);
572 }
573 }
574 else
575 {
576 result.AppendError ("'target select' takes a single argument: a target index\n");
577 result.SetStatus (eReturnStatusFailed);
578 }
579 return result.Succeeded();
580 }
581};
582
Greg Clayton3418c852011-08-10 02:10:13 +0000583#pragma mark CommandObjectTargetSelect
584
585//----------------------------------------------------------------------
586// "target delete"
587//----------------------------------------------------------------------
588
Jim Ingham5a988412012-06-08 21:56:10 +0000589class CommandObjectTargetDelete : public CommandObjectParsed
Greg Clayton3418c852011-08-10 02:10:13 +0000590{
591public:
592 CommandObjectTargetDelete (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000593 CommandObjectParsed(interpreter,
594 "target delete",
595 "Delete one or more targets by target index.",
596 nullptr),
Todd Fialae1cfbc72016-08-11 23:51:28 +0000597 m_option_group(),
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000598 m_all_option(LLDB_OPT_SET_1, false, "all", 'a', "Delete all targets.", false, true),
599 m_cleanup_option(
600 LLDB_OPT_SET_1,
601 false,
602 "clean", 'c',
603 "Perform extra cleanup to minimize memory consumption after deleting the target. "
604 "By default, LLDB will keep in memory any modules previously loaded by the target as well "
605 "as all of its debug info. Specifying --clean will unload all of these shared modules and "
606 "cause them to be reparsed again the next time the target is run",
607 false, true)
Greg Clayton3418c852011-08-10 02:10:13 +0000608 {
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000609 m_option_group.Append(&m_all_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
610 m_option_group.Append(&m_cleanup_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Greg Claytonaa149cb2011-08-11 02:48:45 +0000611 m_option_group.Finalize();
Greg Clayton3418c852011-08-10 02:10:13 +0000612 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000613
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000614 ~CommandObjectTargetDelete() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000615
Jim Ingham5a988412012-06-08 21:56:10 +0000616 Options *
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000617 GetOptions () override
Jim Ingham5a988412012-06-08 21:56:10 +0000618 {
619 return &m_option_group;
620 }
621
622protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000623 bool
624 DoExecute (Args& args, CommandReturnObject &result) override
Greg Clayton3418c852011-08-10 02:10:13 +0000625 {
626 const size_t argc = args.GetArgumentCount();
627 std::vector<TargetSP> delete_target_list;
628 TargetList &target_list = m_interpreter.GetDebugger().GetTargetList();
Greg Clayton3418c852011-08-10 02:10:13 +0000629 TargetSP target_sp;
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000630
631 if (m_all_option.GetOptionValue())
632 {
David Blaikiedab893c2015-03-27 20:19:14 +0000633 for (int i = 0; i < target_list.GetNumTargets(); ++i)
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000634 delete_target_list.push_back(target_list.GetTargetAtIndex(i));
635 }
636 else if (argc > 0)
Greg Clayton3418c852011-08-10 02:10:13 +0000637 {
638 const uint32_t num_targets = target_list.GetNumTargets();
Filipe Cabecinhasf065fdc2012-07-09 13:02:17 +0000639 // Bail out if don't have any targets.
640 if (num_targets == 0) {
641 result.AppendError("no targets to delete");
642 result.SetStatus(eReturnStatusFailed);
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000643 return false;
Filipe Cabecinhasf065fdc2012-07-09 13:02:17 +0000644 }
645
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000646 for (uint32_t arg_idx = 0; arg_idx < argc; ++arg_idx)
Greg Clayton3418c852011-08-10 02:10:13 +0000647 {
648 const char *target_idx_arg = args.GetArgumentAtIndex(arg_idx);
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000649 bool success = false;
Vince Harron5275aaa2015-01-15 20:08:35 +0000650 uint32_t target_idx = StringConvert::ToUInt32 (target_idx_arg, UINT32_MAX, 0, &success);
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000651 if (!success)
Greg Clayton3418c852011-08-10 02:10:13 +0000652 {
653 result.AppendErrorWithFormat("invalid target index '%s'\n", target_idx_arg);
654 result.SetStatus (eReturnStatusFailed);
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000655 return false;
Greg Clayton3418c852011-08-10 02:10:13 +0000656 }
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000657 if (target_idx < num_targets)
658 {
659 target_sp = target_list.GetTargetAtIndex (target_idx);
660 if (target_sp)
661 {
662 delete_target_list.push_back (target_sp);
663 continue;
664 }
665 }
666 if (num_targets > 1)
667 result.AppendErrorWithFormat ("target index %u is out of range, valid target indexes are 0 - %u\n",
668 target_idx,
669 num_targets - 1);
670 else
671 result.AppendErrorWithFormat("target index %u is out of range, the only valid index is 0\n",
672 target_idx);
673
674 result.SetStatus (eReturnStatusFailed);
675 return false;
Greg Clayton3418c852011-08-10 02:10:13 +0000676 }
Greg Clayton3418c852011-08-10 02:10:13 +0000677 }
678 else
679 {
680 target_sp = target_list.GetSelectedTarget();
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000681 if (!target_sp)
Greg Clayton3418c852011-08-10 02:10:13 +0000682 {
683 result.AppendErrorWithFormat("no target is currently selected\n");
684 result.SetStatus (eReturnStatusFailed);
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000685 return false;
Greg Clayton3418c852011-08-10 02:10:13 +0000686 }
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000687 delete_target_list.push_back (target_sp);
Greg Clayton3418c852011-08-10 02:10:13 +0000688 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000689
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000690 const size_t num_targets_to_delete = delete_target_list.size();
691 for (size_t idx = 0; idx < num_targets_to_delete; ++idx)
692 {
693 target_sp = delete_target_list[idx];
694 target_list.DeleteTarget(target_sp);
695 target_sp->Destroy();
696 }
697 // If "--clean" was specified, prune any orphaned shared modules from
698 // the global shared module list
699 if (m_cleanup_option.GetOptionValue ())
700 {
701 const bool mandatory = true;
702 ModuleList::RemoveOrphanSharedModules(mandatory);
703 }
704 result.GetOutputStream().Printf("%u targets deleted.\n", (uint32_t)num_targets_to_delete);
705 result.SetStatus(eReturnStatusSuccessFinishResult);
706
707 return true;
Greg Clayton3418c852011-08-10 02:10:13 +0000708 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000709
Greg Claytonaa149cb2011-08-11 02:48:45 +0000710 OptionGroupOptions m_option_group;
Zachary Turneraa4dabf2015-03-26 16:43:13 +0000711 OptionGroupBoolean m_all_option;
Greg Claytonaa149cb2011-08-11 02:48:45 +0000712 OptionGroupBoolean m_cleanup_option;
Greg Clayton3418c852011-08-10 02:10:13 +0000713};
714
Greg Clayton644247c2011-07-07 01:59:51 +0000715#pragma mark CommandObjectTargetVariable
716
717//----------------------------------------------------------------------
718// "target variable"
719//----------------------------------------------------------------------
720
Jim Ingham5a988412012-06-08 21:56:10 +0000721class CommandObjectTargetVariable : public CommandObjectParsed
Greg Clayton644247c2011-07-07 01:59:51 +0000722{
Saleem Abdulrasool44edda02014-03-18 04:43:47 +0000723 static const uint32_t SHORT_OPTION_FILE = 0x66696c65; // 'file'
724 static const uint32_t SHORT_OPTION_SHLB = 0x73686c62; // 'shlb'
725
Greg Clayton644247c2011-07-07 01:59:51 +0000726public:
Kate Stone7428a182016-07-14 22:03:10 +0000727 CommandObjectTargetVariable(CommandInterpreter &interpreter)
728 : CommandObjectParsed(interpreter, "target variable",
729 "Read global variables for the current target, before or while running a process.",
730 nullptr, eCommandRequiresTarget),
Todd Fialae1cfbc72016-08-11 23:51:28 +0000731 m_option_group(),
Kate Stone7428a182016-07-14 22:03:10 +0000732 m_option_variable(false), // Don't include frame options
733 m_option_format(eFormatDefault),
734 m_option_compile_units(LLDB_OPT_SET_1, false, "file", SHORT_OPTION_FILE, 0, eArgTypeFilename,
735 "A basename or fullpath to a file that contains global variables. This option can be "
736 "specified multiple times."),
737 m_option_shared_libraries(LLDB_OPT_SET_1, false, "shlib", SHORT_OPTION_SHLB, 0, eArgTypeFilename,
738 "A basename or fullpath to a shared library to use in the search for global "
739 "variables. This option can be specified multiple times."),
740 m_varobj_options()
Greg Clayton644247c2011-07-07 01:59:51 +0000741 {
Johnny Chen81ab3f52011-08-22 22:22:00 +0000742 CommandArgumentEntry arg;
743 CommandArgumentData var_name_arg;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000744
Johnny Chen81ab3f52011-08-22 22:22:00 +0000745 // Define the first (and only) variant of this arg.
746 var_name_arg.arg_type = eArgTypeVarName;
747 var_name_arg.arg_repetition = eArgRepeatPlus;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000748
Johnny Chen81ab3f52011-08-22 22:22:00 +0000749 // There is only one variant this argument could be; put it into the argument entry.
750 arg.push_back (var_name_arg);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000751
Johnny Chen81ab3f52011-08-22 22:22:00 +0000752 // Push the data for the first argument into the m_arguments vector.
753 m_arguments.push_back (arg);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000754
Greg Clayton644247c2011-07-07 01:59:51 +0000755 m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Greg Clayton715c2362011-07-07 04:38:25 +0000756 m_option_group.Append (&m_option_variable, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Greg Clayton5009f9d2011-10-27 17:55:14 +0000757 m_option_group.Append (&m_option_format, OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_GDB_FMT, LLDB_OPT_SET_1);
Greg Clayton644247c2011-07-07 01:59:51 +0000758 m_option_group.Append (&m_option_compile_units, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
759 m_option_group.Append (&m_option_shared_libraries, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
760 m_option_group.Finalize();
761 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000762
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000763 ~CommandObjectTargetVariable() override = default;
Greg Clayton884fb692011-07-08 21:46:14 +0000764
765 void
766 DumpValueObject (Stream &s, VariableSP &var_sp, ValueObjectSP &valobj_sp, const char *root_name)
767 {
Enrico Granata4d93b8c2013-09-30 19:11:51 +0000768 DumpValueObjectOptions options(m_varobj_options.GetAsDumpOptions());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000769
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000770 if (!valobj_sp->GetTargetSP()->GetDisplayRuntimeSupportValues() &&
771 valobj_sp->IsRuntimeSupportValue())
Enrico Granata560558e2015-02-11 02:35:39 +0000772 return;
773
Greg Clayton884fb692011-07-08 21:46:14 +0000774 switch (var_sp->GetScope())
775 {
776 case eValueTypeVariableGlobal:
777 if (m_option_variable.show_scope)
778 s.PutCString("GLOBAL: ");
779 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000780
Greg Clayton884fb692011-07-08 21:46:14 +0000781 case eValueTypeVariableStatic:
782 if (m_option_variable.show_scope)
783 s.PutCString("STATIC: ");
784 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000785
Greg Clayton884fb692011-07-08 21:46:14 +0000786 case eValueTypeVariableArgument:
787 if (m_option_variable.show_scope)
788 s.PutCString(" ARG: ");
789 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000790
Greg Clayton884fb692011-07-08 21:46:14 +0000791 case eValueTypeVariableLocal:
792 if (m_option_variable.show_scope)
793 s.PutCString(" LOCAL: ");
794 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000795
Greg Clayton63a27af2016-07-01 17:17:23 +0000796 case eValueTypeVariableThreadLocal:
797 if (m_option_variable.show_scope)
798 s.PutCString("THREAD: ");
799 break;
800
Greg Clayton884fb692011-07-08 21:46:14 +0000801 default:
802 break;
803 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000804
Greg Clayton45ba8542011-07-10 19:21:23 +0000805 if (m_option_variable.show_decl)
Greg Clayton884fb692011-07-08 21:46:14 +0000806 {
Greg Clayton45ba8542011-07-10 19:21:23 +0000807 bool show_fullpaths = false;
808 bool show_module = true;
809 if (var_sp->DumpDeclaration(&s, show_fullpaths, show_module))
810 s.PutCString (": ");
Greg Clayton884fb692011-07-08 21:46:14 +0000811 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000812
Greg Clayton1deb7962011-10-25 06:44:01 +0000813 const Format format = m_option_format.GetFormat();
Greg Clayton884fb692011-07-08 21:46:14 +0000814 if (format != eFormatDefault)
Enrico Granata0c489f52012-03-01 04:24:26 +0000815 options.SetFormat(format);
816
817 options.SetRootValueObjectName(root_name);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000818
Enrico Granata4d93b8c2013-09-30 19:11:51 +0000819 valobj_sp->Dump(s,options);
Greg Clayton884fb692011-07-08 21:46:14 +0000820 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000821
Greg Claytonc7bece562013-01-25 18:06:21 +0000822 static size_t GetVariableCallback (void *baton,
823 const char *name,
824 VariableList &variable_list)
Greg Clayton884fb692011-07-08 21:46:14 +0000825 {
826 Target *target = static_cast<Target *>(baton);
827 if (target)
828 {
829 return target->GetImages().FindGlobalVariables (ConstString(name),
830 true,
831 UINT32_MAX,
832 variable_list);
833 }
834 return 0;
835 }
Greg Clayton884fb692011-07-08 21:46:14 +0000836
Jim Ingham5a988412012-06-08 21:56:10 +0000837 Options *
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000838 GetOptions () override
Jim Ingham5a988412012-06-08 21:56:10 +0000839 {
840 return &m_option_group;
841 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000842
Jim Ingham5a988412012-06-08 21:56:10 +0000843protected:
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000844 void
845 DumpGlobalVariableList(const ExecutionContext &exe_ctx, const SymbolContext &sc, const VariableList &variable_list, Stream &s)
846 {
847 size_t count = variable_list.GetSize();
848 if (count > 0)
849 {
850 if (sc.module_sp)
851 {
852 if (sc.comp_unit)
853 {
Greg Claytonb5ad4ec2013-04-29 17:25:54 +0000854 s.Printf ("Global variables for %s in %s:\n",
855 sc.comp_unit->GetPath().c_str(),
856 sc.module_sp->GetFileSpec().GetPath().c_str());
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000857 }
858 else
859 {
Greg Claytonb5ad4ec2013-04-29 17:25:54 +0000860 s.Printf ("Global variables for %s\n",
861 sc.module_sp->GetFileSpec().GetPath().c_str());
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000862 }
863 }
864 else if (sc.comp_unit)
865 {
Greg Claytonb5ad4ec2013-04-29 17:25:54 +0000866 s.Printf ("Global variables for %s\n",
867 sc.comp_unit->GetPath().c_str());
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000868 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000869
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000870 for (uint32_t i = 0; i < count; ++i)
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000871 {
872 VariableSP var_sp (variable_list.GetVariableAtIndex(i));
873 if (var_sp)
874 {
875 ValueObjectSP valobj_sp (ValueObjectVariable::Create (exe_ctx.GetBestExecutionContextScope(), var_sp));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000876
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000877 if (valobj_sp)
878 DumpValueObject (s, var_sp, valobj_sp, var_sp->GetName().GetCString());
879 }
880 }
881 }
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000882 }
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000883
Bruce Mitchener13d21e92015-10-07 16:56:17 +0000884 bool
885 DoExecute (Args& args, CommandReturnObject &result) override
Greg Clayton644247c2011-07-07 01:59:51 +0000886 {
Greg Claytonf9fc6092013-01-09 19:44:40 +0000887 Target *target = m_exe_ctx.GetTargetPtr();
888 const size_t argc = args.GetArgumentCount();
889 Stream &s = result.GetOutputStream();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000890
Greg Claytonf9fc6092013-01-09 19:44:40 +0000891 if (argc > 0)
Greg Clayton644247c2011-07-07 01:59:51 +0000892 {
Greg Claytonf9fc6092013-01-09 19:44:40 +0000893
894 for (size_t idx = 0; idx < argc; ++idx)
Greg Clayton644247c2011-07-07 01:59:51 +0000895 {
Greg Claytonf9fc6092013-01-09 19:44:40 +0000896 VariableList variable_list;
897 ValueObjectList valobj_list;
Greg Clayton884fb692011-07-08 21:46:14 +0000898
Greg Claytonf9fc6092013-01-09 19:44:40 +0000899 const char *arg = args.GetArgumentAtIndex(idx);
Greg Claytonc7bece562013-01-25 18:06:21 +0000900 size_t matches = 0;
Greg Claytonf9fc6092013-01-09 19:44:40 +0000901 bool use_var_name = false;
902 if (m_option_variable.use_regex)
Greg Clayton644247c2011-07-07 01:59:51 +0000903 {
Greg Claytonf9fc6092013-01-09 19:44:40 +0000904 RegularExpression regex(arg);
905 if (!regex.IsValid ())
Greg Clayton644247c2011-07-07 01:59:51 +0000906 {
Greg Claytonf9fc6092013-01-09 19:44:40 +0000907 result.GetErrorStream().Printf ("error: invalid regular expression: '%s'\n", arg);
Greg Clayton715c2362011-07-07 04:38:25 +0000908 result.SetStatus (eReturnStatusFailed);
909 return false;
910 }
Greg Claytonf9fc6092013-01-09 19:44:40 +0000911 use_var_name = true;
912 matches = target->GetImages().FindGlobalVariables (regex,
913 true,
914 UINT32_MAX,
915 variable_list);
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000916 }
917 else
918 {
Greg Claytonf9fc6092013-01-09 19:44:40 +0000919 Error error (Variable::GetValuesForVariableExpressionPath (arg,
920 m_exe_ctx.GetBestExecutionContextScope(),
921 GetVariableCallback,
922 target,
923 variable_list,
924 valobj_list));
925 matches = variable_list.GetSize();
926 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000927
Greg Claytonf9fc6092013-01-09 19:44:40 +0000928 if (matches == 0)
929 {
930 result.GetErrorStream().Printf ("error: can't find global variable '%s'\n", arg);
931 result.SetStatus (eReturnStatusFailed);
932 return false;
933 }
934 else
935 {
936 for (uint32_t global_idx=0; global_idx<matches; ++global_idx)
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000937 {
Greg Claytonf9fc6092013-01-09 19:44:40 +0000938 VariableSP var_sp (variable_list.GetVariableAtIndex(global_idx));
939 if (var_sp)
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000940 {
Greg Claytonf9fc6092013-01-09 19:44:40 +0000941 ValueObjectSP valobj_sp (valobj_list.GetValueObjectAtIndex(global_idx));
942 if (!valobj_sp)
943 valobj_sp = ValueObjectVariable::Create (m_exe_ctx.GetBestExecutionContextScope(), var_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000944
Greg Claytonf9fc6092013-01-09 19:44:40 +0000945 if (valobj_sp)
946 DumpValueObject (s, var_sp, valobj_sp, use_var_name ? var_sp->GetName().GetCString() : arg);
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000947 }
948 }
Greg Clayton9a5a9342011-10-05 22:17:32 +0000949 }
Greg Clayton644247c2011-07-07 01:59:51 +0000950 }
951 }
952 else
953 {
Greg Claytonf9fc6092013-01-09 19:44:40 +0000954 const FileSpecList &compile_units = m_option_compile_units.GetOptionValue().GetCurrentValue();
955 const FileSpecList &shlibs = m_option_shared_libraries.GetOptionValue().GetCurrentValue();
956 SymbolContextList sc_list;
957 const size_t num_compile_units = compile_units.GetSize();
958 const size_t num_shlibs = shlibs.GetSize();
959 if (num_compile_units == 0 && num_shlibs == 0)
960 {
961 bool success = false;
Jason Molendab57e4a12013-11-04 09:33:30 +0000962 StackFrame *frame = m_exe_ctx.GetFramePtr();
Eugene Zelenkof13e6522016-02-25 19:02:39 +0000963 CompileUnit *comp_unit = nullptr;
Greg Claytonf9fc6092013-01-09 19:44:40 +0000964 if (frame)
965 {
966 SymbolContext sc = frame->GetSymbolContext (eSymbolContextCompUnit);
967 if (sc.comp_unit)
968 {
969 const bool can_create = true;
970 VariableListSP comp_unit_varlist_sp (sc.comp_unit->GetVariableList(can_create));
971 if (comp_unit_varlist_sp)
972 {
973 size_t count = comp_unit_varlist_sp->GetSize();
974 if (count > 0)
975 {
976 DumpGlobalVariableList(m_exe_ctx, sc, *comp_unit_varlist_sp, s);
977 success = true;
978 }
979 }
980 }
981 }
982 if (!success)
983 {
984 if (frame)
985 {
986 if (comp_unit)
Greg Claytonb5ad4ec2013-04-29 17:25:54 +0000987 result.AppendErrorWithFormat ("no global variables in current compile unit: %s\n",
988 comp_unit->GetPath().c_str());
Greg Claytonf9fc6092013-01-09 19:44:40 +0000989 else
990 result.AppendErrorWithFormat ("no debug information for frame %u\n", frame->GetFrameIndex());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000991 }
Greg Claytonf9fc6092013-01-09 19:44:40 +0000992 else
993 result.AppendError ("'target variable' takes one or more global variable names as arguments\n");
994 result.SetStatus (eReturnStatusFailed);
995 }
996 }
997 else
998 {
999 SymbolContextList sc_list;
1000 const bool append = true;
1001 // We have one or more compile unit or shlib
1002 if (num_shlibs > 0)
1003 {
1004 for (size_t shlib_idx=0; shlib_idx<num_shlibs; ++shlib_idx)
1005 {
1006 const FileSpec module_file(shlibs.GetFileSpecAtIndex(shlib_idx));
1007 ModuleSpec module_spec (module_file);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001008
Greg Claytonf9fc6092013-01-09 19:44:40 +00001009 ModuleSP module_sp (target->GetImages().FindFirstModule(module_spec));
1010 if (module_sp)
1011 {
1012 if (num_compile_units > 0)
1013 {
1014 for (size_t cu_idx=0; cu_idx<num_compile_units; ++cu_idx)
1015 module_sp->FindCompileUnits(compile_units.GetFileSpecAtIndex(cu_idx), append, sc_list);
1016 }
1017 else
1018 {
1019 SymbolContext sc;
1020 sc.module_sp = module_sp;
1021 sc_list.Append(sc);
1022 }
1023 }
1024 else
1025 {
1026 // Didn't find matching shlib/module in target...
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00001027 result.AppendErrorWithFormat ("target doesn't contain the specified shared library: %s\n",
1028 module_file.GetPath().c_str());
Greg Claytonf9fc6092013-01-09 19:44:40 +00001029 }
1030 }
1031 }
1032 else
1033 {
1034 // No shared libraries, we just want to find globals for the compile units files that were specified
1035 for (size_t cu_idx=0; cu_idx<num_compile_units; ++cu_idx)
1036 target->GetImages().FindCompileUnits(compile_units.GetFileSpecAtIndex(cu_idx), append, sc_list);
1037 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001038
Greg Claytonf9fc6092013-01-09 19:44:40 +00001039 const uint32_t num_scs = sc_list.GetSize();
1040 if (num_scs > 0)
1041 {
1042 SymbolContext sc;
1043 for (uint32_t sc_idx=0; sc_idx<num_scs; ++sc_idx)
1044 {
1045 if (sc_list.GetContextAtIndex(sc_idx, sc))
1046 {
1047 if (sc.comp_unit)
1048 {
1049 const bool can_create = true;
1050 VariableListSP comp_unit_varlist_sp (sc.comp_unit->GetVariableList(can_create));
1051 if (comp_unit_varlist_sp)
1052 DumpGlobalVariableList(m_exe_ctx, sc, *comp_unit_varlist_sp, s);
1053 }
1054 else if (sc.module_sp)
1055 {
1056 // Get all global variables for this module
1057 lldb_private::RegularExpression all_globals_regex("."); // Any global with at least one character
1058 VariableList variable_list;
1059 sc.module_sp->FindGlobalVariables(all_globals_regex, append, UINT32_MAX, variable_list);
1060 DumpGlobalVariableList(m_exe_ctx, sc, variable_list, s);
1061 }
1062 }
1063 }
1064 }
1065 }
Greg Clayton644247c2011-07-07 01:59:51 +00001066 }
Greg Claytonf9fc6092013-01-09 19:44:40 +00001067
Enrico Granata61a80ba2011-08-12 16:42:31 +00001068 if (m_interpreter.TruncationWarningNecessary())
1069 {
1070 result.GetOutputStream().Printf(m_interpreter.TruncationWarningText(),
1071 m_cmd_name.c_str());
1072 m_interpreter.TruncationWarningGiven();
1073 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001074
Greg Clayton644247c2011-07-07 01:59:51 +00001075 return result.Succeeded();
1076 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001077
Greg Clayton644247c2011-07-07 01:59:51 +00001078 OptionGroupOptions m_option_group;
Greg Clayton715c2362011-07-07 04:38:25 +00001079 OptionGroupVariable m_option_variable;
Greg Clayton1deb7962011-10-25 06:44:01 +00001080 OptionGroupFormat m_option_format;
Greg Clayton644247c2011-07-07 01:59:51 +00001081 OptionGroupFileList m_option_compile_units;
1082 OptionGroupFileList m_option_shared_libraries;
1083 OptionGroupValueObjectDisplay m_varobj_options;
Greg Clayton644247c2011-07-07 01:59:51 +00001084};
1085
Greg Claytoneffe5c92011-05-03 22:09:39 +00001086#pragma mark CommandObjectTargetModulesSearchPathsAdd
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001087
Jim Ingham5a988412012-06-08 21:56:10 +00001088class CommandObjectTargetModulesSearchPathsAdd : public CommandObjectParsed
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001089{
1090public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00001091 CommandObjectTargetModulesSearchPathsAdd (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001092 CommandObjectParsed(interpreter,
1093 "target modules search-paths add",
1094 "Add new image search paths substitution pairs to the current target.",
1095 nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001096 {
Caroline Tice405fe672010-10-04 22:28:36 +00001097 CommandArgumentEntry arg;
1098 CommandArgumentData old_prefix_arg;
1099 CommandArgumentData new_prefix_arg;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001100
Caroline Tice405fe672010-10-04 22:28:36 +00001101 // Define the first variant of this arg pair.
1102 old_prefix_arg.arg_type = eArgTypeOldPathPrefix;
1103 old_prefix_arg.arg_repetition = eArgRepeatPairPlus;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001104
Caroline Tice405fe672010-10-04 22:28:36 +00001105 // Define the first variant of this arg pair.
1106 new_prefix_arg.arg_type = eArgTypeNewPathPrefix;
1107 new_prefix_arg.arg_repetition = eArgRepeatPairPlus;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001108
Caroline Tice405fe672010-10-04 22:28:36 +00001109 // There are two required arguments that must always occur together, i.e. an argument "pair". Because they
1110 // must always occur together, they are treated as two variants of one argument rather than two independent
1111 // arguments. Push them both into the first argument position for m_arguments...
1112
1113 arg.push_back (old_prefix_arg);
1114 arg.push_back (new_prefix_arg);
1115
1116 m_arguments.push_back (arg);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001117 }
1118
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001119 ~CommandObjectTargetModulesSearchPathsAdd() override = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001120
Jim Ingham5a988412012-06-08 21:56:10 +00001121protected:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001122 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00001123 DoExecute (Args& command, CommandReturnObject &result) override
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001124 {
Greg Claytona7015092010-09-18 01:14:36 +00001125 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001126 if (target)
1127 {
Greg Claytonc7bece562013-01-25 18:06:21 +00001128 const size_t argc = command.GetArgumentCount();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001129 if (argc & 1)
1130 {
Greg Clayton7260f622011-04-18 08:33:37 +00001131 result.AppendError ("add requires an even number of arguments\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001132 result.SetStatus (eReturnStatusFailed);
1133 }
1134 else
1135 {
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001136 for (size_t i = 0; i < argc; i+=2)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001137 {
1138 const char *from = command.GetArgumentAtIndex(i);
1139 const char *to = command.GetArgumentAtIndex(i+1);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001140
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001141 if (from[0] && to[0])
1142 {
Jason Molenda71387652015-07-31 04:21:25 +00001143 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
1144 if (log)
1145 {
1146 log->Printf ("target modules search path adding ImageSearchPath pair: '%s' -> '%s'",
1147 from, to);
1148 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001149 bool last_pair = ((argc - i) == 2);
Greg Clayton66111032010-06-23 01:19:29 +00001150 target->GetImageSearchPathList().Append (ConstString(from),
1151 ConstString(to),
1152 last_pair); // Notify if this is the last pair
Johnny Chen7791b332011-02-03 00:30:19 +00001153 result.SetStatus (eReturnStatusSuccessFinishNoResult);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001154 }
1155 else
1156 {
1157 if (from[0])
Greg Clayton7260f622011-04-18 08:33:37 +00001158 result.AppendError ("<path-prefix> can't be empty\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001159 else
Greg Clayton7260f622011-04-18 08:33:37 +00001160 result.AppendError ("<new-path-prefix> can't be empty\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001161 result.SetStatus (eReturnStatusFailed);
1162 }
1163 }
1164 }
1165 }
1166 else
1167 {
Greg Clayton7260f622011-04-18 08:33:37 +00001168 result.AppendError ("invalid target\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001169 result.SetStatus (eReturnStatusFailed);
1170 }
1171 return result.Succeeded();
1172 }
1173};
1174
Greg Claytoneffe5c92011-05-03 22:09:39 +00001175#pragma mark CommandObjectTargetModulesSearchPathsClear
1176
Jim Ingham5a988412012-06-08 21:56:10 +00001177class CommandObjectTargetModulesSearchPathsClear : public CommandObjectParsed
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001178{
1179public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00001180 CommandObjectTargetModulesSearchPathsClear (CommandInterpreter &interpreter) :
Jim Ingham5a988412012-06-08 21:56:10 +00001181 CommandObjectParsed (interpreter,
1182 "target modules search-paths clear",
1183 "Clear all current image search path substitution pairs from the current target.",
1184 "target modules search-paths clear")
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001185 {
1186 }
1187
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001188 ~CommandObjectTargetModulesSearchPathsClear() override = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001189
Jim Ingham5a988412012-06-08 21:56:10 +00001190protected:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001191 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00001192 DoExecute (Args& command, CommandReturnObject &result) override
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001193 {
Greg Claytona7015092010-09-18 01:14:36 +00001194 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001195 if (target)
1196 {
1197 bool notify = true;
1198 target->GetImageSearchPathList().Clear(notify);
Johnny Chen7791b332011-02-03 00:30:19 +00001199 result.SetStatus (eReturnStatusSuccessFinishNoResult);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001200 }
1201 else
1202 {
Greg Clayton7260f622011-04-18 08:33:37 +00001203 result.AppendError ("invalid target\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001204 result.SetStatus (eReturnStatusFailed);
1205 }
1206 return result.Succeeded();
1207 }
1208};
1209
Greg Claytoneffe5c92011-05-03 22:09:39 +00001210#pragma mark CommandObjectTargetModulesSearchPathsInsert
1211
Jim Ingham5a988412012-06-08 21:56:10 +00001212class CommandObjectTargetModulesSearchPathsInsert : public CommandObjectParsed
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001213{
1214public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00001215 CommandObjectTargetModulesSearchPathsInsert (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001216 CommandObjectParsed(interpreter,
1217 "target modules search-paths insert",
1218 "Insert a new image search path substitution pair into the current target at the specified index.",
1219 nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001220 {
Caroline Tice405fe672010-10-04 22:28:36 +00001221 CommandArgumentEntry arg1;
1222 CommandArgumentEntry arg2;
1223 CommandArgumentData index_arg;
1224 CommandArgumentData old_prefix_arg;
1225 CommandArgumentData new_prefix_arg;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001226
Caroline Tice405fe672010-10-04 22:28:36 +00001227 // Define the first and only variant of this arg.
1228 index_arg.arg_type = eArgTypeIndex;
1229 index_arg.arg_repetition = eArgRepeatPlain;
1230
1231 // Put the one and only variant into the first arg for m_arguments:
1232 arg1.push_back (index_arg);
1233
1234 // Define the first variant of this arg pair.
1235 old_prefix_arg.arg_type = eArgTypeOldPathPrefix;
1236 old_prefix_arg.arg_repetition = eArgRepeatPairPlus;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001237
Caroline Tice405fe672010-10-04 22:28:36 +00001238 // Define the first variant of this arg pair.
1239 new_prefix_arg.arg_type = eArgTypeNewPathPrefix;
1240 new_prefix_arg.arg_repetition = eArgRepeatPairPlus;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001241
Caroline Tice405fe672010-10-04 22:28:36 +00001242 // There are two required arguments that must always occur together, i.e. an argument "pair". Because they
1243 // must always occur together, they are treated as two variants of one argument rather than two independent
1244 // arguments. Push them both into the same argument position for m_arguments...
1245
1246 arg2.push_back (old_prefix_arg);
1247 arg2.push_back (new_prefix_arg);
1248
1249 // Add arguments to m_arguments.
1250 m_arguments.push_back (arg1);
1251 m_arguments.push_back (arg2);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001252 }
1253
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001254 ~CommandObjectTargetModulesSearchPathsInsert() override = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001255
Jim Ingham5a988412012-06-08 21:56:10 +00001256protected:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001257 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00001258 DoExecute (Args& command, CommandReturnObject &result) override
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001259 {
Greg Claytona7015092010-09-18 01:14:36 +00001260 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001261 if (target)
1262 {
Greg Claytonc7bece562013-01-25 18:06:21 +00001263 size_t argc = command.GetArgumentCount();
Bruce Mitchener4d31a482015-10-07 10:11:10 +00001264 // check for at least 3 arguments and an odd number of parameters
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001265 if (argc >= 3 && argc & 1)
1266 {
1267 bool success = false;
1268
Vince Harron5275aaa2015-01-15 20:08:35 +00001269 uint32_t insert_idx = StringConvert::ToUInt32(command.GetArgumentAtIndex(0), UINT32_MAX, 0, &success);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001270
1271 if (!success)
1272 {
1273 result.AppendErrorWithFormat("<index> parameter is not an integer: '%s'.\n", command.GetArgumentAtIndex(0));
1274 result.SetStatus (eReturnStatusFailed);
1275 return result.Succeeded();
1276 }
1277
1278 // shift off the index
1279 command.Shift();
1280 argc = command.GetArgumentCount();
1281
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001282 for (uint32_t i = 0; i < argc; i += 2, ++insert_idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001283 {
1284 const char *from = command.GetArgumentAtIndex(i);
1285 const char *to = command.GetArgumentAtIndex(i+1);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001286
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001287 if (from[0] && to[0])
1288 {
1289 bool last_pair = ((argc - i) == 2);
1290 target->GetImageSearchPathList().Insert (ConstString(from),
1291 ConstString(to),
1292 insert_idx,
1293 last_pair);
Johnny Chen7791b332011-02-03 00:30:19 +00001294 result.SetStatus (eReturnStatusSuccessFinishNoResult);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001295 }
1296 else
1297 {
1298 if (from[0])
Greg Clayton7260f622011-04-18 08:33:37 +00001299 result.AppendError ("<path-prefix> can't be empty\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001300 else
Greg Clayton7260f622011-04-18 08:33:37 +00001301 result.AppendError ("<new-path-prefix> can't be empty\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001302 result.SetStatus (eReturnStatusFailed);
1303 return false;
1304 }
1305 }
1306 }
1307 else
1308 {
Greg Clayton7260f622011-04-18 08:33:37 +00001309 result.AppendError ("insert requires at least three arguments\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001310 result.SetStatus (eReturnStatusFailed);
1311 return result.Succeeded();
1312 }
1313
1314 }
1315 else
1316 {
Greg Clayton7260f622011-04-18 08:33:37 +00001317 result.AppendError ("invalid target\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001318 result.SetStatus (eReturnStatusFailed);
1319 }
1320 return result.Succeeded();
1321 }
1322};
1323
Greg Claytoneffe5c92011-05-03 22:09:39 +00001324#pragma mark CommandObjectTargetModulesSearchPathsList
1325
Jim Ingham5a988412012-06-08 21:56:10 +00001326class CommandObjectTargetModulesSearchPathsList : public CommandObjectParsed
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001327{
1328public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00001329 CommandObjectTargetModulesSearchPathsList (CommandInterpreter &interpreter) :
Jim Ingham5a988412012-06-08 21:56:10 +00001330 CommandObjectParsed (interpreter,
1331 "target modules search-paths list",
1332 "List all current image search path substitution pairs in the current target.",
1333 "target modules search-paths list")
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001334 {
1335 }
1336
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001337 ~CommandObjectTargetModulesSearchPathsList() override = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001338
Jim Ingham5a988412012-06-08 21:56:10 +00001339protected:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001340 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00001341 DoExecute (Args& command, CommandReturnObject &result) override
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001342 {
Greg Claytona7015092010-09-18 01:14:36 +00001343 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001344 if (target)
1345 {
1346 if (command.GetArgumentCount() != 0)
1347 {
Greg Clayton7260f622011-04-18 08:33:37 +00001348 result.AppendError ("list takes no arguments\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001349 result.SetStatus (eReturnStatusFailed);
1350 return result.Succeeded();
1351 }
1352
1353 target->GetImageSearchPathList().Dump(&result.GetOutputStream());
Johnny Chen7791b332011-02-03 00:30:19 +00001354 result.SetStatus (eReturnStatusSuccessFinishResult);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001355 }
1356 else
1357 {
Greg Clayton7260f622011-04-18 08:33:37 +00001358 result.AppendError ("invalid target\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001359 result.SetStatus (eReturnStatusFailed);
1360 }
1361 return result.Succeeded();
1362 }
1363};
1364
Greg Claytoneffe5c92011-05-03 22:09:39 +00001365#pragma mark CommandObjectTargetModulesSearchPathsQuery
1366
Jim Ingham5a988412012-06-08 21:56:10 +00001367class CommandObjectTargetModulesSearchPathsQuery : public CommandObjectParsed
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001368{
1369public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00001370 CommandObjectTargetModulesSearchPathsQuery (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001371 CommandObjectParsed(interpreter,
1372 "target modules search-paths query",
1373 "Transform a path using the first applicable image search path.",
1374 nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001375 {
Caroline Tice405fe672010-10-04 22:28:36 +00001376 CommandArgumentEntry arg;
1377 CommandArgumentData path_arg;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001378
Caroline Tice405fe672010-10-04 22:28:36 +00001379 // Define the first (and only) variant of this arg.
Sean Callanan31542552012-10-24 01:12:14 +00001380 path_arg.arg_type = eArgTypeDirectoryName;
Caroline Tice405fe672010-10-04 22:28:36 +00001381 path_arg.arg_repetition = eArgRepeatPlain;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001382
Caroline Tice405fe672010-10-04 22:28:36 +00001383 // There is only one variant this argument could be; put it into the argument entry.
1384 arg.push_back (path_arg);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001385
Caroline Tice405fe672010-10-04 22:28:36 +00001386 // Push the data for the first argument into the m_arguments vector.
1387 m_arguments.push_back (arg);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001388 }
1389
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001390 ~CommandObjectTargetModulesSearchPathsQuery() override = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001391
Jim Ingham5a988412012-06-08 21:56:10 +00001392protected:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001393 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00001394 DoExecute (Args& command, CommandReturnObject &result) override
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001395 {
Greg Claytona7015092010-09-18 01:14:36 +00001396 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001397 if (target)
1398 {
1399 if (command.GetArgumentCount() != 1)
1400 {
Greg Clayton7260f622011-04-18 08:33:37 +00001401 result.AppendError ("query requires one argument\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001402 result.SetStatus (eReturnStatusFailed);
1403 return result.Succeeded();
1404 }
1405
1406 ConstString orig(command.GetArgumentAtIndex(0));
1407 ConstString transformed;
1408 if (target->GetImageSearchPathList().RemapPath(orig, transformed))
1409 result.GetOutputStream().Printf("%s\n", transformed.GetCString());
1410 else
1411 result.GetOutputStream().Printf("%s\n", orig.GetCString());
Johnny Chen7791b332011-02-03 00:30:19 +00001412
1413 result.SetStatus (eReturnStatusSuccessFinishResult);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001414 }
1415 else
1416 {
Greg Clayton7260f622011-04-18 08:33:37 +00001417 result.AppendError ("invalid target\n");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001418 result.SetStatus (eReturnStatusFailed);
1419 }
1420 return result.Succeeded();
1421 }
1422};
1423
Greg Claytoneffe5c92011-05-03 22:09:39 +00001424//----------------------------------------------------------------------
1425// Static Helper functions
1426//----------------------------------------------------------------------
1427static void
1428DumpModuleArchitecture (Stream &strm, Module *module, bool full_triple, uint32_t width)
1429{
1430 if (module)
1431 {
Todd Fiala7df337f2015-10-13 23:41:19 +00001432 StreamString arch_strm;
1433
Greg Claytoneffe5c92011-05-03 22:09:39 +00001434 if (full_triple)
Todd Fiala7df337f2015-10-13 23:41:19 +00001435 module->GetArchitecture().DumpTriple(arch_strm);
Greg Claytoneffe5c92011-05-03 22:09:39 +00001436 else
Todd Fiala7df337f2015-10-13 23:41:19 +00001437 arch_strm.PutCString(module->GetArchitecture().GetArchitectureName());
1438 std::string arch_str = arch_strm.GetString();
1439
Greg Claytoneffe5c92011-05-03 22:09:39 +00001440 if (width)
Todd Fiala7df337f2015-10-13 23:41:19 +00001441 strm.Printf("%-*s", width, arch_str.c_str());
Greg Claytoneffe5c92011-05-03 22:09:39 +00001442 else
Todd Fiala7df337f2015-10-13 23:41:19 +00001443 strm.PutCString(arch_str.c_str());
Greg Claytoneffe5c92011-05-03 22:09:39 +00001444 }
1445}
1446
1447static void
1448DumpModuleUUID (Stream &strm, Module *module)
1449{
Jim Ingham28eb5712012-10-12 17:34:26 +00001450 if (module && module->GetUUID().IsValid())
Greg Clayton3418c852011-08-10 02:10:13 +00001451 module->GetUUID().Dump (&strm);
1452 else
1453 strm.PutCString(" ");
Greg Claytoneffe5c92011-05-03 22:09:39 +00001454}
1455
1456static uint32_t
Greg Claytona0ca6602012-10-18 16:33:33 +00001457DumpCompileUnitLineTable (CommandInterpreter &interpreter,
1458 Stream &strm,
1459 Module *module,
1460 const FileSpec &file_spec,
1461 bool load_addresses)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001462{
1463 uint32_t num_matches = 0;
1464 if (module)
1465 {
1466 SymbolContextList sc_list;
1467 num_matches = module->ResolveSymbolContextsForFileSpec (file_spec,
1468 0,
1469 false,
1470 eSymbolContextCompUnit,
1471 sc_list);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001472
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001473 for (uint32_t i = 0; i < num_matches; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001474 {
1475 SymbolContext sc;
1476 if (sc_list.GetContextAtIndex(i, sc))
1477 {
1478 if (i > 0)
1479 strm << "\n\n";
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001480
Greg Claytoneffe5c92011-05-03 22:09:39 +00001481 strm << "Line table for " << *static_cast<FileSpec*> (sc.comp_unit) << " in `"
1482 << module->GetFileSpec().GetFilename() << "\n";
1483 LineTable *line_table = sc.comp_unit->GetLineTable();
1484 if (line_table)
1485 line_table->GetDescription (&strm,
Greg Claytonc14ee322011-09-22 04:58:26 +00001486 interpreter.GetExecutionContext().GetTargetPtr(),
Greg Claytoneffe5c92011-05-03 22:09:39 +00001487 lldb::eDescriptionLevelBrief);
1488 else
1489 strm << "No line table";
1490 }
1491 }
1492 }
1493 return num_matches;
1494}
1495
1496static void
1497DumpFullpath (Stream &strm, const FileSpec *file_spec_ptr, uint32_t width)
1498{
1499 if (file_spec_ptr)
1500 {
1501 if (width > 0)
1502 {
Jason Molendadb7d11c2013-05-06 10:21:11 +00001503 std::string fullpath = file_spec_ptr->GetPath();
1504 strm.Printf("%-*s", width, fullpath.c_str());
1505 return;
Greg Claytoneffe5c92011-05-03 22:09:39 +00001506 }
1507 else
1508 {
1509 file_spec_ptr->Dump(&strm);
1510 return;
1511 }
1512 }
1513 // Keep the width spacing correct if things go wrong...
1514 if (width > 0)
1515 strm.Printf("%-*s", width, "");
1516}
1517
1518static void
1519DumpDirectory (Stream &strm, const FileSpec *file_spec_ptr, uint32_t width)
1520{
1521 if (file_spec_ptr)
1522 {
1523 if (width > 0)
1524 strm.Printf("%-*s", width, file_spec_ptr->GetDirectory().AsCString(""));
1525 else
1526 file_spec_ptr->GetDirectory().Dump(&strm);
1527 return;
1528 }
1529 // Keep the width spacing correct if things go wrong...
1530 if (width > 0)
1531 strm.Printf("%-*s", width, "");
1532}
1533
1534static void
1535DumpBasename (Stream &strm, const FileSpec *file_spec_ptr, uint32_t width)
1536{
1537 if (file_spec_ptr)
1538 {
1539 if (width > 0)
1540 strm.Printf("%-*s", width, file_spec_ptr->GetFilename().AsCString(""));
1541 else
1542 file_spec_ptr->GetFilename().Dump(&strm);
1543 return;
1544 }
1545 // Keep the width spacing correct if things go wrong...
1546 if (width > 0)
1547 strm.Printf("%-*s", width, "");
1548}
1549
Adrian McCarthy543725c2016-04-04 21:21:49 +00001550static size_t
1551DumpModuleObjfileHeaders(Stream &strm, ModuleList &module_list)
1552{
1553 size_t num_dumped = 0;
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001554 std::lock_guard<std::recursive_mutex> guard(module_list.GetMutex());
Adrian McCarthy543725c2016-04-04 21:21:49 +00001555 const size_t num_modules = module_list.GetSize();
1556 if (num_modules > 0)
1557 {
1558 strm.Printf("Dumping headers for %" PRIu64 " module(s).\n", static_cast<uint64_t>(num_modules));
1559 strm.IndentMore();
1560 for (size_t image_idx = 0; image_idx < num_modules; ++image_idx)
1561 {
1562 Module *module = module_list.GetModulePointerAtIndexUnlocked(image_idx);
1563 if (module)
1564 {
1565 if (num_dumped++ > 0)
1566 {
1567 strm.EOL();
1568 strm.EOL();
1569 }
1570 ObjectFile *objfile = module->GetObjectFile();
1571 objfile->Dump(&strm);
1572 }
1573 }
1574 strm.IndentLess();
1575 }
1576 return num_dumped;
1577}
1578
Greg Claytoneffe5c92011-05-03 22:09:39 +00001579static void
1580DumpModuleSymtab (CommandInterpreter &interpreter, Stream &strm, Module *module, SortOrder sort_order)
1581{
1582 if (module)
1583 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001584 SymbolVendor *sym_vendor = module->GetSymbolVendor ();
1585 if (sym_vendor)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001586 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001587 Symtab *symtab = sym_vendor->GetSymtab();
Greg Claytoneffe5c92011-05-03 22:09:39 +00001588 if (symtab)
Greg Claytonc14ee322011-09-22 04:58:26 +00001589 symtab->Dump(&strm, interpreter.GetExecutionContext().GetTargetPtr(), sort_order);
Greg Claytoneffe5c92011-05-03 22:09:39 +00001590 }
1591 }
1592}
1593
1594static void
1595DumpModuleSections (CommandInterpreter &interpreter, Stream &strm, Module *module)
1596{
1597 if (module)
1598 {
Greg Clayton3046e662013-07-10 01:23:25 +00001599 SectionList *section_list = module->GetSectionList();
Michael Sartaina7499c92013-07-01 19:45:50 +00001600 if (section_list)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001601 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001602 strm.Printf ("Sections for '%s' (%s):\n",
1603 module->GetSpecificationDescription().c_str(),
1604 module->GetArchitecture().GetArchitectureName());
1605 strm.IndentMore();
1606 section_list->Dump(&strm, interpreter.GetExecutionContext().GetTargetPtr(), true, UINT32_MAX);
1607 strm.IndentLess();
Greg Claytoneffe5c92011-05-03 22:09:39 +00001608 }
1609 }
1610}
1611
1612static bool
1613DumpModuleSymbolVendor (Stream &strm, Module *module)
1614{
1615 if (module)
1616 {
1617 SymbolVendor *symbol_vendor = module->GetSymbolVendor(true);
1618 if (symbol_vendor)
1619 {
1620 symbol_vendor->Dump(&strm);
1621 return true;
1622 }
1623 }
1624 return false;
1625}
1626
Greg Claytonc4a8a762012-05-15 18:43:44 +00001627static void
1628DumpAddress (ExecutionContextScope *exe_scope, const Address &so_addr, bool verbose, Stream &strm)
1629{
1630 strm.IndentMore();
1631 strm.Indent (" Address: ");
1632 so_addr.Dump (&strm, exe_scope, Address::DumpStyleModuleWithFileAddress);
1633 strm.PutCString (" (");
1634 so_addr.Dump (&strm, exe_scope, Address::DumpStyleSectionNameOffset);
1635 strm.PutCString (")\n");
1636 strm.Indent (" Summary: ");
1637 const uint32_t save_indent = strm.GetIndentLevel ();
1638 strm.SetIndentLevel (save_indent + 13);
1639 so_addr.Dump (&strm, exe_scope, Address::DumpStyleResolvedDescription);
1640 strm.SetIndentLevel (save_indent);
1641 // Print out detailed address information when verbose is enabled
1642 if (verbose)
1643 {
1644 strm.EOL();
1645 so_addr.Dump (&strm, exe_scope, Address::DumpStyleDetailedSymbolContext);
1646 }
1647 strm.IndentLess();
1648}
1649
Greg Claytoneffe5c92011-05-03 22:09:39 +00001650static bool
Greg Claytone72dfb32012-02-24 01:59:29 +00001651LookupAddressInModule (CommandInterpreter &interpreter,
1652 Stream &strm,
1653 Module *module,
1654 uint32_t resolve_mask,
1655 lldb::addr_t raw_addr,
1656 lldb::addr_t offset,
1657 bool verbose)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001658{
1659 if (module)
1660 {
1661 lldb::addr_t addr = raw_addr - offset;
1662 Address so_addr;
1663 SymbolContext sc;
Greg Claytonc14ee322011-09-22 04:58:26 +00001664 Target *target = interpreter.GetExecutionContext().GetTargetPtr();
Greg Claytoneffe5c92011-05-03 22:09:39 +00001665 if (target && !target->GetSectionLoadList().IsEmpty())
1666 {
1667 if (!target->GetSectionLoadList().ResolveLoadAddress (addr, so_addr))
1668 return false;
Greg Claytone72dfb32012-02-24 01:59:29 +00001669 else if (so_addr.GetModule().get() != module)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001670 return false;
1671 }
1672 else
1673 {
1674 if (!module->ResolveFileAddress (addr, so_addr))
1675 return false;
1676 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001677
Greg Claytoneffe5c92011-05-03 22:09:39 +00001678 ExecutionContextScope *exe_scope = interpreter.GetExecutionContext().GetBestExecutionContextScope();
Greg Claytonc4a8a762012-05-15 18:43:44 +00001679 DumpAddress (exe_scope, so_addr, verbose, strm);
1680// strm.IndentMore();
1681// strm.Indent (" Address: ");
1682// so_addr.Dump (&strm, exe_scope, Address::DumpStyleModuleWithFileAddress);
1683// strm.PutCString (" (");
1684// so_addr.Dump (&strm, exe_scope, Address::DumpStyleSectionNameOffset);
1685// strm.PutCString (")\n");
1686// strm.Indent (" Summary: ");
1687// const uint32_t save_indent = strm.GetIndentLevel ();
1688// strm.SetIndentLevel (save_indent + 13);
1689// so_addr.Dump (&strm, exe_scope, Address::DumpStyleResolvedDescription);
1690// strm.SetIndentLevel (save_indent);
1691// // Print out detailed address information when verbose is enabled
1692// if (verbose)
1693// {
1694// strm.EOL();
1695// so_addr.Dump (&strm, exe_scope, Address::DumpStyleDetailedSymbolContext);
1696// }
1697// strm.IndentLess();
Greg Claytoneffe5c92011-05-03 22:09:39 +00001698 return true;
1699 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001700
Greg Claytoneffe5c92011-05-03 22:09:39 +00001701 return false;
1702}
1703
1704static uint32_t
Greg Claytonc4a8a762012-05-15 18:43:44 +00001705LookupSymbolInModule (CommandInterpreter &interpreter, Stream &strm, Module *module, const char *name, bool name_is_regex, bool verbose)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001706{
1707 if (module)
1708 {
1709 SymbolContext sc;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001710
Michael Sartaina7499c92013-07-01 19:45:50 +00001711 SymbolVendor *sym_vendor = module->GetSymbolVendor ();
1712 if (sym_vendor)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001713 {
Michael Sartaina7499c92013-07-01 19:45:50 +00001714 Symtab *symtab = sym_vendor->GetSymtab();
Greg Claytoneffe5c92011-05-03 22:09:39 +00001715 if (symtab)
1716 {
Greg Claytoneffe5c92011-05-03 22:09:39 +00001717 std::vector<uint32_t> match_indexes;
1718 ConstString symbol_name (name);
1719 uint32_t num_matches = 0;
1720 if (name_is_regex)
1721 {
1722 RegularExpression name_regexp(name);
1723 num_matches = symtab->AppendSymbolIndexesMatchingRegExAndType (name_regexp,
1724 eSymbolTypeAny,
1725 match_indexes);
1726 }
1727 else
1728 {
1729 num_matches = symtab->AppendSymbolIndexesWithName (symbol_name, match_indexes);
1730 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001731
Greg Claytoneffe5c92011-05-03 22:09:39 +00001732 if (num_matches > 0)
1733 {
1734 strm.Indent ();
1735 strm.Printf("%u symbols match %s'%s' in ", num_matches,
1736 name_is_regex ? "the regular expression " : "", name);
1737 DumpFullpath (strm, &module->GetFileSpec(), 0);
1738 strm.PutCString(":\n");
1739 strm.IndentMore ();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001740 for (uint32_t i = 0; i < num_matches; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001741 {
1742 Symbol *symbol = symtab->SymbolAtIndex(match_indexes[i]);
Greg Clayton358cf1e2015-06-25 21:46:34 +00001743 if (symbol && symbol->ValueIsAddress())
1744 {
1745 DumpAddress (interpreter.GetExecutionContext().GetBestExecutionContextScope(),
1746 symbol->GetAddressRef(),
1747 verbose,
1748 strm);
1749 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00001750 }
1751 strm.IndentLess ();
1752 return num_matches;
1753 }
1754 }
1755 }
1756 }
1757 return 0;
1758}
1759
Greg Claytoneffe5c92011-05-03 22:09:39 +00001760static void
Greg Claytonc4a8a762012-05-15 18:43:44 +00001761DumpSymbolContextList (ExecutionContextScope *exe_scope, Stream &strm, SymbolContextList &sc_list, bool verbose)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001762{
1763 strm.IndentMore ();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001764
Greg Claytoneffe5c92011-05-03 22:09:39 +00001765 const uint32_t num_matches = sc_list.GetSize();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001766
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001767 for (uint32_t i = 0; i < num_matches; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001768 {
1769 SymbolContext sc;
1770 if (sc_list.GetContextAtIndex(i, sc))
1771 {
Sean Callananf6172c22012-02-11 00:24:04 +00001772 AddressRange range;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001773
Sean Callananf6172c22012-02-11 00:24:04 +00001774 sc.GetAddressRange(eSymbolContextEverything,
1775 0,
1776 true,
1777 range);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001778
Greg Claytonc4a8a762012-05-15 18:43:44 +00001779 DumpAddress (exe_scope, range.GetBaseAddress(), verbose, strm);
Greg Claytoneffe5c92011-05-03 22:09:39 +00001780 }
1781 }
1782 strm.IndentLess ();
1783}
1784
Greg Claytonc7bece562013-01-25 18:06:21 +00001785static size_t
Greg Claytonc4a8a762012-05-15 18:43:44 +00001786LookupFunctionInModule (CommandInterpreter &interpreter,
1787 Stream &strm,
1788 Module *module,
1789 const char *name,
1790 bool name_is_regex,
1791 bool include_inlines,
1792 bool include_symbols,
1793 bool verbose)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001794{
1795 if (module && name && name[0])
1796 {
1797 SymbolContextList sc_list;
Greg Claytoneffe5c92011-05-03 22:09:39 +00001798 const bool append = true;
Greg Claytonc7bece562013-01-25 18:06:21 +00001799 size_t num_matches = 0;
Greg Claytoneffe5c92011-05-03 22:09:39 +00001800 if (name_is_regex)
1801 {
1802 RegularExpression function_name_regex (name);
1803 num_matches = module->FindFunctions (function_name_regex,
1804 include_symbols,
Sean Callanan9df05fb2012-02-10 22:52:19 +00001805 include_inlines,
Greg Claytoneffe5c92011-05-03 22:09:39 +00001806 append,
1807 sc_list);
1808 }
1809 else
1810 {
1811 ConstString function_name (name);
Eugene Zelenkof13e6522016-02-25 19:02:39 +00001812 num_matches = module->FindFunctions(function_name,
1813 nullptr,
1814 eFunctionNameTypeAuto,
1815 include_symbols,
1816 include_inlines,
1817 append,
1818 sc_list);
Greg Claytoneffe5c92011-05-03 22:09:39 +00001819 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001820
Greg Claytoneffe5c92011-05-03 22:09:39 +00001821 if (num_matches)
1822 {
1823 strm.Indent ();
Deepak Panickal99fbc072014-03-03 15:39:47 +00001824 strm.Printf("%" PRIu64 " match%s found in ", (uint64_t)num_matches, num_matches > 1 ? "es" : "");
Greg Claytoneffe5c92011-05-03 22:09:39 +00001825 DumpFullpath (strm, &module->GetFileSpec(), 0);
1826 strm.PutCString(":\n");
Greg Claytonc4a8a762012-05-15 18:43:44 +00001827 DumpSymbolContextList (interpreter.GetExecutionContext().GetBestExecutionContextScope(), strm, sc_list, verbose);
Greg Claytoneffe5c92011-05-03 22:09:39 +00001828 }
1829 return num_matches;
1830 }
1831 return 0;
1832}
1833
Greg Claytonc7bece562013-01-25 18:06:21 +00001834static size_t
Greg Claytonaafa5c92012-05-15 19:26:12 +00001835LookupTypeInModule (CommandInterpreter &interpreter,
Greg Clayton644247c2011-07-07 01:59:51 +00001836 Stream &strm,
1837 Module *module,
1838 const char *name_cstr,
1839 bool name_is_regex)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001840{
1841 if (module && name_cstr && name_cstr[0])
1842 {
Greg Claytond1767f02011-12-08 02:13:16 +00001843 TypeList type_list;
Greg Clayton84db9102012-03-26 23:03:23 +00001844 const uint32_t max_num_matches = UINT32_MAX;
Greg Claytonc7bece562013-01-25 18:06:21 +00001845 size_t num_matches = 0;
Greg Clayton84db9102012-03-26 23:03:23 +00001846 bool name_is_fully_qualified = false;
Greg Claytond1767f02011-12-08 02:13:16 +00001847 SymbolContext sc;
1848
1849 ConstString name(name_cstr);
Greg Claytonae088e52016-02-10 21:28:13 +00001850 llvm::DenseSet<lldb_private::SymbolFile *> searched_symbol_files;
1851 num_matches = module->FindTypes(sc, name, name_is_fully_qualified, max_num_matches, searched_symbol_files, type_list);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001852
Greg Claytond1767f02011-12-08 02:13:16 +00001853 if (num_matches)
1854 {
1855 strm.Indent ();
Deepak Panickal99fbc072014-03-03 15:39:47 +00001856 strm.Printf("%" PRIu64 " match%s found in ", (uint64_t)num_matches, num_matches > 1 ? "es" : "");
Greg Claytond1767f02011-12-08 02:13:16 +00001857 DumpFullpath (strm, &module->GetFileSpec(), 0);
1858 strm.PutCString(":\n");
Sean Callanan5c19eac2013-11-06 19:28:40 +00001859 for (TypeSP type_sp : type_list.Types())
Greg Claytoneffe5c92011-05-03 22:09:39 +00001860 {
Greg Claytond1767f02011-12-08 02:13:16 +00001861 if (type_sp)
Greg Claytoneffe5c92011-05-03 22:09:39 +00001862 {
Greg Claytond1767f02011-12-08 02:13:16 +00001863 // Resolve the clang type so that any forward references
1864 // to types that haven't yet been parsed will get parsed.
Greg Clayton99558cc42015-08-24 23:46:31 +00001865 type_sp->GetFullCompilerType ();
Greg Claytond1767f02011-12-08 02:13:16 +00001866 type_sp->GetDescription (&strm, eDescriptionLevelFull, true);
Greg Claytonaafa5c92012-05-15 19:26:12 +00001867 // Print all typedef chains
1868 TypeSP typedef_type_sp (type_sp);
1869 TypeSP typedefed_type_sp (typedef_type_sp->GetTypedefType());
1870 while (typedefed_type_sp)
1871 {
1872 strm.EOL();
1873 strm.Printf(" typedef '%s': ", typedef_type_sp->GetName().GetCString());
Greg Clayton99558cc42015-08-24 23:46:31 +00001874 typedefed_type_sp->GetFullCompilerType ();
Greg Claytonaafa5c92012-05-15 19:26:12 +00001875 typedefed_type_sp->GetDescription (&strm, eDescriptionLevelFull, true);
1876 typedef_type_sp = typedefed_type_sp;
1877 typedefed_type_sp = typedef_type_sp->GetTypedefType();
1878 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00001879 }
Greg Claytond1767f02011-12-08 02:13:16 +00001880 strm.EOL();
Greg Claytoneffe5c92011-05-03 22:09:39 +00001881 }
Greg Claytond1767f02011-12-08 02:13:16 +00001882 }
1883 return num_matches;
Greg Claytoneffe5c92011-05-03 22:09:39 +00001884 }
1885 return 0;
1886}
1887
Greg Claytonc7bece562013-01-25 18:06:21 +00001888static size_t
Sean Callanand38b4a92012-06-06 20:49:55 +00001889LookupTypeHere (CommandInterpreter &interpreter,
1890 Stream &strm,
1891 const SymbolContext &sym_ctx,
1892 const char *name_cstr,
1893 bool name_is_regex)
1894{
1895 if (!sym_ctx.module_sp)
1896 return 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001897
Sean Callanand38b4a92012-06-06 20:49:55 +00001898 TypeList type_list;
1899 const uint32_t max_num_matches = UINT32_MAX;
Greg Claytonc7bece562013-01-25 18:06:21 +00001900 size_t num_matches = 1;
Sean Callanand38b4a92012-06-06 20:49:55 +00001901 bool name_is_fully_qualified = false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001902
Sean Callanand38b4a92012-06-06 20:49:55 +00001903 ConstString name(name_cstr);
Greg Claytonae088e52016-02-10 21:28:13 +00001904 llvm::DenseSet<SymbolFile *> searched_symbol_files;
1905 num_matches = sym_ctx.module_sp->FindTypes(sym_ctx, name, name_is_fully_qualified, max_num_matches, searched_symbol_files, type_list);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001906
Sean Callanand38b4a92012-06-06 20:49:55 +00001907 if (num_matches)
1908 {
1909 strm.Indent ();
1910 strm.PutCString("Best match found in ");
1911 DumpFullpath (strm, &sym_ctx.module_sp->GetFileSpec(), 0);
1912 strm.PutCString(":\n");
Enrico Granatae5ffa082015-09-23 19:32:56 +00001913
Sean Callanand38b4a92012-06-06 20:49:55 +00001914 TypeSP type_sp (type_list.GetTypeAtIndex(0));
1915 if (type_sp)
1916 {
1917 // Resolve the clang type so that any forward references
1918 // to types that haven't yet been parsed will get parsed.
Greg Clayton99558cc42015-08-24 23:46:31 +00001919 type_sp->GetFullCompilerType ();
Sean Callanand38b4a92012-06-06 20:49:55 +00001920 type_sp->GetDescription (&strm, eDescriptionLevelFull, true);
1921 // Print all typedef chains
1922 TypeSP typedef_type_sp (type_sp);
1923 TypeSP typedefed_type_sp (typedef_type_sp->GetTypedefType());
1924 while (typedefed_type_sp)
1925 {
1926 strm.EOL();
1927 strm.Printf(" typedef '%s': ", typedef_type_sp->GetName().GetCString());
Greg Clayton99558cc42015-08-24 23:46:31 +00001928 typedefed_type_sp->GetFullCompilerType ();
Sean Callanand38b4a92012-06-06 20:49:55 +00001929 typedefed_type_sp->GetDescription (&strm, eDescriptionLevelFull, true);
1930 typedef_type_sp = typedefed_type_sp;
1931 typedefed_type_sp = typedef_type_sp->GetTypedefType();
1932 }
1933 }
1934 strm.EOL();
1935 }
1936 return num_matches;
1937}
1938
1939static uint32_t
Greg Claytoneffe5c92011-05-03 22:09:39 +00001940LookupFileAndLineInModule (CommandInterpreter &interpreter,
Sean Callanand38b4a92012-06-06 20:49:55 +00001941 Stream &strm,
Greg Claytoneffe5c92011-05-03 22:09:39 +00001942 Module *module,
1943 const FileSpec &file_spec,
1944 uint32_t line,
1945 bool check_inlines,
1946 bool verbose)
1947{
1948 if (module && file_spec)
1949 {
1950 SymbolContextList sc_list;
1951 const uint32_t num_matches = module->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
1952 eSymbolContextEverything, sc_list);
1953 if (num_matches > 0)
1954 {
1955 strm.Indent ();
1956 strm.Printf("%u match%s found in ", num_matches, num_matches > 1 ? "es" : "");
1957 strm << file_spec;
1958 if (line > 0)
1959 strm.Printf (":%u", line);
1960 strm << " in ";
1961 DumpFullpath (strm, &module->GetFileSpec(), 0);
1962 strm.PutCString(":\n");
Greg Claytonc4a8a762012-05-15 18:43:44 +00001963 DumpSymbolContextList (interpreter.GetExecutionContext().GetBestExecutionContextScope(), strm, sc_list, verbose);
Greg Claytoneffe5c92011-05-03 22:09:39 +00001964 return num_matches;
1965 }
1966 }
1967 return 0;
Greg Claytoneffe5c92011-05-03 22:09:39 +00001968}
1969
Greg Clayton8ee64382011-11-10 01:18:58 +00001970static size_t
1971FindModulesByName (Target *target,
1972 const char *module_name,
1973 ModuleList &module_list,
1974 bool check_global_list)
1975{
Greg Clayton8ee64382011-11-10 01:18:58 +00001976 FileSpec module_file_spec(module_name, false);
Greg Claytonb9a01b32012-02-26 05:51:37 +00001977 ModuleSpec module_spec (module_file_spec);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001978
Greg Clayton8ee64382011-11-10 01:18:58 +00001979 const size_t initial_size = module_list.GetSize ();
1980
Greg Claytonf3156262012-07-11 20:46:47 +00001981 if (check_global_list)
Greg Clayton8ee64382011-11-10 01:18:58 +00001982 {
1983 // Check the global list
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00001984 std::lock_guard<std::recursive_mutex> guard(Module::GetAllocationModuleCollectionMutex());
Greg Claytonc7bece562013-01-25 18:06:21 +00001985 const size_t num_modules = Module::GetNumberAllocatedModules();
Greg Clayton8ee64382011-11-10 01:18:58 +00001986 ModuleSP module_sp;
Greg Claytonc7bece562013-01-25 18:06:21 +00001987 for (size_t image_idx = 0; image_idx<num_modules; ++image_idx)
Greg Clayton8ee64382011-11-10 01:18:58 +00001988 {
1989 Module *module = Module::GetAllocatedModuleAtIndex(image_idx);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001990
Greg Clayton8ee64382011-11-10 01:18:58 +00001991 if (module)
1992 {
Greg Claytonb9a01b32012-02-26 05:51:37 +00001993 if (module->MatchesModuleSpec (module_spec))
Greg Clayton8ee64382011-11-10 01:18:58 +00001994 {
Greg Claytone1cd1be2012-01-29 20:56:30 +00001995 module_sp = module->shared_from_this();
Greg Clayton8ee64382011-11-10 01:18:58 +00001996 module_list.AppendIfNeeded(module_sp);
1997 }
1998 }
1999 }
2000 }
Greg Claytonf3156262012-07-11 20:46:47 +00002001 else
2002 {
2003 if (target)
2004 {
2005 const size_t num_matches = target->GetImages().FindModules (module_spec, module_list);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002006
Greg Claytonf3156262012-07-11 20:46:47 +00002007 // Not found in our module list for our target, check the main
2008 // shared module list in case it is a extra file used somewhere
2009 // else
2010 if (num_matches == 0)
2011 {
2012 module_spec.GetArchitecture() = target->GetArchitecture();
2013 ModuleList::FindSharedModules (module_spec, module_list);
2014 }
2015 }
2016 else
2017 {
2018 ModuleList::FindSharedModules (module_spec,module_list);
2019 }
2020 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002021
Greg Clayton8ee64382011-11-10 01:18:58 +00002022 return module_list.GetSize () - initial_size;
2023}
2024
Greg Claytoneffe5c92011-05-03 22:09:39 +00002025#pragma mark CommandObjectTargetModulesModuleAutoComplete
2026
2027//----------------------------------------------------------------------
2028// A base command object class that can auto complete with module file
2029// paths
2030//----------------------------------------------------------------------
2031
Jim Ingham5a988412012-06-08 21:56:10 +00002032class CommandObjectTargetModulesModuleAutoComplete : public CommandObjectParsed
Greg Claytoneffe5c92011-05-03 22:09:39 +00002033{
2034public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00002035 CommandObjectTargetModulesModuleAutoComplete (CommandInterpreter &interpreter,
2036 const char *name,
2037 const char *help,
2038 const char *syntax) :
Jim Ingham5a988412012-06-08 21:56:10 +00002039 CommandObjectParsed (interpreter, name, help, syntax)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002040 {
2041 CommandArgumentEntry arg;
2042 CommandArgumentData file_arg;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002043
Greg Claytoneffe5c92011-05-03 22:09:39 +00002044 // Define the first (and only) variant of this arg.
2045 file_arg.arg_type = eArgTypeFilename;
2046 file_arg.arg_repetition = eArgRepeatStar;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002047
Greg Claytoneffe5c92011-05-03 22:09:39 +00002048 // There is only one variant this argument could be; put it into the argument entry.
2049 arg.push_back (file_arg);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002050
Greg Claytoneffe5c92011-05-03 22:09:39 +00002051 // Push the data for the first argument into the m_arguments vector.
2052 m_arguments.push_back (arg);
2053 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002054
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002055 ~CommandObjectTargetModulesModuleAutoComplete() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002056
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002057 int
Greg Claytoneffe5c92011-05-03 22:09:39 +00002058 HandleArgumentCompletion (Args &input,
2059 int &cursor_index,
2060 int &cursor_char_position,
2061 OptionElementVector &opt_element_vector,
2062 int match_start_point,
2063 int max_return_elements,
2064 bool &word_complete,
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002065 StringList &matches) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00002066 {
2067 // Arguments are the standard module completer.
2068 std::string completion_str (input.GetArgumentAtIndex(cursor_index));
2069 completion_str.erase (cursor_char_position);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002070
Todd Fialae1cfbc72016-08-11 23:51:28 +00002071 CommandCompletions::InvokeCommonCompletionCallbacks(GetCommandInterpreter(),
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002072 CommandCompletions::eModuleCompletion,
2073 completion_str.c_str(),
2074 match_start_point,
2075 max_return_elements,
2076 nullptr,
2077 word_complete,
2078 matches);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002079 return matches.GetSize();
2080 }
2081};
2082
2083#pragma mark CommandObjectTargetModulesSourceFileAutoComplete
2084
2085//----------------------------------------------------------------------
2086// A base command object class that can auto complete with module source
2087// file paths
2088//----------------------------------------------------------------------
2089
Jim Ingham5a988412012-06-08 21:56:10 +00002090class CommandObjectTargetModulesSourceFileAutoComplete : public CommandObjectParsed
Greg Claytoneffe5c92011-05-03 22:09:39 +00002091{
2092public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00002093 CommandObjectTargetModulesSourceFileAutoComplete (CommandInterpreter &interpreter,
Greg Claytonf9fc6092013-01-09 19:44:40 +00002094 const char *name,
2095 const char *help,
2096 const char *syntax,
2097 uint32_t flags) :
2098 CommandObjectParsed (interpreter, name, help, syntax, flags)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002099 {
2100 CommandArgumentEntry arg;
2101 CommandArgumentData source_file_arg;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002102
Greg Claytoneffe5c92011-05-03 22:09:39 +00002103 // Define the first (and only) variant of this arg.
2104 source_file_arg.arg_type = eArgTypeSourceFile;
2105 source_file_arg.arg_repetition = eArgRepeatPlus;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002106
Greg Claytoneffe5c92011-05-03 22:09:39 +00002107 // There is only one variant this argument could be; put it into the argument entry.
2108 arg.push_back (source_file_arg);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002109
Greg Claytoneffe5c92011-05-03 22:09:39 +00002110 // Push the data for the first argument into the m_arguments vector.
2111 m_arguments.push_back (arg);
2112 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002113
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002114 ~CommandObjectTargetModulesSourceFileAutoComplete() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002115
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002116 int
Greg Claytoneffe5c92011-05-03 22:09:39 +00002117 HandleArgumentCompletion (Args &input,
2118 int &cursor_index,
2119 int &cursor_char_position,
2120 OptionElementVector &opt_element_vector,
2121 int match_start_point,
2122 int max_return_elements,
2123 bool &word_complete,
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002124 StringList &matches) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00002125 {
2126 // Arguments are the standard source file completer.
2127 std::string completion_str (input.GetArgumentAtIndex(cursor_index));
2128 completion_str.erase (cursor_char_position);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002129
Todd Fialae1cfbc72016-08-11 23:51:28 +00002130 CommandCompletions::InvokeCommonCompletionCallbacks(GetCommandInterpreter(),
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002131 CommandCompletions::eSourceFileCompletion,
2132 completion_str.c_str(),
2133 match_start_point,
2134 max_return_elements,
2135 nullptr,
2136 word_complete,
2137 matches);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002138 return matches.GetSize();
2139 }
2140};
2141
Adrian McCarthy543725c2016-04-04 21:21:49 +00002142#pragma mark CommandObjectTargetModulesDumpObjfile
2143
2144class CommandObjectTargetModulesDumpObjfile : public CommandObjectTargetModulesModuleAutoComplete
2145{
2146public:
2147 CommandObjectTargetModulesDumpObjfile(CommandInterpreter &interpreter)
2148 : CommandObjectTargetModulesModuleAutoComplete(interpreter, "target modules dump objfile",
2149 "Dump the object file headers from one or more target modules.",
2150 nullptr)
2151 {
2152 }
2153
2154 ~CommandObjectTargetModulesDumpObjfile() override = default;
2155
2156protected:
2157 bool
2158 DoExecute(Args &command, CommandReturnObject &result) override
2159 {
2160 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
2161 if (target == nullptr)
2162 {
2163 result.AppendError("invalid target, create a debug target using the 'target create' command");
2164 result.SetStatus(eReturnStatusFailed);
2165 return false;
2166 }
2167
2168 uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
2169 result.GetOutputStream().SetAddressByteSize(addr_byte_size);
2170 result.GetErrorStream().SetAddressByteSize(addr_byte_size);
2171
2172 size_t num_dumped = 0;
2173 if (command.GetArgumentCount() == 0)
2174 {
2175 // Dump all headers for all modules images
2176 num_dumped = DumpModuleObjfileHeaders(result.GetOutputStream(), target->GetImages());
2177 if (num_dumped == 0)
2178 {
2179 result.AppendError("the target has no associated executable images");
2180 result.SetStatus(eReturnStatusFailed);
2181 }
2182 }
2183 else
2184 {
2185 // Find the modules that match the basename or full path.
2186 ModuleList module_list;
2187 const char *arg_cstr;
2188 for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != nullptr; ++arg_idx)
2189 {
2190 size_t num_matched = FindModulesByName(target, arg_cstr, module_list, true);
2191 if (num_matched == 0)
2192 {
2193 result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr);
2194 }
2195 }
2196 // Dump all the modules we found.
2197 num_dumped = DumpModuleObjfileHeaders(result.GetOutputStream(), module_list);
2198 }
2199
2200 if (num_dumped > 0)
2201 {
2202 result.SetStatus(eReturnStatusSuccessFinishResult);
2203 }
2204 else
2205 {
2206 result.AppendError("no matching executable images found");
2207 result.SetStatus(eReturnStatusFailed);
2208 }
2209 return result.Succeeded();
2210 }
2211};
2212
Greg Claytoneffe5c92011-05-03 22:09:39 +00002213#pragma mark CommandObjectTargetModulesDumpSymtab
2214
Greg Claytoneffe5c92011-05-03 22:09:39 +00002215class CommandObjectTargetModulesDumpSymtab : public CommandObjectTargetModulesModuleAutoComplete
2216{
2217public:
2218 CommandObjectTargetModulesDumpSymtab (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002219 CommandObjectTargetModulesModuleAutoComplete(interpreter,
2220 "target modules dump symtab",
2221 "Dump the symbol table from one or more target modules.",
2222 nullptr),
Todd Fialae1cfbc72016-08-11 23:51:28 +00002223 m_options()
Greg Claytoneffe5c92011-05-03 22:09:39 +00002224 {
2225 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002226
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002227 ~CommandObjectTargetModulesDumpSymtab() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002228
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002229 Options *
2230 GetOptions () override
Jim Ingham5a988412012-06-08 21:56:10 +00002231 {
2232 return &m_options;
2233 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002234
Jim Ingham5a988412012-06-08 21:56:10 +00002235 class CommandOptions : public Options
2236 {
2237 public:
Todd Fialae1cfbc72016-08-11 23:51:28 +00002238 CommandOptions() :
2239 Options(),
2240 m_sort_order(eSortOrderNone)
Jim Ingham5a988412012-06-08 21:56:10 +00002241 {
2242 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002243
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002244 ~CommandOptions() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002245
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002246 Error
Todd Fialae1cfbc72016-08-11 23:51:28 +00002247 SetOptionValue(uint32_t option_idx, const char *option_arg,
2248 ExecutionContext *execution_context) override
Jim Ingham5a988412012-06-08 21:56:10 +00002249 {
2250 Error error;
Greg Clayton3bcdfc02012-12-04 00:32:51 +00002251 const int short_option = m_getopt_table[option_idx].val;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002252
Jim Ingham5a988412012-06-08 21:56:10 +00002253 switch (short_option)
2254 {
2255 case 's':
2256 m_sort_order = (SortOrder) Args::StringToOptionEnum (option_arg,
2257 g_option_table[option_idx].enum_values,
2258 eSortOrderNone,
2259 error);
2260 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002261
Jim Ingham5a988412012-06-08 21:56:10 +00002262 default:
2263 error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
2264 break;
Jim Ingham5a988412012-06-08 21:56:10 +00002265 }
2266 return error;
2267 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002268
Jim Ingham5a988412012-06-08 21:56:10 +00002269 void
Todd Fialae1cfbc72016-08-11 23:51:28 +00002270 OptionParsingStarting(ExecutionContext *execution_context) override
Jim Ingham5a988412012-06-08 21:56:10 +00002271 {
2272 m_sort_order = eSortOrderNone;
2273 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002274
Jim Ingham5a988412012-06-08 21:56:10 +00002275 const OptionDefinition*
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002276 GetDefinitions () override
Jim Ingham5a988412012-06-08 21:56:10 +00002277 {
2278 return g_option_table;
2279 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002280
Jim Ingham5a988412012-06-08 21:56:10 +00002281 // Options table: Required for subclasses of Options.
2282 static OptionDefinition g_option_table[];
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002283
Jim Ingham5a988412012-06-08 21:56:10 +00002284 SortOrder m_sort_order;
2285 };
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002286
Jim Ingham5a988412012-06-08 21:56:10 +00002287protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002288 bool
2289 DoExecute (Args& command, CommandReturnObject &result) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00002290 {
2291 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002292 if (target == nullptr)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002293 {
2294 result.AppendError ("invalid target, create a debug target using the 'target create' command");
2295 result.SetStatus (eReturnStatusFailed);
2296 return false;
2297 }
2298 else
2299 {
2300 uint32_t num_dumped = 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002301
Greg Claytoneffe5c92011-05-03 22:09:39 +00002302 uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
2303 result.GetOutputStream().SetAddressByteSize(addr_byte_size);
2304 result.GetErrorStream().SetAddressByteSize(addr_byte_size);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002305
Greg Claytoneffe5c92011-05-03 22:09:39 +00002306 if (command.GetArgumentCount() == 0)
2307 {
2308 // Dump all sections for all modules images
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00002309 std::lock_guard<std::recursive_mutex> guard(target->GetImages().GetMutex());
Greg Claytonc7bece562013-01-25 18:06:21 +00002310 const size_t num_modules = target->GetImages().GetSize();
Greg Claytoneffe5c92011-05-03 22:09:39 +00002311 if (num_modules > 0)
2312 {
Deepak Panickal99fbc072014-03-03 15:39:47 +00002313 result.GetOutputStream().Printf("Dumping symbol table for %" PRIu64 " modules.\n", (uint64_t)num_modules);
Greg Claytonc7bece562013-01-25 18:06:21 +00002314 for (size_t image_idx = 0; image_idx<num_modules; ++image_idx)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002315 {
2316 if (num_dumped > 0)
2317 {
2318 result.GetOutputStream().EOL();
2319 result.GetOutputStream().EOL();
2320 }
2321 num_dumped++;
Jim Ingham3ee12ef2012-05-30 02:19:25 +00002322 DumpModuleSymtab (m_interpreter,
2323 result.GetOutputStream(),
2324 target->GetImages().GetModulePointerAtIndexUnlocked(image_idx),
2325 m_options.m_sort_order);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002326 }
2327 }
2328 else
2329 {
2330 result.AppendError ("the target has no associated executable images");
2331 result.SetStatus (eReturnStatusFailed);
2332 return false;
2333 }
2334 }
2335 else
2336 {
2337 // Dump specified images (by basename or fullpath)
2338 const char *arg_cstr;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002339 for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != nullptr; ++arg_idx)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002340 {
Greg Clayton8ee64382011-11-10 01:18:58 +00002341 ModuleList module_list;
2342 const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, true);
2343 if (num_matches > 0)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002344 {
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002345 for (size_t i = 0; i < num_matches; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002346 {
Greg Clayton8ee64382011-11-10 01:18:58 +00002347 Module *module = module_list.GetModulePointerAtIndex(i);
2348 if (module)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002349 {
2350 if (num_dumped > 0)
2351 {
2352 result.GetOutputStream().EOL();
2353 result.GetOutputStream().EOL();
2354 }
2355 num_dumped++;
Greg Clayton8ee64382011-11-10 01:18:58 +00002356 DumpModuleSymtab (m_interpreter, result.GetOutputStream(), module, m_options.m_sort_order);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002357 }
2358 }
2359 }
2360 else
2361 result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr);
2362 }
2363 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002364
Greg Claytoneffe5c92011-05-03 22:09:39 +00002365 if (num_dumped > 0)
2366 result.SetStatus (eReturnStatusSuccessFinishResult);
2367 else
2368 {
2369 result.AppendError ("no matching executable images found");
2370 result.SetStatus (eReturnStatusFailed);
2371 }
2372 }
2373 return result.Succeeded();
2374 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002375
Greg Claytoneffe5c92011-05-03 22:09:39 +00002376 CommandOptions m_options;
2377};
2378
2379static OptionEnumValueElement
2380g_sort_option_enumeration[4] =
2381{
2382 { eSortOrderNone, "none", "No sorting, use the original symbol table order."},
2383 { eSortOrderByAddress, "address", "Sort output by symbol address."},
2384 { eSortOrderByName, "name", "Sort output by symbol name."},
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002385 { 0, nullptr, nullptr }
Greg Claytoneffe5c92011-05-03 22:09:39 +00002386};
2387
Greg Claytoneffe5c92011-05-03 22:09:39 +00002388OptionDefinition
2389CommandObjectTargetModulesDumpSymtab::CommandOptions::g_option_table[] =
2390{
Kate Stoneac9c3a62016-08-26 23:28:47 +00002391 // clang-format off
2392 {LLDB_OPT_SET_1, false, "sort", 's', OptionParser::eRequiredArgument, nullptr, g_sort_option_enumeration, 0, eArgTypeSortOrder, "Supply a sort order when dumping the symbol table."},
2393 {0, false, nullptr, 0, 0, nullptr, nullptr, 0, eArgTypeNone, nullptr}
2394 // clang-format on
Greg Claytoneffe5c92011-05-03 22:09:39 +00002395};
2396
2397#pragma mark CommandObjectTargetModulesDumpSections
2398
2399//----------------------------------------------------------------------
2400// Image section dumping command
2401//----------------------------------------------------------------------
2402
2403class CommandObjectTargetModulesDumpSections : public CommandObjectTargetModulesModuleAutoComplete
2404{
2405public:
2406 CommandObjectTargetModulesDumpSections (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002407 CommandObjectTargetModulesModuleAutoComplete(interpreter,
2408 "target modules dump sections",
2409 "Dump the sections from one or more target modules.",
2410 //"target modules dump sections [<file1> ...]")
2411 nullptr)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002412 {
2413 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002414
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002415 ~CommandObjectTargetModulesDumpSections() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002416
Jim Ingham5a988412012-06-08 21:56:10 +00002417protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002418 bool
2419 DoExecute (Args& command, CommandReturnObject &result) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00002420 {
2421 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002422 if (target == nullptr)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002423 {
2424 result.AppendError ("invalid target, create a debug target using the 'target create' command");
2425 result.SetStatus (eReturnStatusFailed);
2426 return false;
2427 }
2428 else
2429 {
2430 uint32_t num_dumped = 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002431
Greg Claytoneffe5c92011-05-03 22:09:39 +00002432 uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
2433 result.GetOutputStream().SetAddressByteSize(addr_byte_size);
2434 result.GetErrorStream().SetAddressByteSize(addr_byte_size);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002435
Greg Claytoneffe5c92011-05-03 22:09:39 +00002436 if (command.GetArgumentCount() == 0)
2437 {
2438 // Dump all sections for all modules images
Greg Claytonc7bece562013-01-25 18:06:21 +00002439 const size_t num_modules = target->GetImages().GetSize();
Greg Claytoneffe5c92011-05-03 22:09:39 +00002440 if (num_modules > 0)
2441 {
Deepak Panickal99fbc072014-03-03 15:39:47 +00002442 result.GetOutputStream().Printf("Dumping sections for %" PRIu64 " modules.\n", (uint64_t)num_modules);
Greg Claytonc7bece562013-01-25 18:06:21 +00002443 for (size_t image_idx = 0; image_idx<num_modules; ++image_idx)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002444 {
2445 num_dumped++;
2446 DumpModuleSections (m_interpreter, result.GetOutputStream(), target->GetImages().GetModulePointerAtIndex(image_idx));
2447 }
2448 }
2449 else
2450 {
2451 result.AppendError ("the target has no associated executable images");
2452 result.SetStatus (eReturnStatusFailed);
2453 return false;
2454 }
2455 }
2456 else
2457 {
2458 // Dump specified images (by basename or fullpath)
2459 const char *arg_cstr;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002460 for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != nullptr; ++arg_idx)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002461 {
Greg Clayton8ee64382011-11-10 01:18:58 +00002462 ModuleList module_list;
2463 const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, true);
2464 if (num_matches > 0)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002465 {
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002466 for (size_t i = 0; i < num_matches; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002467 {
Greg Clayton8ee64382011-11-10 01:18:58 +00002468 Module *module = module_list.GetModulePointerAtIndex(i);
2469 if (module)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002470 {
2471 num_dumped++;
Greg Clayton8ee64382011-11-10 01:18:58 +00002472 DumpModuleSections (m_interpreter, result.GetOutputStream(), module);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002473 }
2474 }
2475 }
2476 else
Greg Clayton8ee64382011-11-10 01:18:58 +00002477 {
2478 // Check the global list
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00002479 std::lock_guard<std::recursive_mutex> guard(Module::GetAllocationModuleCollectionMutex());
Greg Clayton8ee64382011-11-10 01:18:58 +00002480
Greg Claytoneffe5c92011-05-03 22:09:39 +00002481 result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr);
Greg Clayton8ee64382011-11-10 01:18:58 +00002482 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00002483 }
2484 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002485
Greg Claytoneffe5c92011-05-03 22:09:39 +00002486 if (num_dumped > 0)
2487 result.SetStatus (eReturnStatusSuccessFinishResult);
2488 else
2489 {
2490 result.AppendError ("no matching executable images found");
2491 result.SetStatus (eReturnStatusFailed);
2492 }
2493 }
2494 return result.Succeeded();
2495 }
2496};
2497
Greg Claytoneffe5c92011-05-03 22:09:39 +00002498#pragma mark CommandObjectTargetModulesDumpSymfile
2499
2500//----------------------------------------------------------------------
2501// Image debug symbol dumping command
2502//----------------------------------------------------------------------
2503
2504class CommandObjectTargetModulesDumpSymfile : public CommandObjectTargetModulesModuleAutoComplete
2505{
2506public:
2507 CommandObjectTargetModulesDumpSymfile (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002508 CommandObjectTargetModulesModuleAutoComplete(interpreter,
2509 "target modules dump symfile",
2510 "Dump the debug symbol file for one or more target modules.",
2511 //"target modules dump symfile [<file1> ...]")
2512 nullptr)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002513 {
2514 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002515
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002516 ~CommandObjectTargetModulesDumpSymfile() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002517
Jim Ingham5a988412012-06-08 21:56:10 +00002518protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002519 bool
2520 DoExecute (Args& command, CommandReturnObject &result) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00002521 {
2522 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002523 if (target == nullptr)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002524 {
2525 result.AppendError ("invalid target, create a debug target using the 'target create' command");
2526 result.SetStatus (eReturnStatusFailed);
2527 return false;
2528 }
2529 else
2530 {
2531 uint32_t num_dumped = 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002532
Greg Claytoneffe5c92011-05-03 22:09:39 +00002533 uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
2534 result.GetOutputStream().SetAddressByteSize(addr_byte_size);
2535 result.GetErrorStream().SetAddressByteSize(addr_byte_size);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002536
Greg Claytoneffe5c92011-05-03 22:09:39 +00002537 if (command.GetArgumentCount() == 0)
2538 {
2539 // Dump all sections for all modules images
Enrico Granata17598482012-11-08 02:22:02 +00002540 const ModuleList &target_modules = target->GetImages();
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00002541 std::lock_guard<std::recursive_mutex> guard(target_modules.GetMutex());
Greg Claytonc7bece562013-01-25 18:06:21 +00002542 const size_t num_modules = target_modules.GetSize();
Greg Claytoneffe5c92011-05-03 22:09:39 +00002543 if (num_modules > 0)
2544 {
Deepak Panickal99fbc072014-03-03 15:39:47 +00002545 result.GetOutputStream().Printf("Dumping debug symbols for %" PRIu64 " modules.\n", (uint64_t)num_modules);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002546 for (uint32_t image_idx = 0; image_idx<num_modules; ++image_idx)
2547 {
Jim Ingham3ee12ef2012-05-30 02:19:25 +00002548 if (DumpModuleSymbolVendor (result.GetOutputStream(), target_modules.GetModulePointerAtIndexUnlocked(image_idx)))
Greg Claytoneffe5c92011-05-03 22:09:39 +00002549 num_dumped++;
2550 }
2551 }
2552 else
2553 {
2554 result.AppendError ("the target has no associated executable images");
2555 result.SetStatus (eReturnStatusFailed);
2556 return false;
2557 }
2558 }
2559 else
2560 {
2561 // Dump specified images (by basename or fullpath)
2562 const char *arg_cstr;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002563 for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != nullptr; ++arg_idx)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002564 {
Greg Clayton8ee64382011-11-10 01:18:58 +00002565 ModuleList module_list;
2566 const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, true);
2567 if (num_matches > 0)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002568 {
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002569 for (size_t i = 0; i < num_matches; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002570 {
Greg Clayton8ee64382011-11-10 01:18:58 +00002571 Module *module = module_list.GetModulePointerAtIndex(i);
2572 if (module)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002573 {
Greg Clayton8ee64382011-11-10 01:18:58 +00002574 if (DumpModuleSymbolVendor (result.GetOutputStream(), module))
Greg Claytoneffe5c92011-05-03 22:09:39 +00002575 num_dumped++;
2576 }
2577 }
2578 }
2579 else
2580 result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr);
2581 }
2582 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002583
Greg Claytoneffe5c92011-05-03 22:09:39 +00002584 if (num_dumped > 0)
2585 result.SetStatus (eReturnStatusSuccessFinishResult);
2586 else
2587 {
2588 result.AppendError ("no matching executable images found");
2589 result.SetStatus (eReturnStatusFailed);
2590 }
2591 }
2592 return result.Succeeded();
2593 }
2594};
2595
Greg Claytoneffe5c92011-05-03 22:09:39 +00002596#pragma mark CommandObjectTargetModulesDumpLineTable
2597
2598//----------------------------------------------------------------------
2599// Image debug line table dumping command
2600//----------------------------------------------------------------------
2601
2602class CommandObjectTargetModulesDumpLineTable : public CommandObjectTargetModulesSourceFileAutoComplete
2603{
2604public:
2605 CommandObjectTargetModulesDumpLineTable (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002606 CommandObjectTargetModulesSourceFileAutoComplete(interpreter,
2607 "target modules dump line-table",
2608 "Dump the line table for one or more compilation units.",
2609 nullptr,
2610 eCommandRequiresTarget)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002611 {
2612 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002613
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002614 ~CommandObjectTargetModulesDumpLineTable() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002615
Jim Ingham5a988412012-06-08 21:56:10 +00002616protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002617 bool
2618 DoExecute (Args& command, CommandReturnObject &result) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00002619 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00002620 Target *target = m_exe_ctx.GetTargetPtr();
2621 uint32_t total_num_dumped = 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002622
Greg Claytonf9fc6092013-01-09 19:44:40 +00002623 uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
2624 result.GetOutputStream().SetAddressByteSize(addr_byte_size);
2625 result.GetErrorStream().SetAddressByteSize(addr_byte_size);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002626
Greg Claytonf9fc6092013-01-09 19:44:40 +00002627 if (command.GetArgumentCount() == 0)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002628 {
Dawn Perchik954b40b2016-01-05 19:51:51 +00002629 result.AppendError ("file option must be specified.");
Greg Claytoneffe5c92011-05-03 22:09:39 +00002630 result.SetStatus (eReturnStatusFailed);
Dawn Perchik954b40b2016-01-05 19:51:51 +00002631 return result.Succeeded();
Greg Claytoneffe5c92011-05-03 22:09:39 +00002632 }
2633 else
2634 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00002635 // Dump specified images (by basename or fullpath)
2636 const char *arg_cstr;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002637 for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != nullptr; ++arg_idx)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002638 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00002639 FileSpec file_spec(arg_cstr, false);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002640
Greg Claytonf9fc6092013-01-09 19:44:40 +00002641 const ModuleList &target_modules = target->GetImages();
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00002642 std::lock_guard<std::recursive_mutex> guard(target_modules.GetMutex());
Greg Claytonc7bece562013-01-25 18:06:21 +00002643 const size_t num_modules = target_modules.GetSize();
Greg Claytonf9fc6092013-01-09 19:44:40 +00002644 if (num_modules > 0)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002645 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00002646 uint32_t num_dumped = 0;
2647 for (uint32_t i = 0; i<num_modules; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002648 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00002649 if (DumpCompileUnitLineTable (m_interpreter,
2650 result.GetOutputStream(),
2651 target_modules.GetModulePointerAtIndexUnlocked(i),
2652 file_spec,
2653 m_exe_ctx.GetProcessPtr() && m_exe_ctx.GetProcessRef().IsAlive()))
2654 num_dumped++;
Greg Claytoneffe5c92011-05-03 22:09:39 +00002655 }
Greg Claytonf9fc6092013-01-09 19:44:40 +00002656 if (num_dumped == 0)
2657 result.AppendWarningWithFormat ("No source filenames matched '%s'.\n", arg_cstr);
2658 else
2659 total_num_dumped += num_dumped;
Greg Claytoneffe5c92011-05-03 22:09:39 +00002660 }
2661 }
Greg Claytonf9fc6092013-01-09 19:44:40 +00002662 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002663
Greg Claytonf9fc6092013-01-09 19:44:40 +00002664 if (total_num_dumped > 0)
2665 result.SetStatus (eReturnStatusSuccessFinishResult);
2666 else
2667 {
2668 result.AppendError ("no source filenames matched any command arguments");
2669 result.SetStatus (eReturnStatusFailed);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002670 }
2671 return result.Succeeded();
2672 }
2673};
2674
Greg Claytoneffe5c92011-05-03 22:09:39 +00002675#pragma mark CommandObjectTargetModulesDump
2676
2677//----------------------------------------------------------------------
2678// Dump multi-word command for target modules
2679//----------------------------------------------------------------------
2680
2681class CommandObjectTargetModulesDump : public CommandObjectMultiword
2682{
2683public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00002684 //------------------------------------------------------------------
2685 // Constructors and Destructors
2686 //------------------------------------------------------------------
Adrian McCarthy543725c2016-04-04 21:21:49 +00002687 CommandObjectTargetModulesDump(CommandInterpreter &interpreter)
2688 : CommandObjectMultiword(
Kate Stone7428a182016-07-14 22:03:10 +00002689 interpreter, "target modules dump", "Commands for dumping information about one or more target modules.",
Adrian McCarthy543725c2016-04-04 21:21:49 +00002690 "target modules dump [headers|symtab|sections|symfile|line-table] [<file1> <file2> ...]")
Greg Claytoneffe5c92011-05-03 22:09:39 +00002691 {
Adrian McCarthy543725c2016-04-04 21:21:49 +00002692 LoadSubCommand("objfile", CommandObjectSP(new CommandObjectTargetModulesDumpObjfile(interpreter)));
Greg Claytoneffe5c92011-05-03 22:09:39 +00002693 LoadSubCommand ("symtab", CommandObjectSP (new CommandObjectTargetModulesDumpSymtab (interpreter)));
2694 LoadSubCommand ("sections", CommandObjectSP (new CommandObjectTargetModulesDumpSections (interpreter)));
2695 LoadSubCommand ("symfile", CommandObjectSP (new CommandObjectTargetModulesDumpSymfile (interpreter)));
2696 LoadSubCommand ("line-table", CommandObjectSP (new CommandObjectTargetModulesDumpLineTable (interpreter)));
2697 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002698
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002699 ~CommandObjectTargetModulesDump() override = default;
Greg Claytoneffe5c92011-05-03 22:09:39 +00002700};
2701
Jim Ingham5a988412012-06-08 21:56:10 +00002702class CommandObjectTargetModulesAdd : public CommandObjectParsed
Greg Claytoneffe5c92011-05-03 22:09:39 +00002703{
2704public:
2705 CommandObjectTargetModulesAdd (CommandInterpreter &interpreter) :
Jim Ingham5a988412012-06-08 21:56:10 +00002706 CommandObjectParsed (interpreter,
2707 "target modules add",
2708 "Add a new module to the current target's modules.",
Greg Clayton50a24bd2012-11-29 22:16:27 +00002709 "target modules add [<module>]"),
Todd Fialae1cfbc72016-08-11 23:51:28 +00002710 m_option_group(),
Greg Clayton1c5f1862012-11-30 19:05:35 +00002711 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.")
Greg Claytoneffe5c92011-05-03 22:09:39 +00002712 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00002713 m_option_group.Append (&m_uuid_option_group, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Greg Clayton1c5f1862012-11-30 19:05:35 +00002714 m_option_group.Append (&m_symbol_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
Greg Clayton50a24bd2012-11-29 22:16:27 +00002715 m_option_group.Finalize();
Greg Claytoneffe5c92011-05-03 22:09:39 +00002716 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002717
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002718 ~CommandObjectTargetModulesAdd() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002719
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002720 Options *
2721 GetOptions () override
Greg Clayton50a24bd2012-11-29 22:16:27 +00002722 {
2723 return &m_option_group;
2724 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002725
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002726 int
Jim Ingham5a988412012-06-08 21:56:10 +00002727 HandleArgumentCompletion (Args &input,
2728 int &cursor_index,
2729 int &cursor_char_position,
2730 OptionElementVector &opt_element_vector,
2731 int match_start_point,
2732 int max_return_elements,
2733 bool &word_complete,
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002734 StringList &matches) override
Jim Ingham5a988412012-06-08 21:56:10 +00002735 {
2736 std::string completion_str (input.GetArgumentAtIndex(cursor_index));
2737 completion_str.erase (cursor_char_position);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002738
Todd Fialae1cfbc72016-08-11 23:51:28 +00002739 CommandCompletions::InvokeCommonCompletionCallbacks(GetCommandInterpreter(),
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002740 CommandCompletions::eDiskFileCompletion,
2741 completion_str.c_str(),
2742 match_start_point,
2743 max_return_elements,
2744 nullptr,
2745 word_complete,
2746 matches);
Jim Ingham5a988412012-06-08 21:56:10 +00002747 return matches.GetSize();
2748 }
2749
2750protected:
Greg Clayton50a24bd2012-11-29 22:16:27 +00002751 OptionGroupOptions m_option_group;
2752 OptionGroupUUID m_uuid_option_group;
Greg Clayton1c5f1862012-11-30 19:05:35 +00002753 OptionGroupFile m_symbol_file;
Greg Clayton50a24bd2012-11-29 22:16:27 +00002754
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002755 bool
2756 DoExecute (Args& args, CommandReturnObject &result) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00002757 {
2758 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002759 if (target == nullptr)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002760 {
2761 result.AppendError ("invalid target, create a debug target using the 'target create' command");
2762 result.SetStatus (eReturnStatusFailed);
2763 return false;
2764 }
2765 else
2766 {
Sean Callananb36c6c02012-12-13 01:39:39 +00002767 bool flush = false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002768
Greg Claytoneffe5c92011-05-03 22:09:39 +00002769 const size_t argc = args.GetArgumentCount();
2770 if (argc == 0)
2771 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00002772 if (m_uuid_option_group.GetOptionValue ().OptionWasSet())
2773 {
2774 // We are given a UUID only, go locate the file
2775 ModuleSpec module_spec;
2776 module_spec.GetUUID() = m_uuid_option_group.GetOptionValue ().GetCurrentValue();
Greg Clayton1c5f1862012-11-30 19:05:35 +00002777 if (m_symbol_file.GetOptionValue().OptionWasSet())
2778 module_spec.GetSymbolFileSpec() = m_symbol_file.GetOptionValue().GetCurrentValue();
Greg Clayton50a24bd2012-11-29 22:16:27 +00002779 if (Symbols::DownloadObjectAndSymbolFile (module_spec))
2780 {
2781 ModuleSP module_sp (target->GetSharedModule (module_spec));
2782 if (module_sp)
2783 {
2784 result.SetStatus (eReturnStatusSuccessFinishResult);
2785 return true;
2786 }
2787 else
2788 {
2789 StreamString strm;
2790 module_spec.GetUUID().Dump (&strm);
2791 if (module_spec.GetFileSpec())
2792 {
2793 if (module_spec.GetSymbolFileSpec())
2794 {
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00002795 result.AppendErrorWithFormat ("Unable to create the executable or symbol file with UUID %s with path %s and symbol file %s",
Greg Clayton50a24bd2012-11-29 22:16:27 +00002796 strm.GetString().c_str(),
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00002797 module_spec.GetFileSpec().GetPath().c_str(),
2798 module_spec.GetSymbolFileSpec().GetPath().c_str());
Greg Clayton50a24bd2012-11-29 22:16:27 +00002799 }
2800 else
2801 {
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00002802 result.AppendErrorWithFormat ("Unable to create the executable or symbol file with UUID %s with path %s",
Greg Clayton50a24bd2012-11-29 22:16:27 +00002803 strm.GetString().c_str(),
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00002804 module_spec.GetFileSpec().GetPath().c_str());
Greg Clayton50a24bd2012-11-29 22:16:27 +00002805 }
2806 }
2807 else
2808 {
2809 result.AppendErrorWithFormat ("Unable to create the executable or symbol file with UUID %s",
2810 strm.GetString().c_str());
2811 }
2812 result.SetStatus (eReturnStatusFailed);
2813 return false;
2814 }
2815 }
2816 else
2817 {
2818 StreamString strm;
2819 module_spec.GetUUID().Dump (&strm);
2820 result.AppendErrorWithFormat ("Unable to locate the executable or symbol file with UUID %s", strm.GetString().c_str());
2821 result.SetStatus (eReturnStatusFailed);
2822 return false;
2823 }
2824 }
2825 else
2826 {
2827 result.AppendError ("one or more executable image paths must be specified");
2828 result.SetStatus (eReturnStatusFailed);
2829 return false;
2830 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00002831 }
2832 else
2833 {
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002834 for (size_t i = 0; i < argc; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002835 {
2836 const char *path = args.GetArgumentAtIndex(i);
2837 if (path)
2838 {
2839 FileSpec file_spec(path, true);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002840 if (file_spec.Exists())
2841 {
Greg Claytonb9a01b32012-02-26 05:51:37 +00002842 ModuleSpec module_spec (file_spec);
Greg Clayton50a24bd2012-11-29 22:16:27 +00002843 if (m_uuid_option_group.GetOptionValue ().OptionWasSet())
2844 module_spec.GetUUID() = m_uuid_option_group.GetOptionValue ().GetCurrentValue();
Greg Clayton1c5f1862012-11-30 19:05:35 +00002845 if (m_symbol_file.GetOptionValue().OptionWasSet())
2846 module_spec.GetSymbolFileSpec() = m_symbol_file.GetOptionValue().GetCurrentValue();
Jason Molendab019cd92013-09-11 21:25:46 +00002847 if (!module_spec.GetArchitecture().IsValid())
2848 module_spec.GetArchitecture() = target->GetArchitecture();
Greg Clayton50a24bd2012-11-29 22:16:27 +00002849 Error error;
2850 ModuleSP module_sp (target->GetSharedModule (module_spec, &error));
Greg Claytoneffe5c92011-05-03 22:09:39 +00002851 if (!module_sp)
2852 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00002853 const char *error_cstr = error.AsCString();
2854 if (error_cstr)
2855 result.AppendError (error_cstr);
2856 else
2857 result.AppendErrorWithFormat ("unsupported module: %s", path);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002858 result.SetStatus (eReturnStatusFailed);
2859 return false;
2860 }
Sean Callananb36c6c02012-12-13 01:39:39 +00002861 else
2862 {
2863 flush = true;
2864 }
Jason Molenda2f7af6a2011-08-02 23:28:55 +00002865 result.SetStatus (eReturnStatusSuccessFinishResult);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002866 }
2867 else
2868 {
2869 char resolved_path[PATH_MAX];
2870 result.SetStatus (eReturnStatusFailed);
2871 if (file_spec.GetPath (resolved_path, sizeof(resolved_path)))
2872 {
2873 if (strcmp (resolved_path, path) != 0)
2874 {
2875 result.AppendErrorWithFormat ("invalid module path '%s' with resolved path '%s'\n", path, resolved_path);
2876 break;
2877 }
2878 }
2879 result.AppendErrorWithFormat ("invalid module path '%s'\n", path);
2880 break;
2881 }
2882 }
2883 }
2884 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002885
Sean Callananb36c6c02012-12-13 01:39:39 +00002886 if (flush)
2887 {
2888 ProcessSP process = target->GetProcessSP();
2889 if (process)
2890 process->Flush();
2891 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00002892 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002893
Greg Claytoneffe5c92011-05-03 22:09:39 +00002894 return result.Succeeded();
2895 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00002896};
2897
2898class CommandObjectTargetModulesLoad : public CommandObjectTargetModulesModuleAutoComplete
2899{
2900public:
2901 CommandObjectTargetModulesLoad (CommandInterpreter &interpreter) :
2902 CommandObjectTargetModulesModuleAutoComplete (interpreter,
2903 "target modules load",
2904 "Set the load addresses for one or more sections in a target module.",
2905 "target modules load [--file <module> --uuid <uuid>] <sect-name> <address> [<sect-name> <address> ....]"),
Todd Fialae1cfbc72016-08-11 23:51:28 +00002906 m_option_group(),
Jason Molendac6127dd2014-11-21 02:25:15 +00002907 m_file_option (LLDB_OPT_SET_1, false, "file", 'f', 0, eArgTypeName, "Fullpath or basename for module to load.", ""),
Greg Claytoneffe5c92011-05-03 22:09:39 +00002908 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)
2909 {
2910 m_option_group.Append (&m_uuid_option_group, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
2911 m_option_group.Append (&m_file_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
2912 m_option_group.Append (&m_slide_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
2913 m_option_group.Finalize();
2914 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002915
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002916 ~CommandObjectTargetModulesLoad() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002917
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002918 Options *
2919 GetOptions () override
Jim Ingham5a988412012-06-08 21:56:10 +00002920 {
2921 return &m_option_group;
2922 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002923
Jim Ingham5a988412012-06-08 21:56:10 +00002924protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +00002925 bool
2926 DoExecute (Args& args, CommandReturnObject &result) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00002927 {
2928 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00002929 if (target == nullptr)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002930 {
2931 result.AppendError ("invalid target, create a debug target using the 'target create' command");
2932 result.SetStatus (eReturnStatusFailed);
2933 return false;
2934 }
2935 else
2936 {
2937 const size_t argc = args.GetArgumentCount();
Greg Claytonb9a01b32012-02-26 05:51:37 +00002938 ModuleSpec module_spec;
2939 bool search_using_module_spec = false;
Greg Claytoneffe5c92011-05-03 22:09:39 +00002940 if (m_file_option.GetOptionValue().OptionWasSet())
Greg Claytonb9a01b32012-02-26 05:51:37 +00002941 {
2942 search_using_module_spec = true;
Jason Molendac6127dd2014-11-21 02:25:15 +00002943 const char *arg_cstr = m_file_option.GetOptionValue().GetCurrentValue();
2944 const bool use_global_module_list = true;
2945 ModuleList module_list;
2946 const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, use_global_module_list);
2947 if (num_matches == 1)
2948 {
2949 module_spec.GetFileSpec() = module_list.GetModuleAtIndex(0)->GetFileSpec();
2950 }
2951 else if (num_matches > 1 )
2952 {
2953 search_using_module_spec = false;
2954 result.AppendErrorWithFormat ("more than 1 module matched by name '%s'\n", arg_cstr);
2955 result.SetStatus (eReturnStatusFailed);
2956 }
2957 else
2958 {
2959 search_using_module_spec = false;
2960 result.AppendErrorWithFormat ("no object file for module '%s'\n", arg_cstr);
2961 result.SetStatus (eReturnStatusFailed);
2962 }
Greg Claytonb9a01b32012-02-26 05:51:37 +00002963 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00002964
Greg Claytoneffe5c92011-05-03 22:09:39 +00002965 if (m_uuid_option_group.GetOptionValue().OptionWasSet())
Greg Claytonb9a01b32012-02-26 05:51:37 +00002966 {
2967 search_using_module_spec = true;
2968 module_spec.GetUUID() = m_uuid_option_group.GetOptionValue().GetCurrentValue();
2969 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00002970
Greg Claytonb9a01b32012-02-26 05:51:37 +00002971 if (search_using_module_spec)
Greg Claytoneffe5c92011-05-03 22:09:39 +00002972 {
Greg Claytoneffe5c92011-05-03 22:09:39 +00002973 ModuleList matching_modules;
Greg Claytonb9a01b32012-02-26 05:51:37 +00002974 const size_t num_matches = target->GetImages().FindModules (module_spec, matching_modules);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002975
2976 char path[PATH_MAX];
2977 if (num_matches == 1)
2978 {
2979 Module *module = matching_modules.GetModulePointerAtIndex(0);
2980 if (module)
2981 {
2982 ObjectFile *objfile = module->GetObjectFile();
2983 if (objfile)
2984 {
Greg Clayton3046e662013-07-10 01:23:25 +00002985 SectionList *section_list = module->GetSectionList();
Greg Claytoneffe5c92011-05-03 22:09:39 +00002986 if (section_list)
2987 {
Greg Clayton741f3f92012-03-27 21:10:07 +00002988 bool changed = false;
Greg Claytoneffe5c92011-05-03 22:09:39 +00002989 if (argc == 0)
2990 {
2991 if (m_slide_option.GetOptionValue().OptionWasSet())
2992 {
Greg Clayton741f3f92012-03-27 21:10:07 +00002993 const addr_t slide = m_slide_option.GetOptionValue().GetCurrentValue();
Greg Clayton751caf62014-02-07 22:54:47 +00002994 const bool slide_is_offset = true;
2995 module->SetLoadAddress (*target, slide, slide_is_offset, changed);
Greg Claytoneffe5c92011-05-03 22:09:39 +00002996 }
2997 else
2998 {
2999 result.AppendError ("one or more section name + load address pair must be specified");
3000 result.SetStatus (eReturnStatusFailed);
3001 return false;
3002 }
3003 }
3004 else
3005 {
3006 if (m_slide_option.GetOptionValue().OptionWasSet())
3007 {
3008 result.AppendError ("The \"--slide <offset>\" option can't be used in conjunction with setting section load addresses.\n");
3009 result.SetStatus (eReturnStatusFailed);
3010 return false;
3011 }
3012
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003013 for (size_t i = 0; i < argc; i += 2)
Greg Claytoneffe5c92011-05-03 22:09:39 +00003014 {
3015 const char *sect_name = args.GetArgumentAtIndex(i);
3016 const char *load_addr_cstr = args.GetArgumentAtIndex(i+1);
3017 if (sect_name && load_addr_cstr)
3018 {
3019 ConstString const_sect_name(sect_name);
3020 bool success = false;
Vince Harron5275aaa2015-01-15 20:08:35 +00003021 addr_t load_addr = StringConvert::ToUInt64(load_addr_cstr, LLDB_INVALID_ADDRESS, 0, &success);
Greg Claytoneffe5c92011-05-03 22:09:39 +00003022 if (success)
3023 {
3024 SectionSP section_sp (section_list->FindSectionByName(const_sect_name));
3025 if (section_sp)
3026 {
Greg Clayton741f3f92012-03-27 21:10:07 +00003027 if (section_sp->IsThreadSpecific())
3028 {
3029 result.AppendErrorWithFormat ("thread specific sections are not yet supported (section '%s')\n", sect_name);
3030 result.SetStatus (eReturnStatusFailed);
3031 break;
3032 }
3033 else
3034 {
Greg Clayton7820bd12012-07-07 01:24:12 +00003035 if (target->GetSectionLoadList().SetSectionLoadAddress (section_sp, load_addr))
Greg Clayton741f3f92012-03-27 21:10:07 +00003036 changed = true;
Daniel Malead01b2952012-11-29 21:49:15 +00003037 result.AppendMessageWithFormat("section '%s' loaded at 0x%" PRIx64 "\n", sect_name, load_addr);
Greg Clayton741f3f92012-03-27 21:10:07 +00003038 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00003039 }
3040 else
3041 {
3042 result.AppendErrorWithFormat ("no section found that matches the section name '%s'\n", sect_name);
3043 result.SetStatus (eReturnStatusFailed);
3044 break;
3045 }
3046 }
3047 else
3048 {
3049 result.AppendErrorWithFormat ("invalid load address string '%s'\n", load_addr_cstr);
3050 result.SetStatus (eReturnStatusFailed);
3051 break;
3052 }
3053 }
3054 else
3055 {
3056 if (sect_name)
3057 result.AppendError ("section names must be followed by a load address.\n");
3058 else
3059 result.AppendError ("one or more section name + load address pair must be specified.\n");
3060 result.SetStatus (eReturnStatusFailed);
3061 break;
3062 }
3063 }
3064 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003065
Greg Clayton741f3f92012-03-27 21:10:07 +00003066 if (changed)
Greg Clayton3c947372013-01-29 01:17:09 +00003067 {
Greg Clayton741f3f92012-03-27 21:10:07 +00003068 target->ModulesDidLoad (matching_modules);
Greg Clayton3c947372013-01-29 01:17:09 +00003069 Process *process = m_exe_ctx.GetProcessPtr();
3070 if (process)
3071 process->Flush();
3072 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00003073 }
3074 else
3075 {
3076 module->GetFileSpec().GetPath (path, sizeof(path));
3077 result.AppendErrorWithFormat ("no sections in object file '%s'\n", path);
3078 result.SetStatus (eReturnStatusFailed);
3079 }
3080 }
3081 else
3082 {
3083 module->GetFileSpec().GetPath (path, sizeof(path));
3084 result.AppendErrorWithFormat ("no object file for module '%s'\n", path);
3085 result.SetStatus (eReturnStatusFailed);
3086 }
3087 }
3088 else
3089 {
Jim Ingham28eb5712012-10-12 17:34:26 +00003090 FileSpec *module_spec_file = module_spec.GetFileSpecPtr();
3091 if (module_spec_file)
3092 {
3093 module_spec_file->GetPath (path, sizeof(path));
3094 result.AppendErrorWithFormat ("invalid module '%s'.\n", path);
3095 }
3096 else
3097 result.AppendError ("no module spec");
Greg Claytoneffe5c92011-05-03 22:09:39 +00003098 result.SetStatus (eReturnStatusFailed);
3099 }
3100 }
3101 else
3102 {
Jason Molendac16b4af2013-05-03 23:56:12 +00003103 std::string uuid_str;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003104
Greg Claytonb9a01b32012-02-26 05:51:37 +00003105 if (module_spec.GetFileSpec())
3106 module_spec.GetFileSpec().GetPath (path, sizeof(path));
Greg Claytoneffe5c92011-05-03 22:09:39 +00003107 else
3108 path[0] = '\0';
3109
Greg Claytonb9a01b32012-02-26 05:51:37 +00003110 if (module_spec.GetUUIDPtr())
Jason Molendac16b4af2013-05-03 23:56:12 +00003111 uuid_str = module_spec.GetUUID().GetAsString();
Greg Claytoneffe5c92011-05-03 22:09:39 +00003112 if (num_matches > 1)
3113 {
3114 result.AppendErrorWithFormat ("multiple modules match%s%s%s%s:\n",
3115 path[0] ? " file=" : "",
3116 path,
Jason Molendac16b4af2013-05-03 23:56:12 +00003117 !uuid_str.empty() ? " uuid=" : "",
3118 uuid_str.c_str());
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003119 for (size_t i = 0; i < num_matches; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00003120 {
3121 if (matching_modules.GetModulePointerAtIndex(i)->GetFileSpec().GetPath (path, sizeof(path)))
3122 result.AppendMessageWithFormat("%s\n", path);
3123 }
3124 }
3125 else
3126 {
3127 result.AppendErrorWithFormat ("no modules were found that match%s%s%s%s.\n",
3128 path[0] ? " file=" : "",
3129 path,
Jason Molendac16b4af2013-05-03 23:56:12 +00003130 !uuid_str.empty() ? " uuid=" : "",
3131 uuid_str.c_str());
Greg Claytoneffe5c92011-05-03 22:09:39 +00003132 }
3133 result.SetStatus (eReturnStatusFailed);
3134 }
3135 }
3136 else
3137 {
3138 result.AppendError ("either the \"--file <module>\" or the \"--uuid <uuid>\" option must be specified.\n");
3139 result.SetStatus (eReturnStatusFailed);
3140 return false;
3141 }
3142 }
3143 return result.Succeeded();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003144 }
3145
Greg Claytoneffe5c92011-05-03 22:09:39 +00003146 OptionGroupOptions m_option_group;
3147 OptionGroupUUID m_uuid_option_group;
Jason Molendac6127dd2014-11-21 02:25:15 +00003148 OptionGroupString m_file_option;
Greg Claytoneffe5c92011-05-03 22:09:39 +00003149 OptionGroupUInt64 m_slide_option;
3150};
3151
3152//----------------------------------------------------------------------
3153// List images with associated information
3154//----------------------------------------------------------------------
Jim Ingham5a988412012-06-08 21:56:10 +00003155class CommandObjectTargetModulesList : public CommandObjectParsed
Greg Claytoneffe5c92011-05-03 22:09:39 +00003156{
3157public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00003158 class CommandOptions : public Options
3159 {
3160 public:
Todd Fialae1cfbc72016-08-11 23:51:28 +00003161 CommandOptions() :
3162 Options(),
Jim Inghamc10312c2011-10-24 18:36:33 +00003163 m_format_array(),
Daniel Dunbara08823f2011-10-31 22:50:49 +00003164 m_use_global_module_list (false),
Jim Inghamc10312c2011-10-24 18:36:33 +00003165 m_module_addr (LLDB_INVALID_ADDRESS)
Greg Claytoneffe5c92011-05-03 22:09:39 +00003166 {
3167 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003168
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003169 ~CommandOptions() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003170
Bruce Mitchener13d21e92015-10-07 16:56:17 +00003171 Error
Todd Fialae1cfbc72016-08-11 23:51:28 +00003172 SetOptionValue(uint32_t option_idx, const char *option_arg,
3173 ExecutionContext *execution_context) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00003174 {
Greg Claytonb9d5df52012-12-06 22:49:16 +00003175 Error error;
3176
Greg Clayton3bcdfc02012-12-04 00:32:51 +00003177 const int short_option = m_getopt_table[option_idx].val;
Greg Clayton65a03992011-08-09 00:01:09 +00003178 if (short_option == 'g')
3179 {
3180 m_use_global_module_list = true;
3181 }
Jim Inghamc10312c2011-10-24 18:36:33 +00003182 else if (short_option == 'a')
3183 {
Todd Fialae1cfbc72016-08-11 23:51:28 +00003184 m_module_addr = Args::StringToAddress(execution_context,
3185 option_arg,
3186 LLDB_INVALID_ADDRESS,
3187 &error);
Jim Inghamc10312c2011-10-24 18:36:33 +00003188 }
Greg Clayton65a03992011-08-09 00:01:09 +00003189 else
3190 {
Greg Claytonc7bece562013-01-25 18:06:21 +00003191 unsigned long width = 0;
Greg Clayton65a03992011-08-09 00:01:09 +00003192 if (option_arg)
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003193 width = strtoul(option_arg, nullptr, 0);
Greg Clayton65a03992011-08-09 00:01:09 +00003194 m_format_array.push_back(std::make_pair(short_option, width));
3195 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00003196 return error;
3197 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003198
Greg Claytoneffe5c92011-05-03 22:09:39 +00003199 void
Todd Fialae1cfbc72016-08-11 23:51:28 +00003200 OptionParsingStarting(ExecutionContext *execution_context) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00003201 {
3202 m_format_array.clear();
Greg Clayton65a03992011-08-09 00:01:09 +00003203 m_use_global_module_list = false;
Jim Inghamc10312c2011-10-24 18:36:33 +00003204 m_module_addr = LLDB_INVALID_ADDRESS;
Greg Claytoneffe5c92011-05-03 22:09:39 +00003205 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003206
Greg Claytoneffe5c92011-05-03 22:09:39 +00003207 const OptionDefinition*
Bruce Mitchener13d21e92015-10-07 16:56:17 +00003208 GetDefinitions () override
Greg Claytoneffe5c92011-05-03 22:09:39 +00003209 {
3210 return g_option_table;
3211 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003212
Greg Claytoneffe5c92011-05-03 22:09:39 +00003213 // Options table: Required for subclasses of Options.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003214
Greg Claytoneffe5c92011-05-03 22:09:39 +00003215 static OptionDefinition g_option_table[];
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003216
Greg Claytoneffe5c92011-05-03 22:09:39 +00003217 // Instance variables to hold the values for command options.
3218 typedef std::vector< std::pair<char, uint32_t> > FormatWidthCollection;
3219 FormatWidthCollection m_format_array;
Greg Clayton65a03992011-08-09 00:01:09 +00003220 bool m_use_global_module_list;
Jim Inghamc10312c2011-10-24 18:36:33 +00003221 lldb::addr_t m_module_addr;
Greg Claytoneffe5c92011-05-03 22:09:39 +00003222 };
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003223
Greg Claytoneffe5c92011-05-03 22:09:39 +00003224 CommandObjectTargetModulesList (CommandInterpreter &interpreter) :
Jim Ingham5a988412012-06-08 21:56:10 +00003225 CommandObjectParsed (interpreter,
3226 "target modules list",
3227 "List current executable and dependent shared library images.",
3228 "target modules list [<cmd-options>]"),
Todd Fialae1cfbc72016-08-11 23:51:28 +00003229 m_options()
Greg Claytoneffe5c92011-05-03 22:09:39 +00003230 {
3231 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003232
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003233 ~CommandObjectTargetModulesList() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003234
Greg Claytoneffe5c92011-05-03 22:09:39 +00003235 Options *
Bruce Mitchener13d21e92015-10-07 16:56:17 +00003236 GetOptions () override
Greg Claytoneffe5c92011-05-03 22:09:39 +00003237 {
3238 return &m_options;
3239 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003240
Jim Ingham5a988412012-06-08 21:56:10 +00003241protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +00003242 bool
3243 DoExecute (Args& command, CommandReturnObject &result) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00003244 {
3245 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Greg Clayton3418c852011-08-10 02:10:13 +00003246 const bool use_global_module_list = m_options.m_use_global_module_list;
Greg Clayton234076c2012-06-27 20:26:19 +00003247 // Define a local module list here to ensure it lives longer than any "locker"
3248 // object which might lock its contents below (through the "module_list_ptr"
3249 // variable).
3250 ModuleList module_list;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003251 if (target == nullptr && !use_global_module_list)
Greg Claytoneffe5c92011-05-03 22:09:39 +00003252 {
3253 result.AppendError ("invalid target, create a debug target using the 'target create' command");
3254 result.SetStatus (eReturnStatusFailed);
3255 return false;
3256 }
3257 else
3258 {
Greg Clayton3418c852011-08-10 02:10:13 +00003259 if (target)
3260 {
3261 uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
3262 result.GetOutputStream().SetAddressByteSize(addr_byte_size);
3263 result.GetErrorStream().SetAddressByteSize(addr_byte_size);
3264 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00003265 // Dump all sections for all modules images
Jim Inghamc10312c2011-10-24 18:36:33 +00003266 Stream &strm = result.GetOutputStream();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003267
Jim Inghamc10312c2011-10-24 18:36:33 +00003268 if (m_options.m_module_addr != LLDB_INVALID_ADDRESS)
3269 {
3270 if (target)
3271 {
3272 Address module_address;
3273 if (module_address.SetLoadAddress(m_options.m_module_addr, target))
3274 {
Greg Claytone72dfb32012-02-24 01:59:29 +00003275 ModuleSP module_sp (module_address.GetModule());
3276 if (module_sp)
Jim Inghamc10312c2011-10-24 18:36:33 +00003277 {
Greg Claytonc7bece562013-01-25 18:06:21 +00003278 PrintModule (target, module_sp.get(), 0, strm);
Jim Inghamc10312c2011-10-24 18:36:33 +00003279 result.SetStatus (eReturnStatusSuccessFinishResult);
3280 }
3281 else
3282 {
Jim Ingham17fafa12012-12-15 02:40:54 +00003283 result.AppendErrorWithFormat ("Couldn't find module matching address: 0x%" PRIx64 ".", m_options.m_module_addr);
Jim Inghamc10312c2011-10-24 18:36:33 +00003284 result.SetStatus (eReturnStatusFailed);
3285 }
3286 }
3287 else
3288 {
Jim Ingham17fafa12012-12-15 02:40:54 +00003289 result.AppendErrorWithFormat ("Couldn't find module containing address: 0x%" PRIx64 ".", m_options.m_module_addr);
Jim Inghamc10312c2011-10-24 18:36:33 +00003290 result.SetStatus (eReturnStatusFailed);
3291 }
3292 }
3293 else
3294 {
3295 result.AppendError ("Can only look up modules by address with a valid target.");
3296 result.SetStatus (eReturnStatusFailed);
3297 }
3298 return result.Succeeded();
3299 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003300
Greg Claytonc7bece562013-01-25 18:06:21 +00003301 size_t num_modules = 0;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00003302
3303 // This locker will be locked on the mutex in module_list_ptr if it is non-nullptr.
3304 // Otherwise it will lock the AllocationModuleCollectionMutex when accessing
3305 // the global module list directly.
3306 std::unique_lock<std::recursive_mutex> guard(Module::GetAllocationModuleCollectionMutex(), std::defer_lock);
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00003307
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003308 const ModuleList *module_list_ptr = nullptr;
Greg Claytonc4a8a762012-05-15 18:43:44 +00003309 const size_t argc = command.GetArgumentCount();
3310 if (argc == 0)
Greg Clayton65a03992011-08-09 00:01:09 +00003311 {
Greg Claytonc4a8a762012-05-15 18:43:44 +00003312 if (use_global_module_list)
3313 {
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00003314 guard.lock();
Greg Claytonc4a8a762012-05-15 18:43:44 +00003315 num_modules = Module::GetNumberAllocatedModules();
3316 }
3317 else
3318 {
3319 module_list_ptr = &target->GetImages();
Greg Claytonc4a8a762012-05-15 18:43:44 +00003320 }
Greg Clayton65a03992011-08-09 00:01:09 +00003321 }
3322 else
Greg Claytonc4a8a762012-05-15 18:43:44 +00003323 {
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003324 for (size_t i = 0; i < argc; ++i)
Greg Claytonc4a8a762012-05-15 18:43:44 +00003325 {
3326 // Dump specified images (by basename or fullpath)
3327 const char *arg_cstr = command.GetArgumentAtIndex(i);
3328 const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, use_global_module_list);
3329 if (num_matches == 0)
3330 {
3331 if (argc == 1)
3332 {
3333 result.AppendErrorWithFormat ("no modules found that match '%s'", arg_cstr);
3334 result.SetStatus (eReturnStatusFailed);
3335 return false;
3336 }
3337 }
3338 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003339
Greg Claytonc4a8a762012-05-15 18:43:44 +00003340 module_list_ptr = &module_list;
3341 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003342
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00003343 std::unique_lock<std::recursive_mutex> lock;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003344 if (module_list_ptr != nullptr)
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003345 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00003346 lock = std::unique_lock<std::recursive_mutex>(module_list_ptr->GetMutex());
3347
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003348 num_modules = module_list_ptr->GetSize();
3349 }
Greg Clayton65a03992011-08-09 00:01:09 +00003350
Greg Claytoneffe5c92011-05-03 22:09:39 +00003351 if (num_modules > 0)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003352 {
Greg Claytoneffe5c92011-05-03 22:09:39 +00003353 for (uint32_t image_idx = 0; image_idx<num_modules; ++image_idx)
3354 {
Greg Clayton3418c852011-08-10 02:10:13 +00003355 ModuleSP module_sp;
Greg Clayton65a03992011-08-09 00:01:09 +00003356 Module *module;
Greg Claytonc4a8a762012-05-15 18:43:44 +00003357 if (module_list_ptr)
Greg Clayton65a03992011-08-09 00:01:09 +00003358 {
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003359 module_sp = module_list_ptr->GetModuleAtIndexUnlocked(image_idx);
Greg Claytonc4a8a762012-05-15 18:43:44 +00003360 module = module_sp.get();
Greg Clayton65a03992011-08-09 00:01:09 +00003361 }
3362 else
3363 {
Greg Claytonc4a8a762012-05-15 18:43:44 +00003364 module = Module::GetAllocatedModuleAtIndex(image_idx);
3365 module_sp = module->shared_from_this();
Greg Clayton65a03992011-08-09 00:01:09 +00003366 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003367
Greg Claytonc7bece562013-01-25 18:06:21 +00003368 const size_t indent = strm.Printf("[%3u] ", image_idx);
3369 PrintModule (target, module, indent, strm);
Greg Clayton3418c852011-08-10 02:10:13 +00003370
Greg Claytoneffe5c92011-05-03 22:09:39 +00003371 }
3372 result.SetStatus (eReturnStatusSuccessFinishResult);
3373 }
3374 else
3375 {
Greg Claytonc4a8a762012-05-15 18:43:44 +00003376 if (argc)
3377 {
3378 if (use_global_module_list)
3379 result.AppendError ("the global module list has no matching modules");
3380 else
3381 result.AppendError ("the target has no matching modules");
3382 }
Greg Clayton3418c852011-08-10 02:10:13 +00003383 else
Greg Claytonc4a8a762012-05-15 18:43:44 +00003384 {
3385 if (use_global_module_list)
3386 result.AppendError ("the global module list is empty");
3387 else
3388 result.AppendError ("the target has no associated executable images");
3389 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00003390 result.SetStatus (eReturnStatusFailed);
3391 return false;
3392 }
3393 }
3394 return result.Succeeded();
3395 }
Jim Inghamc10312c2011-10-24 18:36:33 +00003396
3397 void
Greg Claytonc7bece562013-01-25 18:06:21 +00003398 PrintModule (Target *target, Module *module, int indent, Stream &strm)
Jim Inghamc10312c2011-10-24 18:36:33 +00003399 {
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003400 if (module == nullptr)
Jim Ingham28eb5712012-10-12 17:34:26 +00003401 {
3402 strm.PutCString("Null module");
3403 return;
3404 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003405
Jim Inghamc10312c2011-10-24 18:36:33 +00003406 bool dump_object_name = false;
3407 if (m_options.m_format_array.empty())
3408 {
Greg Claytonc9660542012-02-05 02:38:54 +00003409 m_options.m_format_array.push_back(std::make_pair('u', 0));
3410 m_options.m_format_array.push_back(std::make_pair('h', 0));
3411 m_options.m_format_array.push_back(std::make_pair('f', 0));
3412 m_options.m_format_array.push_back(std::make_pair('S', 0));
Jim Inghamc10312c2011-10-24 18:36:33 +00003413 }
Greg Claytonc9660542012-02-05 02:38:54 +00003414 const size_t num_entries = m_options.m_format_array.size();
3415 bool print_space = false;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003416 for (size_t i = 0; i < num_entries; ++i)
Jim Inghamc10312c2011-10-24 18:36:33 +00003417 {
Greg Claytonc9660542012-02-05 02:38:54 +00003418 if (print_space)
3419 strm.PutChar(' ');
3420 print_space = true;
3421 const char format_char = m_options.m_format_array[i].first;
3422 uint32_t width = m_options.m_format_array[i].second;
3423 switch (format_char)
Jim Inghamc10312c2011-10-24 18:36:33 +00003424 {
Greg Claytonc9660542012-02-05 02:38:54 +00003425 case 'A':
3426 DumpModuleArchitecture (strm, module, false, width);
3427 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003428
Greg Claytonc9660542012-02-05 02:38:54 +00003429 case 't':
3430 DumpModuleArchitecture (strm, module, true, width);
3431 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003432
Greg Claytonc9660542012-02-05 02:38:54 +00003433 case 'f':
3434 DumpFullpath (strm, &module->GetFileSpec(), width);
3435 dump_object_name = true;
3436 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003437
Greg Claytonc9660542012-02-05 02:38:54 +00003438 case 'd':
3439 DumpDirectory (strm, &module->GetFileSpec(), width);
3440 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003441
Greg Claytonc9660542012-02-05 02:38:54 +00003442 case 'b':
3443 DumpBasename (strm, &module->GetFileSpec(), width);
3444 dump_object_name = true;
3445 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003446
Greg Claytonc9660542012-02-05 02:38:54 +00003447 case 'h':
3448 case 'o':
3449 // Image header address
3450 {
3451 uint32_t addr_nibble_width = target ? (target->GetArchitecture().GetAddressByteSize() * 2) : 16;
Jim Inghamc10312c2011-10-24 18:36:33 +00003452
Greg Claytonc9660542012-02-05 02:38:54 +00003453 ObjectFile *objfile = module->GetObjectFile ();
3454 if (objfile)
Jim Inghamc10312c2011-10-24 18:36:33 +00003455 {
Greg Claytonc9660542012-02-05 02:38:54 +00003456 Address header_addr(objfile->GetHeaderAddress());
3457 if (header_addr.IsValid())
Jim Inghamc10312c2011-10-24 18:36:33 +00003458 {
Greg Claytonc9660542012-02-05 02:38:54 +00003459 if (target && !target->GetSectionLoadList().IsEmpty())
Jim Inghamc10312c2011-10-24 18:36:33 +00003460 {
Greg Claytonc9660542012-02-05 02:38:54 +00003461 lldb::addr_t header_load_addr = header_addr.GetLoadAddress (target);
3462 if (header_load_addr == LLDB_INVALID_ADDRESS)
3463 {
3464 header_addr.Dump (&strm, target, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleFileAddress);
3465 }
Jim Inghamc10312c2011-10-24 18:36:33 +00003466 else
Greg Claytonc9660542012-02-05 02:38:54 +00003467 {
3468 if (format_char == 'o')
3469 {
3470 // Show the offset of slide for the image
Daniel Malead01b2952012-11-29 21:49:15 +00003471 strm.Printf ("0x%*.*" PRIx64, addr_nibble_width, addr_nibble_width, header_load_addr - header_addr.GetFileAddress());
Greg Claytonc9660542012-02-05 02:38:54 +00003472 }
3473 else
3474 {
3475 // Show the load address of the image
Daniel Malead01b2952012-11-29 21:49:15 +00003476 strm.Printf ("0x%*.*" PRIx64, addr_nibble_width, addr_nibble_width, header_load_addr);
Greg Claytonc9660542012-02-05 02:38:54 +00003477 }
3478 }
Jim Inghamc10312c2011-10-24 18:36:33 +00003479 break;
3480 }
Greg Claytonc9660542012-02-05 02:38:54 +00003481 // The address was valid, but the image isn't loaded, output the address in an appropriate format
3482 header_addr.Dump (&strm, target, Address::DumpStyleFileAddress);
3483 break;
Jim Inghamc10312c2011-10-24 18:36:33 +00003484 }
Jim Inghamc10312c2011-10-24 18:36:33 +00003485 }
Greg Claytonc9660542012-02-05 02:38:54 +00003486 strm.Printf ("%*s", addr_nibble_width + 2, "");
3487 }
3488 break;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003489
Greg Claytonc9660542012-02-05 02:38:54 +00003490 case 'r':
3491 {
Greg Claytonc7bece562013-01-25 18:06:21 +00003492 size_t ref_count = 0;
Greg Claytonc9660542012-02-05 02:38:54 +00003493 ModuleSP module_sp (module->shared_from_this());
3494 if (module_sp)
3495 {
3496 // Take one away to make sure we don't count our local "module_sp"
3497 ref_count = module_sp.use_count() - 1;
3498 }
3499 if (width)
Greg Clayton6fea17e2014-03-03 19:15:20 +00003500 strm.Printf("{%*" PRIu64 "}", width, (uint64_t)ref_count);
Greg Claytonc9660542012-02-05 02:38:54 +00003501 else
Deepak Panickal99fbc072014-03-03 15:39:47 +00003502 strm.Printf("{%" PRIu64 "}", (uint64_t)ref_count);
Greg Claytonc9660542012-02-05 02:38:54 +00003503 }
3504 break;
Jim Inghamc10312c2011-10-24 18:36:33 +00003505
Greg Claytonc9660542012-02-05 02:38:54 +00003506 case 's':
3507 case 'S':
3508 {
Ilia Ke912e3e2015-03-10 21:18:59 +00003509 const SymbolVendor *symbol_vendor = module->GetSymbolVendor();
Greg Claytonc9660542012-02-05 02:38:54 +00003510 if (symbol_vendor)
3511 {
Ilia Ke912e3e2015-03-10 21:18:59 +00003512 const FileSpec symfile_spec = symbol_vendor->GetMainFileSpec();
3513 if (format_char == 'S')
Greg Claytonc9660542012-02-05 02:38:54 +00003514 {
Ilia Ke912e3e2015-03-10 21:18:59 +00003515 // Dump symbol file only if different from module file
3516 if (!symfile_spec || symfile_spec == module->GetFileSpec())
Greg Claytonc9660542012-02-05 02:38:54 +00003517 {
Ilia Ke912e3e2015-03-10 21:18:59 +00003518 print_space = false;
3519 break;
Greg Claytonc9660542012-02-05 02:38:54 +00003520 }
Ilia Ke912e3e2015-03-10 21:18:59 +00003521 // Add a newline and indent past the index
3522 strm.Printf ("\n%*s", indent, "");
Greg Claytonc9660542012-02-05 02:38:54 +00003523 }
Ilia Ke912e3e2015-03-10 21:18:59 +00003524 DumpFullpath (strm, &symfile_spec, width);
3525 dump_object_name = true;
3526 break;
Greg Claytonc9660542012-02-05 02:38:54 +00003527 }
3528 strm.Printf("%.*s", width, "<NONE>");
3529 }
3530 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003531
Greg Claytonc9660542012-02-05 02:38:54 +00003532 case 'm':
3533 module->GetModificationTime().Dump(&strm, width);
3534 break;
Jim Inghamc10312c2011-10-24 18:36:33 +00003535
Greg Claytonc9660542012-02-05 02:38:54 +00003536 case 'p':
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003537 strm.Printf("%p", static_cast<void*>(module));
Greg Claytonc9660542012-02-05 02:38:54 +00003538 break;
3539
3540 case 'u':
3541 DumpModuleUUID(strm, module);
3542 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003543
Greg Claytonc9660542012-02-05 02:38:54 +00003544 default:
3545 break;
Jim Inghamc10312c2011-10-24 18:36:33 +00003546 }
Greg Claytonc9660542012-02-05 02:38:54 +00003547 }
3548 if (dump_object_name)
3549 {
3550 const char *object_name = module->GetObjectName().GetCString();
3551 if (object_name)
3552 strm.Printf ("(%s)", object_name);
Jim Inghamc10312c2011-10-24 18:36:33 +00003553 }
3554 strm.EOL();
3555 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003556
Greg Claytoneffe5c92011-05-03 22:09:39 +00003557 CommandOptions m_options;
3558};
3559
3560OptionDefinition
3561CommandObjectTargetModulesList::CommandOptions::g_option_table[] =
3562{
Kate Stoneac9c3a62016-08-26 23:28:47 +00003563 // clang-format off
3564 {LLDB_OPT_SET_1, false, "address", 'a', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeAddressOrExpression, "Display the image at this address."},
3565 {LLDB_OPT_SET_1, false, "arch", 'A', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeWidth, "Display the architecture when listing images."},
3566 {LLDB_OPT_SET_1, false, "triple", 't', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeWidth, "Display the triple when listing images."},
3567 {LLDB_OPT_SET_1, false, "header", 'h', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Display the image header address as a load address if debugging, a file address otherwise."},
3568 {LLDB_OPT_SET_1, false, "offset", 'o', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Display the image header address offset from the header file address (the slide amount)."},
3569 {LLDB_OPT_SET_1, false, "uuid", 'u', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Display the UUID when listing images."},
3570 {LLDB_OPT_SET_1, false, "fullpath", 'f', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeWidth, "Display the fullpath to the image object file."},
3571 {LLDB_OPT_SET_1, false, "directory", 'd', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeWidth, "Display the directory with optional width for the image object file."},
3572 {LLDB_OPT_SET_1, false, "basename", 'b', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeWidth, "Display the basename with optional width for the image object file."},
3573 {LLDB_OPT_SET_1, false, "symfile", 's', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeWidth, "Display the fullpath to the image symbol file with optional width."},
3574 {LLDB_OPT_SET_1, false, "symfile-unique", 'S', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeWidth, "Display the symbol file with optional width only if it is different from the executable object file."},
3575 {LLDB_OPT_SET_1, false, "mod-time", 'm', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeWidth, "Display the modification time with optional width of the module."},
3576 {LLDB_OPT_SET_1, false, "ref-count", 'r', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeWidth, "Display the reference count if the module is still in the shared module cache."},
3577 {LLDB_OPT_SET_1, false, "pointer", 'p', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeNone, "Display the module pointer."},
3578 {LLDB_OPT_SET_1, false, "global", 'g', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Display the modules from the global module list, not just the current target."},
3579 {0, false, nullptr, 0, 0, nullptr, nullptr, 0, eArgTypeNone, nullptr}
3580 // clang-format on
Greg Claytoneffe5c92011-05-03 22:09:39 +00003581};
3582
Jason Molenda380241a2012-07-12 00:20:07 +00003583#pragma mark CommandObjectTargetModulesShowUnwind
Greg Claytoneffe5c92011-05-03 22:09:39 +00003584
Jason Molenda380241a2012-07-12 00:20:07 +00003585//----------------------------------------------------------------------
3586// Lookup unwind information in images
3587//----------------------------------------------------------------------
3588
3589class CommandObjectTargetModulesShowUnwind : public CommandObjectParsed
3590{
3591public:
Jason Molenda380241a2012-07-12 00:20:07 +00003592 enum
3593 {
3594 eLookupTypeInvalid = -1,
3595 eLookupTypeAddress = 0,
3596 eLookupTypeSymbol,
3597 eLookupTypeFunction,
3598 eLookupTypeFunctionOrSymbol,
3599 kNumLookupTypes
3600 };
3601
3602 class CommandOptions : public Options
3603 {
3604 public:
Todd Fialae1cfbc72016-08-11 23:51:28 +00003605 CommandOptions() :
3606 Options(),
Greg Claytonf9fc6092013-01-09 19:44:40 +00003607 m_type(eLookupTypeInvalid),
3608 m_str(),
3609 m_addr(LLDB_INVALID_ADDRESS)
Jason Molenda380241a2012-07-12 00:20:07 +00003610 {
3611 }
3612
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003613 ~CommandOptions() override = default;
Jason Molenda380241a2012-07-12 00:20:07 +00003614
Bruce Mitchener13d21e92015-10-07 16:56:17 +00003615 Error
Todd Fialae1cfbc72016-08-11 23:51:28 +00003616 SetOptionValue(uint32_t option_idx, const char *option_arg,
3617 ExecutionContext *execution_context) override
Jason Molenda380241a2012-07-12 00:20:07 +00003618 {
3619 Error error;
3620
Greg Clayton3bcdfc02012-12-04 00:32:51 +00003621 const int short_option = m_getopt_table[option_idx].val;
Jason Molenda380241a2012-07-12 00:20:07 +00003622
3623 switch (short_option)
3624 {
3625 case 'a':
Jason Molenda535ab862013-04-23 04:30:57 +00003626 {
Michael Sartainb1e15922013-08-22 20:42:30 +00003627 m_str = option_arg;
Jason Molenda380241a2012-07-12 00:20:07 +00003628 m_type = eLookupTypeAddress;
Todd Fialae1cfbc72016-08-11 23:51:28 +00003629 m_addr = Args::StringToAddress(execution_context,
3630 option_arg,
3631 LLDB_INVALID_ADDRESS,
3632 &error);
Jason Molenda380241a2012-07-12 00:20:07 +00003633 if (m_addr == LLDB_INVALID_ADDRESS)
3634 error.SetErrorStringWithFormat ("invalid address string '%s'", option_arg);
3635 break;
Jason Molenda535ab862013-04-23 04:30:57 +00003636 }
Jason Molenda380241a2012-07-12 00:20:07 +00003637
3638 case 'n':
3639 m_str = option_arg;
3640 m_type = eLookupTypeFunctionOrSymbol;
3641 break;
Michael Sartainb1e15922013-08-22 20:42:30 +00003642
3643 default:
3644 error.SetErrorStringWithFormat ("unrecognized option %c.", short_option);
3645 break;
Jason Molenda380241a2012-07-12 00:20:07 +00003646 }
3647
3648 return error;
3649 }
3650
3651 void
Todd Fialae1cfbc72016-08-11 23:51:28 +00003652 OptionParsingStarting(ExecutionContext *execution_context) override
Jason Molenda380241a2012-07-12 00:20:07 +00003653 {
3654 m_type = eLookupTypeInvalid;
3655 m_str.clear();
3656 m_addr = LLDB_INVALID_ADDRESS;
3657 }
3658
3659 const OptionDefinition*
Bruce Mitchener13d21e92015-10-07 16:56:17 +00003660 GetDefinitions () override
Jason Molenda380241a2012-07-12 00:20:07 +00003661 {
3662 return g_option_table;
3663 }
3664
3665 // Options table: Required for subclasses of Options.
3666
3667 static OptionDefinition g_option_table[];
3668
3669 // Instance variables to hold the values for command options.
3670
3671 int m_type; // Should be a eLookupTypeXXX enum after parsing options
3672 std::string m_str; // Holds name lookup
3673 lldb::addr_t m_addr; // Holds the address to lookup
3674 };
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003675
Jason Molenda380241a2012-07-12 00:20:07 +00003676 CommandObjectTargetModulesShowUnwind (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003677 CommandObjectParsed(interpreter,
3678 "target modules show-unwind",
3679 "Show synthesized unwind instructions for a function.",
3680 nullptr,
3681 eCommandRequiresTarget |
3682 eCommandRequiresProcess |
3683 eCommandProcessMustBeLaunched |
3684 eCommandProcessMustBePaused ),
Todd Fialae1cfbc72016-08-11 23:51:28 +00003685 m_options()
Jason Molenda380241a2012-07-12 00:20:07 +00003686 {
3687 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003688
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003689 ~CommandObjectTargetModulesShowUnwind() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003690
Jason Molenda380241a2012-07-12 00:20:07 +00003691 Options *
Bruce Mitchener13d21e92015-10-07 16:56:17 +00003692 GetOptions () override
Jason Molenda380241a2012-07-12 00:20:07 +00003693 {
3694 return &m_options;
3695 }
3696
3697protected:
3698 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00003699 DoExecute (Args& command, CommandReturnObject &result) override
Jason Molenda380241a2012-07-12 00:20:07 +00003700 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00003701 Target *target = m_exe_ctx.GetTargetPtr();
3702 Process *process = m_exe_ctx.GetProcessPtr();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003703 ABI *abi = nullptr;
Jason Molenda380241a2012-07-12 00:20:07 +00003704 if (process)
3705 abi = process->GetABI().get();
3706
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003707 if (process == nullptr)
Jason Molenda380241a2012-07-12 00:20:07 +00003708 {
3709 result.AppendError ("You must have a process running to use this command.");
3710 result.SetStatus (eReturnStatusFailed);
3711 return false;
3712 }
3713
3714 ThreadList threads(process->GetThreadList());
3715 if (threads.GetSize() == 0)
3716 {
3717 result.AppendError ("The process must be paused to use this command.");
3718 result.SetStatus (eReturnStatusFailed);
3719 return false;
3720 }
3721
3722 ThreadSP thread(threads.GetThreadAtIndex(0));
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003723 if (!thread)
Jason Molenda380241a2012-07-12 00:20:07 +00003724 {
3725 result.AppendError ("The process must be paused to use this command.");
3726 result.SetStatus (eReturnStatusFailed);
3727 return false;
3728 }
3729
Jason Molenda535ab862013-04-23 04:30:57 +00003730 SymbolContextList sc_list;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003731
Jason Molenda380241a2012-07-12 00:20:07 +00003732 if (m_options.m_type == eLookupTypeFunctionOrSymbol)
3733 {
Jason Molenda380241a2012-07-12 00:20:07 +00003734 ConstString function_name (m_options.m_str.c_str());
Jason Molenda535ab862013-04-23 04:30:57 +00003735 target->GetImages().FindFunctions (function_name, eFunctionNameTypeAuto, true, false, true, sc_list);
3736 }
3737 else if (m_options.m_type == eLookupTypeAddress && target)
3738 {
3739 Address addr;
3740 if (target->GetSectionLoadList().ResolveLoadAddress (m_options.m_addr, addr))
Jason Molenda380241a2012-07-12 00:20:07 +00003741 {
3742 SymbolContext sc;
Jason Molenda535ab862013-04-23 04:30:57 +00003743 ModuleSP module_sp (addr.GetModule());
3744 module_sp->ResolveSymbolContextForAddress (addr, eSymbolContextEverything, sc);
3745 if (sc.function || sc.symbol)
Jason Molenda380241a2012-07-12 00:20:07 +00003746 {
Jason Molenda535ab862013-04-23 04:30:57 +00003747 sc_list.Append(sc);
Jason Molenda380241a2012-07-12 00:20:07 +00003748 }
Jason Molenda535ab862013-04-23 04:30:57 +00003749 }
3750 }
Michael Sartainb1e15922013-08-22 20:42:30 +00003751 else
3752 {
3753 result.AppendError ("address-expression or function name option must be specified.");
3754 result.SetStatus (eReturnStatusFailed);
3755 return false;
3756 }
Jason Molenda380241a2012-07-12 00:20:07 +00003757
Jason Molenda535ab862013-04-23 04:30:57 +00003758 size_t num_matches = sc_list.GetSize();
Michael Sartainb1e15922013-08-22 20:42:30 +00003759 if (num_matches == 0)
3760 {
3761 result.AppendErrorWithFormat ("no unwind data found that matches '%s'.", m_options.m_str.c_str());
3762 result.SetStatus (eReturnStatusFailed);
3763 return false;
3764 }
3765
Jason Molenda535ab862013-04-23 04:30:57 +00003766 for (uint32_t idx = 0; idx < num_matches; idx++)
3767 {
3768 SymbolContext sc;
3769 sc_list.GetContextAtIndex(idx, sc);
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003770 if (sc.symbol == nullptr && sc.function == nullptr)
Jason Molenda535ab862013-04-23 04:30:57 +00003771 continue;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003772 if (!sc.module_sp || sc.module_sp->GetObjectFile() == nullptr)
Jason Molenda535ab862013-04-23 04:30:57 +00003773 continue;
3774 AddressRange range;
3775 if (!sc.GetAddressRange (eSymbolContextFunction | eSymbolContextSymbol, 0, false, range))
3776 continue;
3777 if (!range.GetBaseAddress().IsValid())
3778 continue;
3779 ConstString funcname(sc.GetFunctionName());
3780 if (funcname.IsEmpty())
3781 continue;
3782 addr_t start_addr = range.GetBaseAddress().GetLoadAddress(target);
3783 if (abi)
3784 start_addr = abi->FixCodeAddress(start_addr);
Jason Molenda380241a2012-07-12 00:20:07 +00003785
Jason Molenda535ab862013-04-23 04:30:57 +00003786 FuncUnwindersSP func_unwinders_sp (sc.module_sp->GetObjectFile()->GetUnwindTable().GetUncachedFuncUnwindersContainingAddress(start_addr, sc));
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003787 if (!func_unwinders_sp)
Jason Molenda535ab862013-04-23 04:30:57 +00003788 continue;
Jason Molenda380241a2012-07-12 00:20:07 +00003789
Jason Molenda34549b82015-01-13 06:04:04 +00003790 result.GetOutputStream().Printf("UNWIND PLANS for %s`%s (start addr 0x%" PRIx64 ")\n\n", sc.module_sp->GetPlatformFileSpec().GetFilename().AsCString(), funcname.AsCString(), start_addr);
Jason Molenda535ab862013-04-23 04:30:57 +00003791
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003792 UnwindPlanSP non_callsite_unwind_plan = func_unwinders_sp->GetUnwindPlanAtNonCallSite(*target, *thread, -1);
3793 if (non_callsite_unwind_plan)
Jason Molenda535ab862013-04-23 04:30:57 +00003794 {
Jason Molenda34549b82015-01-13 06:04:04 +00003795 result.GetOutputStream().Printf("Asynchronous (not restricted to call-sites) UnwindPlan is '%s'\n", non_callsite_unwind_plan->GetSourceName().AsCString());
Jason Molenda535ab862013-04-23 04:30:57 +00003796 }
Jason Molendae589e7e2014-12-08 03:09:00 +00003797 UnwindPlanSP callsite_unwind_plan = func_unwinders_sp->GetUnwindPlanAtCallSite(*target, -1);
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003798 if (callsite_unwind_plan)
Jason Molenda535ab862013-04-23 04:30:57 +00003799 {
Jason Molenda34549b82015-01-13 06:04:04 +00003800 result.GetOutputStream().Printf("Synchronous (restricted to call-sites) UnwindPlan is '%s'\n", callsite_unwind_plan->GetSourceName().AsCString());
Jason Molenda535ab862013-04-23 04:30:57 +00003801 }
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003802 UnwindPlanSP fast_unwind_plan = func_unwinders_sp->GetUnwindPlanFastUnwind(*target, *thread);
3803 if (fast_unwind_plan)
Jason Molenda535ab862013-04-23 04:30:57 +00003804 {
Jason Molenda34549b82015-01-13 06:04:04 +00003805 result.GetOutputStream().Printf("Fast UnwindPlan is '%s'\n", fast_unwind_plan->GetSourceName().AsCString());
Jason Molenda535ab862013-04-23 04:30:57 +00003806 }
3807
Jason Molenda34549b82015-01-13 06:04:04 +00003808 result.GetOutputStream().Printf("\n");
3809
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003810 UnwindPlanSP assembly_sp = func_unwinders_sp->GetAssemblyUnwindPlan(*target, *thread, 0);
Jason Molenda34549b82015-01-13 06:04:04 +00003811 if (assembly_sp)
3812 {
3813 result.GetOutputStream().Printf("Assembly language inspection UnwindPlan:\n");
3814 assembly_sp->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS);
3815 result.GetOutputStream().Printf("\n");
3816 }
Jason Molenda34549b82015-01-13 06:04:04 +00003817
3818 UnwindPlanSP ehframe_sp = func_unwinders_sp->GetEHFrameUnwindPlan(*target, 0);
3819 if (ehframe_sp)
3820 {
3821 result.GetOutputStream().Printf("eh_frame UnwindPlan:\n");
3822 ehframe_sp->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS);
3823 result.GetOutputStream().Printf("\n");
3824 }
3825
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003826 UnwindPlanSP ehframe_augmented_sp = func_unwinders_sp->GetEHFrameAugmentedUnwindPlan(*target, *thread, 0);
Jason Molenda34549b82015-01-13 06:04:04 +00003827 if (ehframe_augmented_sp)
3828 {
3829 result.GetOutputStream().Printf("eh_frame augmented UnwindPlan:\n");
3830 ehframe_augmented_sp->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS);
3831 result.GetOutputStream().Printf("\n");
3832 }
3833
Tamas Berghammer648f3c72015-09-30 13:50:14 +00003834 UnwindPlanSP arm_unwind_sp = func_unwinders_sp->GetArmUnwindUnwindPlan(*target, 0);
3835 if (arm_unwind_sp)
3836 {
3837 result.GetOutputStream().Printf("ARM.exidx unwind UnwindPlan:\n");
3838 arm_unwind_sp->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS);
3839 result.GetOutputStream().Printf("\n");
3840 }
3841
Jason Molenda34549b82015-01-13 06:04:04 +00003842 UnwindPlanSP compact_unwind_sp = func_unwinders_sp->GetCompactUnwindUnwindPlan(*target, 0);
3843 if (compact_unwind_sp)
3844 {
3845 result.GetOutputStream().Printf("Compact unwind UnwindPlan:\n");
3846 compact_unwind_sp->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS);
3847 result.GetOutputStream().Printf("\n");
3848 }
3849
3850 if (fast_unwind_plan)
3851 {
3852 result.GetOutputStream().Printf("Fast UnwindPlan:\n");
3853 fast_unwind_plan->Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS);
3854 result.GetOutputStream().Printf("\n");
3855 }
3856
3857 ABISP abi_sp = process->GetABI();
3858 if (abi_sp)
3859 {
3860 UnwindPlan arch_default(lldb::eRegisterKindGeneric);
3861 if (abi_sp->CreateDefaultUnwindPlan (arch_default))
3862 {
3863 result.GetOutputStream().Printf("Arch default UnwindPlan:\n");
3864 arch_default.Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS);
3865 result.GetOutputStream().Printf("\n");
3866 }
3867
3868 UnwindPlan arch_entry(lldb::eRegisterKindGeneric);
3869 if (abi_sp->CreateFunctionEntryUnwindPlan (arch_entry))
3870 {
3871 result.GetOutputStream().Printf("Arch default at entry point UnwindPlan:\n");
3872 arch_entry.Dump(result.GetOutputStream(), thread.get(), LLDB_INVALID_ADDRESS);
3873 result.GetOutputStream().Printf("\n");
3874 }
3875 }
Jason Molenda535ab862013-04-23 04:30:57 +00003876
3877 result.GetOutputStream().Printf ("\n");
Jason Molenda380241a2012-07-12 00:20:07 +00003878 }
3879 return result.Succeeded();
3880 }
3881
3882 CommandOptions m_options;
3883};
3884
3885OptionDefinition
3886CommandObjectTargetModulesShowUnwind::CommandOptions::g_option_table[] =
3887{
Kate Stoneac9c3a62016-08-26 23:28:47 +00003888 // clang-format off
3889 {LLDB_OPT_SET_1, false, "name", 'n', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeFunctionName, "Show unwind instructions for a function or symbol name."},
3890 {LLDB_OPT_SET_2, false, "address", 'a', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeAddressOrExpression, "Show unwind instructions for a function or symbol containing an address"},
3891 {0, false, nullptr, 0, 0, nullptr, nullptr, 0, eArgTypeNone, nullptr}
3892 // clang-format on
Jason Molenda380241a2012-07-12 00:20:07 +00003893};
Greg Claytoneffe5c92011-05-03 22:09:39 +00003894
3895//----------------------------------------------------------------------
3896// Lookup information in images
3897//----------------------------------------------------------------------
Jim Ingham5a988412012-06-08 21:56:10 +00003898class CommandObjectTargetModulesLookup : public CommandObjectParsed
Greg Claytoneffe5c92011-05-03 22:09:39 +00003899{
3900public:
Greg Claytoneffe5c92011-05-03 22:09:39 +00003901 enum
3902 {
3903 eLookupTypeInvalid = -1,
3904 eLookupTypeAddress = 0,
3905 eLookupTypeSymbol,
3906 eLookupTypeFileLine, // Line is optional
3907 eLookupTypeFunction,
Greg Claytonc4a8a762012-05-15 18:43:44 +00003908 eLookupTypeFunctionOrSymbol,
Greg Claytoneffe5c92011-05-03 22:09:39 +00003909 eLookupTypeType,
3910 kNumLookupTypes
3911 };
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003912
Greg Claytoneffe5c92011-05-03 22:09:39 +00003913 class CommandOptions : public Options
3914 {
3915 public:
Todd Fialae1cfbc72016-08-11 23:51:28 +00003916 CommandOptions() :
3917 Options()
Greg Claytoneffe5c92011-05-03 22:09:39 +00003918 {
Todd Fialae1cfbc72016-08-11 23:51:28 +00003919 OptionParsingStarting(nullptr);
Greg Claytoneffe5c92011-05-03 22:09:39 +00003920 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003921
Eugene Zelenkof13e6522016-02-25 19:02:39 +00003922 ~CommandOptions() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003923
Bruce Mitchener13d21e92015-10-07 16:56:17 +00003924 Error
Todd Fialae1cfbc72016-08-11 23:51:28 +00003925 SetOptionValue (uint32_t option_idx, const char *option_arg,
3926 ExecutionContext *execution_context) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00003927 {
3928 Error error;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003929
Greg Clayton3bcdfc02012-12-04 00:32:51 +00003930 const int short_option = m_getopt_table[option_idx].val;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003931
Greg Claytoneffe5c92011-05-03 22:09:39 +00003932 switch (short_option)
3933 {
3934 case 'a':
Jim Inghame7b849e2013-03-15 23:09:19 +00003935 {
3936 m_type = eLookupTypeAddress;
Todd Fialae1cfbc72016-08-11 23:51:28 +00003937 m_addr = Args::StringToAddress(execution_context,
3938 option_arg,
3939 LLDB_INVALID_ADDRESS,
3940 &error);
Jim Inghame7b849e2013-03-15 23:09:19 +00003941 }
Greg Claytoneffe5c92011-05-03 22:09:39 +00003942 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003943
Greg Claytoneffe5c92011-05-03 22:09:39 +00003944 case 'o':
Vince Harron5275aaa2015-01-15 20:08:35 +00003945 m_offset = StringConvert::ToUInt64(option_arg, LLDB_INVALID_ADDRESS);
Greg Claytoneffe5c92011-05-03 22:09:39 +00003946 if (m_offset == LLDB_INVALID_ADDRESS)
Greg Clayton86edbf42011-10-26 00:56:27 +00003947 error.SetErrorStringWithFormat ("invalid offset string '%s'", option_arg);
Greg Claytoneffe5c92011-05-03 22:09:39 +00003948 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003949
Greg Claytoneffe5c92011-05-03 22:09:39 +00003950 case 's':
3951 m_str = option_arg;
3952 m_type = eLookupTypeSymbol;
3953 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003954
Greg Claytoneffe5c92011-05-03 22:09:39 +00003955 case 'f':
3956 m_file.SetFile (option_arg, false);
3957 m_type = eLookupTypeFileLine;
3958 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003959
Greg Claytoneffe5c92011-05-03 22:09:39 +00003960 case 'i':
Sean Callanand4a7c122012-02-11 01:22:21 +00003961 m_include_inlines = false;
Greg Claytoneffe5c92011-05-03 22:09:39 +00003962 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003963
Greg Claytoneffe5c92011-05-03 22:09:39 +00003964 case 'l':
Vince Harron5275aaa2015-01-15 20:08:35 +00003965 m_line_number = StringConvert::ToUInt32(option_arg, UINT32_MAX);
Greg Claytoneffe5c92011-05-03 22:09:39 +00003966 if (m_line_number == UINT32_MAX)
Greg Clayton86edbf42011-10-26 00:56:27 +00003967 error.SetErrorStringWithFormat ("invalid line number string '%s'", option_arg);
Greg Claytoneffe5c92011-05-03 22:09:39 +00003968 else if (m_line_number == 0)
Greg Clayton86edbf42011-10-26 00:56:27 +00003969 error.SetErrorString ("zero is an invalid line number");
Greg Claytoneffe5c92011-05-03 22:09:39 +00003970 m_type = eLookupTypeFileLine;
3971 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003972
Greg Claytonc4a8a762012-05-15 18:43:44 +00003973 case 'F':
Greg Claytoneffe5c92011-05-03 22:09:39 +00003974 m_str = option_arg;
3975 m_type = eLookupTypeFunction;
3976 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003977
Greg Claytonc4a8a762012-05-15 18:43:44 +00003978 case 'n':
3979 m_str = option_arg;
3980 m_type = eLookupTypeFunctionOrSymbol;
3981 break;
3982
Greg Claytoneffe5c92011-05-03 22:09:39 +00003983 case 't':
3984 m_str = option_arg;
3985 m_type = eLookupTypeType;
3986 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003987
Greg Claytoneffe5c92011-05-03 22:09:39 +00003988 case 'v':
3989 m_verbose = 1;
3990 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003991
Sean Callanand38b4a92012-06-06 20:49:55 +00003992 case 'A':
3993 m_print_all = true;
3994 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003995
Greg Claytoneffe5c92011-05-03 22:09:39 +00003996 case 'r':
3997 m_use_regex = true;
3998 break;
3999 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004000
Greg Claytoneffe5c92011-05-03 22:09:39 +00004001 return error;
4002 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004003
Greg Claytoneffe5c92011-05-03 22:09:39 +00004004 void
Todd Fialae1cfbc72016-08-11 23:51:28 +00004005 OptionParsingStarting(ExecutionContext *execution_context) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00004006 {
4007 m_type = eLookupTypeInvalid;
4008 m_str.clear();
4009 m_file.Clear();
4010 m_addr = LLDB_INVALID_ADDRESS;
4011 m_offset = 0;
4012 m_line_number = 0;
4013 m_use_regex = false;
Sean Callanand4a7c122012-02-11 01:22:21 +00004014 m_include_inlines = true;
Greg Claytoneffe5c92011-05-03 22:09:39 +00004015 m_verbose = false;
Sean Callanand38b4a92012-06-06 20:49:55 +00004016 m_print_all = false;
Greg Claytoneffe5c92011-05-03 22:09:39 +00004017 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004018
Greg Claytoneffe5c92011-05-03 22:09:39 +00004019 const OptionDefinition*
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004020 GetDefinitions () override
Greg Claytoneffe5c92011-05-03 22:09:39 +00004021 {
4022 return g_option_table;
4023 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004024
Greg Claytoneffe5c92011-05-03 22:09:39 +00004025 // Options table: Required for subclasses of Options.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004026
Greg Claytoneffe5c92011-05-03 22:09:39 +00004027 static OptionDefinition g_option_table[];
4028 int m_type; // Should be a eLookupTypeXXX enum after parsing options
4029 std::string m_str; // Holds name lookup
4030 FileSpec m_file; // Files for file lookups
4031 lldb::addr_t m_addr; // Holds the address to lookup
4032 lldb::addr_t m_offset; // Subtract this offset from m_addr before doing lookups.
4033 uint32_t m_line_number; // Line number for file+line lookups
4034 bool m_use_regex; // Name lookups in m_str are regular expressions.
Sean Callanand4a7c122012-02-11 01:22:21 +00004035 bool m_include_inlines;// Check for inline entries when looking up by file/line.
Greg Claytoneffe5c92011-05-03 22:09:39 +00004036 bool m_verbose; // Enable verbose lookup info
Sean Callanand38b4a92012-06-06 20:49:55 +00004037 bool m_print_all; // Print all matches, even in cases where there's a best match.
Greg Claytoneffe5c92011-05-03 22:09:39 +00004038 };
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004039
Greg Claytoneffe5c92011-05-03 22:09:39 +00004040 CommandObjectTargetModulesLookup (CommandInterpreter &interpreter) :
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004041 CommandObjectParsed(interpreter,
4042 "target modules lookup",
4043 "Look up information within executable and dependent shared library images.",
4044 nullptr,
4045 eCommandRequiresTarget),
Todd Fialae1cfbc72016-08-11 23:51:28 +00004046 m_options()
Greg Claytoneffe5c92011-05-03 22:09:39 +00004047 {
4048 CommandArgumentEntry arg;
4049 CommandArgumentData file_arg;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004050
Greg Claytoneffe5c92011-05-03 22:09:39 +00004051 // Define the first (and only) variant of this arg.
4052 file_arg.arg_type = eArgTypeFilename;
4053 file_arg.arg_repetition = eArgRepeatStar;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004054
Greg Claytoneffe5c92011-05-03 22:09:39 +00004055 // There is only one variant this argument could be; put it into the argument entry.
4056 arg.push_back (file_arg);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004057
Greg Claytoneffe5c92011-05-03 22:09:39 +00004058 // Push the data for the first argument into the m_arguments vector.
4059 m_arguments.push_back (arg);
4060 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004061
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004062 ~CommandObjectTargetModulesLookup() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004063
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004064 Options *
4065 GetOptions () override
Greg Claytoneffe5c92011-05-03 22:09:39 +00004066 {
4067 return &m_options;
4068 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004069
Sean Callanand38b4a92012-06-06 20:49:55 +00004070 bool
4071 LookupHere (CommandInterpreter &interpreter, CommandReturnObject &result, bool &syntax_error)
4072 {
4073 switch (m_options.m_type)
4074 {
4075 case eLookupTypeAddress:
4076 case eLookupTypeFileLine:
4077 case eLookupTypeFunction:
4078 case eLookupTypeFunctionOrSymbol:
4079 case eLookupTypeSymbol:
4080 default:
4081 return false;
4082 case eLookupTypeType:
4083 break;
4084 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004085
Jason Molendab57e4a12013-11-04 09:33:30 +00004086 StackFrameSP frame = m_exe_ctx.GetFrameSP();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004087
Sean Callanand38b4a92012-06-06 20:49:55 +00004088 if (!frame)
4089 return false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004090
Sean Callanand38b4a92012-06-06 20:49:55 +00004091 const SymbolContext &sym_ctx(frame->GetSymbolContext(eSymbolContextModule));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004092
Sean Callanand38b4a92012-06-06 20:49:55 +00004093 if (!sym_ctx.module_sp)
4094 return false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004095
Sean Callanand38b4a92012-06-06 20:49:55 +00004096 switch (m_options.m_type)
4097 {
4098 default:
4099 return false;
4100 case eLookupTypeType:
4101 if (!m_options.m_str.empty())
4102 {
4103 if (LookupTypeHere (m_interpreter,
4104 result.GetOutputStream(),
4105 sym_ctx,
4106 m_options.m_str.c_str(),
4107 m_options.m_use_regex))
4108 {
4109 result.SetStatus(eReturnStatusSuccessFinishResult);
4110 return true;
4111 }
4112 }
4113 break;
4114 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004115
Sean Callanand38b4a92012-06-06 20:49:55 +00004116 return true;
4117 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004118
Greg Claytoneffe5c92011-05-03 22:09:39 +00004119 bool
4120 LookupInModule (CommandInterpreter &interpreter, Module *module, CommandReturnObject &result, bool &syntax_error)
4121 {
4122 switch (m_options.m_type)
4123 {
4124 case eLookupTypeAddress:
4125 if (m_options.m_addr != LLDB_INVALID_ADDRESS)
4126 {
Saleem Abdulrasoolc98d9692016-01-22 20:26:34 +00004127 if (LookupAddressInModule (m_interpreter,
4128 result.GetOutputStream(),
4129 module,
4130 eSymbolContextEverything | (m_options.m_verbose ? static_cast<int>(eSymbolContextVariable) : 0),
4131 m_options.m_addr,
Greg Claytoneffe5c92011-05-03 22:09:39 +00004132 m_options.m_offset,
4133 m_options.m_verbose))
4134 {
4135 result.SetStatus(eReturnStatusSuccessFinishResult);
4136 return true;
4137 }
4138 }
4139 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004140
Greg Claytoneffe5c92011-05-03 22:09:39 +00004141 case eLookupTypeSymbol:
4142 if (!m_options.m_str.empty())
4143 {
Greg Claytonc4a8a762012-05-15 18:43:44 +00004144 if (LookupSymbolInModule (m_interpreter,
4145 result.GetOutputStream(),
4146 module,
4147 m_options.m_str.c_str(),
4148 m_options.m_use_regex,
4149 m_options.m_verbose))
Greg Claytoneffe5c92011-05-03 22:09:39 +00004150 {
4151 result.SetStatus(eReturnStatusSuccessFinishResult);
4152 return true;
4153 }
4154 }
4155 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004156
Greg Claytoneffe5c92011-05-03 22:09:39 +00004157 case eLookupTypeFileLine:
4158 if (m_options.m_file)
4159 {
Greg Claytoneffe5c92011-05-03 22:09:39 +00004160 if (LookupFileAndLineInModule (m_interpreter,
4161 result.GetOutputStream(),
4162 module,
4163 m_options.m_file,
4164 m_options.m_line_number,
Sean Callanand4a7c122012-02-11 01:22:21 +00004165 m_options.m_include_inlines,
Greg Claytoneffe5c92011-05-03 22:09:39 +00004166 m_options.m_verbose))
4167 {
4168 result.SetStatus(eReturnStatusSuccessFinishResult);
4169 return true;
4170 }
4171 }
4172 break;
Greg Claytonc4a8a762012-05-15 18:43:44 +00004173
4174 case eLookupTypeFunctionOrSymbol:
Greg Claytoneffe5c92011-05-03 22:09:39 +00004175 case eLookupTypeFunction:
4176 if (!m_options.m_str.empty())
4177 {
4178 if (LookupFunctionInModule (m_interpreter,
4179 result.GetOutputStream(),
4180 module,
4181 m_options.m_str.c_str(),
4182 m_options.m_use_regex,
Sean Callanand4a7c122012-02-11 01:22:21 +00004183 m_options.m_include_inlines,
Greg Claytonc4a8a762012-05-15 18:43:44 +00004184 m_options.m_type == eLookupTypeFunctionOrSymbol, // include symbols
Greg Claytoneffe5c92011-05-03 22:09:39 +00004185 m_options.m_verbose))
4186 {
4187 result.SetStatus(eReturnStatusSuccessFinishResult);
4188 return true;
4189 }
4190 }
4191 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004192
Greg Claytoneffe5c92011-05-03 22:09:39 +00004193 case eLookupTypeType:
4194 if (!m_options.m_str.empty())
4195 {
4196 if (LookupTypeInModule (m_interpreter,
4197 result.GetOutputStream(),
4198 module,
4199 m_options.m_str.c_str(),
4200 m_options.m_use_regex))
4201 {
4202 result.SetStatus(eReturnStatusSuccessFinishResult);
4203 return true;
4204 }
4205 }
4206 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004207
Greg Claytoneffe5c92011-05-03 22:09:39 +00004208 default:
Todd Fialae1cfbc72016-08-11 23:51:28 +00004209 m_options.GenerateOptionUsage(result.GetErrorStream(), this,
4210 GetCommandInterpreter()
4211 .GetDebugger()
4212 .GetTerminalWidth());
Greg Claytoneffe5c92011-05-03 22:09:39 +00004213 syntax_error = true;
4214 break;
4215 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004216
Greg Claytoneffe5c92011-05-03 22:09:39 +00004217 result.SetStatus (eReturnStatusFailed);
4218 return false;
4219 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004220
Jim Ingham5a988412012-06-08 21:56:10 +00004221protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004222 bool
4223 DoExecute (Args& command, CommandReturnObject &result) override
Greg Claytoneffe5c92011-05-03 22:09:39 +00004224 {
4225 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004226 if (target == nullptr)
Greg Claytoneffe5c92011-05-03 22:09:39 +00004227 {
4228 result.AppendError ("invalid target, create a debug target using the 'target create' command");
4229 result.SetStatus (eReturnStatusFailed);
4230 return false;
4231 }
4232 else
4233 {
4234 bool syntax_error = false;
4235 uint32_t i;
4236 uint32_t num_successful_lookups = 0;
4237 uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
4238 result.GetOutputStream().SetAddressByteSize(addr_byte_size);
4239 result.GetErrorStream().SetAddressByteSize(addr_byte_size);
4240 // Dump all sections for all modules images
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004241
Greg Claytoneffe5c92011-05-03 22:09:39 +00004242 if (command.GetArgumentCount() == 0)
4243 {
Sean Callanand38b4a92012-06-06 20:49:55 +00004244 ModuleSP current_module;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004245
Sean Callanand38b4a92012-06-06 20:49:55 +00004246 // Where it is possible to look in the current symbol context
4247 // first, try that. If this search was successful and --all
4248 // was not passed, don't print anything else.
4249 if (LookupHere (m_interpreter, result, syntax_error))
4250 {
4251 result.GetOutputStream().EOL();
4252 num_successful_lookups++;
4253 if (!m_options.m_print_all)
4254 {
4255 result.SetStatus (eReturnStatusSuccessFinishResult);
4256 return result.Succeeded();
4257 }
4258 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004259
Sean Callanand38b4a92012-06-06 20:49:55 +00004260 // Dump all sections for all other modules
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004261
Enrico Granata17598482012-11-08 02:22:02 +00004262 const ModuleList &target_modules = target->GetImages();
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00004263 std::lock_guard<std::recursive_mutex> guard(target_modules.GetMutex());
Greg Claytonc7bece562013-01-25 18:06:21 +00004264 const size_t num_modules = target_modules.GetSize();
Greg Claytoneffe5c92011-05-03 22:09:39 +00004265 if (num_modules > 0)
4266 {
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004267 for (i = 0; i < num_modules && !syntax_error; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00004268 {
Sean Callanand38b4a92012-06-06 20:49:55 +00004269 Module *module_pointer = target_modules.GetModulePointerAtIndexUnlocked(i);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004270
Sean Callanand38b4a92012-06-06 20:49:55 +00004271 if (module_pointer != current_module.get() &&
4272 LookupInModule (m_interpreter, target_modules.GetModulePointerAtIndexUnlocked(i), result, syntax_error))
Greg Claytoneffe5c92011-05-03 22:09:39 +00004273 {
4274 result.GetOutputStream().EOL();
4275 num_successful_lookups++;
4276 }
4277 }
4278 }
4279 else
4280 {
4281 result.AppendError ("the target has no associated executable images");
4282 result.SetStatus (eReturnStatusFailed);
4283 return false;
4284 }
4285 }
4286 else
4287 {
4288 // Dump specified images (by basename or fullpath)
4289 const char *arg_cstr;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004290 for (i = 0; (arg_cstr = command.GetArgumentAtIndex(i)) != nullptr && !syntax_error; ++i)
Greg Claytoneffe5c92011-05-03 22:09:39 +00004291 {
Greg Clayton8ee64382011-11-10 01:18:58 +00004292 ModuleList module_list;
4293 const size_t num_matches = FindModulesByName (target, arg_cstr, module_list, false);
4294 if (num_matches > 0)
Greg Claytoneffe5c92011-05-03 22:09:39 +00004295 {
Jason Molendaccd41e52012-10-04 22:47:07 +00004296 for (size_t j=0; j<num_matches; ++j)
Greg Claytoneffe5c92011-05-03 22:09:39 +00004297 {
Jason Molendaccd41e52012-10-04 22:47:07 +00004298 Module *module = module_list.GetModulePointerAtIndex(j);
Greg Clayton8ee64382011-11-10 01:18:58 +00004299 if (module)
Greg Claytoneffe5c92011-05-03 22:09:39 +00004300 {
Greg Clayton8ee64382011-11-10 01:18:58 +00004301 if (LookupInModule (m_interpreter, module, result, syntax_error))
Greg Claytoneffe5c92011-05-03 22:09:39 +00004302 {
4303 result.GetOutputStream().EOL();
4304 num_successful_lookups++;
4305 }
4306 }
4307 }
4308 }
4309 else
4310 result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr);
4311 }
4312 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004313
Greg Claytoneffe5c92011-05-03 22:09:39 +00004314 if (num_successful_lookups > 0)
4315 result.SetStatus (eReturnStatusSuccessFinishResult);
4316 else
4317 result.SetStatus (eReturnStatusFailed);
4318 }
4319 return result.Succeeded();
4320 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004321
Greg Claytoneffe5c92011-05-03 22:09:39 +00004322 CommandOptions m_options;
4323};
4324
4325OptionDefinition
4326CommandObjectTargetModulesLookup::CommandOptions::g_option_table[] =
4327{
Kate Stoneac9c3a62016-08-26 23:28:47 +00004328 // clang-format off
4329 {LLDB_OPT_SET_1, true, "address", 'a', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeAddressOrExpression, "Lookup an address in one or more target modules."},
4330 {LLDB_OPT_SET_1, false, "offset", 'o', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeOffset, "When looking up an address subtract <offset> from any addresses before doing the lookup."},
4331 /* FIXME: re-enable regex for types when the LookupTypeInModule actually uses the regex option: | LLDB_OPT_SET_6 */
4332 {LLDB_OPT_SET_2| LLDB_OPT_SET_4 | LLDB_OPT_SET_5, false, "regex", 'r', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "The <name> argument for name lookups are regular expressions."},
4333 {LLDB_OPT_SET_2, true, "symbol", 's', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeSymbol, "Lookup a symbol by name in the symbol tables in one or more target modules."},
4334 {LLDB_OPT_SET_3, true, "file", 'f', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeFilename, "Lookup a file by fullpath or basename in one or more target modules."},
4335 {LLDB_OPT_SET_3, false, "line", 'l', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeLineNum, "Lookup a line number in a file (must be used in conjunction with --file)."},
4336 {LLDB_OPT_SET_FROM_TO(3,5), false, "no-inlines", 'i', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Ignore inline entries (must be used in conjunction with --file or --function)."},
4337 {LLDB_OPT_SET_4, true, "function", 'F', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeFunctionName, "Lookup a function by name in the debug symbols in one or more target modules."},
4338 {LLDB_OPT_SET_5, true, "name", 'n', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeFunctionOrSymbol, "Lookup a function or symbol by name in one or more target modules."},
4339 {LLDB_OPT_SET_6, true, "type", 't', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeName, "Lookup a type by name in the debug symbols in one or more target modules."},
4340 {LLDB_OPT_SET_ALL, false, "verbose", 'v', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Enable verbose lookup information."},
4341 {LLDB_OPT_SET_ALL, false, "all", 'A', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Print all matches, not just the best match, if a best match is available."},
4342 {0, false, nullptr, 0, 0, nullptr, nullptr, 0, eArgTypeNone, nullptr}
4343 // clang-format on
Greg Claytoneffe5c92011-05-03 22:09:39 +00004344};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004345
Jim Ingham9575d842011-03-11 03:53:59 +00004346#pragma mark CommandObjectMultiwordImageSearchPaths
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004347
4348//-------------------------------------------------------------------------
4349// CommandObjectMultiwordImageSearchPaths
4350//-------------------------------------------------------------------------
4351
Greg Claytoneffe5c92011-05-03 22:09:39 +00004352class CommandObjectTargetModulesImageSearchPaths : public CommandObjectMultiword
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004353{
4354public:
Kate Stone7428a182016-07-14 22:03:10 +00004355 CommandObjectTargetModulesImageSearchPaths(CommandInterpreter &interpreter)
4356 : CommandObjectMultiword(interpreter, "target modules search-paths",
4357 "Commands for managing module search paths for a target.",
4358 "target modules search-paths <subcommand> [<subcommand-options>]")
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004359 {
Greg Claytoneffe5c92011-05-03 22:09:39 +00004360 LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetModulesSearchPathsAdd (interpreter)));
4361 LoadSubCommand ("clear", CommandObjectSP (new CommandObjectTargetModulesSearchPathsClear (interpreter)));
4362 LoadSubCommand ("insert", CommandObjectSP (new CommandObjectTargetModulesSearchPathsInsert (interpreter)));
4363 LoadSubCommand ("list", CommandObjectSP (new CommandObjectTargetModulesSearchPathsList (interpreter)));
4364 LoadSubCommand ("query", CommandObjectSP (new CommandObjectTargetModulesSearchPathsQuery (interpreter)));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004365 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004366
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004367 ~CommandObjectTargetModulesImageSearchPaths() override = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004368};
4369
Greg Claytoneffe5c92011-05-03 22:09:39 +00004370#pragma mark CommandObjectTargetModules
4371
4372//-------------------------------------------------------------------------
4373// CommandObjectTargetModules
4374//-------------------------------------------------------------------------
4375
4376class CommandObjectTargetModules : public CommandObjectMultiword
4377{
4378public:
4379 //------------------------------------------------------------------
4380 // Constructors and Destructors
4381 //------------------------------------------------------------------
Kate Stone7428a182016-07-14 22:03:10 +00004382 CommandObjectTargetModules(CommandInterpreter &interpreter)
4383 : CommandObjectMultiword(interpreter, "target modules",
4384 "Commands for accessing information for one or more target modules.",
4385 "target modules <sub-command> ...")
Greg Claytoneffe5c92011-05-03 22:09:39 +00004386 {
4387 LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetModulesAdd (interpreter)));
4388 LoadSubCommand ("load", CommandObjectSP (new CommandObjectTargetModulesLoad (interpreter)));
Greg Claytoneffe5c92011-05-03 22:09:39 +00004389 LoadSubCommand ("dump", CommandObjectSP (new CommandObjectTargetModulesDump (interpreter)));
4390 LoadSubCommand ("list", CommandObjectSP (new CommandObjectTargetModulesList (interpreter)));
4391 LoadSubCommand ("lookup", CommandObjectSP (new CommandObjectTargetModulesLookup (interpreter)));
4392 LoadSubCommand ("search-paths", CommandObjectSP (new CommandObjectTargetModulesImageSearchPaths (interpreter)));
Jason Molenda380241a2012-07-12 00:20:07 +00004393 LoadSubCommand ("show-unwind", CommandObjectSP (new CommandObjectTargetModulesShowUnwind (interpreter)));
Greg Claytoneffe5c92011-05-03 22:09:39 +00004394
4395 }
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004396
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004397 ~CommandObjectTargetModules() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004398
Greg Claytoneffe5c92011-05-03 22:09:39 +00004399private:
4400 //------------------------------------------------------------------
4401 // For CommandObjectTargetModules only
4402 //------------------------------------------------------------------
4403 DISALLOW_COPY_AND_ASSIGN (CommandObjectTargetModules);
4404};
4405
Jim Ingham5a988412012-06-08 21:56:10 +00004406class CommandObjectTargetSymbolsAdd : public CommandObjectParsed
Greg Claytone72dfb32012-02-24 01:59:29 +00004407{
4408public:
4409 CommandObjectTargetSymbolsAdd (CommandInterpreter &interpreter) :
Jim Ingham5a988412012-06-08 21:56:10 +00004410 CommandObjectParsed (interpreter,
4411 "target symbols add",
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004412 "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.",
Enrico Granatae87764f2015-05-27 05:04:35 +00004413 "target symbols add [<symfile>]", eCommandRequiresTarget),
Todd Fialae1cfbc72016-08-11 23:51:28 +00004414 m_option_group(),
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004415 m_file_option (LLDB_OPT_SET_1, false, "shlib", 's', CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Fullpath or basename for module to find debug symbols for."),
4416 m_current_frame_option (LLDB_OPT_SET_2, false, "frame", 'F', "Locate the debug symbols the currently selected frame.", false, true)
4417
Greg Claytone72dfb32012-02-24 01:59:29 +00004418 {
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004419 m_option_group.Append (&m_uuid_option_group, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
4420 m_option_group.Append (&m_file_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
4421 m_option_group.Append (&m_current_frame_option, LLDB_OPT_SET_2, LLDB_OPT_SET_2);
4422 m_option_group.Finalize();
Greg Claytone72dfb32012-02-24 01:59:29 +00004423 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004424
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004425 ~CommandObjectTargetSymbolsAdd() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004426
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004427 int
Jim Ingham5a988412012-06-08 21:56:10 +00004428 HandleArgumentCompletion (Args &input,
4429 int &cursor_index,
4430 int &cursor_char_position,
4431 OptionElementVector &opt_element_vector,
4432 int match_start_point,
4433 int max_return_elements,
4434 bool &word_complete,
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004435 StringList &matches) override
Jim Ingham5a988412012-06-08 21:56:10 +00004436 {
4437 std::string completion_str (input.GetArgumentAtIndex(cursor_index));
4438 completion_str.erase (cursor_char_position);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004439
Todd Fialae1cfbc72016-08-11 23:51:28 +00004440 CommandCompletions::InvokeCommonCompletionCallbacks(GetCommandInterpreter(),
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004441 CommandCompletions::eDiskFileCompletion,
4442 completion_str.c_str(),
4443 match_start_point,
4444 max_return_elements,
4445 nullptr,
4446 word_complete,
4447 matches);
Jim Ingham5a988412012-06-08 21:56:10 +00004448 return matches.GetSize();
4449 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004450
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004451 Options *
4452 GetOptions () override
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004453 {
4454 return &m_option_group;
4455 }
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004456
Jim Ingham5a988412012-06-08 21:56:10 +00004457protected:
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004458 bool
4459 AddModuleSymbols (Target *target,
Greg Clayton89deb062012-12-12 01:15:30 +00004460 ModuleSpec &module_spec,
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004461 bool &flush,
4462 CommandReturnObject &result)
4463 {
Greg Clayton89deb062012-12-12 01:15:30 +00004464 const FileSpec &symbol_fspec = module_spec.GetSymbolFileSpec();
4465 if (symbol_fspec)
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004466 {
4467 char symfile_path[PATH_MAX];
Greg Clayton89deb062012-12-12 01:15:30 +00004468 symbol_fspec.GetPath (symfile_path, sizeof(symfile_path));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004469
Greg Clayton89deb062012-12-12 01:15:30 +00004470 if (!module_spec.GetUUID().IsValid())
4471 {
4472 if (!module_spec.GetFileSpec() && !module_spec.GetPlatformFileSpec())
4473 module_spec.GetFileSpec().GetFilename() = symbol_fspec.GetFilename();
4474 }
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004475 // We now have a module that represents a symbol file
4476 // that can be used for a module that might exist in the
4477 // current target, so we need to find that module in the
4478 // target
Greg Clayton89deb062012-12-12 01:15:30 +00004479 ModuleList matching_module_list;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004480
Greg Clayton9aae0a12013-05-15 19:52:08 +00004481 size_t num_matches = 0;
4482 // First extract all module specs from the symbol file
4483 lldb_private::ModuleSpecList symfile_module_specs;
Greg Clayton2540a8a2013-07-12 22:07:46 +00004484 if (ObjectFile::GetModuleSpecifications(module_spec.GetSymbolFileSpec(), 0, 0, symfile_module_specs))
Greg Clayton9aae0a12013-05-15 19:52:08 +00004485 {
4486 // Now extract the module spec that matches the target architecture
4487 ModuleSpec target_arch_module_spec;
4488 ModuleSpec symfile_module_spec;
4489 target_arch_module_spec.GetArchitecture() = target->GetArchitecture();
4490 if (symfile_module_specs.FindMatchingModuleSpec(target_arch_module_spec, symfile_module_spec))
4491 {
4492 // See if it has a UUID?
4493 if (symfile_module_spec.GetUUID().IsValid())
4494 {
4495 // It has a UUID, look for this UUID in the target modules
4496 ModuleSpec symfile_uuid_module_spec;
4497 symfile_uuid_module_spec.GetUUID() = symfile_module_spec.GetUUID();
4498 num_matches = target->GetImages().FindModules (symfile_uuid_module_spec, matching_module_list);
4499 }
4500 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004501
Greg Clayton9aae0a12013-05-15 19:52:08 +00004502 if (num_matches == 0)
4503 {
4504 // No matches yet, iterate through the module specs to find a UUID value that
4505 // we can match up to an image in our target
4506 const size_t num_symfile_module_specs = symfile_module_specs.GetSize();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004507 for (size_t i = 0; i < num_symfile_module_specs && num_matches == 0; ++i)
Greg Clayton9aae0a12013-05-15 19:52:08 +00004508 {
4509 if (symfile_module_specs.GetModuleSpecAtIndex(i, symfile_module_spec))
4510 {
4511 if (symfile_module_spec.GetUUID().IsValid())
4512 {
4513 // It has a UUID, look for this UUID in the target modules
4514 ModuleSpec symfile_uuid_module_spec;
4515 symfile_uuid_module_spec.GetUUID() = symfile_module_spec.GetUUID();
4516 num_matches = target->GetImages().FindModules (symfile_uuid_module_spec, matching_module_list);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004517 }
Greg Clayton9aae0a12013-05-15 19:52:08 +00004518 }
4519 }
4520 }
4521 }
4522
4523 // Just try to match up the file by basename if we have no matches at this point
4524 if (num_matches == 0)
4525 num_matches = target->GetImages().FindModules (module_spec, matching_module_list);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004526
Greg Clayton91c0e742013-01-11 23:44:27 +00004527 while (num_matches == 0)
4528 {
4529 ConstString filename_no_extension(module_spec.GetFileSpec().GetFileNameStrippingExtension());
4530 // Empty string returned, lets bail
4531 if (!filename_no_extension)
4532 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004533
Greg Clayton91c0e742013-01-11 23:44:27 +00004534 // Check if there was no extension to strip and the basename is the same
4535 if (filename_no_extension == module_spec.GetFileSpec().GetFilename())
4536 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004537
Greg Clayton91c0e742013-01-11 23:44:27 +00004538 // Replace basename with one less extension
4539 module_spec.GetFileSpec().GetFilename() = filename_no_extension;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004540
Greg Clayton91c0e742013-01-11 23:44:27 +00004541 num_matches = target->GetImages().FindModules (module_spec, matching_module_list);
4542 }
4543
Greg Clayton89deb062012-12-12 01:15:30 +00004544 if (num_matches > 1)
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004545 {
Greg Clayton89deb062012-12-12 01:15:30 +00004546 result.AppendErrorWithFormat ("multiple modules match symbol file '%s', use the --uuid option to resolve the ambiguity.\n", symfile_path);
4547 }
4548 else if (num_matches == 1)
4549 {
4550 ModuleSP module_sp (matching_module_list.GetModuleAtIndex(0));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004551
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004552 // The module has not yet created its symbol vendor, we can just
4553 // give the existing target module the symfile path to use for
4554 // when it decides to create it!
Greg Clayton89deb062012-12-12 01:15:30 +00004555 module_sp->SetSymbolFileFileSpec (symbol_fspec);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004556
Greg Clayton136dff82012-12-14 02:15:00 +00004557 SymbolVendor *symbol_vendor = module_sp->GetSymbolVendor(true, &result.GetErrorStream());
Greg Clayton89deb062012-12-12 01:15:30 +00004558 if (symbol_vendor)
4559 {
4560 SymbolFile *symbol_file = symbol_vendor->GetSymbolFile();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004561
Greg Clayton89deb062012-12-12 01:15:30 +00004562 if (symbol_file)
4563 {
4564 ObjectFile *object_file = symbol_file->GetObjectFile();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004565
Greg Clayton89deb062012-12-12 01:15:30 +00004566 if (object_file && object_file->GetFileSpec() == symbol_fspec)
4567 {
4568 // Provide feedback that the symfile has been successfully added.
4569 const FileSpec &module_fs = module_sp->GetFileSpec();
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00004570 result.AppendMessageWithFormat("symbol file '%s' has been added to '%s'\n",
Greg Clayton89deb062012-12-12 01:15:30 +00004571 symfile_path,
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00004572 module_fs.GetPath().c_str());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004573
Greg Clayton89deb062012-12-12 01:15:30 +00004574 // Let clients know something changed in the module
4575 // if it is currently loaded
4576 ModuleList module_list;
4577 module_list.Append (module_sp);
Enrico Granataf15ee4e2013-04-05 18:49:06 +00004578 target->SymbolsDidLoad (module_list);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004579
Greg Clayton91c0e742013-01-11 23:44:27 +00004580 // Make sure we load any scripting resources that may be embedded
4581 // in the debug info files in case the platform supports that.
4582 Error error;
Enrico Granata97303392013-05-21 00:00:30 +00004583 StreamString feedback_stream;
4584 module_sp->LoadScriptingResourceInTarget (target, error,&feedback_stream);
Enrico Granatacaa84cb2013-05-20 22:40:54 +00004585 if (error.Fail() && error.AsCString())
Enrico Granata2ea43cd2013-05-13 17:03:52 +00004586 result.AppendWarningWithFormat("unable to load scripting data for module %s - error reported was %s",
4587 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
4588 error.AsCString());
Enrico Granata97303392013-05-21 00:00:30 +00004589 else if (feedback_stream.GetSize())
4590 result.AppendWarningWithFormat("%s",feedback_stream.GetData());
Greg Clayton91c0e742013-01-11 23:44:27 +00004591
Greg Clayton89deb062012-12-12 01:15:30 +00004592 flush = true;
4593 result.SetStatus (eReturnStatusSuccessFinishResult);
4594 return true;
4595 }
4596 }
4597 }
4598 // Clear the symbol file spec if anything went wrong
4599 module_sp->SetSymbolFileFileSpec (FileSpec());
Greg Clayton89deb062012-12-12 01:15:30 +00004600 }
4601
4602 if (module_spec.GetUUID().IsValid())
4603 {
4604 StreamString ss_symfile_uuid;
4605 module_spec.GetUUID().Dump(&ss_symfile_uuid);
4606 result.AppendErrorWithFormat ("symbol file '%s' (%s) does not match any existing module%s\n",
4607 symfile_path,
4608 ss_symfile_uuid.GetData(),
4609 (symbol_fspec.GetFileType() != FileSpec::eFileTypeRegular)
4610 ? "\n please specify the full path to the symbol file"
4611 : "");
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004612 }
4613 else
4614 {
Greg Clayton89deb062012-12-12 01:15:30 +00004615 result.AppendErrorWithFormat ("symbol file '%s' does not match any existing module%s\n",
4616 symfile_path,
4617 (symbol_fspec.GetFileType() != FileSpec::eFileTypeRegular)
4618 ? "\n please specify the full path to the symbol file"
4619 : "");
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004620 }
4621 }
4622 else
4623 {
4624 result.AppendError ("one or more executable image paths must be specified");
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004625 }
Greg Clayton89deb062012-12-12 01:15:30 +00004626 result.SetStatus (eReturnStatusFailed);
4627 return false;
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004628 }
4629
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004630 bool
4631 DoExecute (Args& args, CommandReturnObject &result) override
Greg Claytone72dfb32012-02-24 01:59:29 +00004632 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004633 Target *target = m_exe_ctx.GetTargetPtr();
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004634 result.SetStatus (eReturnStatusFailed);
Greg Claytonf9fc6092013-01-09 19:44:40 +00004635 bool flush = false;
4636 ModuleSpec module_spec;
4637 const bool uuid_option_set = m_uuid_option_group.GetOptionValue().OptionWasSet();
4638 const bool file_option_set = m_file_option.GetOptionValue().OptionWasSet();
4639 const bool frame_option_set = m_current_frame_option.GetOptionValue().OptionWasSet();
Greg Claytonf9fc6092013-01-09 19:44:40 +00004640 const size_t argc = args.GetArgumentCount();
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004641
Greg Claytonf9fc6092013-01-09 19:44:40 +00004642 if (argc == 0)
4643 {
4644 if (uuid_option_set || file_option_set || frame_option_set)
Greg Claytone72dfb32012-02-24 01:59:29 +00004645 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004646 bool success = false;
4647 bool error_set = false;
4648 if (frame_option_set)
Greg Claytone72dfb32012-02-24 01:59:29 +00004649 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004650 Process *process = m_exe_ctx.GetProcessPtr();
4651 if (process)
Greg Claytone72dfb32012-02-24 01:59:29 +00004652 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004653 const StateType process_state = process->GetState();
4654 if (StateIsStoppedState (process_state, true))
Greg Claytone72dfb32012-02-24 01:59:29 +00004655 {
Jason Molendab57e4a12013-11-04 09:33:30 +00004656 StackFrame *frame = m_exe_ctx.GetFramePtr();
Greg Claytonf9fc6092013-01-09 19:44:40 +00004657 if (frame)
Greg Claytone72dfb32012-02-24 01:59:29 +00004658 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004659 ModuleSP frame_module_sp (frame->GetSymbolContext(eSymbolContextModule).module_sp);
4660 if (frame_module_sp)
Greg Claytone72dfb32012-02-24 01:59:29 +00004661 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004662 if (frame_module_sp->GetPlatformFileSpec().Exists())
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004663 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004664 module_spec.GetArchitecture() = frame_module_sp->GetArchitecture();
4665 module_spec.GetFileSpec() = frame_module_sp->GetPlatformFileSpec();
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004666 }
Greg Claytonf9fc6092013-01-09 19:44:40 +00004667 module_spec.GetUUID() = frame_module_sp->GetUUID();
4668 success = module_spec.GetUUID().IsValid() || module_spec.GetFileSpec();
Greg Claytone72dfb32012-02-24 01:59:29 +00004669 }
Johnny Chen82e5a262012-08-22 00:18:43 +00004670 else
4671 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004672 result.AppendError ("frame has no module");
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004673 error_set = true;
Johnny Chen82e5a262012-08-22 00:18:43 +00004674 }
Greg Claytone72dfb32012-02-24 01:59:29 +00004675 }
4676 else
4677 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004678 result.AppendError ("invalid current frame");
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004679 error_set = true;
Greg Claytone72dfb32012-02-24 01:59:29 +00004680 }
Greg Claytone72dfb32012-02-24 01:59:29 +00004681 }
4682 else
4683 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004684 result.AppendErrorWithFormat ("process is not stopped: %s", StateAsCString(process_state));
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004685 error_set = true;
4686 }
4687 }
4688 else
4689 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004690 result.AppendError ("a process must exist in order to use the --frame option");
4691 error_set = true;
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004692 }
4693 }
4694 else
4695 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004696 if (uuid_option_set)
4697 {
4698 module_spec.GetUUID() = m_uuid_option_group.GetOptionValue().GetCurrentValue();
4699 success |= module_spec.GetUUID().IsValid();
4700 }
4701 else if (file_option_set)
4702 {
4703 module_spec.GetFileSpec() = m_file_option.GetOptionValue().GetCurrentValue();
4704 ModuleSP module_sp (target->GetImages().FindFirstModule(module_spec));
4705 if (module_sp)
4706 {
4707 module_spec.GetFileSpec() = module_sp->GetFileSpec();
4708 module_spec.GetPlatformFileSpec() = module_sp->GetPlatformFileSpec();
4709 module_spec.GetUUID() = module_sp->GetUUID();
4710 module_spec.GetArchitecture() = module_sp->GetArchitecture();
4711 }
4712 else
4713 {
4714 module_spec.GetArchitecture() = target->GetArchitecture();
4715 }
Greg Clayton479d5452016-02-25 00:56:47 +00004716 success |= module_spec.GetUUID().IsValid() || module_spec.GetFileSpec().Exists();
Greg Claytonf9fc6092013-01-09 19:44:40 +00004717 }
4718 }
4719
4720 if (success)
4721 {
4722 if (Symbols::DownloadObjectAndSymbolFile (module_spec))
4723 {
4724 if (module_spec.GetSymbolFileSpec())
4725 success = AddModuleSymbols (target, module_spec, flush, result);
4726 }
4727 }
4728
4729 if (!success && !error_set)
4730 {
4731 StreamString error_strm;
4732 if (uuid_option_set)
4733 {
4734 error_strm.PutCString("unable to find debug symbols for UUID ");
4735 module_spec.GetUUID().Dump (&error_strm);
4736 }
4737 else if (file_option_set)
4738 {
4739 error_strm.PutCString("unable to find debug symbols for the executable file ");
4740 error_strm << module_spec.GetFileSpec();
4741 }
4742 else if (frame_option_set)
4743 {
4744 error_strm.PutCString("unable to find debug symbols for the current frame");
4745 }
4746 result.AppendError (error_strm.GetData());
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004747 }
4748 }
4749 else
4750 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004751 result.AppendError ("one or more symbol file paths must be specified, or options must be specified");
4752 }
4753 }
4754 else
4755 {
4756 if (uuid_option_set)
4757 {
4758 result.AppendError ("specify either one or more paths to symbol files or use the --uuid option without arguments");
4759 }
4760 else if (file_option_set)
4761 {
4762 result.AppendError ("specify either one or more paths to symbol files or use the --file option without arguments");
4763 }
4764 else if (frame_option_set)
4765 {
4766 result.AppendError ("specify either one or more paths to symbol files or use the --frame option without arguments");
4767 }
4768 else
4769 {
4770 PlatformSP platform_sp (target->GetPlatform());
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004771
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004772 for (size_t i = 0; i < argc; ++i)
Greg Claytonf9fc6092013-01-09 19:44:40 +00004773 {
4774 const char *symfile_path = args.GetArgumentAtIndex(i);
4775 if (symfile_path)
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004776 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004777 module_spec.GetSymbolFileSpec().SetFile(symfile_path, true);
4778 if (platform_sp)
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004779 {
Greg Claytonf9fc6092013-01-09 19:44:40 +00004780 FileSpec symfile_spec;
4781 if (platform_sp->ResolveSymbolFile(*target, module_spec, symfile_spec).Success())
4782 module_spec.GetSymbolFileSpec() = symfile_spec;
4783 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004784
Greg Claytonf9fc6092013-01-09 19:44:40 +00004785 ArchSpec arch;
4786 bool symfile_exists = module_spec.GetSymbolFileSpec().Exists();
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004787
Greg Claytonf9fc6092013-01-09 19:44:40 +00004788 if (symfile_exists)
4789 {
4790 if (!AddModuleSymbols (target, module_spec, flush, result))
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004791 break;
Greg Claytonf9fc6092013-01-09 19:44:40 +00004792 }
4793 else
4794 {
4795 char resolved_symfile_path[PATH_MAX];
4796 if (module_spec.GetSymbolFileSpec().GetPath (resolved_symfile_path, sizeof(resolved_symfile_path)))
4797 {
4798 if (strcmp (resolved_symfile_path, symfile_path) != 0)
4799 {
4800 result.AppendErrorWithFormat ("invalid module path '%s' with resolved path '%s'\n", symfile_path, resolved_symfile_path);
4801 break;
4802 }
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004803 }
Greg Claytonf9fc6092013-01-09 19:44:40 +00004804 result.AppendErrorWithFormat ("invalid module path '%s'\n", symfile_path);
4805 break;
Greg Claytone72dfb32012-02-24 01:59:29 +00004806 }
4807 }
4808 }
4809 }
Greg Claytonf9fc6092013-01-09 19:44:40 +00004810 }
Greg Claytonfa559e52012-05-18 02:38:05 +00004811
Greg Claytonf9fc6092013-01-09 19:44:40 +00004812 if (flush)
4813 {
4814 Process *process = m_exe_ctx.GetProcessPtr();
4815 if (process)
4816 process->Flush();
Greg Claytone72dfb32012-02-24 01:59:29 +00004817 }
4818 return result.Succeeded();
4819 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004820
Greg Claytonb5f0fea2012-09-27 22:26:11 +00004821 OptionGroupOptions m_option_group;
4822 OptionGroupUUID m_uuid_option_group;
4823 OptionGroupFile m_file_option;
4824 OptionGroupBoolean m_current_frame_option;
Greg Claytone72dfb32012-02-24 01:59:29 +00004825};
4826
Greg Claytone72dfb32012-02-24 01:59:29 +00004827#pragma mark CommandObjectTargetSymbols
4828
4829//-------------------------------------------------------------------------
4830// CommandObjectTargetSymbols
4831//-------------------------------------------------------------------------
4832
4833class CommandObjectTargetSymbols : public CommandObjectMultiword
4834{
4835public:
4836 //------------------------------------------------------------------
4837 // Constructors and Destructors
4838 //------------------------------------------------------------------
Kate Stone7428a182016-07-14 22:03:10 +00004839 CommandObjectTargetSymbols(CommandInterpreter &interpreter)
4840 : CommandObjectMultiword(interpreter, "target symbols", "Commands for adding and managing debug symbol files.",
4841 "target symbols <sub-command> ...")
Greg Claytone72dfb32012-02-24 01:59:29 +00004842 {
4843 LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetSymbolsAdd (interpreter)));
Greg Claytone72dfb32012-02-24 01:59:29 +00004844 }
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004845
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004846 ~CommandObjectTargetSymbols() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004847
Greg Claytone72dfb32012-02-24 01:59:29 +00004848private:
4849 //------------------------------------------------------------------
4850 // For CommandObjectTargetModules only
4851 //------------------------------------------------------------------
4852 DISALLOW_COPY_AND_ASSIGN (CommandObjectTargetSymbols);
4853};
4854
Jim Ingham9575d842011-03-11 03:53:59 +00004855#pragma mark CommandObjectTargetStopHookAdd
4856
4857//-------------------------------------------------------------------------
4858// CommandObjectTargetStopHookAdd
4859//-------------------------------------------------------------------------
4860
Greg Clayton44d93782014-01-27 23:43:24 +00004861class CommandObjectTargetStopHookAdd :
4862 public CommandObjectParsed,
4863 public IOHandlerDelegateMultiline
Jim Ingham9575d842011-03-11 03:53:59 +00004864{
4865public:
Jim Ingham9575d842011-03-11 03:53:59 +00004866 class CommandOptions : public Options
4867 {
4868 public:
Todd Fialae1cfbc72016-08-11 23:51:28 +00004869 CommandOptions() :
4870 Options(),
Jim Ingham9575d842011-03-11 03:53:59 +00004871 m_line_start(0),
4872 m_line_end (UINT_MAX),
4873 m_func_name_type_mask (eFunctionNameTypeAuto),
4874 m_sym_ctx_specified (false),
Johnny Chenb1372c02011-05-02 23:47:55 +00004875 m_thread_specified (false),
4876 m_use_one_liner (false),
4877 m_one_liner()
Jim Ingham9575d842011-03-11 03:53:59 +00004878 {
4879 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004880
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004881 ~CommandOptions() override = default;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004882
Greg Claytone0d378b2011-03-24 21:19:54 +00004883 const OptionDefinition*
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004884 GetDefinitions () override
Jim Ingham9575d842011-03-11 03:53:59 +00004885 {
4886 return g_option_table;
4887 }
4888
Bruce Mitchener13d21e92015-10-07 16:56:17 +00004889 Error
Todd Fialae1cfbc72016-08-11 23:51:28 +00004890 SetOptionValue(uint32_t option_idx, const char *option_arg,
4891 ExecutionContext *execution_context) override
Jim Ingham9575d842011-03-11 03:53:59 +00004892 {
4893 Error error;
Greg Clayton3bcdfc02012-12-04 00:32:51 +00004894 const int short_option = m_getopt_table[option_idx].val;
Jim Ingham9575d842011-03-11 03:53:59 +00004895 bool success;
4896
4897 switch (short_option)
4898 {
4899 case 'c':
4900 m_class_name = option_arg;
4901 m_sym_ctx_specified = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004902 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004903
Jim Ingham9575d842011-03-11 03:53:59 +00004904 case 'e':
Vince Harron5275aaa2015-01-15 20:08:35 +00004905 m_line_end = StringConvert::ToUInt32 (option_arg, UINT_MAX, 0, &success);
Jim Ingham9575d842011-03-11 03:53:59 +00004906 if (!success)
4907 {
Greg Clayton86edbf42011-10-26 00:56:27 +00004908 error.SetErrorStringWithFormat ("invalid end line number: \"%s\"", option_arg);
Jim Ingham9575d842011-03-11 03:53:59 +00004909 break;
4910 }
4911 m_sym_ctx_specified = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004912 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004913
Jim Ingham9575d842011-03-11 03:53:59 +00004914 case 'l':
Vince Harron5275aaa2015-01-15 20:08:35 +00004915 m_line_start = StringConvert::ToUInt32 (option_arg, 0, 0, &success);
Jim Ingham9575d842011-03-11 03:53:59 +00004916 if (!success)
4917 {
Greg Clayton86edbf42011-10-26 00:56:27 +00004918 error.SetErrorStringWithFormat ("invalid start line number: \"%s\"", option_arg);
Jim Ingham9575d842011-03-11 03:53:59 +00004919 break;
4920 }
4921 m_sym_ctx_specified = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004922 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004923
Sean Callanand4a7c122012-02-11 01:22:21 +00004924 case 'i':
4925 m_no_inlines = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004926 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004927
Jim Ingham9575d842011-03-11 03:53:59 +00004928 case 'n':
4929 m_function_name = option_arg;
4930 m_func_name_type_mask |= eFunctionNameTypeAuto;
4931 m_sym_ctx_specified = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004932 break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004933
Jim Ingham9575d842011-03-11 03:53:59 +00004934 case 'f':
4935 m_file_name = option_arg;
4936 m_sym_ctx_specified = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004937 break;
4938
Jim Ingham9575d842011-03-11 03:53:59 +00004939 case 's':
4940 m_module_name = option_arg;
4941 m_sym_ctx_specified = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004942 break;
4943
Jim Ingham9575d842011-03-11 03:53:59 +00004944 case 't' :
Vince Harron5275aaa2015-01-15 20:08:35 +00004945 m_thread_id = StringConvert::ToUInt64(option_arg, LLDB_INVALID_THREAD_ID, 0);
Jim Ingham9575d842011-03-11 03:53:59 +00004946 if (m_thread_id == LLDB_INVALID_THREAD_ID)
Greg Clayton86edbf42011-10-26 00:56:27 +00004947 error.SetErrorStringWithFormat ("invalid thread id string '%s'", option_arg);
Jim Ingham9575d842011-03-11 03:53:59 +00004948 m_thread_specified = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004949 break;
4950
Jim Ingham9575d842011-03-11 03:53:59 +00004951 case 'T':
4952 m_thread_name = option_arg;
4953 m_thread_specified = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004954 break;
4955
Jim Ingham9575d842011-03-11 03:53:59 +00004956 case 'q':
4957 m_queue_name = option_arg;
4958 m_thread_specified = true;
4959 break;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004960
Jim Ingham9575d842011-03-11 03:53:59 +00004961 case 'x':
Vince Harron5275aaa2015-01-15 20:08:35 +00004962 m_thread_index = StringConvert::ToUInt32(option_arg, UINT32_MAX, 0);
Jim Ingham9575d842011-03-11 03:53:59 +00004963 if (m_thread_id == UINT32_MAX)
Greg Clayton86edbf42011-10-26 00:56:27 +00004964 error.SetErrorStringWithFormat ("invalid thread index string '%s'", option_arg);
Jim Ingham9575d842011-03-11 03:53:59 +00004965 m_thread_specified = true;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004966 break;
4967
Johnny Chenb1372c02011-05-02 23:47:55 +00004968 case 'o':
4969 m_use_one_liner = true;
4970 m_one_liner = option_arg;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004971 break;
4972
Jim Ingham9575d842011-03-11 03:53:59 +00004973 default:
Greg Clayton86edbf42011-10-26 00:56:27 +00004974 error.SetErrorStringWithFormat ("unrecognized option %c.", short_option);
Eugene Zelenkof13e6522016-02-25 19:02:39 +00004975 break;
Jim Ingham9575d842011-03-11 03:53:59 +00004976 }
4977 return error;
4978 }
4979
4980 void
Todd Fialae1cfbc72016-08-11 23:51:28 +00004981 OptionParsingStarting(ExecutionContext *execution_context) override
Jim Ingham9575d842011-03-11 03:53:59 +00004982 {
4983 m_class_name.clear();
4984 m_function_name.clear();
4985 m_line_start = 0;
4986 m_line_end = UINT_MAX;
4987 m_file_name.clear();
4988 m_module_name.clear();
4989 m_func_name_type_mask = eFunctionNameTypeAuto;
4990 m_thread_id = LLDB_INVALID_THREAD_ID;
4991 m_thread_index = UINT32_MAX;
4992 m_thread_name.clear();
4993 m_queue_name.clear();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004994
Sean Callanand4a7c122012-02-11 01:22:21 +00004995 m_no_inlines = false;
Jim Ingham9575d842011-03-11 03:53:59 +00004996 m_sym_ctx_specified = false;
4997 m_thread_specified = false;
Johnny Chenb1372c02011-05-02 23:47:55 +00004998
4999 m_use_one_liner = false;
5000 m_one_liner.clear();
Jim Ingham9575d842011-03-11 03:53:59 +00005001 }
5002
Greg Claytone0d378b2011-03-24 21:19:54 +00005003 static OptionDefinition g_option_table[];
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005004
Jim Ingham9575d842011-03-11 03:53:59 +00005005 std::string m_class_name;
5006 std::string m_function_name;
5007 uint32_t m_line_start;
5008 uint32_t m_line_end;
5009 std::string m_file_name;
5010 std::string m_module_name;
5011 uint32_t m_func_name_type_mask; // A pick from lldb::FunctionNameType.
5012 lldb::tid_t m_thread_id;
5013 uint32_t m_thread_index;
5014 std::string m_thread_name;
5015 std::string m_queue_name;
5016 bool m_sym_ctx_specified;
Sean Callanand4a7c122012-02-11 01:22:21 +00005017 bool m_no_inlines;
Jim Ingham9575d842011-03-11 03:53:59 +00005018 bool m_thread_specified;
Johnny Chenb1372c02011-05-02 23:47:55 +00005019 // Instance variables to hold the values for one_liner options.
5020 bool m_use_one_liner;
5021 std::string m_one_liner;
Jim Ingham9575d842011-03-11 03:53:59 +00005022 };
5023
Jim Ingham9575d842011-03-11 03:53:59 +00005024 CommandObjectTargetStopHookAdd (CommandInterpreter &interpreter) :
Jim Ingham5a988412012-06-08 21:56:10 +00005025 CommandObjectParsed (interpreter,
Greg Clayton44d93782014-01-27 23:43:24 +00005026 "target stop-hook add",
Jim Ingham5a988412012-06-08 21:56:10 +00005027 "Add a hook to be executed when the target stops.",
5028 "target stop-hook add"),
Greg Claytonc3d874a2014-05-08 16:59:00 +00005029 IOHandlerDelegateMultiline ("DONE", IOHandlerDelegate::Completion::LLDBCommand),
Todd Fialae1cfbc72016-08-11 23:51:28 +00005030 m_options()
Jim Ingham9575d842011-03-11 03:53:59 +00005031 {
5032 }
5033
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005034 ~CommandObjectTargetStopHookAdd() override = default;
5035
5036 Options *
5037 GetOptions () override
Jim Ingham9575d842011-03-11 03:53:59 +00005038 {
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005039 return &m_options;
Jim Ingham9575d842011-03-11 03:53:59 +00005040 }
5041
Jim Ingham5a988412012-06-08 21:56:10 +00005042protected:
Bruce Mitchener13d21e92015-10-07 16:56:17 +00005043 void
5044 IOHandlerActivated (IOHandler &io_handler) override
Greg Clayton44d93782014-01-27 23:43:24 +00005045 {
5046 StreamFileSP output_sp(io_handler.GetOutputStreamFile());
5047 if (output_sp)
5048 {
5049 output_sp->PutCString("Enter your stop hook command(s). Type 'DONE' to end.\n");
5050 output_sp->Flush();
5051 }
5052 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005053
Bruce Mitchener13d21e92015-10-07 16:56:17 +00005054 void
5055 IOHandlerInputComplete (IOHandler &io_handler, std::string &line) override
Greg Clayton44d93782014-01-27 23:43:24 +00005056 {
5057 if (m_stop_hook_sp)
5058 {
5059 if (line.empty())
5060 {
5061 StreamFileSP error_sp(io_handler.GetErrorStreamFile());
5062 if (error_sp)
5063 {
5064 error_sp->Printf("error: stop hook #%" PRIu64 " aborted, no commands.\n", m_stop_hook_sp->GetID());
5065 error_sp->Flush();
5066 }
5067 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
5068 if (target)
5069 target->RemoveStopHookByID(m_stop_hook_sp->GetID());
5070 }
5071 else
5072 {
5073 m_stop_hook_sp->GetCommandPointer()->SplitIntoLines(line);
5074 StreamFileSP output_sp(io_handler.GetOutputStreamFile());
5075 if (output_sp)
5076 {
5077 output_sp->Printf("Stop hook #%" PRIu64 " added.\n", m_stop_hook_sp->GetID());
5078 output_sp->Flush();
5079 }
5080 }
5081 m_stop_hook_sp.reset();
5082 }
5083 io_handler.SetIsDone(true);
5084 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005085
Jim Ingham9575d842011-03-11 03:53:59 +00005086 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00005087 DoExecute (Args& command, CommandReturnObject &result) override
Jim Ingham9575d842011-03-11 03:53:59 +00005088 {
Greg Clayton44d93782014-01-27 23:43:24 +00005089 m_stop_hook_sp.reset();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005090
Jim Ingham893c9322014-11-22 01:42:44 +00005091 Target *target = GetSelectedOrDummyTarget();
Jim Ingham9575d842011-03-11 03:53:59 +00005092 if (target)
5093 {
Greg Clayton44d93782014-01-27 23:43:24 +00005094 Target::StopHookSP new_hook_sp = target->CreateStopHook();
Jim Ingham9575d842011-03-11 03:53:59 +00005095
5096 // First step, make the specifier.
Greg Clayton7b0992d2013-04-18 22:45:39 +00005097 std::unique_ptr<SymbolContextSpecifier> specifier_ap;
Jim Ingham9575d842011-03-11 03:53:59 +00005098 if (m_options.m_sym_ctx_specified)
5099 {
5100 specifier_ap.reset(new SymbolContextSpecifier(m_interpreter.GetDebugger().GetSelectedTarget()));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005101
Jim Ingham9575d842011-03-11 03:53:59 +00005102 if (!m_options.m_module_name.empty())
5103 {
5104 specifier_ap->AddSpecification (m_options.m_module_name.c_str(), SymbolContextSpecifier::eModuleSpecified);
5105 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005106
Jim Ingham9575d842011-03-11 03:53:59 +00005107 if (!m_options.m_class_name.empty())
5108 {
5109 specifier_ap->AddSpecification (m_options.m_class_name.c_str(), SymbolContextSpecifier::eClassOrNamespaceSpecified);
5110 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005111
Jim Ingham9575d842011-03-11 03:53:59 +00005112 if (!m_options.m_file_name.empty())
5113 {
5114 specifier_ap->AddSpecification (m_options.m_file_name.c_str(), SymbolContextSpecifier::eFileSpecified);
5115 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005116
Jim Ingham9575d842011-03-11 03:53:59 +00005117 if (m_options.m_line_start != 0)
5118 {
5119 specifier_ap->AddLineSpecification (m_options.m_line_start, SymbolContextSpecifier::eLineStartSpecified);
5120 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005121
Jim Ingham9575d842011-03-11 03:53:59 +00005122 if (m_options.m_line_end != UINT_MAX)
5123 {
5124 specifier_ap->AddLineSpecification (m_options.m_line_end, SymbolContextSpecifier::eLineEndSpecified);
5125 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005126
Jim Ingham9575d842011-03-11 03:53:59 +00005127 if (!m_options.m_function_name.empty())
5128 {
5129 specifier_ap->AddSpecification (m_options.m_function_name.c_str(), SymbolContextSpecifier::eFunctionSpecified);
5130 }
5131 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005132
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005133 if (specifier_ap)
Jim Ingham9575d842011-03-11 03:53:59 +00005134 new_hook_sp->SetSpecifier (specifier_ap.release());
5135
5136 // Next see if any of the thread options have been entered:
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005137
Jim Ingham9575d842011-03-11 03:53:59 +00005138 if (m_options.m_thread_specified)
5139 {
5140 ThreadSpec *thread_spec = new ThreadSpec();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005141
Jim Ingham9575d842011-03-11 03:53:59 +00005142 if (m_options.m_thread_id != LLDB_INVALID_THREAD_ID)
5143 {
5144 thread_spec->SetTID (m_options.m_thread_id);
5145 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005146
Jim Ingham9575d842011-03-11 03:53:59 +00005147 if (m_options.m_thread_index != UINT32_MAX)
5148 thread_spec->SetIndex (m_options.m_thread_index);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005149
Jim Ingham9575d842011-03-11 03:53:59 +00005150 if (!m_options.m_thread_name.empty())
5151 thread_spec->SetName (m_options.m_thread_name.c_str());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005152
Jim Ingham9575d842011-03-11 03:53:59 +00005153 if (!m_options.m_queue_name.empty())
5154 thread_spec->SetQueueName (m_options.m_queue_name.c_str());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005155
Jim Ingham9575d842011-03-11 03:53:59 +00005156 new_hook_sp->SetThreadSpecifier (thread_spec);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005157
Jim Ingham9575d842011-03-11 03:53:59 +00005158 }
Johnny Chenb1372c02011-05-02 23:47:55 +00005159 if (m_options.m_use_one_liner)
Jim Ingham9575d842011-03-11 03:53:59 +00005160 {
Johnny Chenb1372c02011-05-02 23:47:55 +00005161 // Use one-liner.
5162 new_hook_sp->GetCommandPointer()->AppendString (m_options.m_one_liner.c_str());
Daniel Malead01b2952012-11-29 21:49:15 +00005163 result.AppendMessageWithFormat("Stop hook #%" PRIu64 " added.\n", new_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00005164 }
Johnny Chenb1372c02011-05-02 23:47:55 +00005165 else
Jim Ingham9575d842011-03-11 03:53:59 +00005166 {
Greg Clayton44d93782014-01-27 23:43:24 +00005167 m_stop_hook_sp = new_hook_sp;
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005168 m_interpreter.GetLLDBCommandsFromIOHandler("> ", // Prompt
5169 *this, // IOHandlerDelegate
5170 true, // Run IOHandler in async mode
5171 nullptr); // Baton for the "io_handler" that will be passed back into our IOHandlerDelegate functions
Greg Clayton44d93782014-01-27 23:43:24 +00005172
Jim Ingham9575d842011-03-11 03:53:59 +00005173 }
Jim Ingham9575d842011-03-11 03:53:59 +00005174 result.SetStatus (eReturnStatusSuccessFinishNoResult);
5175 }
5176 else
5177 {
Greg Clayton7260f622011-04-18 08:33:37 +00005178 result.AppendError ("invalid target\n");
Jim Ingham9575d842011-03-11 03:53:59 +00005179 result.SetStatus (eReturnStatusFailed);
5180 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005181
Jim Ingham9575d842011-03-11 03:53:59 +00005182 return result.Succeeded();
5183 }
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005184
Jim Ingham9575d842011-03-11 03:53:59 +00005185private:
5186 CommandOptions m_options;
Greg Clayton44d93782014-01-27 23:43:24 +00005187 Target::StopHookSP m_stop_hook_sp;
Jim Ingham9575d842011-03-11 03:53:59 +00005188};
5189
Greg Claytone0d378b2011-03-24 21:19:54 +00005190OptionDefinition
Jim Ingham9575d842011-03-11 03:53:59 +00005191CommandObjectTargetStopHookAdd::CommandOptions::g_option_table[] =
5192{
Kate Stoneac9c3a62016-08-26 23:28:47 +00005193 // clang-format off
5194 {LLDB_OPT_SET_ALL, false, "one-liner", 'o', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeOneLiner, "Specify a one-line breakpoint command inline. Be sure to surround it with quotes."},
5195 {LLDB_OPT_SET_ALL, false, "shlib", 's', OptionParser::eRequiredArgument, nullptr, nullptr, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Set the module within which the stop-hook is to be run."},
5196 {LLDB_OPT_SET_ALL, false, "thread-index", 'x', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeThreadIndex, "The stop hook is run only for the thread whose index matches this argument."},
5197 {LLDB_OPT_SET_ALL, false, "thread-id", 't', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeThreadID, "The stop hook is run only for the thread whose TID matches this argument."},
5198 {LLDB_OPT_SET_ALL, false, "thread-name", 'T', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeThreadName, "The stop hook is run only for the thread whose thread name matches this argument."},
5199 {LLDB_OPT_SET_ALL, false, "queue-name", 'q', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeQueueName, "The stop hook is run only for threads in the queue whose name is given by this argument."},
5200 {LLDB_OPT_SET_1, false, "file", 'f', OptionParser::eRequiredArgument, nullptr, nullptr, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, "Specify the source file within which the stop-hook is to be run."},
5201 {LLDB_OPT_SET_1, false, "start-line", 'l', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeLineNum, "Set the start of the line range for which the stop-hook is to be run."},
5202 {LLDB_OPT_SET_1, false, "end-line", 'e', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeLineNum, "Set the end of the line range for which the stop-hook is to be run."},
5203 {LLDB_OPT_SET_2, false, "classname", 'c', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeClassName, "Specify the class within which the stop-hook is to be run."},
5204 {LLDB_OPT_SET_3, false, "name", 'n', OptionParser::eRequiredArgument, nullptr, nullptr, CommandCompletions::eSymbolCompletion, eArgTypeFunctionName, "Set the function name within which the stop hook will be run."},
5205 {0, false, nullptr, 0, 0, nullptr, nullptr, 0, eArgTypeNone, nullptr }
5206 // clang-format on
Jim Ingham9575d842011-03-11 03:53:59 +00005207};
5208
5209#pragma mark CommandObjectTargetStopHookDelete
5210
5211//-------------------------------------------------------------------------
5212// CommandObjectTargetStopHookDelete
5213//-------------------------------------------------------------------------
5214
Jim Ingham5a988412012-06-08 21:56:10 +00005215class CommandObjectTargetStopHookDelete : public CommandObjectParsed
Jim Ingham9575d842011-03-11 03:53:59 +00005216{
5217public:
Jim Ingham9575d842011-03-11 03:53:59 +00005218 CommandObjectTargetStopHookDelete (CommandInterpreter &interpreter) :
Jim Ingham5a988412012-06-08 21:56:10 +00005219 CommandObjectParsed (interpreter,
5220 "target stop-hook delete",
5221 "Delete a stop-hook.",
5222 "target stop-hook delete [<idx>]")
Jim Ingham9575d842011-03-11 03:53:59 +00005223 {
5224 }
5225
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005226 ~CommandObjectTargetStopHookDelete() override = default;
Jim Ingham9575d842011-03-11 03:53:59 +00005227
Jim Ingham5a988412012-06-08 21:56:10 +00005228protected:
Jim Ingham9575d842011-03-11 03:53:59 +00005229 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00005230 DoExecute (Args& command, CommandReturnObject &result) override
Jim Ingham9575d842011-03-11 03:53:59 +00005231 {
Jim Ingham893c9322014-11-22 01:42:44 +00005232 Target *target = GetSelectedOrDummyTarget();
Jim Ingham9575d842011-03-11 03:53:59 +00005233 if (target)
5234 {
5235 // FIXME: see if we can use the breakpoint id style parser?
5236 size_t num_args = command.GetArgumentCount();
5237 if (num_args == 0)
5238 {
5239 if (!m_interpreter.Confirm ("Delete all stop hooks?", true))
5240 {
5241 result.SetStatus (eReturnStatusFailed);
5242 return false;
5243 }
5244 else
5245 {
5246 target->RemoveAllStopHooks();
5247 }
5248 }
5249 else
5250 {
5251 bool success;
5252 for (size_t i = 0; i < num_args; i++)
5253 {
Vince Harron5275aaa2015-01-15 20:08:35 +00005254 lldb::user_id_t user_id = StringConvert::ToUInt32 (command.GetArgumentAtIndex(i), 0, 0, &success);
Jim Ingham9575d842011-03-11 03:53:59 +00005255 if (!success)
5256 {
Greg Clayton7260f622011-04-18 08:33:37 +00005257 result.AppendErrorWithFormat ("invalid stop hook id: \"%s\".\n", command.GetArgumentAtIndex(i));
Jim Ingham9575d842011-03-11 03:53:59 +00005258 result.SetStatus(eReturnStatusFailed);
5259 return false;
5260 }
5261 success = target->RemoveStopHookByID (user_id);
5262 if (!success)
5263 {
Greg Clayton7260f622011-04-18 08:33:37 +00005264 result.AppendErrorWithFormat ("unknown stop hook id: \"%s\".\n", command.GetArgumentAtIndex(i));
Jim Ingham9575d842011-03-11 03:53:59 +00005265 result.SetStatus(eReturnStatusFailed);
5266 return false;
5267 }
5268 }
5269 }
5270 result.SetStatus (eReturnStatusSuccessFinishNoResult);
5271 }
5272 else
5273 {
Greg Clayton7260f622011-04-18 08:33:37 +00005274 result.AppendError ("invalid target\n");
Jim Ingham9575d842011-03-11 03:53:59 +00005275 result.SetStatus (eReturnStatusFailed);
5276 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005277
Jim Ingham9575d842011-03-11 03:53:59 +00005278 return result.Succeeded();
5279 }
5280};
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005281
Jim Ingham9575d842011-03-11 03:53:59 +00005282#pragma mark CommandObjectTargetStopHookEnableDisable
5283
5284//-------------------------------------------------------------------------
5285// CommandObjectTargetStopHookEnableDisable
5286//-------------------------------------------------------------------------
5287
Jim Ingham5a988412012-06-08 21:56:10 +00005288class CommandObjectTargetStopHookEnableDisable : public CommandObjectParsed
Jim Ingham9575d842011-03-11 03:53:59 +00005289{
5290public:
Jim Ingham9575d842011-03-11 03:53:59 +00005291 CommandObjectTargetStopHookEnableDisable (CommandInterpreter &interpreter, bool enable, const char *name, const char *help, const char *syntax) :
Jim Ingham5a988412012-06-08 21:56:10 +00005292 CommandObjectParsed (interpreter,
5293 name,
5294 help,
5295 syntax),
Jim Ingham9575d842011-03-11 03:53:59 +00005296 m_enable (enable)
5297 {
5298 }
5299
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005300 ~CommandObjectTargetStopHookEnableDisable() override = default;
Jim Ingham9575d842011-03-11 03:53:59 +00005301
Jim Ingham5a988412012-06-08 21:56:10 +00005302protected:
Jim Ingham9575d842011-03-11 03:53:59 +00005303 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00005304 DoExecute (Args& command, CommandReturnObject &result) override
Jim Ingham9575d842011-03-11 03:53:59 +00005305 {
Jim Ingham893c9322014-11-22 01:42:44 +00005306 Target *target = GetSelectedOrDummyTarget();
Jim Ingham9575d842011-03-11 03:53:59 +00005307 if (target)
5308 {
5309 // FIXME: see if we can use the breakpoint id style parser?
5310 size_t num_args = command.GetArgumentCount();
5311 bool success;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005312
Jim Ingham9575d842011-03-11 03:53:59 +00005313 if (num_args == 0)
5314 {
5315 target->SetAllStopHooksActiveState (m_enable);
5316 }
5317 else
5318 {
5319 for (size_t i = 0; i < num_args; i++)
5320 {
Vince Harron5275aaa2015-01-15 20:08:35 +00005321 lldb::user_id_t user_id = StringConvert::ToUInt32 (command.GetArgumentAtIndex(i), 0, 0, &success);
Jim Ingham9575d842011-03-11 03:53:59 +00005322 if (!success)
5323 {
Greg Clayton7260f622011-04-18 08:33:37 +00005324 result.AppendErrorWithFormat ("invalid stop hook id: \"%s\".\n", command.GetArgumentAtIndex(i));
Jim Ingham9575d842011-03-11 03:53:59 +00005325 result.SetStatus(eReturnStatusFailed);
5326 return false;
5327 }
5328 success = target->SetStopHookActiveStateByID (user_id, m_enable);
5329 if (!success)
5330 {
Greg Clayton7260f622011-04-18 08:33:37 +00005331 result.AppendErrorWithFormat ("unknown stop hook id: \"%s\".\n", command.GetArgumentAtIndex(i));
Jim Ingham9575d842011-03-11 03:53:59 +00005332 result.SetStatus(eReturnStatusFailed);
5333 return false;
5334 }
5335 }
5336 }
5337 result.SetStatus (eReturnStatusSuccessFinishNoResult);
5338 }
5339 else
5340 {
Greg Clayton7260f622011-04-18 08:33:37 +00005341 result.AppendError ("invalid target\n");
Jim Ingham9575d842011-03-11 03:53:59 +00005342 result.SetStatus (eReturnStatusFailed);
5343 }
5344 return result.Succeeded();
5345 }
5346private:
5347 bool m_enable;
5348};
5349
5350#pragma mark CommandObjectTargetStopHookList
5351
5352//-------------------------------------------------------------------------
5353// CommandObjectTargetStopHookList
5354//-------------------------------------------------------------------------
5355
Jim Ingham5a988412012-06-08 21:56:10 +00005356class CommandObjectTargetStopHookList : public CommandObjectParsed
Jim Ingham9575d842011-03-11 03:53:59 +00005357{
5358public:
Jim Ingham9575d842011-03-11 03:53:59 +00005359 CommandObjectTargetStopHookList (CommandInterpreter &interpreter) :
Jim Ingham5a988412012-06-08 21:56:10 +00005360 CommandObjectParsed (interpreter,
5361 "target stop-hook list",
5362 "List all stop-hooks.",
5363 "target stop-hook list [<type>]")
Jim Ingham9575d842011-03-11 03:53:59 +00005364 {
5365 }
5366
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005367 ~CommandObjectTargetStopHookList() override = default;
Jim Ingham9575d842011-03-11 03:53:59 +00005368
Jim Ingham5a988412012-06-08 21:56:10 +00005369protected:
Jim Ingham9575d842011-03-11 03:53:59 +00005370 bool
Bruce Mitchener13d21e92015-10-07 16:56:17 +00005371 DoExecute (Args& command, CommandReturnObject &result) override
Jim Ingham9575d842011-03-11 03:53:59 +00005372 {
Jim Ingham893c9322014-11-22 01:42:44 +00005373 Target *target = GetSelectedOrDummyTarget();
Johnny Chenfaa5c132011-11-29 23:56:14 +00005374 if (!target)
Jim Ingham9575d842011-03-11 03:53:59 +00005375 {
Greg Clayton7260f622011-04-18 08:33:37 +00005376 result.AppendError ("invalid target\n");
Jim Ingham9575d842011-03-11 03:53:59 +00005377 result.SetStatus (eReturnStatusFailed);
Jason Molendaeffcd2a2011-09-23 21:15:42 +00005378 return result.Succeeded();
Jim Ingham9575d842011-03-11 03:53:59 +00005379 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005380
Jim Ingham9575d842011-03-11 03:53:59 +00005381 size_t num_hooks = target->GetNumStopHooks ();
5382 if (num_hooks == 0)
5383 {
5384 result.GetOutputStream().PutCString ("No stop hooks.\n");
5385 }
5386 else
5387 {
5388 for (size_t i = 0; i < num_hooks; i++)
5389 {
5390 Target::StopHookSP this_hook = target->GetStopHookAtIndex (i);
5391 if (i > 0)
5392 result.GetOutputStream().PutCString ("\n");
5393 this_hook->GetDescription (&(result.GetOutputStream()), eDescriptionLevelFull);
5394 }
5395 }
Johnny Chend0cff1e2011-11-30 19:09:20 +00005396 result.SetStatus (eReturnStatusSuccessFinishResult);
Jim Ingham9575d842011-03-11 03:53:59 +00005397 return result.Succeeded();
5398 }
5399};
5400
5401#pragma mark CommandObjectMultiwordTargetStopHooks
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005402
Jim Ingham9575d842011-03-11 03:53:59 +00005403//-------------------------------------------------------------------------
5404// CommandObjectMultiwordTargetStopHooks
5405//-------------------------------------------------------------------------
5406
5407class CommandObjectMultiwordTargetStopHooks : public CommandObjectMultiword
5408{
5409public:
Kate Stone7428a182016-07-14 22:03:10 +00005410 CommandObjectMultiwordTargetStopHooks(CommandInterpreter &interpreter)
5411 : CommandObjectMultiword(interpreter, "target stop-hook",
5412 "Commands for operating on debugger target stop-hooks.",
5413 "target stop-hook <subcommand> [<subcommand-options>]")
Jim Ingham9575d842011-03-11 03:53:59 +00005414 {
5415 LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetStopHookAdd (interpreter)));
5416 LoadSubCommand ("delete", CommandObjectSP (new CommandObjectTargetStopHookDelete (interpreter)));
5417 LoadSubCommand ("disable", CommandObjectSP (new CommandObjectTargetStopHookEnableDisable (interpreter,
5418 false,
5419 "target stop-hook disable [<id>]",
5420 "Disable a stop-hook.",
5421 "target stop-hook disable")));
5422 LoadSubCommand ("enable", CommandObjectSP (new CommandObjectTargetStopHookEnableDisable (interpreter,
5423 true,
5424 "target stop-hook enable [<id>]",
5425 "Enable a stop-hook.",
5426 "target stop-hook enable")));
5427 LoadSubCommand ("list", CommandObjectSP (new CommandObjectTargetStopHookList (interpreter)));
5428 }
5429
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005430 ~CommandObjectMultiwordTargetStopHooks() override = default;
Jim Ingham9575d842011-03-11 03:53:59 +00005431};
5432
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005433#pragma mark CommandObjectMultiwordTarget
5434
5435//-------------------------------------------------------------------------
5436// CommandObjectMultiwordTarget
5437//-------------------------------------------------------------------------
5438
Kate Stone7428a182016-07-14 22:03:10 +00005439CommandObjectMultiwordTarget::CommandObjectMultiwordTarget(CommandInterpreter &interpreter)
5440 : CommandObjectMultiword(interpreter, "target", "Commands for operating on debugger targets.",
5441 "target <subcommand> [<subcommand-options>]")
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005442{
Greg Clayton7260f622011-04-18 08:33:37 +00005443 LoadSubCommand ("create", CommandObjectSP (new CommandObjectTargetCreate (interpreter)));
Greg Clayton3418c852011-08-10 02:10:13 +00005444 LoadSubCommand ("delete", CommandObjectSP (new CommandObjectTargetDelete (interpreter)));
Greg Clayton7260f622011-04-18 08:33:37 +00005445 LoadSubCommand ("list", CommandObjectSP (new CommandObjectTargetList (interpreter)));
5446 LoadSubCommand ("select", CommandObjectSP (new CommandObjectTargetSelect (interpreter)));
Jim Ingham9575d842011-03-11 03:53:59 +00005447 LoadSubCommand ("stop-hook", CommandObjectSP (new CommandObjectMultiwordTargetStopHooks (interpreter)));
Greg Claytoneffe5c92011-05-03 22:09:39 +00005448 LoadSubCommand ("modules", CommandObjectSP (new CommandObjectTargetModules (interpreter)));
Greg Claytone72dfb32012-02-24 01:59:29 +00005449 LoadSubCommand ("symbols", CommandObjectSP (new CommandObjectTargetSymbols (interpreter)));
Greg Clayton644247c2011-07-07 01:59:51 +00005450 LoadSubCommand ("variable", CommandObjectSP (new CommandObjectTargetVariable (interpreter)));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005451}
5452
Eugene Zelenkof13e6522016-02-25 19:02:39 +00005453CommandObjectMultiwordTarget::~CommandObjectMultiwordTarget() = default;