CommandObjectSource.cpp revision ea0bb4d45c14447a2fe9be9f4bd8e79a84513537
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;
20412b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            case 'r':
20512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham                reverse = true;
20612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham                break;
207767af88aa617288e584afcfed055f7755e408542Jim Ingham           default:
2089c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option);
209767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212767af88aa617288e584afcfed055f7755e408542Jim Ingham            return error;
213767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215767af88aa617288e584afcfed055f7755e408542Jim Ingham        void
216143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
217767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
218767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_spec.Clear();
219767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_name.clear();
220338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            symbol_name.clear();
221781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            address = LLDB_INVALID_ADDRESS;
222767af88aa617288e584afcfed055f7755e408542Jim Ingham            start_line = 0;
223767af88aa617288e584afcfed055f7755e408542Jim Ingham            num_lines = 10;
22452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            show_bp_locs = false;
22512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            reverse = false;
22652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            modules.clear();
227767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
228767af88aa617288e584afcfed055f7755e408542Jim Ingham
229b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
230767af88aa617288e584afcfed055f7755e408542Jim Ingham        GetDefinitions ()
231767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
232767af88aa617288e584afcfed055f7755e408542Jim Ingham            return g_option_table;
233767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
234b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
235767af88aa617288e584afcfed055f7755e408542Jim Ingham
236767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Instance variables to hold the values for command options.
237767af88aa617288e584afcfed055f7755e408542Jim Ingham        FileSpec file_spec;
238767af88aa617288e584afcfed055f7755e408542Jim Ingham        std::string file_name;
239338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        std::string symbol_name;
240781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        lldb::addr_t address;
241767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t start_line;
242767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t num_lines;
24352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        STLStringArray modules;
24452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        bool show_bp_locs;
24512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        bool reverse;
246767af88aa617288e584afcfed055f7755e408542Jim Ingham    };
247767af88aa617288e584afcfed055f7755e408542Jim Ingham
248767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
249238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectSourceList(CommandInterpreter &interpreter) :
250da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
251da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "source list",
252da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Display source code (as specified) based on the current executable's debug info.",
253ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             NULL,
254ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagRequiresTarget),
255f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
256767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
257767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
258767af88aa617288e584afcfed055f7755e408542Jim Ingham
259767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectSourceList ()
260767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
261767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
262767af88aa617288e584afcfed055f7755e408542Jim Ingham
263767af88aa617288e584afcfed055f7755e408542Jim Ingham
264767af88aa617288e584afcfed055f7755e408542Jim Ingham    Options *
265767af88aa617288e584afcfed055f7755e408542Jim Ingham    GetOptions ()
266767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
267767af88aa617288e584afcfed055f7755e408542Jim Ingham        return &m_options;
268767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
269767af88aa617288e584afcfed055f7755e408542Jim Ingham
270da26bd203cbb104291b39891febf7481794f205fJim Ingham    virtual const char *
271da26bd203cbb104291b39891febf7481794f205fJim Ingham    GetRepeatCommand (Args &current_command_args, uint32_t index)
272da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
27312b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        // This is kind of gross, but the command hasn't been parsed yet so we can't look at the option
27412b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        // values for this invocation...  I have to scan the arguments directly.
27512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        size_t num_args = current_command_args.GetArgumentCount();
27612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        bool is_reverse = false;
27712b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        for (size_t i = 0 ; i < num_args; i++)
27812b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        {
27912b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            const char *arg = current_command_args.GetArgumentAtIndex(i);
28012b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            if (arg && (strcmp(arg, "-r") == 0 || strcmp(arg, "--reverse") == 0))
28112b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            {
28212b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham                is_reverse = true;
28312b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            }
28412b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        }
28512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        if (is_reverse)
28612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        {
28712b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            if (m_reverse_name.empty())
28812b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            {
28912b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham                m_reverse_name = m_cmd_name;
29012b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham                m_reverse_name.append (" -r");
29112b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            }
29212b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            return m_reverse_name.c_str();
29312b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        }
29412b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham        else
29512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham            return m_cmd_name.c_str();
296da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
297767af88aa617288e584afcfed055f7755e408542Jim Ingham
298da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
299767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
300da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& command, CommandReturnObject &result)
301767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
302da26bd203cbb104291b39891febf7481794f205fJim Ingham        const int argc = command.GetArgumentCount();
303767af88aa617288e584afcfed055f7755e408542Jim Ingham
304767af88aa617288e584afcfed055f7755e408542Jim Ingham        if (argc != 0)
305767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
306767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendErrorWithFormat("'%s' takes no arguments, only flags.\n", GetCommandName());
307767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.SetStatus (eReturnStatusFailed);
30826e089bf5310f8378e7d86b9f38db32a38e76411Jim Ingham            return false;
309767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
310767af88aa617288e584afcfed055f7755e408542Jim Ingham
311ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        Target *target = m_exe_ctx.GetTargetPtr();
312fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
313781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        SymbolContextList sc_list;
314338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        if (!m_options.symbol_name.empty())
315338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        {
316338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // Displaying the source for a symbol:
317338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            ConstString name(m_options.symbol_name.c_str());
31828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            bool include_symbols = false;
319302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan            bool include_inlines = true;
320338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            bool append = true;
321338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
322338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
32352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            if (m_options.modules.size() > 0)
324338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
325338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
32652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                for (unsigned i = 0, e = m_options.modules.size(); i != e; i++)
327338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
328444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                    FileSpec module_file_spec(m_options.modules[i].c_str(), false);
329444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                    if (module_file_spec)
330338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
331444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        ModuleSpec module_spec (module_file_spec);
332338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
333444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        target->GetImages().FindModules (module_spec, matching_modules);
334302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                        num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list);
335338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
336338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
337338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
338338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
339338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
340302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list);
341338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
342338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
343338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
344338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
345338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
346338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
347338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function named: \"%s\".\n", m_options.symbol_name.c_str());
348338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
349338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
350338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
351338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
352338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            sc_list.GetContextAtIndex (0, sc);
353338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec start_file;
354338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t start_line;
355338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t end_line;
356338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec end_file;
357338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc.function != NULL)
358338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
359338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetStartLineSourceInfo (start_file, start_line);
360338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (start_line == 0)
361338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
362338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Could not find line information for start of function: \"%s\".\n", m_options.symbol_name.c_str());
363338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
364338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
365338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
366338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetEndLineSourceInfo (end_file, end_line);
367338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
368338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
369338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
370338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function info for: \"%s\".\n", m_options.symbol_name.c_str());
371338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
372338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
373338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
374338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
375338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
376338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
377338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // This could either be because there are multiple functions of this name, in which case
378338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // we'll have to specify this further...  Or it could be because there are multiple inlined instances
379338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // of one function.  So run through the matches and if they all have the same file & line then we can just
380338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // list one.
381338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
382338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool found_multiple = false;
383338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
384338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                for (size_t i = 1; i < num_matches; i++)
385338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
386338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    SymbolContext scratch_sc;
387338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex (i, scratch_sc);
388338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (scratch_sc.function != NULL)
389338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
390338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        FileSpec scratch_file;
391338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        uint32_t scratch_line;
392338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        scratch_sc.function->GetStartLineSourceInfo (scratch_file, scratch_line);
393338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_file != start_file
394338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            || scratch_line != start_line)
395338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
396338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            found_multiple = true;
397338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            break;
398338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
399338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
400338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
401338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (found_multiple)
402338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
403338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    StreamString s;
404338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    for (size_t i = 0; i < num_matches; i++)
405338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
406338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        SymbolContext scratch_sc;
407338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        sc_list.GetContextAtIndex (i, scratch_sc);
408338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_sc.function != NULL)
409338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
4107e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda                            s.Printf("\n%lu: ", i);
411338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            scratch_sc.function->Dump (&s, true);
412338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
413338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
414338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple functions found matching: %s: \n%s\n",
415338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.symbol_name.c_str(),
416338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 s.GetData());
417338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
418338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
419338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
420338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
421338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
422338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
423338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // This is a little hacky, but the first line table entry for a function points to the "{" that
424338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // starts the function block.  It would be nice to actually get the function
425338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // declaration in there too.  So back up a bit, but not further than what you're going to display.
426338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2;
427338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t line_no;
428338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (start_line <= lines_to_back_up)
429338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = 1;
430338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
431338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = start_line - lines_to_back_up;
432338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
433338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // For fun, if the function is shorter than the number of lines we're supposed to display,
434338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // only display the function...
435338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (end_line != 0)
436338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
437338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (m_options.num_lines > end_line - line_no)
438338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    m_options.num_lines = end_line - line_no;
439338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
440338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
44152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            char path_buf[PATH_MAX];
44252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            start_file.GetPath(path_buf, sizeof(path_buf));
4431cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton
444fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            if (m_options.show_bp_locs)
4451cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton            {
4461cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                const bool show_inlines = true;
4471cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                m_breakpoint_locations.Reset (start_file, 0, show_inlines);
448ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                SearchFilter target_search_filter (m_exe_ctx.GetTargetSP());
4491cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                target_search_filter.Search (m_breakpoint_locations);
4501cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton            }
4511cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton            else
4521cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                m_breakpoint_locations.Clear();
4531cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton
454338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.AppendMessageWithFormat("File: %s.\n", path_buf);
455fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham            target->GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file,
456fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          line_no,
457fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          0,
458fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          m_options.num_lines,
459fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          "",
460fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          &result.GetOutputStream(),
461fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                          GetBreakpointLocations ());
462338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
463338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.SetStatus (eReturnStatusSuccessFinishResult);
464338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            return true;
465338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
466338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        }
467781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        else if (m_options.address != LLDB_INVALID_ADDRESS)
468781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        {
469781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            SymbolContext sc;
470781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            Address so_addr;
471781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            StreamString error_strm;
472781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
473781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            if (target->GetSectionLoadList().IsEmpty())
474781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            {
475781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                // The target isn't loaded yet, we need to lookup the file address
476781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                // in all modules
477781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                const ModuleList &module_list = target->GetImages();
478781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                const uint32_t num_modules = module_list.GetSize();
479781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                for (uint32_t i=0; i<num_modules; ++i)
480781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
481781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    ModuleSP module_sp (module_list.GetModuleAtIndex(i));
482781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    if (module_sp && module_sp->ResolveFileAddress(m_options.address, so_addr))
483781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    {
484781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        sc.Clear();
485781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        if (module_sp->ResolveSymbolContextForAddress (so_addr, eSymbolContextEverything, sc) & eSymbolContextLineEntry)
486781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            sc_list.Append(sc);
487781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    }
488781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
489781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
490781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                if (sc_list.GetSize() == 0)
491781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
492781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.AppendErrorWithFormat("no modules have source information for file address 0x%" PRIx64 ".\n",
493781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                 m_options.address);
494781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.SetStatus (eReturnStatusFailed);
495781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    return false;
496781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
497781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            }
498781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            else
499781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            {
500781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                // The target has some things loaded, resolve this address to a
501781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                // compile unit + file + line and display
502781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                if (target->GetSectionLoadList().ResolveLoadAddress (m_options.address, so_addr))
503781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
504781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    ModuleSP module_sp (so_addr.GetModule());
505781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    if (module_sp)
506781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    {
507781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        sc.Clear();
508781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        if (module_sp->ResolveSymbolContextForAddress (so_addr, eSymbolContextEverything, sc) & eSymbolContextLineEntry)
509781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        {
510781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            sc_list.Append(sc);
511781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        }
512781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        else
513781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        {
514781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            so_addr.Dump(&error_strm, NULL, Address::DumpStyleModuleWithFileAddress);
515781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            result.AppendErrorWithFormat("address resolves to %s, but there is no line table information available for this address.\n",
516781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                         error_strm.GetData());
517781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            result.SetStatus (eReturnStatusFailed);
518781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                            return false;
519781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        }
520781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    }
521781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
522781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
523781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                if (sc_list.GetSize() == 0)
524781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
525781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.AppendErrorWithFormat("no modules contain load address 0x%" PRIx64 ".\n", m_options.address);
526781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.SetStatus (eReturnStatusFailed);
527781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    return false;
528781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
529781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            }
530781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            uint32_t num_matches = sc_list.GetSize();
531781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            for (uint32_t i=0; i<num_matches; ++i)
532781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            {
533781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                sc_list.GetContextAtIndex(i, sc);
534781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                if (sc.comp_unit)
535781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                {
536781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    if (m_options.show_bp_locs)
537781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    {
538781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        m_breakpoint_locations.Clear();
539781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        const bool show_inlines = true;
540781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines);
541781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        SearchFilter target_search_filter (target->shared_from_this());
542781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                        target_search_filter.Search (m_breakpoint_locations);
543781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    }
544781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
545781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    bool show_fullpaths = true;
546781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    bool show_module = true;
547781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    bool show_inlined_frames = true;
548781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    sc.DumpStopContext(&result.GetOutputStream(),
549ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                                       m_exe_ctx.GetBestExecutionContextScope(),
550781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                       sc.line_entry.range.GetBaseAddress(),
551781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                       show_fullpaths,
552781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                       show_module,
553781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                       show_inlined_frames);
554781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.GetOutputStream().EOL();
555781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
556781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2;
557781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton
558781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    target->GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit,
559781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  sc.line_entry.line,
560781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  lines_to_back_up,
561781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  m_options.num_lines - lines_to_back_up,
562781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  "->",
563781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  &result.GetOutputStream(),
564781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                                                                                  GetBreakpointLocations ());
565781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                    result.SetStatus (eReturnStatusSuccessFinishResult);
566781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton                }
567781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton            }
568781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton        }
569338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        else if (m_options.file_name.empty())
570767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
571767af88aa617288e584afcfed055f7755e408542Jim Ingham            // Last valid source manager context, or the current frame if no
572767af88aa617288e584afcfed055f7755e408542Jim Ingham            // valid last context in source manager.
573767af88aa617288e584afcfed055f7755e408542Jim Ingham            // One little trick here, if you type the exact same list command twice in a row, it is
574767af88aa617288e584afcfed055f7755e408542Jim Ingham            // more likely because you typed it once, then typed it again
575767af88aa617288e584afcfed055f7755e408542Jim Ingham            if (m_options.start_line == 0)
576767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
577c7f18c8fc956ce421bcb4913a0c99a61fdb40247Jim Ingham                if (target->GetSourceManager().DisplayMoreWithLineNumbers (&result.GetOutputStream(),
57812b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham                                                                           GetBreakpointLocations (),
57912b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham                                                                           m_options.reverse))
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessFinishResult);
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
583767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
584767af88aa617288e584afcfed055f7755e408542Jim Ingham            else
585767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
586fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                if (m_options.show_bp_locs)
5871cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                {
588fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    SourceManager::FileSP last_file_sp (target->GetSourceManager().GetLastFile ());
5891cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    if (last_file_sp)
5901cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    {
5911cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                        const bool show_inlines = true;
5921cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                        m_breakpoint_locations.Reset (last_file_sp->GetFileSpec(), 0, show_inlines);
59313d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton                        SearchFilter target_search_filter (target->shared_from_this());
5941cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                        target_search_filter.Search (m_breakpoint_locations);
5951cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    }
5961cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                }
5971cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                else
5981cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton                    m_breakpoint_locations.Clear();
5991cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton
600fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                if (target->GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile(
601767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.start_line,   // Line to display
602767af88aa617288e584afcfed055f7755e408542Jim Ingham                            0,                      // Lines before line to display
603767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.num_lines,    // Lines after line to display
604767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "",                     // Don't mark "line"
60552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                            &result.GetOutputStream(),
60652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                            GetBreakpointLocations ()))
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
608767af88aa617288e584afcfed055f7755e408542Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
610767af88aa617288e584afcfed055f7755e408542Jim Ingham
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
615767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char *filename = m_options.file_name.c_str();
616767af88aa617288e584afcfed055f7755e408542Jim Ingham
617767af88aa617288e584afcfed055f7755e408542Jim Ingham            bool check_inlines = false;
618767af88aa617288e584afcfed055f7755e408542Jim Ingham            SymbolContextList sc_list;
619338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
620338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
62152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            if (m_options.modules.size() > 0)
622338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
623338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
62452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                for (unsigned i = 0, e = m_options.modules.size(); i != e; i++)
625338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
626444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                    FileSpec module_file_spec(m_options.modules[i].c_str(), false);
627444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                    if (module_file_spec)
628338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
629444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        ModuleSpec module_spec (module_file_spec);
630338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
631444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        target->GetImages().FindModules (module_spec, matching_modules);
632338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        num_matches += matching_modules.ResolveSymbolContextForFilePath (filename,
63352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         0,
63452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         check_inlines,
63552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         eSymbolContextModule | eSymbolContextCompUnit,
63652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                                                                                         sc_list);
637338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
638338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
639338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
640338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
641338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
642338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                num_matches = target->GetImages().ResolveSymbolContextForFilePath (filename,
643338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   0,
644338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   check_inlines,
645338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   eSymbolContextModule | eSymbolContextCompUnit,
646338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   sc_list);
647338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
648338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
649338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
650338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
651338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find source file \"%s\".\n",
652338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                             m_options.file_name.c_str());
653338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
654338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
655338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
656338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
657338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
658767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
659767af88aa617288e584afcfed055f7755e408542Jim Ingham                SymbolContext sc;
660338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool got_multiple = false;
661338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                FileSpec *test_cu_spec = NULL;
662338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
6630f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner                for (unsigned i = 0; i < num_matches; i++)
664767af88aa617288e584afcfed055f7755e408542Jim Ingham                {
665338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex(i, sc);
666767af88aa617288e584afcfed055f7755e408542Jim Ingham                    if (sc.comp_unit)
667767af88aa617288e584afcfed055f7755e408542Jim Ingham                    {
668338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (test_cu_spec)
669338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
670338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            if (test_cu_spec != static_cast<FileSpec *> (sc.comp_unit))
671338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                got_multiple = true;
672338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                break;
673338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
674338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        else
675338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            test_cu_spec = sc.comp_unit;
676767af88aa617288e584afcfed055f7755e408542Jim Ingham                    }
677767af88aa617288e584afcfed055f7755e408542Jim Ingham                }
678338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (got_multiple)
679338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
680338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple source files found matching: \"%s.\"\n",
681338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
682338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
683338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
684338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
685338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
686338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
687338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
688338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc_list.GetContextAtIndex(0, sc))
689338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
690338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (sc.comp_unit)
691338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
692fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    if (m_options.show_bp_locs)
69352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    {
69452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        const bool show_inlines = true;
69552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines);
69613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton                        SearchFilter target_search_filter (target->shared_from_this());
69752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        target_search_filter.Search (m_breakpoint_locations);
69852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    }
69952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                    else
70052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton                        m_breakpoint_locations.Clear();
70152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
702fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    target->GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit,
703fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  m_options.start_line,
704fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  0,
705fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  m_options.num_lines,
706fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  "",
707fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  &result.GetOutputStream(),
708fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                                                                                  GetBreakpointLocations ());
70952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
710338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
711338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
712338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                else
713338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
714338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("No comp unit found for: \"%s.\"\n",
715338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
716338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
717338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
718338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
719767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
721767af88aa617288e584afcfed055f7755e408542Jim Ingham        return result.Succeeded();
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
723767af88aa617288e584afcfed055f7755e408542Jim Ingham
72452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    const SymbolContextList *
72552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    GetBreakpointLocations ()
72652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    {
72752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        if (m_breakpoint_locations.GetFileLineMatches().GetSize() > 0)
72852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            return &m_breakpoint_locations.GetFileLineMatches();
72952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        return NULL;
73052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    }
731767af88aa617288e584afcfed055f7755e408542Jim Ingham    CommandOptions m_options;
73252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    FileLineResolver m_breakpoint_locations;
73312b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham    std::string    m_reverse_name;
734767af88aa617288e584afcfed055f7755e408542Jim Ingham
735767af88aa617288e584afcfed055f7755e408542Jim Ingham};
736767af88aa617288e584afcfed055f7755e408542Jim Ingham
737b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
738767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceList::CommandOptions::g_option_table[] =
739767af88aa617288e584afcfed055f7755e408542Jim Ingham{
740781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_ALL, false, "count",  'c', required_argument, NULL, 0, eArgTypeCount,   "The number of source lines to display."},
741781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_1  |
742781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton  LLDB_OPT_SET_2  , false, "shlib",  's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Look up the source file in the given shared library."},
74352c8b6e3205e11e90adc83521c01915fc13626deGreg 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."},
744781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_1  , false, "file",   'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,    "The file from which to display source."},
745781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_1  , false, "line",   'l', required_argument, NULL, 0, eArgTypeLineNum,    "The line number at which to start the display source."},
746781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_2  , false, "name",   'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeSymbol,    "The name of a function whose source to display."},
747781241147dbdd18762ab676960ecbff18ab0a766Greg 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."},
74812b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham{ LLDB_OPT_SET_4, false, "reverse", 'r', no_argument, NULL, 0, eArgTypeNone, "Reverse the listing to look backwards from the last displayed block of source."},
7494d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
750767af88aa617288e584afcfed055f7755e408542Jim Ingham};
751767af88aa617288e584afcfed055f7755e408542Jim Ingham
752767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordSource
753767af88aa617288e584afcfed055f7755e408542Jim Ingham
754767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
755767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordSource
756767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
757767af88aa617288e584afcfed055f7755e408542Jim Ingham
758767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::CommandObjectMultiwordSource (CommandInterpreter &interpreter) :
759238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
760238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "source",
761c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice                            "A set of commands for accessing source file information",
762767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "source <subcommand> [<subcommand-options>]")
763767af88aa617288e584afcfed055f7755e408542Jim Ingham{
764238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("info",   CommandObjectSP (new CommandObjectSourceInfo (interpreter)));
765238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",   CommandObjectSP (new CommandObjectSourceList (interpreter)));
766767af88aa617288e584afcfed055f7755e408542Jim Ingham}
767767af88aa617288e584afcfed055f7755e408542Jim Ingham
768767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::~CommandObjectMultiwordSource ()
769767af88aa617288e584afcfed055f7755e408542Jim Ingham{
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
771767af88aa617288e584afcfed055f7755e408542Jim Ingham
772