124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectFrame.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 "CommandObjectFrame.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1610b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen#include <string>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h"
20537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/Module.h"
21537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/StreamFile.h"
2210b12b3aa8542721fa9485c1d520433de0e0e720Johnny Chen#include "lldb/Core/StreamString.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
24537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/Value.h"
25537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/ValueObject.h"
26537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Core/ValueObjectVariable.h"
27f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/DataVisualization.h"
28cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Host.h"
29537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Interpreter/Args.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
32537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Interpreter/Options.h"
33a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton#include "lldb/Interpreter/OptionGroupFormat.h"
3410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
35368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton#include "lldb/Interpreter/OptionGroupVariable.h"
36537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/ClangASTType.h"
37537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/ClangASTContext.h"
38537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/ObjectFile.h"
39537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/SymbolContext.h"
40537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/Type.h"
41537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/Variable.h"
42537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Symbol/VariableList.h"
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
46537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#include "lldb/Target/Target.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectFrameInfo
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectFrameInfo
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectFrameInfo : public CommandObjectParsed
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectFrameInfo (CommandInterpreter &interpreter) :
62da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
63da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "frame info",
64da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "List information about the currently selected frame in the current thread.",
65da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "frame info",
66ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagRequiresFrame         |
67ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagTryTargetAPILock      |
68ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagProcessMustBeLaunched |
69ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagProcessMustBePaused   )
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectFrameInfo ()
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
79ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    DoExecute (Args& command, CommandReturnObject &result)
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
81ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        m_exe_ctx.GetFrameRef().DumpUsingSettingsFormat (&result.GetOutputStream());
82ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        result.SetStatus (eReturnStatusSuccessFinishResult);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectFrameSelect
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectFrameSelect
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectFrameSelect : public CommandObjectParsed
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton   class CommandOptions : public Options
98c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    {
99c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    public:
100c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
101f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
1029335643418cfaeba8e42a6c8e4084eae623b1acdJohnny Chen            Options(interpreter)
103c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        {
104143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            OptionParsingStarting ();
105c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        }
106c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
107c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        virtual
108c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        ~CommandOptions ()
109c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        {
110c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        }
111c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
112c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        virtual Error
113143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx, const char *option_arg)
114c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        {
115c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            Error error;
116c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            bool success = false;
1176475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton            const int short_option = m_getopt_table[option_idx].val;
118c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            switch (short_option)
119c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            {
120c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            case 'r':
121c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton                relative_frame_offset = Args::StringToSInt32 (option_arg, INT32_MIN, 0, &success);
122c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton                if (!success)
1239c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat ("invalid frame offset argument '%s'", option_arg);
124c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton                break;
125c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
126c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            default:
1279c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("invalid short option character '%c'", short_option);
128c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton                break;
129c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            }
130c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
131c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            return error;
132c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        }
133c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
134c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        void
135143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
136c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        {
137c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            relative_frame_offset = INT32_MIN;
138c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        }
139c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
140b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
141c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        GetDefinitions ()
142c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        {
143c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            return g_option_table;
144c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        }
145c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
146c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        // Options table: Required for subclasses of Options.
147c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
148b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
149c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        int32_t relative_frame_offset;
150c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    };
151c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
152238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectFrameSelect (CommandInterpreter &interpreter) :
153da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
154da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "frame select",
155da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Select a frame by index from within the current thread and make it the current frame.",
156da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL,
157ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagRequiresThread        |
158ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagTryTargetAPILock      |
159ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagProcessMustBeLaunched |
160ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagProcessMustBePaused   ),
161f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
16443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData index_arg;
16543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
16643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
16743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        index_arg.arg_type = eArgTypeFrameIndex;
168c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        index_arg.arg_repetition = eArgRepeatOptional;
16943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
17043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
17143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (index_arg);
17243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
17343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
17443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectFrameSelect ()
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    virtual
182c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    Options *
183c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    GetOptions ()
184c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    {
185c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton        return &m_options;
186c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    }
187c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
188c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
189da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
191ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    DoExecute (Args& command, CommandReturnObject &result)
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
193ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        // No need to check "thread" for validity as eFlagRequiresThread ensures it is valid
194ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        Thread *thread = m_exe_ctx.GetThreadPtr();
195ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
196ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        uint32_t frame_idx = UINT32_MAX;
197ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if (m_options.relative_frame_offset != INT32_MIN)
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
199ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            // The one and only argument is a signed relative frame index
200ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            frame_idx = thread->GetSelectedFrameIndex ();
201ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            if (frame_idx == UINT32_MAX)
202ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                frame_idx = 0;
203ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
204ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            if (m_options.relative_frame_offset < 0)
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
206ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                if (frame_idx >= -m_options.relative_frame_offset)
207ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    frame_idx += m_options.relative_frame_offset;
208ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                else
209c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton                {
210ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    if (frame_idx == 0)
211d9fa9d7c77adecaa22ae5dc8624a96afc6cf9edbJim Ingham                    {
212ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        //If you are already at the bottom of the stack, then just warn and don't reset the frame.
213ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        result.AppendError("Already at the bottom of the stack");
214ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        result.SetStatus(eReturnStatusFailed);
215ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        return false;
216d9fa9d7c77adecaa22ae5dc8624a96afc6cf9edbJim Ingham                    }
217c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton                    else
218ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        frame_idx = 0;
219c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton                }
220c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            }
221ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            else if (m_options.relative_frame_offset > 0)
222c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            {
223ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                // I don't want "up 20" where "20" takes you past the top of the stack to produce
224ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                // an error, but rather to just go to the top.  So I have to count the stack here...
225ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                const uint32_t num_frames = thread->GetStackFrameCount();
226ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                if (num_frames - frame_idx > m_options.relative_frame_offset)
227ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    frame_idx += m_options.relative_frame_offset;
228ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                else
229811ded5b244c20a9f39a04aba1a11ce02aa45f5eJason Molenda                {
230ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    if (frame_idx == num_frames - 1)
2317685ccc99dd2f85aa596f92d9ccd8999b30b2e9fJason Molenda                    {
232ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        //If we are already at the top of the stack, just warn and don't reset the frame.
233ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        result.AppendError("Already at the top of the stack");
234ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        result.SetStatus(eReturnStatusFailed);
235ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        return false;
2367685ccc99dd2f85aa596f92d9ccd8999b30b2e9fJason Molenda                    }
237ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    else
238ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                        frame_idx = num_frames - 1;
239811ded5b244c20a9f39a04aba1a11ce02aa45f5eJason Molenda                }
240ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            }
241ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
242ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        else
243ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
244ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            if (command.GetArgumentCount() == 1)
245ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            {
246ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                const char *frame_idx_cstr = command.GetArgumentAtIndex(0);
247ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                frame_idx = Args::StringToUInt32 (frame_idx_cstr, UINT32_MAX, 0);
248ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            }
249ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            else if (command.GetArgumentCount() == 0)
250ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            {
251ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                frame_idx = thread->GetSelectedFrameIndex ();
252ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                if (frame_idx == UINT32_MAX)
253c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton                {
254ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    frame_idx = 0;
255c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton                }
256c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton            }
257ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            else
258ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            {
259ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                result.AppendError ("invalid arguments.\n");
260ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                m_options.GenerateOptionUsage (result.GetErrorStream(), this);
261ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            }
262ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
26394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
264be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham        bool success = thread->SetSelectedFrameByIndexNoisily (frame_idx, result.GetOutputStream());
265ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if (success)
266ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
267ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            m_exe_ctx.SetFrameSP(thread->GetSelectedFrame ());
268be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham            result.SetStatus (eReturnStatusSuccessFinishResult);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
270be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham        else
271be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham        {
272be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham            result.AppendErrorWithFormat ("Frame index (%u) out of range.\n", frame_idx);
273be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham            result.SetStatus (eReturnStatusFailed);
274be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham        }
275be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham
276be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham        return result.Succeeded();
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
278c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Claytonprotected:
279c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
280c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    CommandOptions m_options;
281c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton};
282c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
283b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
284c12b6b40b93687539b0ca303f64eb77b6af6924dGreg ClaytonCommandObjectFrameSelect::CommandOptions::g_option_table[] =
285c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton{
286c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton{ LLDB_OPT_SET_1, false, "relative", 'r', required_argument, NULL, 0, eArgTypeOffset, "A relative frame index offset from the current frame index."},
287560c51483461697b2f78c145d70d0cd285012c4dFilipe Cabecinhas{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
290537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham#pragma mark CommandObjectFrameVariable
291537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham//----------------------------------------------------------------------
292537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham// List images with associated information
293537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham//----------------------------------------------------------------------
294da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectFrameVariable : public CommandObjectParsed
295537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham{
296537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Inghampublic:
297537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham
298238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectFrameVariable (CommandInterpreter &interpreter) :
299da26bd203cbb104291b39891febf7481794f205fJim Ingham        CommandObjectParsed (interpreter,
300da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "frame variable",
301da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Show frame variables. All argument and local variables "
302da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "that are in scope will be shown when no arguments are given. "
303da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "If any arguments are specified, they can be names of "
304da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "argument, local, file static and file global variables. "
305da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "Children of aggregate variables can be specified such as "
306da26bd203cbb104291b39891febf7481794f205fJim Ingham                             "'var->child.x'.",
307da26bd203cbb104291b39891febf7481794f205fJim Ingham                             NULL,
308ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagRequiresFrame |
309ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagTryTargetAPILock |
310ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                             eFlagProcessMustBeLaunched |
31176695d358405d1473c088309a5dfa5cf18970a00Enrico Granata                             eFlagProcessMustBePaused |
31276695d358405d1473c088309a5dfa5cf18970a00Enrico Granata                             eFlagRequiresProcess),
31310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        m_option_group (interpreter),
314368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton        m_option_variable(true), // Include the frame specific options by passing "true"
315a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton        m_option_format (eFormatDefault),
31610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        m_varobj_options()
317537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    {
31843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
31943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData var_name_arg;
32043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
32143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
32243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        var_name_arg.arg_type = eArgTypeVarName;
32343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        var_name_arg.arg_repetition = eArgRepeatStar;
32443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
32543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
32643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (var_name_arg);
32743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
32843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
32943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
33010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
331368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton        m_option_group.Append (&m_option_variable, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
33224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton        m_option_group.Append (&m_option_format, OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_GDB_FMT, LLDB_OPT_SET_1);
33310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
33410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        m_option_group.Finalize();
335537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    }
336537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham
337537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    virtual
338537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    ~CommandObjectFrameVariable ()
339537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    {
340537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    }
341537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham
342537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    virtual
343537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    Options *
344537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    GetOptions ()
345537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    {
34610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return &m_option_group;
347537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    }
348946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
349946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
350946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    virtual int
351946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    HandleArgumentCompletion (Args &input,
352946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                              int &cursor_index,
353946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                              int &cursor_char_position,
354946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                              OptionElementVector &opt_element_vector,
355946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                              int match_start_point,
356946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                              int max_return_elements,
357946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                              bool &word_complete,
358946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                              StringList &matches)
359946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    {
360946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        // Arguments are the standard source file completer.
361946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        std::string completion_str (input.GetArgumentAtIndex(cursor_index));
362946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        completion_str.erase (cursor_char_position);
363946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
364946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
365946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                             CommandCompletions::eVariablePathCompletion,
366946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                             completion_str.c_str(),
367946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                             match_start_point,
368946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                             max_return_elements,
369946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                             NULL,
370946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                             word_complete,
371946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                             matches);
372946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        return matches.GetSize();
373946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    }
374537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham
375da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected:
376537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    virtual bool
377da26bd203cbb104291b39891febf7481794f205fJim Ingham    DoExecute (Args& command, CommandReturnObject &result)
378537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    {
379ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        // No need to check "frame" for validity as eFlagRequiresFrame ensures it is valid
380ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        StackFrame *frame = m_exe_ctx.GetFramePtr();
381649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
382649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen        Stream &s = result.GetOutputStream();
383649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
384649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen        bool get_file_globals = true;
385649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
386649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen        // Be careful about the stack frame, if any summary formatter runs code, it might clear the StackFrameList
387649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen        // for the thread.  So hold onto a shared pointer to the frame so it stays alive.
388649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
389567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        VariableList *variable_list = frame->GetVariableList (get_file_globals);
390649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
391649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen        VariableSP var_sp;
392649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen        ValueObjectSP valobj_sp;
393649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
394649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen        const char *name_cstr = NULL;
395649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen        size_t idx;
396649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
39716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata        TypeSummaryImplSP summary_format_sp;
398879de484c7ef1d0971ac6c007b319b8285723e69Enrico Granata        if (!m_option_variable.summary.IsCurrentValueEmpty())
399879de484c7ef1d0971ac6c007b319b8285723e69Enrico Granata            DataVisualization::NamedSummaryFormats::GetSummaryFormat(ConstString(m_option_variable.summary.GetCurrentValue()), summary_format_sp);
400879de484c7ef1d0971ac6c007b319b8285723e69Enrico Granata        else if (!m_option_variable.summary_string.IsCurrentValueEmpty())
401879de484c7ef1d0971ac6c007b319b8285723e69Enrico Granata            summary_format_sp.reset(new StringSummaryFormat(TypeSummaryImpl::Flags(),m_option_variable.summary_string.GetCurrentValue()));
402649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
403c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata        ValueObject::DumpValueObjectOptions options(m_varobj_options.GetAsDumpOptions(false,eFormatDefault,summary_format_sp));
404649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
405649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen        if (variable_list)
406537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham        {
407a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton            const Format format = m_option_format.GetFormat();
4083069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata            options.SetFormat(format);
409a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton
410649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen            if (command.GetArgumentCount() > 0)
411649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen            {
412649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                VariableList regex_var_list;
413649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
414649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                // If we have any args to the variable command, we will make
415649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                // variable objects from them...
416649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                for (idx = 0; (name_cstr = command.GetArgumentAtIndex(idx)) != NULL; ++idx)
417649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                {
418649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                    if (m_option_variable.use_regex)
419537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham                    {
42036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                        const size_t regex_start_index = regex_var_list.GetSize();
421649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        RegularExpression regex (name_cstr);
422649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        if (regex.Compile(name_cstr))
423c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                        {
424649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            size_t num_matches = 0;
425649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            const size_t num_new_regex_vars = variable_list->AppendVariablesIfUnique(regex,
426649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                                                                                     regex_var_list,
427649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                                                                                     num_matches);
428649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            if (num_new_regex_vars > 0)
4296bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                            {
43036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                                for (size_t regex_idx = regex_start_index, end_index = regex_var_list.GetSize();
431649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                     regex_idx < end_index;
432649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                     ++regex_idx)
4336bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                                {
434649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                    var_sp = regex_var_list.GetVariableAtIndex (regex_idx);
435649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                    if (var_sp)
4366bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                                    {
437567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        valobj_sp = frame->GetValueObjectForFrameVariable (var_sp, m_varobj_options.use_dynamic);
438649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                        if (valobj_sp)
4396bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                                        {
440ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton//                                            if (format != eFormatDefault)
441ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton//                                                valobj_sp->SetFormat (format);
442649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
443649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                            if (m_option_variable.show_decl && var_sp->GetDeclaration ().GetFile())
444649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                            {
445649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                                bool show_fullpaths = false;
446649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                                bool show_module = true;
447649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                                if (var_sp->DumpDeclaration(&s, show_fullpaths, show_module))
448649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                                    s.PutCString (": ");
4496bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                                            }
450649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                            ValueObject::DumpValueObject (result.GetOutputStream(),
451649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                                                          valobj_sp.get(),
4523069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata                                                                          options);
4536bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                                        }
4546bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                                    }
4556bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                                }
4566bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                            }
457649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            else if (num_matches == 0)
4586bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                            {
459649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                result.GetErrorStream().Printf ("error: no variables matched the regular expression '%s'.\n", name_cstr);
4606bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                            }
461c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                        }
462649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        else
463537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham                        {
464649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            char regex_error[1024];
465649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            if (regex.GetErrorAsCString(regex_error, sizeof(regex_error)))
466649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                result.GetErrorStream().Printf ("error: %s\n", regex_error);
467649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            else
468649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                result.GetErrorStream().Printf ("error: unkown regex error when compiling '%s'\n", name_cstr);
469649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        }
470649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                    }
471649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                    else // No regex, either exact variable names or variable expressions.
472649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                    {
473649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        Error error;
474b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                        uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember |
475b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                                     StackFrame::eExpressionPathOptionsAllowDirectIVarAccess;
476649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        lldb::VariableSP var_sp;
477567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                        valobj_sp = frame->GetValueForVariableExpressionPath (name_cstr,
478567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                                              m_varobj_options.use_dynamic,
479567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                                              expr_path_options,
480567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                                              var_sp,
481567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                                              error);
482649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        if (valobj_sp)
483649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        {
484ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton//                            if (format != eFormatDefault)
485ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton//                                valobj_sp->SetFormat (format);
486649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            if (m_option_variable.show_decl && var_sp && var_sp->GetDeclaration ().GetFile())
4876bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                            {
488649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                var_sp->GetDeclaration ().DumpStopContext (&s, false);
489649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                s.PutCString (": ");
490649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            }
4913069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata
4923069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata                            options.SetFormat(format);
493649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
494649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            Stream &output_stream = result.GetOutputStream();
4953069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata                            options.SetRootValueObjectName(valobj_sp->GetParent() ? name_cstr : NULL);
496649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            ValueObject::DumpValueObject (output_stream,
497649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                                          valobj_sp.get(),
4983069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata                                                          options);
499649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        }
500649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        else
501649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        {
502649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            const char *error_cstr = error.AsCString(NULL);
503649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            if (error_cstr)
504649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                result.GetErrorStream().Printf("error: %s\n", error_cstr);
5056bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton                            else
506649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                result.GetErrorStream().Printf ("error: unable to find any variable expression path that matches '%s'\n", name_cstr);
507c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                        }
508537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham                    }
509537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham                }
510649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen            }
511649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen            else // No command arg specified.  Use variable_list, instead.
512649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen            {
51336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                const size_t num_variables = variable_list->GetSize();
514649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                if (num_variables > 0)
515c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                {
51636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    for (size_t i=0; i<num_variables; i++)
517c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                    {
518649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        var_sp = variable_list->GetVariableAtIndex(i);
519649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        bool dump_variable = true;
520649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        switch (var_sp->GetScope())
521c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                        {
522c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                            case eValueTypeVariableGlobal:
523368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton                                dump_variable = m_option_variable.show_globals;
524368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton                                if (dump_variable && m_option_variable.show_scope)
525c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                    s.PutCString("GLOBAL: ");
526c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                break;
527c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton
528c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                            case eValueTypeVariableStatic:
529368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton                                dump_variable = m_option_variable.show_globals;
530368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton                                if (dump_variable && m_option_variable.show_scope)
531c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                    s.PutCString("STATIC: ");
532c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                break;
533649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
534c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                            case eValueTypeVariableArgument:
535368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton                                dump_variable = m_option_variable.show_args;
536368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton                                if (dump_variable && m_option_variable.show_scope)
537c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                    s.PutCString("   ARG: ");
538c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                break;
539649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
540c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                            case eValueTypeVariableLocal:
541368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton                                dump_variable = m_option_variable.show_locals;
542368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton                                if (dump_variable && m_option_variable.show_scope)
543c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                    s.PutCString(" LOCAL: ");
544c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                break;
545c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton
546c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                            default:
547c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                break;
548649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        }
549649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen
550649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        if (dump_variable)
551649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                        {
552649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            // Use the variable object code to make sure we are
553649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            // using the same APIs as the the public API will be
554649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            // using...
555567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                            valobj_sp = frame->GetValueObjectForFrameVariable (var_sp,
556567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                                               m_varobj_options.use_dynamic);
557649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                            if (valobj_sp)
558c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                            {
559ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton//                                if (format != eFormatDefault)
560ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton//                                    valobj_sp->SetFormat (format);
561c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton
562649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                // When dumping all variables, don't print any variables
563649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                // that are not in scope to avoid extra unneeded output
564649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                if (valobj_sp->IsInScope ())
565c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                {
566649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                    if (m_option_variable.show_decl && var_sp->GetDeclaration ().GetFile())
567c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                    {
568649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                        var_sp->GetDeclaration ().DumpStopContext (&s, false);
569649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                        s.PutCString (": ");
570c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                    }
5713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata
5723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata                                    options.SetFormat(format);
5733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata                                    options.SetRootValueObjectName(name_cstr);
574649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                    ValueObject::DumpValueObject (result.GetOutputStream(),
575649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen                                                                  valobj_sp.get(),
5763069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata                                                                  options);
577c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                                }
578c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                            }
579c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                        }
580c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                    }
581c0cf52d198b38f98d1bb302123c9ea536a8e66c9Greg Clayton                }
582537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham            }
583649d3f1daa5af2a3b420b3d83b8a26b68ce21228Johnny Chen            result.SetStatus (eReturnStatusSuccessFinishResult);
584537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham        }
585db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata
586db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata        if (m_interpreter.TruncationWarningNecessary())
587db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata        {
588db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata            result.GetOutputStream().Printf(m_interpreter.TruncationWarningText(),
589db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata                                            m_cmd_name.c_str());
590db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata            m_interpreter.TruncationWarningGiven();
591db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata        }
592db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata
593537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham        return result.Succeeded();
594537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham    }
595537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Inghamprotected:
596537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham
59710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    OptionGroupOptions m_option_group;
598368f8226b1f75fbb4758748fafcee70f18fc248eGreg Clayton    OptionGroupVariable m_option_variable;
599a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton    OptionGroupFormat m_option_format;
60010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    OptionGroupValueObjectDisplay m_varobj_options;
601537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham};
602537926c76e5bc7b92ce9a74c864f1d2e2a346596Jim Ingham
60310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectMultiwordFrame
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordFrame
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61063094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiwordFrame::CommandObjectMultiwordFrame (CommandInterpreter &interpreter) :
611238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
612238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "frame",
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "A set of commands for operating on the current thread's frames.",
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "frame <subcommand> [<subcommand-options>]")
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
616238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("info",   CommandObjectSP (new CommandObjectFrameInfo (interpreter)));
617238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("select", CommandObjectSP (new CommandObjectFrameSelect (interpreter)));
618238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("variable", CommandObjectSP (new CommandObjectFrameVariable (interpreter)));
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiwordFrame::~CommandObjectMultiwordFrame ()
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
625