CommandObjectSource.cpp revision fdf24efe672bf3fa041cdbebd2d7f406b11882bd
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"
1852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/FileLineResolver.h"
1952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/SourceManager.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
225f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
25767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandCompletions.h"
26767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/Options.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
3252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// CommandObjectSourceInfo
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectSourceInfo : public CommandObject
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38767af88aa617288e584afcfed055f7755e408542Jim Ingham    class CommandOptions : public Options
39767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
40767af88aa617288e584afcfed055f7755e408542Jim Ingham    public:
41f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
42f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options(interpreter)
43767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
44767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
45767af88aa617288e584afcfed055f7755e408542Jim Ingham
46767af88aa617288e584afcfed055f7755e408542Jim Ingham        ~CommandOptions ()
47767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
48767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
49767af88aa617288e584afcfed055f7755e408542Jim Ingham
50767af88aa617288e584afcfed055f7755e408542Jim Ingham        Error
51143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx, const char *option_arg)
52767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
53767af88aa617288e584afcfed055f7755e408542Jim Ingham            Error error;
54767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char short_option = g_option_table[option_idx].short_option;
55767af88aa617288e584afcfed055f7755e408542Jim Ingham            switch (short_option)
56767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
57767af88aa617288e584afcfed055f7755e408542Jim Ingham            case 'l':
58767af88aa617288e584afcfed055f7755e408542Jim Ingham                start_line = Args::StringToUInt32 (option_arg, 0);
59767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (start_line == 0)
60767af88aa617288e584afcfed055f7755e408542Jim Ingham                    error.SetErrorStringWithFormat("Invalid line number: '%s'.\n", option_arg);
61767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
62767af88aa617288e584afcfed055f7755e408542Jim Ingham
63767af88aa617288e584afcfed055f7755e408542Jim Ingham             case 'f':
64767af88aa617288e584afcfed055f7755e408542Jim Ingham                file_name = option_arg;
65767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
66767af88aa617288e584afcfed055f7755e408542Jim Ingham
67767af88aa617288e584afcfed055f7755e408542Jim Ingham           default:
68767af88aa617288e584afcfed055f7755e408542Jim Ingham                error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option);
69767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
70767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
71767af88aa617288e584afcfed055f7755e408542Jim Ingham
72767af88aa617288e584afcfed055f7755e408542Jim Ingham            return error;
73767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
74767af88aa617288e584afcfed055f7755e408542Jim Ingham
75767af88aa617288e584afcfed055f7755e408542Jim Ingham        void
76143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
77767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
78767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_spec.Clear();
79767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_name.clear();
80767af88aa617288e584afcfed055f7755e408542Jim Ingham            start_line = 0;
81767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
82767af88aa617288e584afcfed055f7755e408542Jim Ingham
83b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
84767af88aa617288e584afcfed055f7755e408542Jim Ingham        GetDefinitions ()
85767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
86767af88aa617288e584afcfed055f7755e408542Jim Ingham            return g_option_table;
87767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
88b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
89767af88aa617288e584afcfed055f7755e408542Jim Ingham
90767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Instance variables to hold the values for command options.
91767af88aa617288e584afcfed055f7755e408542Jim Ingham        FileSpec file_spec;
92767af88aa617288e584afcfed055f7755e408542Jim Ingham        std::string file_name;
93767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t start_line;
94767af88aa617288e584afcfed055f7755e408542Jim Ingham
95767af88aa617288e584afcfed055f7755e408542Jim Ingham    };
96767af88aa617288e584afcfed055f7755e408542Jim Ingham
97767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
98238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectSourceInfo(CommandInterpreter &interpreter) :
99238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
100238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "source info",
101238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "Display information about the source lines from the current executable's debug info.",
102f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton                       "source info [<cmd-options>]"),
103f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
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
134b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
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:
153f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
154f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options(interpreter)
155767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
156767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158767af88aa617288e584afcfed055f7755e408542Jim Ingham        ~CommandOptions ()
159767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
160767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162767af88aa617288e584afcfed055f7755e408542Jim Ingham        Error
163143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t 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
18152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            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':
19052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                modules.push_back (std::string (option_arg));
19152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                break;
19252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
19352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            case 'b':
19452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                show_bp_locs = true;
195338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                break;
196767af88aa617288e584afcfed055f7755e408542Jim Ingham           default:
197767af88aa617288e584afcfed055f7755e408542Jim Ingham                error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option);
198767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
201767af88aa617288e584afcfed055f7755e408542Jim Ingham            return error;
202767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
204767af88aa617288e584afcfed055f7755e408542Jim Ingham        void
205143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
206767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
207767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_spec.Clear();
208767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_name.clear();
209338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            symbol_name.clear();
210767af88aa617288e584afcfed055f7755e408542Jim Ingham            start_line = 0;
211767af88aa617288e584afcfed055f7755e408542Jim Ingham            num_lines = 10;
21252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            show_bp_locs = false;
21352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            modules.clear();
214767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
215767af88aa617288e584afcfed055f7755e408542Jim Ingham
216b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
217767af88aa617288e584afcfed055f7755e408542Jim Ingham        GetDefinitions ()
218767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
219767af88aa617288e584afcfed055f7755e408542Jim Ingham            return g_option_table;
220767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
221b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
222767af88aa617288e584afcfed055f7755e408542Jim Ingham
223767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Instance variables to hold the values for command options.
224767af88aa617288e584afcfed055f7755e408542Jim Ingham        FileSpec file_spec;
225767af88aa617288e584afcfed055f7755e408542Jim Ingham        std::string file_name;
226338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        std::string symbol_name;
227767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t start_line;
228767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t num_lines;
22952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        STLStringArray modules;
23052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        bool show_bp_locs;
231767af88aa617288e584afcfed055f7755e408542Jim Ingham    };
232767af88aa617288e584afcfed055f7755e408542Jim Ingham
233767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
234238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectSourceList(CommandInterpreter &interpreter) :
235238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
236238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "source list",
237238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "Display source code (as specified) based on the current executable's debug info.",
238f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton                        NULL),
239f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
240767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
24143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
24243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData file_arg;
24343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
24543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_type = eArgTypeFilename;
24643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_repetition = eArgRepeatOptional;
24743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
24843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
24943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (file_arg);
25043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
25143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
25243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
253767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
254767af88aa617288e584afcfed055f7755e408542Jim Ingham
255767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectSourceList ()
256767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
257767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
258767af88aa617288e584afcfed055f7755e408542Jim Ingham
259767af88aa617288e584afcfed055f7755e408542Jim Ingham
260767af88aa617288e584afcfed055f7755e408542Jim Ingham    Options *
261767af88aa617288e584afcfed055f7755e408542Jim Ingham    GetOptions ()
262767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
263767af88aa617288e584afcfed055f7755e408542Jim Ingham        return &m_options;
264767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
265767af88aa617288e584afcfed055f7755e408542Jim Ingham
266767af88aa617288e584afcfed055f7755e408542Jim Ingham
267767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
268767af88aa617288e584afcfed055f7755e408542Jim Ingham    Execute
269767af88aa617288e584afcfed055f7755e408542Jim Ingham    (
270767af88aa617288e584afcfed055f7755e408542Jim Ingham        Args& args,
271767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandReturnObject &result
272767af88aa617288e584afcfed055f7755e408542Jim Ingham    )
273767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
274767af88aa617288e584afcfed055f7755e408542Jim Ingham        const int argc = args.GetArgumentCount();
275767af88aa617288e584afcfed055f7755e408542Jim Ingham
276767af88aa617288e584afcfed055f7755e408542Jim Ingham        if (argc != 0)
277767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
278767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendErrorWithFormat("'%s' takes no arguments, only flags.\n", GetCommandName());
279767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.SetStatus (eReturnStatusFailed);
280767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
281767af88aa617288e584afcfed055f7755e408542Jim Ingham
282b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
283fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        Target *target = NULL;
284fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
285fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        if (exe_ctx.target)
286fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            target = exe_ctx.target;
287fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        else
288fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            target = m_interpreter.GetDebugger().GetSelectedTarget().get();
289fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
290fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        if (target == NULL)
291fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        {
292fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            result.AppendError ("invalid target, create a debug target using the 'target create' command");
293fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            result.SetStatus (eReturnStatusFailed);
294fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            return false;
295fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        }
296fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
297338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        if (!m_options.symbol_name.empty())
298338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        {
299338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // Displaying the source for a symbol:
300338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContextList sc_list;
301338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            ConstString name(m_options.symbol_name.c_str());
30228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            bool include_symbols = false;
303338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            bool append = true;
304338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
305338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
30652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            if (m_options.modules.size() > 0)
307338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
308338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
30952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                for (unsigned i = 0, e = m_options.modules.size(); i != e; i++)
310338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
31152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    FileSpec module_spec(m_options.modules[i].c_str(), false);
312338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (module_spec)
313338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
314338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
315338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules);
31628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeBase, include_symbols, append, sc_list);
317338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
318338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
319338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
320338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
321338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
32228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeBase, include_symbols, append, sc_list);
323338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
324338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
325338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
326338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
327338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
328338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
329338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function named: \"%s\".\n", m_options.symbol_name.c_str());
330338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
331338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
332338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
333338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
334338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            sc_list.GetContextAtIndex (0, sc);
335338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec start_file;
336338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t start_line;
337338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t end_line;
338338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec end_file;
339338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc.function != NULL)
340338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
341338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetStartLineSourceInfo (start_file, start_line);
342338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (start_line == 0)
343338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
344338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Could not find line information for start of function: \"%s\".\n", m_options.symbol_name.c_str());
345338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
346338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
347338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
348338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetEndLineSourceInfo (end_file, end_line);
349338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
350338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
351338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
352338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function info for: \"%s\".\n", m_options.symbol_name.c_str());
353338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
354338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
355338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
356338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
357338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
358338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
359338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // This could either be because there are multiple functions of this name, in which case
360338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // we'll have to specify this further...  Or it could be because there are multiple inlined instances
361338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // of one function.  So run through the matches and if they all have the same file & line then we can just
362338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // list one.
363338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
364338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool found_multiple = false;
365338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
366338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                for (size_t i = 1; i < num_matches; i++)
367338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
368338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    SymbolContext scratch_sc;
369338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex (i, scratch_sc);
370338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (scratch_sc.function != NULL)
371338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
372338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        FileSpec scratch_file;
373338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        uint32_t scratch_line;
374338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        scratch_sc.function->GetStartLineSourceInfo (scratch_file, scratch_line);
375338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_file != start_file
376338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            || scratch_line != start_line)
377338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
378338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            found_multiple = true;
379338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            break;
380338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
381338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
382338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
383338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (found_multiple)
384338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
385338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    StreamString s;
386338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    for (size_t i = 0; i < num_matches; i++)
387338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
388338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        SymbolContext scratch_sc;
389338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        sc_list.GetContextAtIndex (i, scratch_sc);
390338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_sc.function != NULL)
391338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
392338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            s.Printf("\n%d: ", i);
393338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            scratch_sc.function->Dump (&s, true);
394338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
395338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
396338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple functions found matching: %s: \n%s\n",
397338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.symbol_name.c_str(),
398338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 s.GetData());
399338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
400338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
401338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
402338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
403338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
404338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
405338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // This is a little hacky, but the first line table entry for a function points to the "{" that
406338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // starts the function block.  It would be nice to actually get the function
407338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // declaration in there too.  So back up a bit, but not further than what you're going to display.
408338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2;
409338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t line_no;
410338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (start_line <= lines_to_back_up)
411338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = 1;
412338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
413338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = start_line - lines_to_back_up;
414338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
415338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // For fun, if the function is shorter than the number of lines we're supposed to display,
416338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // only display the function...
417338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (end_line != 0)
418338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
419338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (m_options.num_lines > end_line - line_no)
420338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    m_options.num_lines = end_line - line_no;
421338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
422338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
42352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            char path_buf[PATH_MAX];
42452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            start_file.GetPath(path_buf, sizeof(path_buf));
4251cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton
426fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            if (m_options.show_bp_locs)
4271cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton            {
4281cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                const bool show_inlines = true;
4291cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                m_breakpoint_locations.Reset (start_file, 0, show_inlines);
4301cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                SearchFilter target_search_filter (exe_ctx.target->GetSP());
4311cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                target_search_filter.Search (m_breakpoint_locations);
4321cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton            }
4331cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton            else
4341cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                m_breakpoint_locations.Clear();
4351cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton
436338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.AppendMessageWithFormat("File: %s.\n", path_buf);
437fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            target->GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file,
438fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          line_no,
439fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          0,
440fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          m_options.num_lines,
441fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          "",
442fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          &result.GetOutputStream(),
443fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          GetBreakpointLocations ());
444338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
445338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.SetStatus (eReturnStatusSuccessFinishResult);
446338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            return true;
447338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
448338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        }
449338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        else if (m_options.file_name.empty())
450767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
451767af88aa617288e584afcfed055f7755e408542Jim Ingham            // Last valid source manager context, or the current frame if no
452767af88aa617288e584afcfed055f7755e408542Jim Ingham            // valid last context in source manager.
453767af88aa617288e584afcfed055f7755e408542Jim Ingham            // One little trick here, if you type the exact same list command twice in a row, it is
454767af88aa617288e584afcfed055f7755e408542Jim Ingham            // more likely because you typed it once, then typed it again
455767af88aa617288e584afcfed055f7755e408542Jim Ingham            if (m_options.start_line == 0)
456767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
45752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                if (m_interpreter.GetDebugger().GetSourceManager().DisplayMoreWithLineNumbers (&result.GetOutputStream(),
45852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                               GetBreakpointLocations ()))
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessFinishResult);
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
462767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
463767af88aa617288e584afcfed055f7755e408542Jim Ingham            else
464767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
465fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                if (m_options.show_bp_locs)
4661cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                {
467fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    SourceManager::FileSP last_file_sp (target->GetSourceManager().GetLastFile ());
4681cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    if (last_file_sp)
4691cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    {
4701cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                        const bool show_inlines = true;
4711cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                        m_breakpoint_locations.Reset (last_file_sp->GetFileSpec(), 0, show_inlines);
472fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                        SearchFilter target_search_filter (target->GetSP());
4731cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                        target_search_filter.Search (m_breakpoint_locations);
4741cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    }
4751cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                }
4761cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                else
4771cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    m_breakpoint_locations.Clear();
4781cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton
479fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                if (target->GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile(
480767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.start_line,   // Line to display
481767af88aa617288e584afcfed055f7755e408542Jim Ingham                            0,                      // Lines before line to display
482767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.num_lines,    // Lines after line to display
483767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "",                     // Don't mark "line"
48452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                            &result.GetOutputStream(),
48552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                            GetBreakpointLocations ()))
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
487767af88aa617288e584afcfed055f7755e408542Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
489767af88aa617288e584afcfed055f7755e408542Jim Ingham
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
494767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char *filename = m_options.file_name.c_str();
495767af88aa617288e584afcfed055f7755e408542Jim Ingham
496767af88aa617288e584afcfed055f7755e408542Jim Ingham            bool check_inlines = false;
497767af88aa617288e584afcfed055f7755e408542Jim Ingham            SymbolContextList sc_list;
498338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
499338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
50052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            if (m_options.modules.size() > 0)
501338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
502338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
50352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                for (unsigned i = 0, e = m_options.modules.size(); i != e; i++)
504338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
50552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    FileSpec module_spec(m_options.modules[i].c_str(), false);
506338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (module_spec)
507338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
508338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
509338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules);
510338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        num_matches += matching_modules.ResolveSymbolContextForFilePath (filename,
51152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         0,
51252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         check_inlines,
51352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         eSymbolContextModule | eSymbolContextCompUnit,
51452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         sc_list);
515338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
516338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
517338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
518338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
519338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
520338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                num_matches = target->GetImages().ResolveSymbolContextForFilePath (filename,
521338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   0,
522338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   check_inlines,
523338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   eSymbolContextModule | eSymbolContextCompUnit,
524338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   sc_list);
525338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
526338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
527338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
528338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
529338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find source file \"%s\".\n",
530338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                             m_options.file_name.c_str());
531338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
532338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
533338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
534338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
535338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
536767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
537767af88aa617288e584afcfed055f7755e408542Jim Ingham                SymbolContext sc;
538338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool got_multiple = false;
539338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                FileSpec *test_cu_spec = NULL;
540338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
5410f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner                for (unsigned i = 0; i < num_matches; i++)
542767af88aa617288e584afcfed055f7755e408542Jim Ingham                {
543338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex(i, sc);
544767af88aa617288e584afcfed055f7755e408542Jim Ingham                    if (sc.comp_unit)
545767af88aa617288e584afcfed055f7755e408542Jim Ingham                    {
546338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (test_cu_spec)
547338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
548338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            if (test_cu_spec != static_cast<FileSpec *> (sc.comp_unit))
549338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                got_multiple = true;
550338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                break;
551338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
552338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        else
553338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            test_cu_spec = sc.comp_unit;
554767af88aa617288e584afcfed055f7755e408542Jim Ingham                    }
555767af88aa617288e584afcfed055f7755e408542Jim Ingham                }
556338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (got_multiple)
557338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
558338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple source files found matching: \"%s.\"\n",
559338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
560338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
561338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
562338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
563338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
564338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
565338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
566338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc_list.GetContextAtIndex(0, sc))
567338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
568338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (sc.comp_unit)
569338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
570fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    if (m_options.show_bp_locs)
57152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    {
57252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        const bool show_inlines = true;
57352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines);
574fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                        SearchFilter target_search_filter (target->GetSP());
57552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        target_search_filter.Search (m_breakpoint_locations);
57652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    }
57752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    else
57852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        m_breakpoint_locations.Clear();
57952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
580fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    target->GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit,
581fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  m_options.start_line,
582fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  0,
583fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  m_options.num_lines,
584fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  "",
585fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  &result.GetOutputStream(),
586fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  GetBreakpointLocations ());
58752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
588338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
589338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
590338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                else
591338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
592338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("No comp unit found for: \"%s.\"\n",
593338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
594338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
595338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
596338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
597767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
599767af88aa617288e584afcfed055f7755e408542Jim Ingham        return result.Succeeded();
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
601767af88aa617288e584afcfed055f7755e408542Jim Ingham
602767af88aa617288e584afcfed055f7755e408542Jim Ingham    virtual const char *GetRepeatCommand (Args &current_command_args, uint32_t index)
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
604767af88aa617288e584afcfed055f7755e408542Jim Ingham        return m_cmd_name.c_str();
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
607767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected:
60852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    const SymbolContextList *
60952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    GetBreakpointLocations ()
61052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    {
61152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        if (m_breakpoint_locations.GetFileLineMatches().GetSize() > 0)
61252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            return &m_breakpoint_locations.GetFileLineMatches();
61352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        return NULL;
61452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    }
615767af88aa617288e584afcfed055f7755e408542Jim Ingham    CommandOptions m_options;
61652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    FileLineResolver m_breakpoint_locations;
617767af88aa617288e584afcfed055f7755e408542Jim Ingham
618767af88aa617288e584afcfed055f7755e408542Jim Ingham};
619767af88aa617288e584afcfed055f7755e408542Jim Ingham
620b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
621767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceList::CommandOptions::g_option_table[] =
622767af88aa617288e584afcfed055f7755e408542Jim Ingham{
6234d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "count",    'c', required_argument, NULL, 0, eArgTypeCount,   "The number of source lines to display."},
6244d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "shlib",    's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Look up the source file in the given shared library."},
62552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{ LLDB_OPT_SET_ALL, false, "show-breakpoints", 'b', no_argument, NULL, 0, eArgTypeNone, "Show the line table locations from the debug information that indicate valid places to set source level breakpoints."},
6264d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,    "The file from which to display source."},
6274d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line",       'l', required_argument, NULL, 0, eArgTypeLineNum,    "The line number at which to start the display source."},
6284d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_2, false, "name",       'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeSymbol,    "The name of a function whose source to display."},
6294d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
630767af88aa617288e584afcfed055f7755e408542Jim Ingham};
631767af88aa617288e584afcfed055f7755e408542Jim Ingham
632767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordSource
633767af88aa617288e584afcfed055f7755e408542Jim Ingham
634767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
635767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordSource
636767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
637767af88aa617288e584afcfed055f7755e408542Jim Ingham
638767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::CommandObjectMultiwordSource (CommandInterpreter &interpreter) :
639238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
640238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "source",
641c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice                            "A set of commands for accessing source file information",
642767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "source <subcommand> [<subcommand-options>]")
643767af88aa617288e584afcfed055f7755e408542Jim Ingham{
644238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("info",   CommandObjectSP (new CommandObjectSourceInfo (interpreter)));
645238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",   CommandObjectSP (new CommandObjectSourceList (interpreter)));
646767af88aa617288e584afcfed055f7755e408542Jim Ingham}
647767af88aa617288e584afcfed055f7755e408542Jim Ingham
648767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::~CommandObjectMultiwordSource ()
649767af88aa617288e584afcfed055f7755e408542Jim Ingham{
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
651767af88aa617288e584afcfed055f7755e408542Jim Ingham
652