CommandObjectTarget.cpp revision c833295baeec641086f536e78050388af36784f8
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectTarget.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 "CommandObjectTarget.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <errno.h>
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <sys/errno.h>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1884cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
2163094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectTargetImageSearchPaths
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectTargetImageSearchPathsAdd : public CommandObject
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectTargetImageSearchPathsAdd () :
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject ("target image-search-paths add",
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Add new image search paths substitution pairs to the current target.",
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "target image-search-paths add <path-prefix> <new-path-prefix> [<path-prefix> <new-path-prefix>] ...")
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectTargetImageSearchPathsAdd ()
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
4963094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute (CommandInterpreter &interpreter,
5063094e0bb161580564954dee512955c1c79d3476Greg Clayton             Args& command,
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
53c833295baeec641086f536e78050388af36784f8Jim Ingham        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target)
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t argc = command.GetArgumentCount();
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (argc & 1)
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendError ("add requires an even number of arguments");
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (uint32_t i=0; i<argc; i+=2)
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const char *from = command.GetArgumentAtIndex(i);
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const char *to = command.GetArgumentAtIndex(i+1);
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (from[0] && to[0])
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bool last_pair = ((argc - i) == 2);
7263094e0bb161580564954dee512955c1c79d3476Greg Clayton                        target->GetImageSearchPathList().Append (ConstString(from),
7363094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                 ConstString(to),
7463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                 last_pair); // Notify if this is the last pair
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (from[0])
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            result.AppendError ("<path-prefix> can't be empty");
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            result.AppendError ("<new-path-prefix> can't be empty");
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus (eReturnStatusFailed);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("invalid target");
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectTargetImageSearchPathsClear : public CommandObject
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectTargetImageSearchPathsClear () :
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject ("target image-search-paths clear",
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Clears all current image search paths substitution pairs from the current target.",
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "target image-search-paths clear")
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectTargetImageSearchPathsClear ()
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
11263094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute (CommandInterpreter &interpreter,
11363094e0bb161580564954dee512955c1c79d3476Greg Clayton             Args& command,
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
116c833295baeec641086f536e78050388af36784f8Jim Ingham        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target)
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool notify = true;
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            target->GetImageSearchPathList().Clear(notify);
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("invalid target");
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectTargetImageSearchPathsInsert : public CommandObject
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectTargetImageSearchPathsInsert () :
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject ("target image-search-paths insert",
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Inserts a new image search paths substitution pair to the current target at the specified index.",
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "target image-search-paths insert <index> <path-prefix> <new-path-prefix> [<path-prefix> <new-path-prefix>] ...")
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectTargetImageSearchPathsInsert ()
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
14763094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute (CommandInterpreter &interpreter,
14863094e0bb161580564954dee512955c1c79d3476Greg Clayton             Args& command,
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
151c833295baeec641086f536e78050388af36784f8Jim Ingham        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target)
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t argc = command.GetArgumentCount();
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // check for at least 3 arguments and an odd nubmer of parameters
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (argc >= 3 && argc & 1)
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bool success = false;
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t insert_idx = Args::StringToUInt32(command.GetArgumentAtIndex(0), UINT32_MAX, 0, &success);
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (!success)
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendErrorWithFormat("<index> parameter is not an integer: '%s'.\n", command.GetArgumentAtIndex(0));
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return result.Succeeded();
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // shift off the index
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                command.Shift();
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                argc = command.GetArgumentCount();
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (uint32_t i=0; i<argc; i+=2, ++insert_idx)
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const char *from = command.GetArgumentAtIndex(i);
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const char *to = command.GetArgumentAtIndex(i+1);
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (from[0] && to[0])
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bool last_pair = ((argc - i) == 2);
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        target->GetImageSearchPathList().Insert (ConstString(from),
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                 ConstString(to),
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                 insert_idx,
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                 last_pair);
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (from[0])
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            result.AppendError ("<path-prefix> can't be empty");
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            result.AppendError ("<new-path-prefix> can't be empty");
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus (eReturnStatusFailed);
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return false;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendError ("insert requires at least three arguments");
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return result.Succeeded();
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("invalid target");
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectTargetImageSearchPathsList : public CommandObject
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectTargetImageSearchPathsList () :
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject ("target image-search-paths list",
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Lists all current image search paths substitution pairs in the current target.",
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "target image-search-paths list")
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectTargetImageSearchPathsList ()
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
23063094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute (CommandInterpreter &interpreter,
23163094e0bb161580564954dee512955c1c79d3476Greg Clayton             Args& command,
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
234c833295baeec641086f536e78050388af36784f8Jim Ingham        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target)
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (command.GetArgumentCount() != 0)
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendError ("list takes no arguments");
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return result.Succeeded();
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            target->GetImageSearchPathList().Dump(&result.GetOutputStream());
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("invalid target");
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectTargetImageSearchPathsQuery : public CommandObject
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectTargetImageSearchPathsQuery () :
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject ("target image-search-paths query",
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   "Transforms a path using the first applicable image search path.",
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   "target image-search-paths query <path>")
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectTargetImageSearchPathsQuery ()
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
27163094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute (CommandInterpreter &interpreter,
27263094e0bb161580564954dee512955c1c79d3476Greg Clayton             Args& command,
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             CommandReturnObject &result)
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
275c833295baeec641086f536e78050388af36784f8Jim Ingham        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target)
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (command.GetArgumentCount() != 1)
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendError ("query requires one argument");
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return result.Succeeded();
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ConstString orig(command.GetArgumentAtIndex(0));
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ConstString transformed;
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target->GetImageSearchPathList().RemapPath(orig, transformed))
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.GetOutputStream().Printf("%s\n", transformed.GetCString());
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.GetOutputStream().Printf("%s\n", orig.GetCString());
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("invalid target");
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// TODO: implement the target select later when we start doing multiple targets
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#pragma mark CommandObjectTargetSelect
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////-------------------------------------------------------------------------
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// CommandObjectTargetSelect
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////-------------------------------------------------------------------------
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//class CommandObjectTargetSelect : public CommandObject
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//public:
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    CommandObjectTargetSelect () :
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    CommandObject ("frame select",
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                   "Select the current frame by index in the current thread.",
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                   "frame select <frame-index>")
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    ~CommandObjectTargetSelect ()
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    bool
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Execute (Args& command,
32563094e0bb161580564954dee512955c1c79d3476Greg Clayton//             Debugger *context,
32663094e0bb161580564954dee512955c1c79d3476Greg Clayton//             CommandInterpreter &interpreter,
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             CommandReturnObject &result)
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        ExecutionContext exe_ctx (context->GetExecutionContext());
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        if (exe_ctx.thread)
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (command.GetArgumentCount() == 1)
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const char *frame_idx_cstr = command.GetArgumentAtIndex(0);
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint32_t num_frames = exe_ctx.thread->GetStackFrameCount();
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint32_t frame_idx = Args::StringToUInt32 (frame_idx_cstr, UINT32_MAX, 0);
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (frame_idx < num_frames)
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
340c833295baeec641086f536e78050388af36784f8Jim Ingham//                    exe_ctx.thread->SetSelectedFrameByIndex (frame_idx);
341c833295baeec641086f536e78050388af36784f8Jim Ingham//                    exe_ctx.frame = exe_ctx.thread->GetSelectedFrame ().get();
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (exe_ctx.frame)
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        if (DisplayFrameForExecutionContext (exe_ctx.thread,
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                             exe_ctx.frame,
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                             interpreter,
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                             result.GetOutputStream(),
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                             true,
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                             true,
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                             3,
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                             3))
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        {
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                            result.SetStatus (eReturnStatusSuccessFinishResult);
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                            return result.Succeeded();
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        }
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (frame_idx == UINT32_MAX)
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    result.AppendErrorWithFormat ("Invalid frame index: %s.\n", frame_idx_cstr);
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                else
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    result.AppendErrorWithFormat ("Frame index (%u) out of range.\n", frame_idx);
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            else
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                result.AppendError ("invalid arguments");
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                result.AppendErrorWithFormat ("Usage: %s\n", m_cmd_syntax.c_str());
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        else
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            result.AppendError ("no current thread");
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        result.SetStatus (eReturnStatusFailed);
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        return false;
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//};
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectMultiwordTarget
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordImageSearchPaths
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectMultiwordImageSearchPaths : public CommandObjectMultiword
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39063094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandObjectMultiwordImageSearchPaths (CommandInterpreter &interpreter) :
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObjectMultiword ("target image-search-paths",
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                "A set of commands for operating on debugger target image search paths.",
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                "target image-search-paths <subcommand> [<subcommand-options>]")
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39563094e0bb161580564954dee512955c1c79d3476Greg Clayton        LoadSubCommand (interpreter, "add",     CommandObjectSP (new CommandObjectTargetImageSearchPathsAdd ()));
39663094e0bb161580564954dee512955c1c79d3476Greg Clayton        LoadSubCommand (interpreter, "clear",   CommandObjectSP (new CommandObjectTargetImageSearchPathsClear ()));
39763094e0bb161580564954dee512955c1c79d3476Greg Clayton        LoadSubCommand (interpreter, "insert",  CommandObjectSP (new CommandObjectTargetImageSearchPathsInsert ()));
39863094e0bb161580564954dee512955c1c79d3476Greg Clayton        LoadSubCommand (interpreter, "list",    CommandObjectSP (new CommandObjectTargetImageSearchPathsList ()));
39963094e0bb161580564954dee512955c1c79d3476Greg Clayton        LoadSubCommand (interpreter, "query",   CommandObjectSP (new CommandObjectTargetImageSearchPathsQuery ()));
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectMultiwordImageSearchPaths()
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CommandObjectMultiwordTarget
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordTarget
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41463094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiwordTarget::CommandObjectMultiwordTarget (CommandInterpreter &interpreter) :
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectMultiword ("target",
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "A set of commands for operating on debugger targets.",
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "target <subcommand> [<subcommand-options>]")
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41963094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "image-search-paths", CommandObjectSP (new CommandObjectMultiwordImageSearchPaths (interpreter)));
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiwordTarget::~CommandObjectMultiwordTarget ()
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
426