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