CommandObjectSource.cpp revision 781241147dbdd18762ab676960ecbff18ab0a766
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
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectSource.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1884cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
1963094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h"
2052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/FileLineResolver.h"
21781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton#include "lldb/Core/Module.h"
2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h"
2352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/SourceManager.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
265f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h"
2749ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h"
2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
31767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandCompletions.h"
32767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/Options.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
3852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// CommandObjectSourceInfo
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectSourceInfo : public CommandObjectParsed
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44767af88aa617288e584afcfed055f7755e408542Jim Ingham    class CommandOptions : public Options
45767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
46767af88aa617288e584afcfed055f7755e408542Jim Ingham    public:
47f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
48f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options(interpreter)
49767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
50767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
51767af88aa617288e584afcfed055f7755e408542Jim Ingham
52767af88aa617288e584afcfed055f7755e408542Jim Ingham        ~CommandOptions ()
53767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
54767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
55767af88aa617288e584afcfed055f7755e408542Jim Ingham
56767af88aa617288e584afcfed055f7755e408542Jim Ingham        Error
57143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx, const char *option_arg)
58767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
59767af88aa617288e584afcfed055f7755e408542Jim Ingham            Error error;
606475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton            const int short_option = g_option_table[option_idx].short_option;
61767af88aa617288e584afcfed055f7755e408542Jim Ingham            switch (short_option)
62767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
63767af88aa617288e584afcfed055f7755e408542Jim Ingham            case 'l':
64767af88aa617288e584afcfed055f7755e408542Jim Ingham                start_line = Args::StringToUInt32 (option_arg, 0);
65767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (start_line == 0)
669c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat("invalid line number: '%s'", option_arg);
67767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
68767af88aa617288e584afcfed055f7755e408542Jim Ingham
69767af88aa617288e584afcfed055f7755e408542Jim Ingham             case 'f':
70767af88aa617288e584afcfed055f7755e408542Jim Ingham                file_name = option_arg;
71767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
72767af88aa617288e584afcfed055f7755e408542Jim Ingham
73767af88aa617288e584afcfed055f7755e408542Jim Ingham           default:
749c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option);
75767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
76767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
77767af88aa617288e584afcfed055f7755e408542Jim Ingham
78767af88aa617288e584afcfed055f7755e408542Jim Ingham            return error;
79767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
80767af88aa617288e584afcfed055f7755e408542Jim Ingham
81767af88aa617288e584afcfed055f7755e408542Jim Ingham        void
82143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
83767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
84767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_spec.Clear();
85767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_name.clear();
86767af88aa617288e584afcfed055f7755e408542Jim Ingham            start_line = 0;
87767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
88767af88aa617288e584afcfed055f7755e408542Jim Ingham
89b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
90767af88aa617288e584afcfed055f7755e408542Jim Ingham        GetDefinitions ()
91767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
92767af88aa617288e584afcfed055f7755e408542Jim Ingham            return g_option_table;
93767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
94b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
95767af88aa617288e584afcfed055f7755e408542Jim Ingham
96767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Instance variables to hold the values for command options.
97767af88aa617288e584afcfed055f7755e408542Jim Ingham        FileSpec file_spec;
98767af88aa617288e584afcfed055f7755e408542Jim Ingham        std::string file_name;
99767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t start_line;
100767af88aa617288e584afcfed055f7755e408542Jim Ingham
101767af88aa617288e584afcfed055f7755e408542Jim Ingham    };
102767af88aa617288e584afcfed055f7755e408542Jim Ingham
103767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
104238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectSourceInfo(CommandInterpreter &interpreter) :
105da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
106da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "source info",
107da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Display information about the source lines from the current executable's debug info.",
108da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "source info [<cmd-options>]"),
109f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
110767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
111767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
112767af88aa617288e584afcfed055f7755e408542Jim Ingham
113767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectSourceInfo ()
114767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
115767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
116767af88aa617288e584afcfed055f7755e408542Jim Ingham
117767af88aa617288e584afcfed055f7755e408542Jim Ingham
118767af88aa617288e584afcfed055f7755e408542Jim Ingham    Options *
119767af88aa617288e584afcfed055f7755e408542Jim Ingham    GetOptions ()
120767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
121767af88aa617288e584afcfed055f7755e408542Jim Ingham        return &m_options;
122767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
123767af88aa617288e584afcfed055f7755e408542Jim Ingham
124da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
125767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
126da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& command, CommandReturnObject &result)
127767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
128767af88aa617288e584afcfed055f7755e408542Jim Ingham        result.AppendError ("Not yet implemented");
129767af88aa617288e584afcfed055f7755e408542Jim Ingham        result.SetStatus (eReturnStatusFailed);
130767af88aa617288e584afcfed055f7755e408542Jim Ingham        return false;
131767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
132da26bd203cbb104291b39891febf7481794f205fJim Ingham
133767af88aa617288e584afcfed055f7755e408542Jim Ingham    CommandOptions m_options;
134767af88aa617288e584afcfed055f7755e408542Jim Ingham};
135767af88aa617288e584afcfed055f7755e408542Jim Ingham
136b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
137767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceInfo::CommandOptions::g_option_table[] =
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1394d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line",       'l', required_argument, NULL, 0, eArgTypeLineNum,    "The line number at which to start the display source."},
1404d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,    "The file from which to display source."},
1414d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
142767af88aa617288e584afcfed055f7755e408542Jim Ingham};
143767af88aa617288e584afcfed055f7755e408542Jim Ingham
144767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectSourceList
145767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
146767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectSourceList
147767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectSourceList : public CommandObjectParsed
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
151767af88aa617288e584afcfed055f7755e408542Jim Ingham
152767af88aa617288e584afcfed055f7755e408542Jim Ingham    class CommandOptions : public Options
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
154767af88aa617288e584afcfed055f7755e408542Jim Ingham    public:
155f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
156f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options(interpreter)
157767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
158767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
160767af88aa617288e584afcfed055f7755e408542Jim Ingham        ~CommandOptions ()
161767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
162767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164767af88aa617288e584afcfed055f7755e408542Jim Ingham        Error
165143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx, const char *option_arg)
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
167767af88aa617288e584afcfed055f7755e408542Jim Ingham            Error error;
1686475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton            const int short_option = g_option_table[option_idx].short_option;
169767af88aa617288e584afcfed055f7755e408542Jim Ingham            switch (short_option)
170767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
171767af88aa617288e584afcfed055f7755e408542Jim Ingham            case 'l':
172767af88aa617288e584afcfed055f7755e408542Jim Ingham                start_line = Args::StringToUInt32 (option_arg, 0);
173767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (start_line == 0)
1749c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat("invalid line number: '%s'", option_arg);
175767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            case 'c':
178767af88aa617288e584afcfed055f7755e408542Jim Ingham                num_lines = Args::StringToUInt32 (option_arg, 0);
179767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (num_lines == 0)
1809c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat("invalid line count: '%s'", option_arg);
181767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            case 'f':
184767af88aa617288e584afcfed055f7755e408542Jim Ingham                file_name = option_arg;
185767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
186338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
187338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            case 'n':
188338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                symbol_name = option_arg;
189338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                break;
190767af88aa617288e584afcfed055f7755e408542Jim Ingham
191781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            case 'a':
192781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
193781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    ExecutionContext exe_ctx (m_interpreter.GetExecutionContext());
194781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    address = Args::StringToAddress(&exe_ctx, option_arg, LLDB_INVALID_ADDRESS, &error);
195781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
196781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                break;
197338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            case 's':
19852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                modules.push_back (std::string (option_arg));
19952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                break;
20052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
20152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            case 'b':
20252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                show_bp_locs = true;
203338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                break;
204767af88aa617288e584afcfed055f7755e408542Jim Ingham           default:
2059c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option);
206767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209767af88aa617288e584afcfed055f7755e408542Jim Ingham            return error;
210767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212767af88aa617288e584afcfed055f7755e408542Jim Ingham        void
213143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
214767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
215767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_spec.Clear();
216767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_name.clear();
217338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            symbol_name.clear();
218781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            address = LLDB_INVALID_ADDRESS;
219767af88aa617288e584afcfed055f7755e408542Jim Ingham            start_line = 0;
220767af88aa617288e584afcfed055f7755e408542Jim Ingham            num_lines = 10;
22152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            show_bp_locs = false;
22252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            modules.clear();
223767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
224767af88aa617288e584afcfed055f7755e408542Jim Ingham
225b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
226767af88aa617288e584afcfed055f7755e408542Jim Ingham        GetDefinitions ()
227767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
228767af88aa617288e584afcfed055f7755e408542Jim Ingham            return g_option_table;
229767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
230b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
231767af88aa617288e584afcfed055f7755e408542Jim Ingham
232767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Instance variables to hold the values for command options.
233767af88aa617288e584afcfed055f7755e408542Jim Ingham        FileSpec file_spec;
234767af88aa617288e584afcfed055f7755e408542Jim Ingham        std::string file_name;
235338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        std::string symbol_name;
236781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        lldb::addr_t address;
237767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t start_line;
238767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t num_lines;
23952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        STLStringArray modules;
24052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        bool show_bp_locs;
241767af88aa617288e584afcfed055f7755e408542Jim Ingham    };
242767af88aa617288e584afcfed055f7755e408542Jim Ingham
243767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
244238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectSourceList(CommandInterpreter &interpreter) :
245da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
246da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "source list",
247da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Display source code (as specified) based on the current executable's debug info.",
248da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL),
249f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
250767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
25143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
25243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData file_arg;
25343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
25443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
25543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_type = eArgTypeFilename;
25643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_repetition = eArgRepeatOptional;
25743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
25843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
25943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (file_arg);
26043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
26143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
26243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
263767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
264767af88aa617288e584afcfed055f7755e408542Jim Ingham
265767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectSourceList ()
266767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
267767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
268767af88aa617288e584afcfed055f7755e408542Jim Ingham
269767af88aa617288e584afcfed055f7755e408542Jim Ingham
270767af88aa617288e584afcfed055f7755e408542Jim Ingham    Options *
271767af88aa617288e584afcfed055f7755e408542Jim Ingham    GetOptions ()
272767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
273767af88aa617288e584afcfed055f7755e408542Jim Ingham        return &m_options;
274767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
275767af88aa617288e584afcfed055f7755e408542Jim Ingham
276da26bd203cbb104291b39891febf7481794f205fJim Ingham    virtual const char *
277da26bd203cbb104291b39891febf7481794f205fJim Ingham    GetRepeatCommand (Args &current_command_args, uint32_t index)
278da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
279da26bd203cbb104291b39891febf7481794f205fJim Ingham        return m_cmd_name.c_str();
280da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
281767af88aa617288e584afcfed055f7755e408542Jim Ingham
282da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
283767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
284da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& command, CommandReturnObject &result)
285767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
286da26bd203cbb104291b39891febf7481794f205fJim Ingham        const int argc = command.GetArgumentCount();
287767af88aa617288e584afcfed055f7755e408542Jim Ingham
288767af88aa617288e584afcfed055f7755e408542Jim Ingham        if (argc != 0)
289767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
290767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendErrorWithFormat("'%s' takes no arguments, only flags.\n", GetCommandName());
291767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.SetStatus (eReturnStatusFailed);
29226e089bf5310f8378e7d86b9f38db32a38e76411Jim Ingham            return false;
293767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
294767af88aa617288e584afcfed055f7755e408542Jim Ingham
295b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
296567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Target *target = exe_ctx.GetTargetPtr();
297fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
298567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (target == NULL)
299fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            target = m_interpreter.GetDebugger().GetSelectedTarget().get();
300fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
301fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        if (target == NULL)
302fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        {
303fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            result.AppendError ("invalid target, create a debug target using the 'target create' command");
304fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            result.SetStatus (eReturnStatusFailed);
305fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            return false;
306fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        }
307fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
308781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        SymbolContextList sc_list;
309338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        if (!m_options.symbol_name.empty())
310338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        {
311338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // Displaying the source for a symbol:
312338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            ConstString name(m_options.symbol_name.c_str());
31328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            bool include_symbols = false;
314302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan            bool include_inlines = true;
315338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            bool append = true;
316338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
317338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
31852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            if (m_options.modules.size() > 0)
319338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
320338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
32152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                for (unsigned i = 0, e = m_options.modules.size(); i != e; i++)
322338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
323444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                    FileSpec module_file_spec(m_options.modules[i].c_str(), false);
324444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                    if (module_file_spec)
325338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
326444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        ModuleSpec module_spec (module_file_spec);
327338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
328444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        target->GetImages().FindModules (module_spec, matching_modules);
329302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                        num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list);
330338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
331338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
332338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
333338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
334338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
335302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list);
336338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
337338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
338338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
339338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
340338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
341338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
342338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function named: \"%s\".\n", m_options.symbol_name.c_str());
343338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
344338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
345338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
346338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
347338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            sc_list.GetContextAtIndex (0, sc);
348338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec start_file;
349338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t start_line;
350338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t end_line;
351338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec end_file;
352338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc.function != NULL)
353338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
354338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetStartLineSourceInfo (start_file, start_line);
355338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (start_line == 0)
356338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
357338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Could not find line information for start of function: \"%s\".\n", m_options.symbol_name.c_str());
358338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
359338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
360338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
361338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetEndLineSourceInfo (end_file, end_line);
362338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
363338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
364338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
365338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function info for: \"%s\".\n", m_options.symbol_name.c_str());
366338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
367338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
368338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
369338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
370338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
371338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
372338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // This could either be because there are multiple functions of this name, in which case
373338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // we'll have to specify this further...  Or it could be because there are multiple inlined instances
374338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // of one function.  So run through the matches and if they all have the same file & line then we can just
375338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // list one.
376338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
377338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool found_multiple = false;
378338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
379338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                for (size_t i = 1; i < num_matches; i++)
380338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
381338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    SymbolContext scratch_sc;
382338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex (i, scratch_sc);
383338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (scratch_sc.function != NULL)
384338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
385338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        FileSpec scratch_file;
386338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        uint32_t scratch_line;
387338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        scratch_sc.function->GetStartLineSourceInfo (scratch_file, scratch_line);
388338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_file != start_file
389338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            || scratch_line != start_line)
390338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
391338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            found_multiple = true;
392338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            break;
393338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
394338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
395338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
396338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (found_multiple)
397338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
398338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    StreamString s;
399338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    for (size_t i = 0; i < num_matches; i++)
400338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
401338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        SymbolContext scratch_sc;
402338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        sc_list.GetContextAtIndex (i, scratch_sc);
403338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_sc.function != NULL)
404338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
4057e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda                            s.Printf("\n%lu: ", i);
406338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            scratch_sc.function->Dump (&s, true);
407338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
408338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
409338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple functions found matching: %s: \n%s\n",
410338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.symbol_name.c_str(),
411338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 s.GetData());
412338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
413338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
414338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
415338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
416338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
417338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
418338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // This is a little hacky, but the first line table entry for a function points to the "{" that
419338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // starts the function block.  It would be nice to actually get the function
420338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // declaration in there too.  So back up a bit, but not further than what you're going to display.
421338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2;
422338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t line_no;
423338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (start_line <= lines_to_back_up)
424338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = 1;
425338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
426338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = start_line - lines_to_back_up;
427338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
428338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // For fun, if the function is shorter than the number of lines we're supposed to display,
429338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // only display the function...
430338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (end_line != 0)
431338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
432338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (m_options.num_lines > end_line - line_no)
433338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    m_options.num_lines = end_line - line_no;
434338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
435338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
43652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            char path_buf[PATH_MAX];
43752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            start_file.GetPath(path_buf, sizeof(path_buf));
4381cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton
439fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            if (m_options.show_bp_locs)
4401cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton            {
4411cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                const bool show_inlines = true;
4421cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                m_breakpoint_locations.Reset (start_file, 0, show_inlines);
443567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                SearchFilter target_search_filter (exe_ctx.GetTargetSP());
4441cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                target_search_filter.Search (m_breakpoint_locations);
4451cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton            }
4461cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton            else
4471cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                m_breakpoint_locations.Clear();
4481cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton
449338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.AppendMessageWithFormat("File: %s.\n", path_buf);
450fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            target->GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file,
451fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          line_no,
452fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          0,
453fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          m_options.num_lines,
454fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          "",
455fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          &result.GetOutputStream(),
456fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          GetBreakpointLocations ());
457338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
458338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.SetStatus (eReturnStatusSuccessFinishResult);
459338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            return true;
460338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
461338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        }
462781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        else if (m_options.address != LLDB_INVALID_ADDRESS)
463781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        {
464781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            SymbolContext sc;
465781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            Address so_addr;
466781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            StreamString error_strm;
467781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
468781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            if (target->GetSectionLoadList().IsEmpty())
469781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            {
470781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                // The target isn't loaded yet, we need to lookup the file address
471781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                // in all modules
472781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                const ModuleList &module_list = target->GetImages();
473781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                const uint32_t num_modules = module_list.GetSize();
474781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                for (uint32_t i=0; i<num_modules; ++i)
475781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
476781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    ModuleSP module_sp (module_list.GetModuleAtIndex(i));
477781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    if (module_sp && module_sp->ResolveFileAddress(m_options.address, so_addr))
478781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    {
479781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        sc.Clear();
480781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        if (module_sp->ResolveSymbolContextForAddress (so_addr, eSymbolContextEverything, sc) & eSymbolContextLineEntry)
481781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            sc_list.Append(sc);
482781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    }
483781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
484781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
485781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                if (sc_list.GetSize() == 0)
486781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
487781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.AppendErrorWithFormat("no modules have source information for file address 0x%" PRIx64 ".\n",
488781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                 m_options.address);
489781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.SetStatus (eReturnStatusFailed);
490781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    return false;
491781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
492781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            }
493781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            else
494781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            {
495781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                // The target has some things loaded, resolve this address to a
496781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                // compile unit + file + line and display
497781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                if (target->GetSectionLoadList().ResolveLoadAddress (m_options.address, so_addr))
498781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
499781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    ModuleSP module_sp (so_addr.GetModule());
500781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    if (module_sp)
501781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    {
502781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        sc.Clear();
503781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        if (module_sp->ResolveSymbolContextForAddress (so_addr, eSymbolContextEverything, sc) & eSymbolContextLineEntry)
504781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        {
505781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            sc_list.Append(sc);
506781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        }
507781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        else
508781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        {
509781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            so_addr.Dump(&error_strm, NULL, Address::DumpStyleModuleWithFileAddress);
510781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            result.AppendErrorWithFormat("address resolves to %s, but there is no line table information available for this address.\n",
511781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                         error_strm.GetData());
512781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            result.SetStatus (eReturnStatusFailed);
513781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            return false;
514781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        }
515781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    }
516781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
517781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
518781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                if (sc_list.GetSize() == 0)
519781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
520781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.AppendErrorWithFormat("no modules contain load address 0x%" PRIx64 ".\n", m_options.address);
521781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.SetStatus (eReturnStatusFailed);
522781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    return false;
523781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
524781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            }
525781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            uint32_t num_matches = sc_list.GetSize();
526781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            for (uint32_t i=0; i<num_matches; ++i)
527781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            {
528781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                sc_list.GetContextAtIndex(i, sc);
529781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                if (sc.comp_unit)
530781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
531781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    if (m_options.show_bp_locs)
532781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    {
533781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        m_breakpoint_locations.Clear();
534781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        const bool show_inlines = true;
535781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines);
536781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        SearchFilter target_search_filter (target->shared_from_this());
537781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        target_search_filter.Search (m_breakpoint_locations);
538781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    }
539781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
540781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    bool show_fullpaths = true;
541781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    bool show_module = true;
542781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    bool show_inlined_frames = true;
543781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    sc.DumpStopContext(&result.GetOutputStream(),
544781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                       exe_ctx.GetBestExecutionContextScope(),
545781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                       sc.line_entry.range.GetBaseAddress(),
546781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                       show_fullpaths,
547781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                       show_module,
548781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                       show_inlined_frames);
549781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.GetOutputStream().EOL();
550781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
551781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2;
552781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
553781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    target->GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit,
554781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  sc.line_entry.line,
555781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  lines_to_back_up,
556781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  m_options.num_lines - lines_to_back_up,
557781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  "->",
558781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  &result.GetOutputStream(),
559781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  GetBreakpointLocations ());
560781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.SetStatus (eReturnStatusSuccessFinishResult);
561781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
562781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            }
563781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        }
564338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        else if (m_options.file_name.empty())
565767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
566767af88aa617288e584afcfed055f7755e408542Jim Ingham            // Last valid source manager context, or the current frame if no
567767af88aa617288e584afcfed055f7755e408542Jim Ingham            // valid last context in source manager.
568767af88aa617288e584afcfed055f7755e408542Jim Ingham            // One little trick here, if you type the exact same list command twice in a row, it is
569767af88aa617288e584afcfed055f7755e408542Jim Ingham            // more likely because you typed it once, then typed it again
570767af88aa617288e584afcfed055f7755e408542Jim Ingham            if (m_options.start_line == 0)
571767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
572c7f18c8fc956ce421bcb4913a0c99a61fdb40247Jim Ingham                if (target->GetSourceManager().DisplayMoreWithLineNumbers (&result.GetOutputStream(),
57352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                               GetBreakpointLocations ()))
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessFinishResult);
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
577767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
578767af88aa617288e584afcfed055f7755e408542Jim Ingham            else
579767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
580fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                if (m_options.show_bp_locs)
5811cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                {
582fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    SourceManager::FileSP last_file_sp (target->GetSourceManager().GetLastFile ());
5831cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    if (last_file_sp)
5841cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    {
5851cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                        const bool show_inlines = true;
5861cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                        m_breakpoint_locations.Reset (last_file_sp->GetFileSpec(), 0, show_inlines);
58713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton                        SearchFilter target_search_filter (target->shared_from_this());
5881cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                        target_search_filter.Search (m_breakpoint_locations);
5891cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    }
5901cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                }
5911cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                else
5921cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    m_breakpoint_locations.Clear();
5931cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton
594fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                if (target->GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile(
595767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.start_line,   // Line to display
596767af88aa617288e584afcfed055f7755e408542Jim Ingham                            0,                      // Lines before line to display
597767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.num_lines,    // Lines after line to display
598767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "",                     // Don't mark "line"
59952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                            &result.GetOutputStream(),
60052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                            GetBreakpointLocations ()))
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
602767af88aa617288e584afcfed055f7755e408542Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
604767af88aa617288e584afcfed055f7755e408542Jim Ingham
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
609767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char *filename = m_options.file_name.c_str();
610767af88aa617288e584afcfed055f7755e408542Jim Ingham
611767af88aa617288e584afcfed055f7755e408542Jim Ingham            bool check_inlines = false;
612767af88aa617288e584afcfed055f7755e408542Jim Ingham            SymbolContextList sc_list;
613338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
614338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
61552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            if (m_options.modules.size() > 0)
616338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
617338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
61852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                for (unsigned i = 0, e = m_options.modules.size(); i != e; i++)
619338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
620444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                    FileSpec module_file_spec(m_options.modules[i].c_str(), false);
621444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                    if (module_file_spec)
622338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
623444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        ModuleSpec module_spec (module_file_spec);
624338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
625444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        target->GetImages().FindModules (module_spec, matching_modules);
626338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        num_matches += matching_modules.ResolveSymbolContextForFilePath (filename,
62752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         0,
62852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         check_inlines,
62952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         eSymbolContextModule | eSymbolContextCompUnit,
63052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         sc_list);
631338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
632338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
633338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
634338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
635338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
636338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                num_matches = target->GetImages().ResolveSymbolContextForFilePath (filename,
637338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   0,
638338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   check_inlines,
639338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   eSymbolContextModule | eSymbolContextCompUnit,
640338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   sc_list);
641338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
642338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
643338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
644338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
645338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find source file \"%s\".\n",
646338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                             m_options.file_name.c_str());
647338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
648338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
649338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
650338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
651338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
652767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
653767af88aa617288e584afcfed055f7755e408542Jim Ingham                SymbolContext sc;
654338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool got_multiple = false;
655338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                FileSpec *test_cu_spec = NULL;
656338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
6570f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner                for (unsigned i = 0; i < num_matches; i++)
658767af88aa617288e584afcfed055f7755e408542Jim Ingham                {
659338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex(i, sc);
660767af88aa617288e584afcfed055f7755e408542Jim Ingham                    if (sc.comp_unit)
661767af88aa617288e584afcfed055f7755e408542Jim Ingham                    {
662338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (test_cu_spec)
663338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
664338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            if (test_cu_spec != static_cast<FileSpec *> (sc.comp_unit))
665338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                got_multiple = true;
666338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                break;
667338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
668338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        else
669338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            test_cu_spec = sc.comp_unit;
670767af88aa617288e584afcfed055f7755e408542Jim Ingham                    }
671767af88aa617288e584afcfed055f7755e408542Jim Ingham                }
672338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (got_multiple)
673338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
674338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple source files found matching: \"%s.\"\n",
675338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
676338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
677338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
678338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
679338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
680338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
681338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
682338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc_list.GetContextAtIndex(0, sc))
683338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
684338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (sc.comp_unit)
685338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
686fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    if (m_options.show_bp_locs)
68752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    {
68852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        const bool show_inlines = true;
68952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines);
69013d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton                        SearchFilter target_search_filter (target->shared_from_this());
69152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        target_search_filter.Search (m_breakpoint_locations);
69252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    }
69352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    else
69452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        m_breakpoint_locations.Clear();
69552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
696fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    target->GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit,
697fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  m_options.start_line,
698fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  0,
699fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  m_options.num_lines,
700fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  "",
701fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  &result.GetOutputStream(),
702fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  GetBreakpointLocations ());
70352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
704338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
705338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
706338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                else
707338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
708338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("No comp unit found for: \"%s.\"\n",
709338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
710338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
711338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
712338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
713767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
715767af88aa617288e584afcfed055f7755e408542Jim Ingham        return result.Succeeded();
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
717767af88aa617288e584afcfed055f7755e408542Jim Ingham
71852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    const SymbolContextList *
71952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    GetBreakpointLocations ()
72052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    {
72152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        if (m_breakpoint_locations.GetFileLineMatches().GetSize() > 0)
72252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            return &m_breakpoint_locations.GetFileLineMatches();
72352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        return NULL;
72452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    }
725767af88aa617288e584afcfed055f7755e408542Jim Ingham    CommandOptions m_options;
72652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    FileLineResolver m_breakpoint_locations;
727767af88aa617288e584afcfed055f7755e408542Jim Ingham
728767af88aa617288e584afcfed055f7755e408542Jim Ingham};
729767af88aa617288e584afcfed055f7755e408542Jim Ingham
730b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
731767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceList::CommandOptions::g_option_table[] =
732767af88aa617288e584afcfed055f7755e408542Jim Ingham{
733781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_ALL, false, "count",  'c', required_argument, NULL, 0, eArgTypeCount,   "The number of source lines to display."},
734781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_1  |
735781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton  LLDB_OPT_SET_2  , false, "shlib",  's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Look up the source file in the given shared library."},
73652c8b6e3205e11e90adc83521c01915fc13626deGreg 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."},
737781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_1  , false, "file",   'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,    "The file from which to display source."},
738781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_1  , false, "line",   'l', required_argument, NULL, 0, eArgTypeLineNum,    "The line number at which to start the display source."},
739781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_2  , false, "name",   'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeSymbol,    "The name of a function whose source to display."},
740781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_3  , false, "address",'a', required_argument, NULL, 0, eArgTypeAddress, "Lookup the address and display the source information for the corresponding file and line."},
7414d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
742767af88aa617288e584afcfed055f7755e408542Jim Ingham};
743767af88aa617288e584afcfed055f7755e408542Jim Ingham
744767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordSource
745767af88aa617288e584afcfed055f7755e408542Jim Ingham
746767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
747767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordSource
748767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
749767af88aa617288e584afcfed055f7755e408542Jim Ingham
750767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::CommandObjectMultiwordSource (CommandInterpreter &interpreter) :
751238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
752238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "source",
753c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice                            "A set of commands for accessing source file information",
754767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "source <subcommand> [<subcommand-options>]")
755767af88aa617288e584afcfed055f7755e408542Jim Ingham{
756238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("info",   CommandObjectSP (new CommandObjectSourceInfo (interpreter)));
757238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",   CommandObjectSP (new CommandObjectSourceList (interpreter)));
758767af88aa617288e584afcfed055f7755e408542Jim Ingham}
759767af88aa617288e584afcfed055f7755e408542Jim Ingham
760767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::~CommandObjectMultiwordSource ()
761767af88aa617288e584afcfed055f7755e408542Jim Ingham{
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
763767af88aa617288e584afcfed055f7755e408542Jim Ingham
764