CommandObjectSource.cpp revision f15996eea072cdaa8a092f22d3a1212b3d95f0ec
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectSource.cpp ---------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectSource.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1684cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
1763094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
205f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
22767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Core/SourceManager.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
24767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandCompletions.h"
25767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/Options.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
31767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectSourceList
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectSourceInfo : public CommandObject
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37767af88aa617288e584afcfed055f7755e408542Jim Ingham    class CommandOptions : public Options
38767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
39767af88aa617288e584afcfed055f7755e408542Jim Ingham    public:
40f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
41f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options(interpreter)
42767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
43767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
44767af88aa617288e584afcfed055f7755e408542Jim Ingham
45767af88aa617288e584afcfed055f7755e408542Jim Ingham        ~CommandOptions ()
46767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
47767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
48767af88aa617288e584afcfed055f7755e408542Jim Ingham
49767af88aa617288e584afcfed055f7755e408542Jim Ingham        Error
50767af88aa617288e584afcfed055f7755e408542Jim Ingham        SetOptionValue (int option_idx, const char *option_arg)
51767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
52767af88aa617288e584afcfed055f7755e408542Jim Ingham            Error error;
53767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char short_option = g_option_table[option_idx].short_option;
54767af88aa617288e584afcfed055f7755e408542Jim Ingham            switch (short_option)
55767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
56767af88aa617288e584afcfed055f7755e408542Jim Ingham            case 'l':
57767af88aa617288e584afcfed055f7755e408542Jim Ingham                start_line = Args::StringToUInt32 (option_arg, 0);
58767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (start_line == 0)
59767af88aa617288e584afcfed055f7755e408542Jim Ingham                    error.SetErrorStringWithFormat("Invalid line number: '%s'.\n", option_arg);
60767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
61767af88aa617288e584afcfed055f7755e408542Jim Ingham
62767af88aa617288e584afcfed055f7755e408542Jim Ingham             case 'f':
63767af88aa617288e584afcfed055f7755e408542Jim Ingham                file_name = option_arg;
64767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
65767af88aa617288e584afcfed055f7755e408542Jim Ingham
66767af88aa617288e584afcfed055f7755e408542Jim Ingham           default:
67767af88aa617288e584afcfed055f7755e408542Jim Ingham                error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option);
68767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
69767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
70767af88aa617288e584afcfed055f7755e408542Jim Ingham
71767af88aa617288e584afcfed055f7755e408542Jim Ingham            return error;
72767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
73767af88aa617288e584afcfed055f7755e408542Jim Ingham
74767af88aa617288e584afcfed055f7755e408542Jim Ingham        void
75767af88aa617288e584afcfed055f7755e408542Jim Ingham        ResetOptionValues ()
76767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
77767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_spec.Clear();
78767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_name.clear();
79767af88aa617288e584afcfed055f7755e408542Jim Ingham            start_line = 0;
80767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
81767af88aa617288e584afcfed055f7755e408542Jim Ingham
82b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
83767af88aa617288e584afcfed055f7755e408542Jim Ingham        GetDefinitions ()
84767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
85767af88aa617288e584afcfed055f7755e408542Jim Ingham            return g_option_table;
86767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
87b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
88767af88aa617288e584afcfed055f7755e408542Jim Ingham
89767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Instance variables to hold the values for command options.
90767af88aa617288e584afcfed055f7755e408542Jim Ingham        FileSpec file_spec;
91767af88aa617288e584afcfed055f7755e408542Jim Ingham        std::string file_name;
92767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t start_line;
93767af88aa617288e584afcfed055f7755e408542Jim Ingham
94767af88aa617288e584afcfed055f7755e408542Jim Ingham    };
95767af88aa617288e584afcfed055f7755e408542Jim Ingham
96767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
97238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectSourceInfo(CommandInterpreter &interpreter) :
98238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
99238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "source info",
100238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "Display information about the source lines from the current executable's debug info.",
101f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton                       "source info [<cmd-options>]"),
102f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
103767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
104767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
105767af88aa617288e584afcfed055f7755e408542Jim Ingham
106767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectSourceInfo ()
107767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
108767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
109767af88aa617288e584afcfed055f7755e408542Jim Ingham
110767af88aa617288e584afcfed055f7755e408542Jim Ingham
111767af88aa617288e584afcfed055f7755e408542Jim Ingham    Options *
112767af88aa617288e584afcfed055f7755e408542Jim Ingham    GetOptions ()
113767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
114767af88aa617288e584afcfed055f7755e408542Jim Ingham        return &m_options;
115767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
116767af88aa617288e584afcfed055f7755e408542Jim Ingham
117767af88aa617288e584afcfed055f7755e408542Jim Ingham
118767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
119767af88aa617288e584afcfed055f7755e408542Jim Ingham    Execute
120767af88aa617288e584afcfed055f7755e408542Jim Ingham    (
121767af88aa617288e584afcfed055f7755e408542Jim Ingham        Args& args,
122767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandReturnObject &result
123767af88aa617288e584afcfed055f7755e408542Jim Ingham    )
124767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
125767af88aa617288e584afcfed055f7755e408542Jim Ingham        result.AppendError ("Not yet implemented");
126767af88aa617288e584afcfed055f7755e408542Jim Ingham        result.SetStatus (eReturnStatusFailed);
127767af88aa617288e584afcfed055f7755e408542Jim Ingham        return false;
128767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
129767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected:
130767af88aa617288e584afcfed055f7755e408542Jim Ingham    CommandOptions m_options;
131767af88aa617288e584afcfed055f7755e408542Jim Ingham};
132767af88aa617288e584afcfed055f7755e408542Jim Ingham
133b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
134767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceInfo::CommandOptions::g_option_table[] =
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1364d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line",       'l', required_argument, NULL, 0, eArgTypeLineNum,    "The line number at which to start the display source."},
1374d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,    "The file from which to display source."},
1384d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
139767af88aa617288e584afcfed055f7755e408542Jim Ingham};
140767af88aa617288e584afcfed055f7755e408542Jim Ingham
141767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectSourceList
142767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
143767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectSourceList
144767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
146767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectSourceList : public CommandObject
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
148767af88aa617288e584afcfed055f7755e408542Jim Ingham
149767af88aa617288e584afcfed055f7755e408542Jim Ingham    class CommandOptions : public Options
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
151767af88aa617288e584afcfed055f7755e408542Jim Ingham    public:
152f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
153f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options(interpreter)
154767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
155767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157767af88aa617288e584afcfed055f7755e408542Jim Ingham        ~CommandOptions ()
158767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
159767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161767af88aa617288e584afcfed055f7755e408542Jim Ingham        Error
162767af88aa617288e584afcfed055f7755e408542Jim Ingham        SetOptionValue (int option_idx, const char *option_arg)
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
164767af88aa617288e584afcfed055f7755e408542Jim Ingham            Error error;
165767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char short_option = g_option_table[option_idx].short_option;
166767af88aa617288e584afcfed055f7755e408542Jim Ingham            switch (short_option)
167767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
168767af88aa617288e584afcfed055f7755e408542Jim Ingham            case 'l':
169767af88aa617288e584afcfed055f7755e408542Jim Ingham                start_line = Args::StringToUInt32 (option_arg, 0);
170767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (start_line == 0)
171767af88aa617288e584afcfed055f7755e408542Jim Ingham                    error.SetErrorStringWithFormat("Invalid line number: '%s'.\n", option_arg);
172767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
174338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            case 'c':
175767af88aa617288e584afcfed055f7755e408542Jim Ingham                num_lines = Args::StringToUInt32 (option_arg, 0);
176767af88aa617288e584afcfed055f7755e408542Jim Ingham                if (num_lines == 0)
177767af88aa617288e584afcfed055f7755e408542Jim Ingham                    error.SetErrorStringWithFormat("Invalid line count: '%s'.\n", option_arg);
178767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
180767af88aa617288e584afcfed055f7755e408542Jim Ingham             case 'f':
181767af88aa617288e584afcfed055f7755e408542Jim Ingham                file_name = option_arg;
182767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
183338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
184338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            case 'n':
185338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                symbol_name = option_arg;
186338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                break;
187767af88aa617288e584afcfed055f7755e408542Jim Ingham
188338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            case 's':
189338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                m_modules.push_back (std::string (option_arg));
190338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                break;
191767af88aa617288e584afcfed055f7755e408542Jim Ingham           default:
192767af88aa617288e584afcfed055f7755e408542Jim Ingham                error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option);
193767af88aa617288e584afcfed055f7755e408542Jim Ingham                break;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
196767af88aa617288e584afcfed055f7755e408542Jim Ingham            return error;
197767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
199767af88aa617288e584afcfed055f7755e408542Jim Ingham        void
200767af88aa617288e584afcfed055f7755e408542Jim Ingham        ResetOptionValues ()
201767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
202767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_spec.Clear();
203767af88aa617288e584afcfed055f7755e408542Jim Ingham            file_name.clear();
204338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            symbol_name.clear();
205767af88aa617288e584afcfed055f7755e408542Jim Ingham            start_line = 0;
206767af88aa617288e584afcfed055f7755e408542Jim Ingham            num_lines = 10;
207338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            m_modules.clear();
208767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
209767af88aa617288e584afcfed055f7755e408542Jim Ingham
210b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
211767af88aa617288e584afcfed055f7755e408542Jim Ingham        GetDefinitions ()
212767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
213767af88aa617288e584afcfed055f7755e408542Jim Ingham            return g_option_table;
214767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
215b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
216767af88aa617288e584afcfed055f7755e408542Jim Ingham
217767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Instance variables to hold the values for command options.
218767af88aa617288e584afcfed055f7755e408542Jim Ingham        FileSpec file_spec;
219767af88aa617288e584afcfed055f7755e408542Jim Ingham        std::string file_name;
220338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        std::string symbol_name;
221767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t start_line;
222767af88aa617288e584afcfed055f7755e408542Jim Ingham        uint32_t num_lines;
223338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        STLStringArray m_modules;
224767af88aa617288e584afcfed055f7755e408542Jim Ingham    };
225767af88aa617288e584afcfed055f7755e408542Jim Ingham
226767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
227238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectSourceList(CommandInterpreter &interpreter) :
228238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
229238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "source list",
230238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "Display source code (as specified) based on the current executable's debug info.",
231f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton                        NULL),
232f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
233767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
23443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
23543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData file_arg;
23643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
23743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
23843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_type = eArgTypeFilename;
23943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_repetition = eArgRepeatOptional;
24043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
24143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
24243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (file_arg);
24343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
24543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
246767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
247767af88aa617288e584afcfed055f7755e408542Jim Ingham
248767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectSourceList ()
249767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
250767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
251767af88aa617288e584afcfed055f7755e408542Jim Ingham
252767af88aa617288e584afcfed055f7755e408542Jim Ingham
253767af88aa617288e584afcfed055f7755e408542Jim Ingham    Options *
254767af88aa617288e584afcfed055f7755e408542Jim Ingham    GetOptions ()
255767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
256767af88aa617288e584afcfed055f7755e408542Jim Ingham        return &m_options;
257767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
258767af88aa617288e584afcfed055f7755e408542Jim Ingham
259767af88aa617288e584afcfed055f7755e408542Jim Ingham
260767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
261767af88aa617288e584afcfed055f7755e408542Jim Ingham    Execute
262767af88aa617288e584afcfed055f7755e408542Jim Ingham    (
263767af88aa617288e584afcfed055f7755e408542Jim Ingham        Args& args,
264767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandReturnObject &result
265767af88aa617288e584afcfed055f7755e408542Jim Ingham    )
266767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
267767af88aa617288e584afcfed055f7755e408542Jim Ingham        const int argc = args.GetArgumentCount();
268767af88aa617288e584afcfed055f7755e408542Jim Ingham
269767af88aa617288e584afcfed055f7755e408542Jim Ingham        if (argc != 0)
270767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
271767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendErrorWithFormat("'%s' takes no arguments, only flags.\n", GetCommandName());
272767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.SetStatus (eReturnStatusFailed);
273767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
274767af88aa617288e584afcfed055f7755e408542Jim Ingham
275238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        ExecutionContext exe_ctx(m_interpreter.GetDebugger().GetExecutionContext());
276338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
277338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        if (!m_options.symbol_name.empty())
278338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        {
279338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // Displaying the source for a symbol:
280238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton            Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
281338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (target == NULL)
282338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
283338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendError ("invalid target, set executable file using 'file' command");
284338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
285338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
286338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
287338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
288338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContextList sc_list;
289338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            ConstString name(m_options.symbol_name.c_str());
29028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            bool include_symbols = false;
291338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            bool append = true;
292338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
293338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
294338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (m_options.m_modules.size() > 0)
295338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
296338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
2970f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner                for (unsigned i = 0, e = m_options.m_modules.size(); i != e; i++)
298338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
299537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton                    FileSpec module_spec(m_options.m_modules[i].c_str(), false);
300338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (module_spec)
301338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
302338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
303338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules);
30428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeBase, include_symbols, append, sc_list);
305338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
306338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
307338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
308338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
309338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
31028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeBase, include_symbols, append, sc_list);
311338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
312338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
313338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
314338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
315338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
316338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
317338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function named: \"%s\".\n", m_options.symbol_name.c_str());
318338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
319338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
320338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
321338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
322338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            sc_list.GetContextAtIndex (0, sc);
323338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec start_file;
324338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t start_line;
325338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t end_line;
326338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            FileSpec end_file;
327338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc.function != NULL)
328338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
329338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetStartLineSourceInfo (start_file, start_line);
330338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (start_line == 0)
331338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
332338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Could not find line information for start of function: \"%s\".\n", m_options.symbol_name.c_str());
333338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
334338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
335338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
336338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                sc.function->GetEndLineSourceInfo (end_file, end_line);
337338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
338338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
339338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
340338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find function info for: \"%s\".\n", m_options.symbol_name.c_str());
341338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
342338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
343338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
344338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
345338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
346338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
347338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // This could either be because there are multiple functions of this name, in which case
348338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // we'll have to specify this further...  Or it could be because there are multiple inlined instances
349338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // of one function.  So run through the matches and if they all have the same file & line then we can just
350338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                // list one.
351338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
352338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool found_multiple = false;
353338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
354338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                for (size_t i = 1; i < num_matches; i++)
355338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
356338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    SymbolContext scratch_sc;
357338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex (i, scratch_sc);
358338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (scratch_sc.function != NULL)
359338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
360338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        FileSpec scratch_file;
361338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        uint32_t scratch_line;
362338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        scratch_sc.function->GetStartLineSourceInfo (scratch_file, scratch_line);
363338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_file != start_file
364338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            || scratch_line != start_line)
365338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
366338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            found_multiple = true;
367338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            break;
368338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
369338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
370338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
371338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (found_multiple)
372338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
373338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    StreamString s;
374338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    for (size_t i = 0; i < num_matches; i++)
375338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
376338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        SymbolContext scratch_sc;
377338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        sc_list.GetContextAtIndex (i, scratch_sc);
378338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (scratch_sc.function != NULL)
379338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
380338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            s.Printf("\n%d: ", i);
381338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            scratch_sc.function->Dump (&s, true);
382338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
383338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
384338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple functions found matching: %s: \n%s\n",
385338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.symbol_name.c_str(),
386338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 s.GetData());
387338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
388338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
389338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
390338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
391338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
392338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
393338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // This is a little hacky, but the first line table entry for a function points to the "{" that
394338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // starts the function block.  It would be nice to actually get the function
395338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // declaration in there too.  So back up a bit, but not further than what you're going to display.
396338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2;
397338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            uint32_t line_no;
398338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (start_line <= lines_to_back_up)
399338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = 1;
400338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
401338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                line_no = start_line - lines_to_back_up;
402338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
403338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // For fun, if the function is shorter than the number of lines we're supposed to display,
404338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            // only display the function...
405338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (end_line != 0)
406338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
407338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (m_options.num_lines > end_line - line_no)
408338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    m_options.num_lines = end_line - line_no;
409338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
410338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
411338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            char path_buf[PATH_MAX+1];
412338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            start_file.GetPath(path_buf, PATH_MAX);
413338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.AppendMessageWithFormat("File: %s.\n", path_buf);
414238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton            m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file,
415238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              line_no,
416238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              0,
417238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              m_options.num_lines,
418238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              "",
419238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                              &result.GetOutputStream());
420338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
421338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            result.SetStatus (eReturnStatusSuccessFinishResult);
422338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            return true;
423338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
424338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        }
425338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham        else if (m_options.file_name.empty())
426767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
427767af88aa617288e584afcfed055f7755e408542Jim Ingham            // Last valid source manager context, or the current frame if no
428767af88aa617288e584afcfed055f7755e408542Jim Ingham            // valid last context in source manager.
429767af88aa617288e584afcfed055f7755e408542Jim Ingham            // One little trick here, if you type the exact same list command twice in a row, it is
430767af88aa617288e584afcfed055f7755e408542Jim Ingham            // more likely because you typed it once, then typed it again
431767af88aa617288e584afcfed055f7755e408542Jim Ingham            if (m_options.start_line == 0)
432767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
433238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                if (m_interpreter.GetDebugger().GetSourceManager().DisplayMoreWithLineNumbers (&result.GetOutputStream()))
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessFinishResult);
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
437767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
438767af88aa617288e584afcfed055f7755e408542Jim Ingham            else
439767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
440238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                if (m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile(
441767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.start_line,   // Line to display
442767af88aa617288e584afcfed055f7755e408542Jim Ingham                            0,                      // Lines before line to display
443767af88aa617288e584afcfed055f7755e408542Jim Ingham                            m_options.num_lines,    // Lines after line to display
444767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "",                     // Don't mark "line"
445767af88aa617288e584afcfed055f7755e408542Jim Ingham                            &result.GetOutputStream()))
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
447767af88aa617288e584afcfed055f7755e408542Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
449767af88aa617288e584afcfed055f7755e408542Jim Ingham
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
454767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char *filename = m_options.file_name.c_str();
455238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton            Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
456767af88aa617288e584afcfed055f7755e408542Jim Ingham            if (target == NULL)
457767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
458767af88aa617288e584afcfed055f7755e408542Jim Ingham                result.AppendError ("invalid target, set executable file using 'file' command");
459767af88aa617288e584afcfed055f7755e408542Jim Ingham                result.SetStatus (eReturnStatusFailed);
460767af88aa617288e584afcfed055f7755e408542Jim Ingham                return false;
461767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
463767af88aa617288e584afcfed055f7755e408542Jim Ingham
464767af88aa617288e584afcfed055f7755e408542Jim Ingham            bool check_inlines = false;
465767af88aa617288e584afcfed055f7755e408542Jim Ingham            SymbolContextList sc_list;
466338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            size_t num_matches = 0;
467338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
468338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (m_options.m_modules.size() > 0)
469338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
470338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                ModuleList matching_modules;
4710f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner                for (unsigned i = 0, e = m_options.m_modules.size(); i != e; i++)
472338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
473537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton                    FileSpec module_spec(m_options.m_modules[i].c_str(), false);
474338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    if (module_spec)
475338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    {
476338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        matching_modules.Clear();
477338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules);
478338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        num_matches += matching_modules.ResolveSymbolContextForFilePath (filename,
479338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   0,
480338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   check_inlines,
481338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   eSymbolContextModule | eSymbolContextCompUnit,
482338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   sc_list);
483338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    }
484338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
485338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
486338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            else
487338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
488338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                num_matches = target->GetImages().ResolveSymbolContextForFilePath (filename,
489338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   0,
490338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   check_inlines,
491338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   eSymbolContextModule | eSymbolContextCompUnit,
492338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                                                   sc_list);
493338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
494338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
495338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches == 0)
496338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
497338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.AppendErrorWithFormat("Could not find source file \"%s\".\n",
498338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                             m_options.file_name.c_str());
499338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                result.SetStatus (eReturnStatusFailed);
500338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                return false;
501338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
502338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
503338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (num_matches > 1)
504767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
505767af88aa617288e584afcfed055f7755e408542Jim Ingham                SymbolContext sc;
506338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                bool got_multiple = false;
507338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                FileSpec *test_cu_spec = NULL;
508338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
5090f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner                for (unsigned i = 0; i < num_matches; i++)
510767af88aa617288e584afcfed055f7755e408542Jim Ingham                {
511338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    sc_list.GetContextAtIndex(i, sc);
512767af88aa617288e584afcfed055f7755e408542Jim Ingham                    if (sc.comp_unit)
513767af88aa617288e584afcfed055f7755e408542Jim Ingham                    {
514338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        if (test_cu_spec)
515338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        {
516338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            if (test_cu_spec != static_cast<FileSpec *> (sc.comp_unit))
517338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                got_multiple = true;
518338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                break;
519338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        }
520338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                        else
521338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                            test_cu_spec = sc.comp_unit;
522767af88aa617288e584afcfed055f7755e408542Jim Ingham                    }
523767af88aa617288e584afcfed055f7755e408542Jim Ingham                }
524338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (got_multiple)
525338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
526338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("Multiple source files found matching: \"%s.\"\n",
527338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
528338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
529338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
530338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
531338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            }
532338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
533338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            SymbolContext sc;
534338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            if (sc_list.GetContextAtIndex(0, sc))
535338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham            {
536338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                if (sc.comp_unit)
537338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
538238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                    m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit,
539238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      m_options.start_line,
540238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      0,
541238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      m_options.num_lines,
542238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      "",
543238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                                                                      &result.GetOutputStream());
544338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham
545338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusSuccessFinishResult);
546338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
547338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                else
548338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                {
549338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.AppendErrorWithFormat("No comp unit found for: \"%s.\"\n",
550338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                                                 m_options.file_name.c_str());
551338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    result.SetStatus (eReturnStatusFailed);
552338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                    return false;
553338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham                }
554767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
556767af88aa617288e584afcfed055f7755e408542Jim Ingham        return result.Succeeded();
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
558767af88aa617288e584afcfed055f7755e408542Jim Ingham
559767af88aa617288e584afcfed055f7755e408542Jim Ingham    virtual const char *GetRepeatCommand (Args &current_command_args, uint32_t index)
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
561767af88aa617288e584afcfed055f7755e408542Jim Ingham        return m_cmd_name.c_str();
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
564767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected:
565767af88aa617288e584afcfed055f7755e408542Jim Ingham    CommandOptions m_options;
566767af88aa617288e584afcfed055f7755e408542Jim Ingham
567767af88aa617288e584afcfed055f7755e408542Jim Ingham};
568767af88aa617288e584afcfed055f7755e408542Jim Ingham
569b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
570767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceList::CommandOptions::g_option_table[] =
571767af88aa617288e584afcfed055f7755e408542Jim Ingham{
5724d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "count",    'c', required_argument, NULL, 0, eArgTypeCount,   "The number of source lines to display."},
5734d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "shlib",    's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Look up the source file in the given shared library."},
5744d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file",       'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename,    "The file from which to display source."},
5754d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line",       'l', required_argument, NULL, 0, eArgTypeLineNum,    "The line number at which to start the display source."},
5764d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_2, false, "name",       'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeSymbol,    "The name of a function whose source to display."},
5774d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
578767af88aa617288e584afcfed055f7755e408542Jim Ingham};
579767af88aa617288e584afcfed055f7755e408542Jim Ingham
580767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordSource
581767af88aa617288e584afcfed055f7755e408542Jim Ingham
582767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
583767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordSource
584767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
585767af88aa617288e584afcfed055f7755e408542Jim Ingham
586767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::CommandObjectMultiwordSource (CommandInterpreter &interpreter) :
587238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
588238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "source",
589c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice                            "A set of commands for accessing source file information",
590767af88aa617288e584afcfed055f7755e408542Jim Ingham                            "source <subcommand> [<subcommand-options>]")
591767af88aa617288e584afcfed055f7755e408542Jim Ingham{
592238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("info",   CommandObjectSP (new CommandObjectSourceInfo (interpreter)));
593238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",   CommandObjectSP (new CommandObjectSourceList (interpreter)));
594767af88aa617288e584afcfed055f7755e408542Jim Ingham}
595767af88aa617288e584afcfed055f7755e408542Jim Ingham
596767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::~CommandObjectMultiwordSource ()
597767af88aa617288e584afcfed055f7755e408542Jim Ingham{
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
599767af88aa617288e584afcfed055f7755e408542Jim Ingham
600