CommandObjectSource.cpp revision 537a7a86687683fd403ce652d178fbc89e06ef9f
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectSource.cpp ---------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectSource.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1684cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
1763094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
20767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Core/FileSpec.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
22767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Core/SourceManager.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
24767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandCompletions.h"
25767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/Options.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
31767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectSourceList
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectSourceInfo : public CommandObject
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37767af88aa617288e584afcfed055f7755e408542Jim Ingham    class CommandOptions : public Options
38767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
39767af88aa617288e584afcfed055f7755e408542Jim Ingham    public:
40767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandOptions () :
41767af88aa617288e584afcfed055f7755e408542Jim Ingham            Options()
42767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
43767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
44767af88aa617288e584afcfed055f7755e408542Jim Ingham
45767af88aa617288e584afcfed055f7755e408542Jim Ingham        ~CommandOptions ()
46767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
47767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
48767af88aa617288e584afcfed055f7755e408542Jim Ingham
49767af88aa617288e584afcfed055f7755e408542Jim Ingham        Error
50767af88aa617288e584afcfed055f7755e408542Jim Ingham        SetOptionValue (int option_idx, const char *option_arg)
51767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
52767af88aa617288e584afcfed055f7755e408542Jim Ingham            Error error;
53767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char short_option = g_option_table[option_idx].short_option;
54767af88aa617288e584afcfed055f7755e408542Jim Ingham            switch (short_option)
55767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
56767af88aa617288e584afcfed055f7755e408542Jim Ingham            case 'l':
57767af88aa617288e584afcfed055f7755e408542Jim Ingham                start_line = Args::StringToUInt32 (option_arg, 0);
58767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (start_line == 0)
59767af88aa617288e584afcfed055f7755e408542Jim Ingham                    error.SetErrorStringWithFormat("Invalid line number: '%s'.\n", option_arg);
60767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
61767af88aa617288e584afcfed055f7755e408542Jim Ingham
62767af88aa617288e584afcfed055f7755e408542Jim Ingham             case 'f':
63767af88aa617288e584afcfed055f7755e408542Jim Ingham                file_name = option_arg;
64767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
65767af88aa617288e584afcfed055f7755e408542Jim Ingham
66767af88aa617288e584afcfed055f7755e408542Jim Ingham           default:
67767af88aa617288e584afcfed055f7755e408542Jim Ingham                error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option);
68767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
69767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
70767af88aa617288e584afcfed055f7755e408542Jim Ingham
71767af88aa617288e584afcfed055f7755e408542Jim Ingham            return error;
72767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
73767af88aa617288e584afcfed055f7755e408542Jim Ingham
74767af88aa617288e584afcfed055f7755e408542Jim Ingham        void
75767af88aa617288e584afcfed055f7755e408542Jim Ingham        ResetOptionValues ()
76767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
77767af88aa617288e584afcfed055f7755e408542Jim Ingham            Options::ResetOptionValues();
78767af88aa617288e584afcfed055f7755e408542Jim Ingham
79767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_spec.Clear();
80767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_name.clear();
81767af88aa617288e584afcfed055f7755e408542Jim Ingham            start_line = 0;
82767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
83767af88aa617288e584afcfed055f7755e408542Jim Ingham
84767af88aa617288e584afcfed055f7755e408542Jim Ingham        const lldb::OptionDefinition*
85767af88aa617288e584afcfed055f7755e408542Jim Ingham        GetDefinitions ()
86767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
87767af88aa617288e584afcfed055f7755e408542Jim Ingham            return g_option_table;
88767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
89767af88aa617288e584afcfed055f7755e408542Jim Ingham        static lldb::OptionDefinition g_option_table[];
90767af88aa617288e584afcfed055f7755e408542Jim Ingham
91767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Instance variables to hold the values for command options.
92767af88aa617288e584afcfed055f7755e408542Jim Ingham        FileSpec file_spec;
93767af88aa617288e584afcfed055f7755e408542Jim Ingham        std::string file_name;
94767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t start_line;
95767af88aa617288e584afcfed055f7755e408542Jim Ingham
96767af88aa617288e584afcfed055f7755e408542Jim Ingham    };
97767af88aa617288e584afcfed055f7755e408542Jim Ingham
98767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
99238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectSourceInfo(CommandInterpreter &interpreter) :
100238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
101238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "source info",
102238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "Display information about the source lines from the current executable's debug info.",
103238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "source info [<cmd-options>]")
104767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
105767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
106767af88aa617288e584afcfed055f7755e408542Jim Ingham
107767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectSourceInfo ()
108767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
109767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
110767af88aa617288e584afcfed055f7755e408542Jim Ingham
111767af88aa617288e584afcfed055f7755e408542Jim Ingham
112767af88aa617288e584afcfed055f7755e408542Jim Ingham    Options *
113767af88aa617288e584afcfed055f7755e408542Jim Ingham    GetOptions ()
114767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
115767af88aa617288e584afcfed055f7755e408542Jim Ingham        return &m_options;
116767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
117767af88aa617288e584afcfed055f7755e408542Jim Ingham
118767af88aa617288e584afcfed055f7755e408542Jim Ingham
119767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
120767af88aa617288e584afcfed055f7755e408542Jim Ingham    Execute
121767af88aa617288e584afcfed055f7755e408542Jim Ingham    (
122767af88aa617288e584afcfed055f7755e408542Jim Ingham        Args& args,
123767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandReturnObject &result
124767af88aa617288e584afcfed055f7755e408542Jim Ingham    )
125767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
126767af88aa617288e584afcfed055f7755e408542Jim Ingham        result.AppendError ("Not yet implemented");
127767af88aa617288e584afcfed055f7755e408542Jim Ingham        result.SetStatus (eReturnStatusFailed);
128767af88aa617288e584afcfed055f7755e408542Jim Ingham        return false;
129767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
130767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected:
131767af88aa617288e584afcfed055f7755e408542Jim Ingham    CommandOptions m_options;
132767af88aa617288e584afcfed055f7755e408542Jim Ingham};
133767af88aa617288e584afcfed055f7755e408542Jim Ingham
134767af88aa617288e584afcfed055f7755e408542Jim Inghamlldb::OptionDefinition
135767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceInfo::CommandOptions::g_option_table[] =
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1374d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line",       'l', required_argument, NULL, 0, eArgTypeLineNum,    "The line number at which to start the display source."},
1384d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,    "The file from which to display source."},
1394d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
140767af88aa617288e584afcfed055f7755e408542Jim Ingham};
141767af88aa617288e584afcfed055f7755e408542Jim Ingham
142767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectSourceList
143767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
144767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectSourceList
145767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
147767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectSourceList : public CommandObject
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
149767af88aa617288e584afcfed055f7755e408542Jim Ingham
150767af88aa617288e584afcfed055f7755e408542Jim Ingham    class CommandOptions : public Options
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
152767af88aa617288e584afcfed055f7755e408542Jim Ingham    public:
153767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandOptions () :
154767af88aa617288e584afcfed055f7755e408542Jim Ingham            Options()
155767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
156767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158767af88aa617288e584afcfed055f7755e408542Jim Ingham        ~CommandOptions ()
159767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
160767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162767af88aa617288e584afcfed055f7755e408542Jim Ingham        Error
163767af88aa617288e584afcfed055f7755e408542Jim Ingham        SetOptionValue (int option_idx, const char *option_arg)
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
165767af88aa617288e584afcfed055f7755e408542Jim Ingham            Error error;
166767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char short_option = g_option_table[option_idx].short_option;
167767af88aa617288e584afcfed055f7755e408542Jim Ingham            switch (short_option)
168767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
169767af88aa617288e584afcfed055f7755e408542Jim Ingham            case 'l':
170767af88aa617288e584afcfed055f7755e408542Jim Ingham                start_line = Args::StringToUInt32 (option_arg, 0);
171767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (start_line == 0)
172767af88aa617288e584afcfed055f7755e408542Jim Ingham                    error.SetErrorStringWithFormat("Invalid line number: '%s'.\n", option_arg);
173767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            case 'c':
176767af88aa617288e584afcfed055f7755e408542Jim Ingham                num_lines = Args::StringToUInt32 (option_arg, 0);
177767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (num_lines == 0)
178767af88aa617288e584afcfed055f7755e408542Jim Ingham                    error.SetErrorStringWithFormat("Invalid line count: '%s'.\n", option_arg);
179767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181767af88aa617288e584afcfed055f7755e408542Jim Ingham             case 'f':
182767af88aa617288e584afcfed055f7755e408542Jim Ingham                file_name = option_arg;
183767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
184338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
185338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            case 'n':
186338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                symbol_name = option_arg;
187338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                break;
188767af88aa617288e584afcfed055f7755e408542Jim Ingham
189338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            case 's':
190338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                m_modules.push_back (std::string (option_arg));
191338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                break;
192767af88aa617288e584afcfed055f7755e408542Jim Ingham           default:
193767af88aa617288e584afcfed055f7755e408542Jim Ingham                error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option);
194767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
197767af88aa617288e584afcfed055f7755e408542Jim Ingham            return error;
198767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200767af88aa617288e584afcfed055f7755e408542Jim Ingham        void
201767af88aa617288e584afcfed055f7755e408542Jim Ingham        ResetOptionValues ()
202767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
203767af88aa617288e584afcfed055f7755e408542Jim Ingham            Options::ResetOptionValues();
204767af88aa617288e584afcfed055f7755e408542Jim Ingham
205767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_spec.Clear();
206767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_name.clear();
207338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            symbol_name.clear();
208767af88aa617288e584afcfed055f7755e408542Jim Ingham            start_line = 0;
209767af88aa617288e584afcfed055f7755e408542Jim Ingham            num_lines = 10;
210338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            m_modules.clear();
211767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
212767af88aa617288e584afcfed055f7755e408542Jim Ingham
213767af88aa617288e584afcfed055f7755e408542Jim Ingham        const lldb::OptionDefinition*
214767af88aa617288e584afcfed055f7755e408542Jim Ingham        GetDefinitions ()
215767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
216767af88aa617288e584afcfed055f7755e408542Jim Ingham            return g_option_table;
217767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
218767af88aa617288e584afcfed055f7755e408542Jim Ingham        static lldb::OptionDefinition g_option_table[];
219767af88aa617288e584afcfed055f7755e408542Jim Ingham
220767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Instance variables to hold the values for command options.
221767af88aa617288e584afcfed055f7755e408542Jim Ingham        FileSpec file_spec;
222767af88aa617288e584afcfed055f7755e408542Jim Ingham        std::string file_name;
223338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        std::string symbol_name;
224767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t start_line;
225767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t num_lines;
226338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        STLStringArray m_modules;
227767af88aa617288e584afcfed055f7755e408542Jim Ingham    };
228767af88aa617288e584afcfed055f7755e408542Jim Ingham
229767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
230238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectSourceList(CommandInterpreter &interpreter) :
231238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
232238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "source list",
233238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "Display source code (as specified) based on the current executable's debug info.",
23443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                        NULL)
235767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
23643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
23743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData file_arg;
23843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
23943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
24043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_type = eArgTypeFilename;
24143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_repetition = eArgRepeatOptional;
24243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
24343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (file_arg);
24543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
24643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
24743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
248767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
249767af88aa617288e584afcfed055f7755e408542Jim Ingham
250767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectSourceList ()
251767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
252767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
253767af88aa617288e584afcfed055f7755e408542Jim Ingham
254767af88aa617288e584afcfed055f7755e408542Jim Ingham
255767af88aa617288e584afcfed055f7755e408542Jim Ingham    Options *
256767af88aa617288e584afcfed055f7755e408542Jim Ingham    GetOptions ()
257767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
258767af88aa617288e584afcfed055f7755e408542Jim Ingham        return &m_options;
259767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
260767af88aa617288e584afcfed055f7755e408542Jim Ingham
261767af88aa617288e584afcfed055f7755e408542Jim Ingham
262767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
263767af88aa617288e584afcfed055f7755e408542Jim Ingham    Execute
264767af88aa617288e584afcfed055f7755e408542Jim Ingham    (
265767af88aa617288e584afcfed055f7755e408542Jim Ingham        Args& args,
266767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandReturnObject &result
267767af88aa617288e584afcfed055f7755e408542Jim Ingham    )
268767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
269767af88aa617288e584afcfed055f7755e408542Jim Ingham        const int argc = args.GetArgumentCount();
270767af88aa617288e584afcfed055f7755e408542Jim Ingham
271767af88aa617288e584afcfed055f7755e408542Jim Ingham        if (argc != 0)
272767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
273767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendErrorWithFormat("'%s' takes no arguments, only flags.\n", GetCommandName());
274767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.SetStatus (eReturnStatusFailed);
275767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
276767af88aa617288e584afcfed055f7755e408542Jim Ingham
277238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        ExecutionContext exe_ctx(m_interpreter.GetDebugger().GetExecutionContext());
278338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
279338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        if (!m_options.symbol_name.empty())
280338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        {
281338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // Displaying the source for a symbol:
282238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton            Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
283338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (target == NULL)
284338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
285338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendError ("invalid target, set executable file using 'file' command");
286338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
287338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
288338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
289338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
290338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContextList sc_list;
291338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            ConstString name(m_options.symbol_name.c_str());
292338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            bool append = true;
293338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
294338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
295338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (m_options.m_modules.size() > 0)
296338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
297338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
2980f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner                for (unsigned i = 0, e = m_options.m_modules.size(); i != e; i++)
299338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
300537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton                    FileSpec module_spec(m_options.m_modules[i].c_str(), false);
301338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (module_spec)
302338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
303338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
304338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules);
305338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeBase, append, sc_list);
306338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
307338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
308338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
309338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
310338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
311338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeBase, append, sc_list);
312338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
313338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
314338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
315338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
316338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
317338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
318338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function named: \"%s\".\n", m_options.symbol_name.c_str());
319338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
320338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
321338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
322338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
323338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            sc_list.GetContextAtIndex (0, sc);
324338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec start_file;
325338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t start_line;
326338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t end_line;
327338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec end_file;
328338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc.function != NULL)
329338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
330338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetStartLineSourceInfo (start_file, start_line);
331338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (start_line == 0)
332338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
333338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Could not find line information for start of function: \"%s\".\n", m_options.symbol_name.c_str());
334338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
335338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
336338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
337338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetEndLineSourceInfo (end_file, end_line);
338338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
339338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
340338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
341338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function info for: \"%s\".\n", m_options.symbol_name.c_str());
342338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
343338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
344338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
345338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
346338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
347338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
348338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // This could either be because there are multiple functions of this name, in which case
349338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // we'll have to specify this further...  Or it could be because there are multiple inlined instances
350338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // of one function.  So run through the matches and if they all have the same file & line then we can just
351338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // list one.
352338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
353338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool found_multiple = false;
354338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
355338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                for (size_t i = 1; i < num_matches; i++)
356338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
357338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    SymbolContext scratch_sc;
358338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex (i, scratch_sc);
359338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (scratch_sc.function != NULL)
360338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
361338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        FileSpec scratch_file;
362338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        uint32_t scratch_line;
363338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        scratch_sc.function->GetStartLineSourceInfo (scratch_file, scratch_line);
364338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_file != start_file
365338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            || scratch_line != start_line)
366338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
367338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            found_multiple = true;
368338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            break;
369338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
370338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
371338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
372338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (found_multiple)
373338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
374338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    StreamString s;
375338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    for (size_t i = 0; i < num_matches; i++)
376338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
377338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        SymbolContext scratch_sc;
378338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        sc_list.GetContextAtIndex (i, scratch_sc);
379338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_sc.function != NULL)
380338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
381338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            s.Printf("\n%d: ", i);
382338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            scratch_sc.function->Dump (&s, true);
383338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
384338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
385338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple functions found matching: %s: \n%s\n",
386338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.symbol_name.c_str(),
387338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 s.GetData());
388338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
389338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
390338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
391338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
392338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
393338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
394338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // This is a little hacky, but the first line table entry for a function points to the "{" that
395338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // starts the function block.  It would be nice to actually get the function
396338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // declaration in there too.  So back up a bit, but not further than what you're going to display.
397338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2;
398338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t line_no;
399338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (start_line <= lines_to_back_up)
400338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = 1;
401338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
402338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = start_line - lines_to_back_up;
403338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
404338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // For fun, if the function is shorter than the number of lines we're supposed to display,
405338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // only display the function...
406338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (end_line != 0)
407338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
408338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (m_options.num_lines > end_line - line_no)
409338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    m_options.num_lines = end_line - line_no;
410338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
411338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
412338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            char path_buf[PATH_MAX+1];
413338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            start_file.GetPath(path_buf, PATH_MAX);
414338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.AppendMessageWithFormat("File: %s.\n", path_buf);
415238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton            m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file,
416238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              line_no,
417238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              0,
418238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              m_options.num_lines,
419238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              "",
420238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              &result.GetOutputStream());
421338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
422338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.SetStatus (eReturnStatusSuccessFinishResult);
423338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            return true;
424338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
425338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        }
426338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        else if (m_options.file_name.empty())
427767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
428767af88aa617288e584afcfed055f7755e408542Jim Ingham            // Last valid source manager context, or the current frame if no
429767af88aa617288e584afcfed055f7755e408542Jim Ingham            // valid last context in source manager.
430767af88aa617288e584afcfed055f7755e408542Jim Ingham            // One little trick here, if you type the exact same list command twice in a row, it is
431767af88aa617288e584afcfed055f7755e408542Jim Ingham            // more likely because you typed it once, then typed it again
432767af88aa617288e584afcfed055f7755e408542Jim Ingham            if (m_options.start_line == 0)
433767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
434238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                if (m_interpreter.GetDebugger().GetSourceManager().DisplayMoreWithLineNumbers (&result.GetOutputStream()))
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessFinishResult);
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
438767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
439767af88aa617288e584afcfed055f7755e408542Jim Ingham            else
440767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
441238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                if (m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile(
442767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.start_line,   // Line to display
443767af88aa617288e584afcfed055f7755e408542Jim Ingham                            0,                      // Lines before line to display
444767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.num_lines,    // Lines after line to display
445767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "",                     // Don't mark "line"
446767af88aa617288e584afcfed055f7755e408542Jim Ingham                            &result.GetOutputStream()))
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
448767af88aa617288e584afcfed055f7755e408542Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
450767af88aa617288e584afcfed055f7755e408542Jim Ingham
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
455767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char *filename = m_options.file_name.c_str();
456238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton            Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
457767af88aa617288e584afcfed055f7755e408542Jim Ingham            if (target == NULL)
458767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
459767af88aa617288e584afcfed055f7755e408542Jim Ingham                result.AppendError ("invalid target, set executable file using 'file' command");
460767af88aa617288e584afcfed055f7755e408542Jim Ingham                result.SetStatus (eReturnStatusFailed);
461767af88aa617288e584afcfed055f7755e408542Jim Ingham                return false;
462767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
464767af88aa617288e584afcfed055f7755e408542Jim Ingham
465767af88aa617288e584afcfed055f7755e408542Jim Ingham            bool check_inlines = false;
466767af88aa617288e584afcfed055f7755e408542Jim Ingham            SymbolContextList sc_list;
467338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
468338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
469338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (m_options.m_modules.size() > 0)
470338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
471338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
4720f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner                for (unsigned i = 0, e = m_options.m_modules.size(); i != e; i++)
473338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
474537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton                    FileSpec module_spec(m_options.m_modules[i].c_str(), false);
475338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (module_spec)
476338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
477338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
478338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules);
479338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        num_matches += matching_modules.ResolveSymbolContextForFilePath (filename,
480338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   0,
481338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   check_inlines,
482338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   eSymbolContextModule | eSymbolContextCompUnit,
483338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   sc_list);
484338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
485338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
486338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
487338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
488338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
489338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                num_matches = target->GetImages().ResolveSymbolContextForFilePath (filename,
490338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   0,
491338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   check_inlines,
492338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   eSymbolContextModule | eSymbolContextCompUnit,
493338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   sc_list);
494338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
495338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
496338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
497338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
498338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find source file \"%s\".\n",
499338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                             m_options.file_name.c_str());
500338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
501338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
502338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
503338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
504338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
505767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
506767af88aa617288e584afcfed055f7755e408542Jim Ingham                SymbolContext sc;
507338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool got_multiple = false;
508338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                FileSpec *test_cu_spec = NULL;
509338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
5100f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner                for (unsigned i = 0; i < num_matches; i++)
511767af88aa617288e584afcfed055f7755e408542Jim Ingham                {
512338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex(i, sc);
513767af88aa617288e584afcfed055f7755e408542Jim Ingham                    if (sc.comp_unit)
514767af88aa617288e584afcfed055f7755e408542Jim Ingham                    {
515338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (test_cu_spec)
516338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
517338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            if (test_cu_spec != static_cast<FileSpec *> (sc.comp_unit))
518338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                got_multiple = true;
519338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                break;
520338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
521338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        else
522338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            test_cu_spec = sc.comp_unit;
523767af88aa617288e584afcfed055f7755e408542Jim Ingham                    }
524767af88aa617288e584afcfed055f7755e408542Jim Ingham                }
525338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (got_multiple)
526338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
527338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple source files found matching: \"%s.\"\n",
528338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
529338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
530338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
531338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
532338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
533338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
534338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
535338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc_list.GetContextAtIndex(0, sc))
536338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
537338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (sc.comp_unit)
538338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
539238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                    m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit,
540238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      m_options.start_line,
541238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      0,
542238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      m_options.num_lines,
543238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      "",
544238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      &result.GetOutputStream());
545338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
546338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
547338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
548338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                else
549338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
550338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("No comp unit found for: \"%s.\"\n",
551338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
552338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
553338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
554338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
555767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
557767af88aa617288e584afcfed055f7755e408542Jim Ingham        return result.Succeeded();
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
559767af88aa617288e584afcfed055f7755e408542Jim Ingham
560767af88aa617288e584afcfed055f7755e408542Jim Ingham    virtual const char *GetRepeatCommand (Args &current_command_args, uint32_t index)
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
562767af88aa617288e584afcfed055f7755e408542Jim Ingham        return m_cmd_name.c_str();
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
565767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected:
566767af88aa617288e584afcfed055f7755e408542Jim Ingham    CommandOptions m_options;
567767af88aa617288e584afcfed055f7755e408542Jim Ingham
568767af88aa617288e584afcfed055f7755e408542Jim Ingham};
569767af88aa617288e584afcfed055f7755e408542Jim Ingham
570767af88aa617288e584afcfed055f7755e408542Jim Inghamlldb::OptionDefinition
571767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceList::CommandOptions::g_option_table[] =
572767af88aa617288e584afcfed055f7755e408542Jim Ingham{
5734d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "count",    'c', required_argument, NULL, 0, eArgTypeCount,   "The number of source lines to display."},
5744d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "shlib",    's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Look up the source file in the given shared library."},
5754d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,    "The file from which to display source."},
5764d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line",       'l', required_argument, NULL, 0, eArgTypeLineNum,    "The line number at which to start the display source."},
5774d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_2, false, "name",       'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeSymbol,    "The name of a function whose source to display."},
5784d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
579767af88aa617288e584afcfed055f7755e408542Jim Ingham};
580767af88aa617288e584afcfed055f7755e408542Jim Ingham
581767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordSource
582767af88aa617288e584afcfed055f7755e408542Jim Ingham
583767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
584767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordSource
585767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
586767af88aa617288e584afcfed055f7755e408542Jim Ingham
587767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::CommandObjectMultiwordSource (CommandInterpreter &interpreter) :
588238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
589238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "source",
590c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice                            "A set of commands for accessing source file information",
591767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "source <subcommand> [<subcommand-options>]")
592767af88aa617288e584afcfed055f7755e408542Jim Ingham{
593238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("info",   CommandObjectSP (new CommandObjectSourceInfo (interpreter)));
594238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",   CommandObjectSP (new CommandObjectSourceList (interpreter)));
595767af88aa617288e584afcfed055f7755e408542Jim Ingham}
596767af88aa617288e584afcfed055f7755e408542Jim Ingham
597767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::~CommandObjectMultiwordSource ()
598767af88aa617288e584afcfed055f7755e408542Jim Ingham{
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
600767af88aa617288e584afcfed055f7755e408542Jim Ingham
601