Debugger.cpp revision 1586d9720002e407a3a097baf302de5fa4ca9c1b
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Debugger.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
105c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/Debugger.h"
115c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton
125c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include <map>
135c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton
141391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/DeclCXX.h"
151391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/Type.h"
161391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConnectionFileDescriptor.h"
195c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/FormatManager.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/InputReader.h"
21061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h"
23e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham#include "lldb/Core/StreamAsynchronousIO.h"
24d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Core/StreamString.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
261391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "lldb/Core/ValueObject.h"
270fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton#include "lldb/Host/Terminal.h"
2863094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
31d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/RegisterContext.h"
32d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/StopInfo.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
34f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton#include "lldb/Utility/AnsiTerminal.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic uint32_t g_shared_debugger_refcount = 0;
41558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Ticestatic lldb::user_id_t g_unique_id = 1;
42558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice
43d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Static Functions
44d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
45d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic Mutex &
46d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerListMutex ()
47d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{
48d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    static Mutex g_mutex(Mutex::eMutexTypeRecursive);
49d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    return g_mutex;
50d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton}
51d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
52d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytontypedef std::vector<DebuggerSP> DebuggerList;
53d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
54d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic DebuggerList &
55d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerList()
56d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{
57d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    // hide the static debugger list inside a singleton accessor to avoid
58d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    // global init contructors
59d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    static DebuggerList g_list;
60d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    return g_list;
61d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton}
62d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
63d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
64be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
65be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonPromptVarName ()
66be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
67be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("prompt");
68be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
69be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
70be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
71be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
72be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonGetFrameFormatName ()
73be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
74be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("frame-format");
75be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
76be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
77be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
78be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
79be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonGetThreadFormatName ()
80be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
81be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("thread-format");
82be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
83be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
84be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
85be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
86be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonScriptLangVarName ()
87be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
88be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("script-lang");
89be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
90be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
91be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
92be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
93be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonTermWidthVarName ()
94be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
95be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("term-width");
96be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
97be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
98be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
99be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
100be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonUseExternalEditorVarName ()
101be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
102be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("use-external-editor");
103be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
104be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
105be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
106be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
107be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonAutoConfirmName ()
108be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
109be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("auto-confirm");
110be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
111be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
112be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
113be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
114be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonStopSourceContextBeforeName ()
115be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
116be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("stop-line-count-before");
117be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
118be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
119be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
120be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
121be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonStopSourceContextAfterName ()
122be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
123be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("stop-line-count-after");
124be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
125be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
126be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
127be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
128be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonStopDisassemblyCountName ()
129be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
130be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("stop-disassembly-count");
131be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
132be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
133be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
134be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString &
135be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonStopDisassemblyDisplayName ()
136be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
137be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    static ConstString g_const_string ("stop-disassembly-display");
138be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    return g_const_string;
139be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}
140be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
141be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonOptionEnumValueElement
142be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonDebuggerInstanceSettings::g_show_disassembly_enum_values[] =
143be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{
144be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    { eStopDisassemblyTypeNever,    "never",     "Never show disassembly when displaying a stop context."},
145be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    { eStopDisassemblyTypeNoSource, "no-source", "Show disassembly when there is no source information, or the source file is missing when displaying a stop context."},
146be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    { eStopDisassemblyTypeAlways,   "always",    "Always show disassembly when displaying a stop context."},
147be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    { 0, NULL, NULL }
148be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton};
149be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
150be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
151be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton
152d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Debugger
153d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
154990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonUserSettingsControllerSP &
155990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonDebugger::GetSettingsController ()
156990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{
157990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    static UserSettingsControllerSP g_settings_controller;
158990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    return g_settings_controller;
159990de7bb41d3afec6b789155408ff322187d8682Greg Clayton}
160990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
1610aa2e55f0e9422405ad33675adc1e35044537adbCaroline Ticeint
1620aa2e55f0e9422405ad33675adc1e35044537adbCaroline TiceDebugger::TestDebuggerRefCount ()
1630aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice{
1640aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    return g_shared_debugger_refcount;
1650aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice}
1660aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Initialize ()
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (g_shared_debugger_refcount == 0)
171990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    {
172c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton        lldb_private::Initialize();
173990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    }
17463094e0bb161580564954dee512955c1c79d3476Greg Clayton    g_shared_debugger_refcount++;
175990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Terminate ()
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (g_shared_debugger_refcount > 0)
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
18363094e0bb161580564954dee512955c1c79d3476Greg Clayton        g_shared_debugger_refcount--;
18463094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (g_shared_debugger_refcount == 0)
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
186c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton            lldb_private::WillTerminate();
187c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton            lldb_private::Terminate();
188202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice
189202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice            // Clear our master list of debugger objects
190202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice            Mutex::Locker locker (GetDebuggerListMutex ());
191202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice            GetDebuggerList().clear();
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1962a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid
1972a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsInitialize ()
1982a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{
1992a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    static bool g_initialized = false;
2002a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice
2012a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    if (!g_initialized)
2022a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    {
2032a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice        g_initialized = true;
2042a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice        UserSettingsControllerSP &usc = GetSettingsController();
2052a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice        usc.reset (new SettingsController);
2062a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice        UserSettingsController::InitializeSettingsController (usc,
2072a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice                                                              SettingsController::global_settings_table,
2082a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice                                                              SettingsController::instance_settings_table);
2092a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice        // Now call SettingsInitialize for each settings 'child' of Debugger
2102a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice        Target::SettingsInitialize ();
2112a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    }
2122a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice}
2132a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice
2142a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid
2152a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsTerminate ()
2162a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{
2172a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice
2182a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    // Must call SettingsTerminate() for each settings 'child' of Debugger, before terminating the Debugger's
2192a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    // Settings.
2202a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice
2212a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    Target::SettingsTerminate ();
2222a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice
2232a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    // Now terminate the Debugger Settings.
2242a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice
2252a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    UserSettingsControllerSP &usc = GetSettingsController();
2262a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    UserSettingsController::FinalizeSettingsController (usc);
2272a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    usc.reset();
2282a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice}
2292a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice
23063094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebuggerSP
23163094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::CreateInstance ()
23263094e0bb161580564954dee512955c1c79d3476Greg Clayton{
23363094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerSP debugger_sp (new Debugger);
23463094e0bb161580564954dee512955c1c79d3476Greg Clayton    // Scope for locker
23563094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
23663094e0bb161580564954dee512955c1c79d3476Greg Clayton        Mutex::Locker locker (GetDebuggerListMutex ());
23763094e0bb161580564954dee512955c1c79d3476Greg Clayton        GetDebuggerList().push_back(debugger_sp);
23863094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
23963094e0bb161580564954dee512955c1c79d3476Greg Clayton    return debugger_sp;
24063094e0bb161580564954dee512955c1c79d3476Greg Clayton}
24163094e0bb161580564954dee512955c1c79d3476Greg Clayton
242c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Ticevoid
243987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::Destroy (DebuggerSP &debugger_sp)
244c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice{
245c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice    if (debugger_sp.get() == NULL)
246c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice        return;
247c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice
248c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham    debugger_sp->Clear();
249c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham
250c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice    Mutex::Locker locker (GetDebuggerListMutex ());
251c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice    DebuggerList &debugger_list = GetDebuggerList ();
252c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice    DebuggerList::iterator pos, end = debugger_list.end();
253c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice    for (pos = debugger_list.begin (); pos != end; ++pos)
254c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice    {
255c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice        if ((*pos).get() == debugger_sp.get())
256c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice        {
257c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice            debugger_list.erase (pos);
258c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice            return;
259c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice        }
260c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice    }
261c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice}
262c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice
263987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebuggerSP
26463094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::GetSP ()
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
266987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    // This object contains an instrusive ref count base class so we can
267987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    // easily make a shared pointer to this object
268987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    return DebuggerSP (this);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebuggerSP
2726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::FindDebuggerWithInstanceName (const ConstString &instance_name)
2736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
274987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    DebuggerSP debugger_sp;
2756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    Mutex::Locker locker (GetDebuggerListMutex ());
2776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    DebuggerList &debugger_list = GetDebuggerList();
2786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    DebuggerList::iterator pos, end = debugger_list.end();
2796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    for (pos = debugger_list.begin(); pos != end; ++pos)
2816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
2826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if ((*pos).get()->m_instance_name == instance_name)
2836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
2846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            debugger_sp = *pos;
2856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            break;
2866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
2876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
2886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return debugger_sp;
2896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
29063094e0bb161580564954dee512955c1c79d3476Greg Clayton
29163094e0bb161580564954dee512955c1c79d3476Greg ClaytonTargetSP
29263094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::FindTargetWithProcessID (lldb::pid_t pid)
29363094e0bb161580564954dee512955c1c79d3476Greg Clayton{
294987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    TargetSP target_sp;
29563094e0bb161580564954dee512955c1c79d3476Greg Clayton    Mutex::Locker locker (GetDebuggerListMutex ());
29663094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerList &debugger_list = GetDebuggerList();
29763094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerList::iterator pos, end = debugger_list.end();
29863094e0bb161580564954dee512955c1c79d3476Greg Clayton    for (pos = debugger_list.begin(); pos != end; ++pos)
29963094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
30063094e0bb161580564954dee512955c1c79d3476Greg Clayton        target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid);
30163094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (target_sp)
30263094e0bb161580564954dee512955c1c79d3476Greg Clayton            break;
30363094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
30463094e0bb161580564954dee512955c1c79d3476Greg Clayton    return target_sp;
30563094e0bb161580564954dee512955c1c79d3476Greg Clayton}
30663094e0bb161580564954dee512955c1c79d3476Greg Clayton
3071c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonTargetSP
3081c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonDebugger::FindTargetWithProcess (Process *process)
3091c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton{
3101c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    TargetSP target_sp;
3111c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    Mutex::Locker locker (GetDebuggerListMutex ());
3121c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    DebuggerList &debugger_list = GetDebuggerList();
3131c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    DebuggerList::iterator pos, end = debugger_list.end();
3141c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    for (pos = debugger_list.begin(); pos != end; ++pos)
3151c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    {
3161c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton        target_sp = (*pos)->GetTargetList().FindTargetWithProcess (process);
3171c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton        if (target_sp)
3181c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton            break;
3191c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    }
3201c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    return target_sp;
3211c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton}
3221c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton
32363094e0bb161580564954dee512955c1c79d3476Greg Clayton
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Debugger () :
325558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    UserID (g_unique_id++),
326c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton    DebuggerInstanceSettings (*GetSettingsController()),
327eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton    m_input_comm("debugger.input"),
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_file (),
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_output_file (),
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error_file (),
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_list (),
332b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_platform_list (),
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_listener ("lldb.Debugger"),
334cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham    m_source_manager(*this),
335cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham    m_source_file_cache(),
33663094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)),
337d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice    m_input_reader_stack (),
3384b40711e7950310afb74835820eb669004cd8c44Greg Clayton    m_input_reader_data ()
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34063094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_interpreter_ap->Initialize ();
341b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // Always add our default platform to the platform list
342b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    PlatformSP default_platform_sp (Platform::GetDefaultPlatform());
343b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    assert (default_platform_sp.get());
344b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_platform_list.Append (default_platform_sp, true);
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::~Debugger ()
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
349c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham    Clear();
350c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham}
351c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham
352c0c53249938e49e006a982057e9106a97da5ea89Jim Inghamvoid
353c0c53249938e49e006a982057e9106a97da5ea89Jim InghamDebugger::Clear()
354c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham{
355c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice    CleanUpInputReaders();
3562f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    m_listener.Clear();
35763094e0bb161580564954dee512955c1c79d3476Greg Clayton    int num_targets = m_target_list.GetNumTargets();
35863094e0bb161580564954dee512955c1c79d3476Greg Clayton    for (int i = 0; i < num_targets; i++)
35963094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
36063094e0bb161580564954dee512955c1c79d3476Greg Clayton        ProcessSP process_sp (m_target_list.GetTargetAtIndex (i)->GetProcessSP());
36163094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (process_sp)
362c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham        {
363ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            if (process_sp->GetShouldDetach())
364c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham                process_sp->Detach();
365c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham            else
366c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham                process_sp->Destroy();
367c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham        }
36863094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
36963094e0bb161580564954dee512955c1c79d3476Greg Clayton    DisconnectInput();
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
371c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham}
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
374421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::GetCloseInputOnEOF () const
375421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{
376421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton    return m_input_comm.GetCloseOnEOF();
377421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton}
378421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton
379421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonvoid
380421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::SetCloseInputOnEOF (bool b)
381421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{
382421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton    m_input_comm.SetCloseOnEOF(b);
383421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton}
384421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton
385421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonbool
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetAsyncExecution ()
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38863094e0bb161580564954dee512955c1c79d3476Greg Clayton    return !m_command_interpreter_ap->GetSynchronous();
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetAsyncExecution (bool async_execution)
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39463094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_interpreter_ap->SetSynchronous (!async_execution);
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership)
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4015892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File &in_file = GetInputFile();
4025892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    in_file.SetStream (fh, tranfer_ownership);
4035892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    if (in_file.IsValid() == false)
4045892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        in_file.SetStream (stdin, true);
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Disconnect from any old connection if we had one
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.Disconnect ();
4085892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    m_input_comm.SetConnection (new ConnectionFileDescriptor (in_file.GetDescriptor(), true));
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this);
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_input_comm.StartReadThread (&error) == false)
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4145892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        File &err_file = GetErrorFile();
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4165892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        err_file.Printf ("error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error");
4175892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        exit(1);
4185892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    }
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership)
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4245892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File &out_file = GetOutputFile();
4255892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    out_file.SetStream (fh, tranfer_ownership);
4265892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    if (out_file.IsValid() == false)
4275892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        out_file.SetStream (stdout, false);
4280aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice
4290aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    GetCommandInterpreter().GetScriptInterpreter()->ResetOutputFileHandle (fh);
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership)
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4355892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File &err_file = GetErrorFile();
4365892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    err_file.SetStream (fh, tranfer_ownership);
4375892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    if (err_file.IsValid() == false)
4385892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        err_file.SetStream (stderr, false);
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerExecutionContext
442c833295baeec641086f536e78050388af36784f8Jim InghamDebugger::GetSelectedExecutionContext ()
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ExecutionContext exe_ctx;
445567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    TargetSP target_sp(GetSelectedTarget());
446567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    exe_ctx.SetTargetSP (target_sp);
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_sp)
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
450567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        ProcessSP process_sp (target_sp->GetProcessSP());
451567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        exe_ctx.SetProcessSP (process_sp);
452567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (process_sp && process_sp->IsRunning() == false)
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread());
455567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (thread_sp)
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                exe_ctx.SetThreadSP (thread_sp);
458567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame());
459567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (exe_ctx.GetFramePtr() == NULL)
460567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0));
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return exe_ctx;
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4687f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceInputReaderSP
4697f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceDebugger::GetCurrentInputReader ()
4707f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice{
4717f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    InputReaderSP reader_sp;
4727f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice
473d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice    if (!m_input_reader_stack.IsEmpty())
4747f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    {
4757f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        // Clear any finished readers from the stack
4767f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        while (CheckIfTopInputReaderIsDone()) ;
4777f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice
478d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice        if (!m_input_reader_stack.IsEmpty())
479d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice            reader_sp = m_input_reader_stack.Top();
4807f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    }
4817f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice
4827f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    return reader_sp;
4837f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice}
4847f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len)
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
488c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    if (bytes_len > 0)
489c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len);
490c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    else
491c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        ((Debugger *)baton)->DispatchInputEndOfFile ();
492c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice}
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInput (const char *bytes, size_t bytes_len)
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
498c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    if (bytes == NULL || bytes_len == 0)
499c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        return;
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WriteToDefaultReader (bytes, bytes_len);
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
505c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputInterrupt ()
506c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{
507c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    m_input_reader_data.clear();
508c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
5097f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    InputReaderSP reader_sp (GetCurrentInputReader ());
5107f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    if (reader_sp)
511c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    {
5127f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        reader_sp->Notify (eInputReaderInterrupt);
513c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
5147f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        // If notifying the reader of the interrupt finished the reader, we should pop it off the stack.
515c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        while (CheckIfTopInputReaderIsDone ()) ;
516c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    }
517c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice}
518c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
519c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid
520c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputEndOfFile ()
521c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{
522c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    m_input_reader_data.clear();
523c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
5247f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    InputReaderSP reader_sp (GetCurrentInputReader ());
5257f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    if (reader_sp)
526c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    {
5277f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        reader_sp->Notify (eInputReaderEndOfFile);
528c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
5297f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        // If notifying the reader of the end-of-file finished the reader, we should pop it off the stack.
530c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        while (CheckIfTopInputReaderIsDone ()) ;
531c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    }
532c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice}
533c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
534c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid
535c0446861315ac0d5994f93510e24cbcac9f534adCaroline TiceDebugger::CleanUpInputReaders ()
536c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice{
537c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice    m_input_reader_data.clear();
538c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice
5397f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    // The bottom input reader should be the main debugger input reader.  We do not want to close that one here.
540d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice    while (m_input_reader_stack.GetSize() > 1)
541c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice    {
5427f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        InputReaderSP reader_sp (GetCurrentInputReader ());
543c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice        if (reader_sp)
544c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice        {
545c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice            reader_sp->Notify (eInputReaderEndOfFile);
546c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice            reader_sp->SetIsDone (true);
547c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice        }
548c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice    }
549c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice}
550c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice
551c0446861315ac0d5994f93510e24cbcac9f534adCaroline Ticevoid
5524a348081030cdd2af758fddc869518357d9befd3Caroline TiceDebugger::NotifyTopInputReader (InputReaderAction notification)
5534a348081030cdd2af758fddc869518357d9befd3Caroline Tice{
5544a348081030cdd2af758fddc869518357d9befd3Caroline Tice    InputReaderSP reader_sp (GetCurrentInputReader());
5554a348081030cdd2af758fddc869518357d9befd3Caroline Tice    if (reader_sp)
5564a348081030cdd2af758fddc869518357d9befd3Caroline Tice	{
5574a348081030cdd2af758fddc869518357d9befd3Caroline Tice        reader_sp->Notify (notification);
5584a348081030cdd2af758fddc869518357d9befd3Caroline Tice
5594a348081030cdd2af758fddc869518357d9befd3Caroline Tice        // Flush out any input readers that are done.
5604a348081030cdd2af758fddc869518357d9befd3Caroline Tice        while (CheckIfTopInputReaderIsDone ())
5614a348081030cdd2af758fddc869518357d9befd3Caroline Tice            /* Do nothing. */;
5624a348081030cdd2af758fddc869518357d9befd3Caroline Tice    }
5634a348081030cdd2af758fddc869518357d9befd3Caroline Tice}
5644a348081030cdd2af758fddc869518357d9befd3Caroline Tice
565b38df1e945846a5d956974ec157902a6ad748868Caroline Ticebool
566987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::InputReaderIsTopReader (const InputReaderSP& reader_sp)
567b38df1e945846a5d956974ec157902a6ad748868Caroline Tice{
568892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice    InputReaderSP top_reader_sp (GetCurrentInputReader());
569b38df1e945846a5d956974ec157902a6ad748868Caroline Tice
570892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice    return (reader_sp.get() == top_reader_sp.get());
571b38df1e945846a5d956974ec157902a6ad748868Caroline Tice}
572b38df1e945846a5d956974ec157902a6ad748868Caroline Tice
573b38df1e945846a5d956974ec157902a6ad748868Caroline Tice
5744a348081030cdd2af758fddc869518357d9befd3Caroline Ticevoid
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::WriteToDefaultReader (const char *bytes, size_t bytes_len)
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bytes && bytes_len)
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_input_reader_data.append (bytes, bytes_len);
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_input_reader_data.empty())
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
583d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice    while (!m_input_reader_stack.IsEmpty() && !m_input_reader_data.empty())
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get the input reader from the top of the stack
5867f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        InputReaderSP reader_sp (GetCurrentInputReader ());
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!reader_sp)
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59053d68e749f0715691a95f23e9490d97e484b15daGreg Clayton        size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(),
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          m_input_reader_data.size());
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bytes_handled)
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_input_reader_data.erase (0, bytes_handled);
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No bytes were handled, we might not have reached our
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // granularity, just return and wait for more data
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6047f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    // Flush out any input readers that are done.
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (CheckIfTopInputReaderIsDone ())
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        /* Do nothing. */;
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PushInputReader (const InputReaderSP& reader_sp)
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!reader_sp)
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
6157f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice
6167f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    // Deactivate the old top reader
6177f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    InputReaderSP top_reader_sp (GetCurrentInputReader ());
6187f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice
6197f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice    if (top_reader_sp)
6207f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        top_reader_sp->Notify (eInputReaderDeactivate);
6217f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice
622d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice    m_input_reader_stack.Push (reader_sp);
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    reader_sp->Notify (eInputReaderActivate);
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ActivateInputReader (reader_sp);
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
628987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::PopInputReader (const InputReaderSP& pop_reader_sp)
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool result = false;
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The reader on the stop of the stack is done, so let the next
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // read on the stack referesh its prompt and if there is one...
634d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice    if (!m_input_reader_stack.IsEmpty())
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6367f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        // Cannot call GetCurrentInputReader here, as that would cause an infinite loop.
637d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice        InputReaderSP reader_sp(m_input_reader_stack.Top());
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get())
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
641d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice            m_input_reader_stack.Pop ();
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            reader_sp->Notify (eInputReaderDeactivate);
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            reader_sp->Notify (eInputReaderDone);
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result = true;
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
646d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice            if (!m_input_reader_stack.IsEmpty())
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
648d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice                reader_sp = m_input_reader_stack.Top();
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (reader_sp)
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ActivateInputReader (reader_sp);
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    reader_sp->Notify (eInputReaderReactivate);
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::CheckIfTopInputReaderIsDone ()
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool result = false;
664d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice    if (!m_input_reader_stack.IsEmpty())
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6667f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice        // Cannot call GetCurrentInputReader here, as that would cause an infinite loop.
667d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice        InputReaderSP reader_sp(m_input_reader_stack.Top());
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (reader_sp && reader_sp->IsDone())
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result = true;
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PopInputReader (reader_sp);
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::ActivateInputReader (const InputReaderSP &reader_sp)
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6815892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    int input_fd = m_input_file.GetFile().GetDescriptor();
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6835892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    if (input_fd >= 0)
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6855892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        Terminal tty(input_fd);
6860fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton
6870fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton        tty.SetEcho(reader_sp->GetEcho());
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6890fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton        switch (reader_sp->GetGranularity())
6900fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton        {
6910fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton        case eInputReaderGranularityByte:
6920fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton        case eInputReaderGranularityWord:
6930fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton            tty.SetCanonical (false);
6940fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton            break;
6950fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton
6960fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton        case eInputReaderGranularityLine:
6970fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton        case eInputReaderGranularityAll:
6980fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton            tty.SetCanonical (true);
6990fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton            break;
7000fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton
7010fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton        default:
7020fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton            break;
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70663094e0bb161580564954dee512955c1c79d3476Greg Clayton
707e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP
708e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncOutputStream ()
709e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{
710e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham    return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(),
711e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham                                               CommandInterpreter::eBroadcastBitAsynchronousOutputData));
712e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham}
713e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham
714e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP
715e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncErrorStream ()
716e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{
717e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham    return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(),
718e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham                                               CommandInterpreter::eBroadcastBitAsynchronousErrorData));
719e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham}
720e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham
721558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebuggerSP
722558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebugger::FindDebuggerWithID (lldb::user_id_t id)
723558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice{
724987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    DebuggerSP debugger_sp;
725558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice
726558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    Mutex::Locker locker (GetDebuggerListMutex ());
727558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    DebuggerList &debugger_list = GetDebuggerList();
728558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    DebuggerList::iterator pos, end = debugger_list.end();
729558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    for (pos = debugger_list.begin(); pos != end; ++pos)
730558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    {
731558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice        if ((*pos).get()->GetID() == id)
732558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice        {
733558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice            debugger_sp = *pos;
734558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice            break;
735558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice        }
736558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    }
737558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    return debugger_sp;
738558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice}
7396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
740d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic void
741d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonTestPromptFormats (StackFrame *frame)
742d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{
743d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    if (frame == NULL)
744d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        return;
745d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
746d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    StreamString s;
747d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    const char *prompt_format =
748d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{addr = '${addr}'\n}"
749d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{process.id = '${process.id}'\n}"
750d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{process.name = '${process.name}'\n}"
751d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{process.file.basename = '${process.file.basename}'\n}"
752d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{process.file.fullpath = '${process.file.fullpath}'\n}"
753d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{thread.id = '${thread.id}'\n}"
754d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{thread.index = '${thread.index}'\n}"
755d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{thread.name = '${thread.name}'\n}"
756d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{thread.queue = '${thread.queue}'\n}"
757d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{thread.stop-reason = '${thread.stop-reason}'\n}"
758d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{target.arch = '${target.arch}'\n}"
759d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{module.file.basename = '${module.file.basename}'\n}"
760d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{module.file.fullpath = '${module.file.fullpath}'\n}"
761d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{file.basename = '${file.basename}'\n}"
762d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{file.fullpath = '${file.fullpath}'\n}"
763d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.index = '${frame.index}'\n}"
764d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.pc = '${frame.pc}'\n}"
765d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.sp = '${frame.sp}'\n}"
766d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.fp = '${frame.fp}'\n}"
767d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.flags = '${frame.flags}'\n}"
768d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.reg.rdi = '${frame.reg.rdi}'\n}"
769d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.reg.rip = '${frame.reg.rip}'\n}"
770d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.reg.rsp = '${frame.reg.rsp}'\n}"
771d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.reg.rbp = '${frame.reg.rbp}'\n}"
772d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.reg.rflags = '${frame.reg.rflags}'\n}"
773d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.reg.xmm0 = '${frame.reg.xmm0}'\n}"
774d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{frame.reg.carp = '${frame.reg.carp}'\n}"
775d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{function.id = '${function.id}'\n}"
776d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{function.name = '${function.name}'\n}"
777d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{function.addr-offset = '${function.addr-offset}'\n}"
778d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{function.line-offset = '${function.line-offset}'\n}"
779d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{function.pc-offset = '${function.pc-offset}'\n}"
780d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{line.file.basename = '${line.file.basename}'\n}"
781d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{line.file.fullpath = '${line.file.fullpath}'\n}"
782d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{line.number = '${line.number}'\n}"
783d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{line.start-addr = '${line.start-addr}'\n}"
784d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    "{line.end-addr = '${line.end-addr}'\n}"
785d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton;
786d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
787d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    SymbolContext sc (frame->GetSymbolContext(eSymbolContextEverything));
788d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    ExecutionContext exe_ctx;
789a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    frame->CalculateExecutionContext(exe_ctx);
790d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    const char *end = NULL;
791d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    if (Debugger::FormatPrompt (prompt_format, &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, &end))
792d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    {
793d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        printf("%s\n", s.GetData());
794d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    }
795d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    else
796d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    {
797d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        printf ("error: at '%s'\n", end);
798d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        printf ("what we got: %s\n", s.GetData());
799d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    }
800d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton}
801d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
8029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool
8032c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanFormatDescriptor (const char* var_name_begin,
8042c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                      const char* var_name_end,
8052c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                      const char** var_name_final,
8062c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                      const char** percent_position,
807987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton                      Format* custom_format,
8082c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                      ValueObject::ValueObjectRepresentationStyle* val_obj_display)
8099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
810de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
8119762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    *percent_position = ::strchr(var_name_begin,'%');
812107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    if (!*percent_position || *percent_position > var_name_end)
813de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    {
814de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        if (log)
815de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            log->Printf("no format descriptor in string, skipping");
8169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        *var_name_final = var_name_end;
817de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    }
8189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    else
8199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
8209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        *var_name_final = *percent_position;
8219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        char* format_name = new char[var_name_end-*var_name_final]; format_name[var_name_end-*var_name_final-1] = '\0';
8229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        memcpy(format_name, *var_name_final+1, var_name_end-*var_name_final-1);
823de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        if (log)
824de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            log->Printf("parsing %s as a format descriptor", format_name);
8259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if ( !FormatManager::GetFormatFromCString(format_name,
8269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                  true,
8279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                  *custom_format) )
8289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
829de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (log)
830de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                log->Printf("%s is an unknown format", format_name);
8319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // if this is an @ sign, print ObjC description
832107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (*format_name == '@')
8339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                *val_obj_display = ValueObject::eDisplayLanguageSpecific;
8349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // if this is a V, print the value using the default format
835de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            else if (*format_name == 'V')
8369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                *val_obj_display = ValueObject::eDisplayValue;
837e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            // if this is an L, print the location of the value
838de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            else if (*format_name == 'L')
839f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                *val_obj_display = ValueObject::eDisplayLocation;
840e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            // if this is an S, print the summary after all
841de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            else if (*format_name == 'S')
842e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                *val_obj_display = ValueObject::eDisplaySummary;
8434e5397c1127d698c61df295f30909e573a1c9876Enrico Granata            else if (*format_name == '#')
8444e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                *val_obj_display = ValueObject::eDisplayChildrenCount;
8456f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata            else if (*format_name == 'T')
8466f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                *val_obj_display = ValueObject::eDisplayType;
847de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            else if (log)
848de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                log->Printf("%s is an error, leaving the previous value alone", format_name);
8499762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
8509762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // a good custom format tells us to print the value using it
8519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        else
852de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        {
853de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (log)
854de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                log->Printf("will display value for this VO");
8559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            *val_obj_display = ValueObject::eDisplayValue;
856de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        }
8579762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        delete format_name;
8589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
859de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    if (log)
860de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        log->Printf("final format description outcome: custom_format = %d, val_obj_display = %d",
861de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                    *custom_format,
862de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                    *val_obj_display);
8639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return true;
8649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
8659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
8669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool
8672c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanBracketedRange (const char* var_name_begin,
8682c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                    const char* var_name_end,
8692c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                    const char* var_name_final,
8702c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                    const char** open_bracket_position,
8712c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                    const char** separator_position,
8722c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                    const char** close_bracket_position,
8732c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                    const char** var_name_final_if_array_range,
8742c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                    int64_t* index_lower,
8752c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                    int64_t* index_higher)
8769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
877de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
8789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    *open_bracket_position = ::strchr(var_name_begin,'[');
879107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    if (*open_bracket_position && *open_bracket_position < var_name_final)
8809762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
8819762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        *separator_position = ::strchr(*open_bracket_position,'-'); // might be NULL if this is a simple var[N] bitfield
8829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        *close_bracket_position = ::strchr(*open_bracket_position,']');
8839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // as usual, we assume that [] will come before %
8849762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        //printf("trying to expand a []\n");
8859762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        *var_name_final_if_array_range = *open_bracket_position;
886107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        if (*close_bracket_position - *open_bracket_position == 1)
8879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
888de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (log)
889de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                log->Printf("[] detected.. going from 0 to end of data");
8909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            *index_lower = 0;
8919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
8929762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        else if (*separator_position == NULL || *separator_position > var_name_end)
8939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
8949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            char *end = NULL;
8959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            *index_lower = ::strtoul (*open_bracket_position+1, &end, 0);
8969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            *index_higher = *index_lower;
897de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (log)
8987e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda                log->Printf("[%lld] detected, high index is same", *index_lower);
8999762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
900107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        else if (*close_bracket_position && *close_bracket_position < var_name_end)
9019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
9029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            char *end = NULL;
9039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            *index_lower = ::strtoul (*open_bracket_position+1, &end, 0);
9049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            *index_higher = ::strtoul (*separator_position+1, &end, 0);
905de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (log)
9067e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda                log->Printf("[%lld-%lld] detected", *index_lower, *index_higher);
9079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
9089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        else
909de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        {
910de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (log)
911de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                log->Printf("expression is erroneous, cannot extract indices out of it");
9129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            return false;
913de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        }
9149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (*index_lower > *index_higher && *index_higher > 0)
9159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
916de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (log)
917de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                log->Printf("swapping indices");
9189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            int temp = *index_lower;
9199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            *index_lower = *index_higher;
9209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            *index_higher = temp;
9219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
9229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
923de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    else if (log)
924de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            log->Printf("no bracketed range, skipping entirely");
9259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return true;
9269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
9279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
9289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
9299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic ValueObjectSP
9302c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataExpandExpressionPath (ValueObject* valobj,
9312c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                      StackFrame* frame,
9322c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                      bool* do_deref_pointer,
9332c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                      const char* var_name_begin,
9342c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                      const char* var_name_final,
9352c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                      Error& error)
9369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
937de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
9389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    StreamString sstring;
9399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    VariableSP var_sp;
9409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
941107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    if (*do_deref_pointer)
942de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    {
943de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        if (log)
944de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            log->Printf("been told to deref_pointer by caller");
9459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        sstring.PutChar('*');
946de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    }
947f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata    else if (valobj->IsDereferenceOfParent() && ClangASTContext::IsPointerType(valobj->GetParent()->GetClangType()) && !valobj->IsArrayItemForPointer())
9489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
949de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        if (log)
950de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            log->Printf("decided to deref_pointer myself");
9519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        sstring.PutChar('*');
9529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        *do_deref_pointer = true;
9539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
9549762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
955f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata    valobj->GetExpressionPath(sstring, true, ValueObject::eHonorPointers);
956de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    if (log)
957de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        log->Printf("expression path to expand in phase 0: %s",sstring.GetData());
9589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    sstring.PutRawBytes(var_name_begin+3, var_name_final-var_name_begin-3);
959de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    if (log)
960de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        log->Printf("expression path to expand in phase 1: %s",sstring.GetData());
9619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    std::string name = std::string(sstring.GetData());
9629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    ValueObjectSP target = frame->GetValueForVariableExpressionPath (name.c_str(),
9639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                                     eNoDynamicValues,
9649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                                     0,
9659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                                     var_sp,
9669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                                     error);
9679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return target;
9689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
9699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
9709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic ValueObjectSP
9712c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataExpandIndexedExpression (ValueObject* valobj,
9722c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                         uint32_t index,
9732c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                         StackFrame* frame,
9742c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                         bool deref_pointer)
9759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
976de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
977ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    const char* ptr_deref_format = "[%d]";
978ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    std::auto_ptr<char> ptr_deref_buffer(new char[10]);
979ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ::sprintf(ptr_deref_buffer.get(), ptr_deref_format, index);
980de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    if (log)
981de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        log->Printf("name to deref: %s",ptr_deref_buffer.get());
982ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    const char* first_unparsed;
983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObject::GetValueForExpressionPathOptions options;
984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObject::ExpressionPathEndResultType final_value_type;
985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObject::ExpressionPathScanEndReason reason_to_stop;
986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObject::ExpressionPathAftermath what_next = (deref_pointer ? ValueObject::eDereference : ValueObject::eNothing);
987f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata    ValueObjectSP item = valobj->GetValueForExpressionPath (ptr_deref_buffer.get(),
988ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                          &first_unparsed,
989ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                          &reason_to_stop,
990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                          &final_value_type,
991ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                          options,
992ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                          &what_next);
993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (!item)
994ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
995de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        if (log)
996de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            log->Printf("ERROR: unparsed portion = %s, why stopping = %d,"
997de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata               " final_value_type %d",
998ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata               first_unparsed, reason_to_stop, final_value_type);
9999762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
1000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    else
1001ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1002de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        if (log)
1003de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            log->Printf("ALL RIGHT: unparsed portion = %s, why stopping = %d,"
1004de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata               " final_value_type %d",
1005ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata               first_unparsed, reason_to_stop, final_value_type);
1006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
10079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return item;
10089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
10099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
1010d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonbool
1011d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::FormatPrompt
1012d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton(
1013d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    const char *format,
1014d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    const SymbolContext *sc,
1015d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    const ExecutionContext *exe_ctx,
1016d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    const Address *addr,
1017d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    Stream &s,
10181391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    const char **end,
1019f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata    ValueObject* valobj
1020d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton)
1021d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{
1022f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata    ValueObject* realvalobj = NULL; // makes it super-easy to parse pointers
1023d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    bool success = true;
1024d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    const char *p;
1025de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
1026d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    for (p = format; *p != '\0'; ++p)
1027d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    {
1028f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata        if (realvalobj)
10291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        {
1030f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata            valobj = realvalobj;
1031f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata            realvalobj = NULL;
10321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        }
1033d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        size_t non_special_chars = ::strcspn (p, "${}\\");
1034d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        if (non_special_chars > 0)
1035d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        {
1036d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            if (success)
1037d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                s.Write (p, non_special_chars);
1038d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            p += non_special_chars;
1039d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        }
1040d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1041d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        if (*p == '\0')
1042d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        {
1043d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            break;
1044d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        }
1045d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        else if (*p == '{')
1046d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        {
1047d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // Start a new scope that must have everything it needs if it is to
1048d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // to make it into the final output stream "s". If you want to make
1049d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // a format that only prints out the function or symbol name if there
1050d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // is one in the symbol context you can use:
1051d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            //      "{function =${function.name}}"
1052d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // The first '{' starts a new scope that end with the matching '}' at
1053d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // the end of the string. The contents "function =${function.name}"
1054d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // will then be evaluated and only be output if there is a function
1055d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // or symbol with a valid name.
1056d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            StreamString sub_strm;
1057d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1058d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            ++p;  // Skip the '{'
1059d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1060f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata            if (FormatPrompt (p, sc, exe_ctx, addr, sub_strm, &p, valobj))
1061d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            {
1062d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                // The stream had all it needed
1063d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                s.Write(sub_strm.GetData(), sub_strm.GetSize());
1064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            }
1065d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            if (*p != '}')
1066d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            {
1067d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                success = false;
1068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                break;
1069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            }
1070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        }
1071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        else if (*p == '}')
1072d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        {
1073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // End of a enclosing scope
1074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            break;
1075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        }
1076d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        else if (*p == '$')
1077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        {
1078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            // We have a prompt variable to print
1079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            ++p;
1080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            if (*p == '{')
1081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            {
1082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                ++p;
1083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                const char *var_name_begin = p;
1084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                const char *var_name_end = ::strchr (p, '}');
1085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                if (var_name_end && var_name_begin < var_name_end)
1087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                {
1088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    // if we have already failed to parse, skip this variable
1089d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    if (success)
1090d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    {
1091d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        const char *cstr = NULL;
1092d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        Address format_addr;
1093d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        bool calculate_format_addr_function_offset = false;
1094d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        // Set reg_kind and reg_num to invalid values
1095d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        RegisterKind reg_kind = kNumRegisterKinds;
1096d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        uint32_t reg_num = LLDB_INVALID_REGNUM;
1097d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        FileSpec format_file_spec;
1098b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                        const RegisterInfo *reg_info = NULL;
1099d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        RegisterContext *reg_ctx = NULL;
11009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                        bool do_deref_pointer = false;
1101de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        ValueObject::ExpressionPathScanEndReason reason_to_stop = ValueObject::eEndOfString;
1102de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        ValueObject::ExpressionPathEndResultType final_value_type = ValueObject::ePlain;
1103ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1104d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        // Each variable must set success to true below...
1105d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        bool var_success = false;
1106d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        switch (var_name_begin[0])
1107d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        {
11081391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        case '*':
11091391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        case 'v':
1110979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                        case 's':
11111391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            {
1112f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata                                if (!valobj)
1113979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                    break;
1114979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1115afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                if (log)
1116afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                    log->Printf("initial string: %s",var_name_begin);
1117afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
1118979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                // check for *var and *svar
1119979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                if (*var_name_begin == '*')
1120979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                {
1121979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                    do_deref_pointer = true;
1122979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                    var_name_begin++;
1123979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                }
1124afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
1125afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                if (log)
1126afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                    log->Printf("initial string: %s",var_name_begin);
1127afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
1128979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                if (*var_name_begin == 's')
1129979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                {
1130987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton                                    valobj = valobj->GetSyntheticValue(eUseSyntheticFilter).get();
1131979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                    var_name_begin++;
1132979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                }
1133979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1134afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                if (log)
1135afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                    log->Printf("initial string: %s",var_name_begin);
1136afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
1137979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                // should be a 'v' by now
1138979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                if (*var_name_begin != 'v')
1139979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                    break;
1140979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1141afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                if (log)
1142afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                    log->Printf("initial string: %s",var_name_begin);
1143afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
1144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                ValueObject::ExpressionPathAftermath what_next = (do_deref_pointer ?
1145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                                                  ValueObject::eDereference : ValueObject::eNothing);
1146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                ValueObject::GetValueForExpressionPathOptions options;
11479c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata                                options.DontCheckDotVsArrowSyntax().DoAllowBitfieldSyntax().DoAllowFragileIVar().DoAllowSyntheticChildren();
1148107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                ValueObject::ValueObjectRepresentationStyle val_obj_display = ValueObject::eDisplaySummary;
1149107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                ValueObject* target = NULL;
1150987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton                                Format custom_format = eFormatInvalid;
1151107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                const char* var_name_final = NULL;
1152107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                const char* var_name_final_if_array_range = NULL;
1153107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                const char* close_bracket_position = NULL;
1154107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                int64_t index_lower = -1;
1155107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                int64_t index_higher = -1;
1156107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                bool is_array_range = false;
1157ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                const char* first_unparsed;
11581c61743af946076e988d88baf725382e99d905deEnrico Granata                                bool was_plain_var = false;
11591c61743af946076e988d88baf725382e99d905deEnrico Granata                                bool was_var_format = false;
1160ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1161f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata                                if (!valobj) break;
1162f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata                                // simplest case ${var}, just print valobj's value
1163107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                if (::strncmp (var_name_begin, "var}", strlen("var}")) == 0)
1164107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                {
11651c61743af946076e988d88baf725382e99d905deEnrico Granata                                    was_plain_var = true;
1166f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata                                    target = valobj;
1167107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    val_obj_display = ValueObject::eDisplayValue;
1168107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                }
1169107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                else if (::strncmp(var_name_begin,"var%",strlen("var%")) == 0)
1170107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                {
11711c61743af946076e988d88baf725382e99d905deEnrico Granata                                    was_var_format = true;
1172107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    // this is a variable with some custom format applied to it
1173107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    const char* percent_position;
1174f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata                                    target = valobj;
1175107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    val_obj_display = ValueObject::eDisplayValue;
1176107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    ScanFormatDescriptor (var_name_begin,
1177107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          var_name_end,
1178107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          &var_name_final,
1179107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          &percent_position,
1180107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          &custom_format,
1181107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          &val_obj_display);
1182107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                }
1183107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    // this is ${var.something} or multiple .something nested
1184107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                else if (::strncmp (var_name_begin, "var", strlen("var")) == 0)
11851391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                {
1186107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1187107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    const char* percent_position;
1188107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    ScanFormatDescriptor (var_name_begin,
1189107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          var_name_end,
1190107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          &var_name_final,
1191107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          &percent_position,
1192107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          &custom_format,
1193107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                          &val_obj_display);
1194107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1195107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    const char* open_bracket_position;
1196107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    const char* separator_position;
1197107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    ScanBracketedRange (var_name_begin,
1198107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                        var_name_end,
1199107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                        var_name_final,
1200107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                        &open_bracket_position,
1201107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                        &separator_position,
1202107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                        &close_bracket_position,
1203107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                        &var_name_final_if_array_range,
1204107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                        &index_lower,
1205107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                                        &index_higher);
1206107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1207107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    Error error;
1208ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1209ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                    std::auto_ptr<char> expr_path(new char[var_name_final-var_name_begin-1]);
1210ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                    ::memset(expr_path.get(), 0, var_name_final-var_name_begin-1);
1211ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                    memcpy(expr_path.get(), var_name_begin+3,var_name_final-var_name_begin-3);
1212ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1213de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                    if (log)
1214de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                        log->Printf("symbol to expand: %s",expr_path.get());
1215ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1216f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata                                    target = valobj->GetValueForExpressionPath(expr_path.get(),
1217ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                                             &first_unparsed,
1218ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                                             &reason_to_stop,
1219ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                                             &final_value_type,
1220ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                                             options,
1221ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                                             &what_next).get();
1222ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1223ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                    if (!target)
1224107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    {
1225de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                        if (log)
1226de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                            log->Printf("ERROR: unparsed portion = %s, why stopping = %d,"
1227de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                               " final_value_type %d",
1228ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                               first_unparsed, reason_to_stop, final_value_type);
1229ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        break;
12309762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                    }
1231ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                    else
1232ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                    {
1233de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                        if (log)
1234de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                            log->Printf("ALL RIGHT: unparsed portion = %s, why stopping = %d,"
1235de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                               " final_value_type %d",
1236ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                               first_unparsed, reason_to_stop, final_value_type);
1237ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                    }
1238107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                }
1239107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                else
12409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                    break;
1241ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1242ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                is_array_range = (final_value_type == ValueObject::eBoundedRange ||
1243ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                  final_value_type == ValueObject::eUnboundedRange);
1244ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1245ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                do_deref_pointer = (what_next == ValueObject::eDereference);
1246107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
124713cb5406e7f013ca7c15b370ec2fa72f9a911ab5Enrico Granata                                if (do_deref_pointer && !is_array_range)
12489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                {
1249107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    // I have not deref-ed yet, let's do it
1250107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    // this happens when we are not going through GetValueForVariableExpressionPath
1251107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    // to get to the target ValueObject
1252107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    Error error;
1253107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    target = target->Dereference(error).get();
12542c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                                    if (error.Fail())
12552c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                                    {
12562c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                                        if (log)
12572c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                                            log->Printf("ERROR: %s\n", error.AsCString("unknown")); \
12582c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                                        break;
12592c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata                                    }
1260107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    do_deref_pointer = false;
12619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                }
126286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
12631c61743af946076e988d88baf725382e99d905deEnrico Granata                                // TODO use flags for these
126486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                bool is_array = ClangASTContext::IsArrayType(target->GetClangType());
126586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                bool is_pointer = ClangASTContext::IsPointerType(target->GetClangType());
12661c61743af946076e988d88baf725382e99d905deEnrico Granata                                bool is_aggregate = ClangASTContext::IsAggregateType(target->GetClangType());
126786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
126886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                if ((is_array || is_pointer) && (!is_array_range) && val_obj_display == ValueObject::eDisplayValue) // this should be wrong, but there are some exceptions
126986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                {
12701c61743af946076e988d88baf725382e99d905deEnrico Granata                                    StreamString str_temp;
1271de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                    if (log)
1272de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                        log->Printf("I am into array || pointer && !range");
12736f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata
12746f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                    if (target->HasSpecialCasesForPrintableRepresentation(val_obj_display,
12756f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                                                                          custom_format))
12761c61743af946076e988d88baf725382e99d905deEnrico Granata                                    {
12776f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        // try to use the special cases
12786f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        var_success = target->DumpPrintableRepresentation(str_temp,
12796f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                                                                          val_obj_display,
12806f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                                                                          custom_format);
12816f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        if (log)
12826f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                            log->Printf("special cases did%s match", var_success ? "" : "n't");
12836f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata
12846f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        // should not happen
12856f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        if (!var_success)
12866f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                            s << "<invalid usage of pointer value as object>";
12876f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        else
12886f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                            s << str_temp.GetData();
12891c61743af946076e988d88baf725382e99d905deEnrico Granata                                        var_success = true;
12906f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        break;
12911c61743af946076e988d88baf725382e99d905deEnrico Granata                                    }
12921c61743af946076e988d88baf725382e99d905deEnrico Granata                                    else
12936f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                    {
1294ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata                                        if (was_plain_var) // if ${var}
12956f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        {
12966f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                            s << target->GetTypeName() << " @ " << target->GetLocationAsCString();
12976f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        }
1298ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata                                        else if (is_pointer) // if pointer, value is the address stored
1299ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata                                        {
1300ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata                                            var_success = target->GetPrintableRepresentation(s,
1301ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata                                                                                             val_obj_display,
1302ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata                                                                                             custom_format);
1303ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata                                        }
13046f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        else
13056f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        {
13066f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                            s << "<invalid usage of pointer value as object>";
13076f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        }
13086f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        var_success = true;
13096f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                        break;
13106f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                    }
13116f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                }
13126f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata
13136f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                // if directly trying to print ${var}, and this is an aggregate, display a nice
13146f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                // type @ location message
13156f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                if (is_aggregate && was_plain_var)
13166f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                {
13176f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                    s << target->GetTypeName() << " @ " << target->GetLocationAsCString();
13186f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                    var_success = true;
13191c61743af946076e988d88baf725382e99d905deEnrico Granata                                    break;
13201c61743af946076e988d88baf725382e99d905deEnrico Granata                                }
13211c61743af946076e988d88baf725382e99d905deEnrico Granata
13226f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                // if directly trying to print ${var%V}, and this is an aggregate, do not let the user do it
13236f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                                if (is_aggregate && ((was_var_format && val_obj_display == ValueObject::eDisplayValue)))
13241c61743af946076e988d88baf725382e99d905deEnrico Granata                                {
13251c61743af946076e988d88baf725382e99d905deEnrico Granata                                    s << "<invalid use of aggregate type>";
13261c61743af946076e988d88baf725382e99d905deEnrico Granata                                    var_success = true;
132786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    break;
132886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                }
1329107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1330107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                if (!is_array_range)
1331de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                {
1332de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                    if (log)
1333de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                        log->Printf("dumping ordinary printable output");
1334107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    var_success = target->DumpPrintableRepresentation(s,val_obj_display, custom_format);
1335de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                }
1336107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                else
1337de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                {
1338de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                    if (log)
1339de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                        log->Printf("checking if I can handle as array");
1340107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    if (!is_array && !is_pointer)
1341107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                        break;
1342de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                    if (log)
1343de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                        log->Printf("handle as array");
1344ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                    const char* special_directions = NULL;
1345ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                    StreamString special_directions_writer;
1346107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    if (close_bracket_position && (var_name_end-close_bracket_position > 1))
1347107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    {
1348ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        ConstString additional_data;
1349ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        additional_data.SetCStringWithLength(close_bracket_position+1, var_name_end-close_bracket_position-1);
1350ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        special_directions_writer.Printf("${%svar%s}",
1351ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                                         do_deref_pointer ? "*" : "",
1352ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                                         additional_data.GetCString());
1353ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        special_directions = special_directions_writer.GetData();
1354107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    }
13559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
1356107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    // let us display items index_lower thru index_higher of this array
1357107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    s.PutChar('[');
1358107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    var_success = true;
1359107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1360107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    if (index_higher < 0)
1361f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata                                        index_higher = valobj->GetNumChildren() - 1;
1362107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1363018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata                                    uint32_t max_num_children = target->GetUpdatePoint().GetTargetSP()->GetMaximumNumberOfChildrenToDisplay();
1364018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata
1365107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    for (;index_lower<=index_higher;index_lower++)
1366107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    {
1367567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        ValueObject* item = ExpandIndexedExpression (target,
1368567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                                                     index_lower,
1369567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                                                     exe_ctx->GetFramePtr(),
1370567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                                                     false).get();
1371107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1372ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        if (!item)
1373ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        {
1374de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                            if (log)
13757e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda                                                log->Printf("ERROR in getting child item at index %lld", index_lower);
1376ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        }
1377ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        else
1378ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        {
1379de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                            if (log)
1380de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                                                log->Printf("special_directions for child item: %s",special_directions);
1381ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                        }
1382ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1383107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                        if (!special_directions)
1384107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                            var_success &= item->DumpPrintableRepresentation(s,val_obj_display, custom_format);
1385107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                        else
1386107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                            var_success &= FormatPrompt(special_directions, sc, exe_ctx, addr, s, NULL, item);
1387107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1388018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata                                        if (--max_num_children == 0)
1389018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata                                        {
1390018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata                                            s.PutCString(", ...");
1391018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata                                            break;
1392018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata                                        }
1393018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata
1394107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                        if (index_lower < index_higher)
1395107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                            s.PutChar(',');
1396107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    }
1397107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                                    s.PutChar(']');
13989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                }
13991391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            }
14009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                            break;
1401d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        case 'a':
1402d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (::strncmp (var_name_begin, "addr}", strlen("addr}")) == 0)
1403d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1404d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                if (addr && addr->IsValid())
1405d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1406d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    var_success = true;
1407d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    format_addr = *addr;
1408d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1409d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1410f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            else if (::strncmp (var_name_begin, "ansi.", strlen("ansi.")) == 0)
1411f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            {
1412f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                var_success = true;
1413f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                var_name_begin += strlen("ansi."); // Skip the "ansi."
1414f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                if (::strncmp (var_name_begin, "fg.", strlen("fg.")) == 0)
1415f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1416f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    var_name_begin += strlen("fg."); // Skip the "fg."
1417f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0)
1418f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1419f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1420f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1421f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_fg_black,
1422f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1423f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1424f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0)
1425f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1426f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1427f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1428f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_fg_red,
1429f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1430f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1431f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0)
1432f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1433f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1434f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1435f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_fg_green,
1436f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1437f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1438f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0)
1439f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1440f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1441f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1442f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_fg_yellow,
1443f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1444f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1445f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0)
1446f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1447f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1448f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1449f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_fg_blue,
1450f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1451f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1452f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0)
1453f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1454f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1455f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1456f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_fg_purple,
1457f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1458f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1459f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0)
1460f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1461f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1462f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1463f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_fg_cyan,
1464f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1465f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1466f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0)
1467f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1468f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1469f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1470f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_fg_white,
1471f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1472f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1473f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else
1474f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1475f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        var_success = false;
1476f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1477f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1478f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "bg.", strlen("bg.")) == 0)
1479f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1480f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    var_name_begin += strlen("bg."); // Skip the "bg."
1481f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0)
1482f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1483f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1484f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1485f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_bg_black,
1486f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1487f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1488f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0)
1489f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1490f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1491f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1492f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_bg_red,
1493f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1494f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1495f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0)
1496f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1497f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1498f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1499f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_bg_green,
1500f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1501f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1502f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0)
1503f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1504f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1505f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1506f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_bg_yellow,
1507f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1508f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1509f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0)
1510f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1511f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1512f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1513f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_bg_blue,
1514f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1515f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1516f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0)
1517f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1518f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1519f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1520f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_bg_purple,
1521f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1522f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1523f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0)
1524f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1525f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1526f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1527f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_bg_cyan,
1528f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1529f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1530f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0)
1531f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1532f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        s.Printf ("%s%s%s",
1533f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_start,
1534f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_bg_white,
1535f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                  lldb_utility::ansi::k_escape_end);
1536f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1537f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    else
1538f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    {
1539f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                        var_success = false;
1540f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    }
1541f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1542f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "normal}", strlen ("normal}")) == 0)
1543f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1544f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1545f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1546f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_normal,
1547f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1548f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1549f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "bold}", strlen("bold}")) == 0)
1550f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1551f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1552f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1553f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_bold,
1554f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1555f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1556f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "faint}", strlen("faint}")) == 0)
1557f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1558f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1559f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1560f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_faint,
1561f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1562f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1563f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "italic}", strlen("italic}")) == 0)
1564f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1565f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1566f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1567f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_italic,
1568f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1569f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1570f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "underline}", strlen("underline}")) == 0)
1571f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1572f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1573f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1574f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_underline,
1575f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1576f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1577f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "slow-blink}", strlen("slow-blink}")) == 0)
1578f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1579f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1580f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1581f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_slow_blink,
1582f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1583f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1584f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "fast-blink}", strlen("fast-blink}")) == 0)
1585f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1586f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1587f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1588f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_fast_blink,
1589f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1590f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1591f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "negative}", strlen("negative}")) == 0)
1592f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1593f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1594f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1595f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_negative,
1596f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1597f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1598f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "conceal}", strlen("conceal}")) == 0)
1599f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1600f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1601f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1602f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_conceal,
1603f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1604f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1605f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1606f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else if (::strncmp (var_name_begin, "crossed-out}", strlen("crossed-out}")) == 0)
1607f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1608f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    s.Printf ("%s%s%s",
1609f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_start,
1610f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_ctrl_crossed_out,
1611f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                              lldb_utility::ansi::k_escape_end);
1612f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1613f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                else
1614f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                {
1615f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    var_success = false;
1616f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                }
1617f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            }
1618d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            break;
1619d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1620d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        case 'p':
1621d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (::strncmp (var_name_begin, "process.", strlen("process.")) == 0)
1622d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1623567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                if (exe_ctx)
1624d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1625567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                    Process *process = exe_ctx->GetProcessPtr();
1626567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                    if (process)
1627d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1628567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        var_name_begin += ::strlen ("process.");
1629567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0)
1630d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1631444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                                            s.Printf("%llu", process->GetID());
1632567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = true;
1633567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1634567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) ||
1635567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                 (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) ||
1636567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                 (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0))
1637567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1638567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            Module *exe_module = process->GetTarget().GetExecutableModulePointer();
1639567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            if (exe_module)
1640d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            {
1641567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f')
1642567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                {
1643567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                    format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename();
1644567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                    var_success = format_file_spec;
1645567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                }
1646567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                else
1647567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                {
1648567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                    format_file_spec = exe_module->GetFileSpec();
1649567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                    var_success = format_file_spec;
1650567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                }
1651d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            }
1652d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1653d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1654567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                }
1655d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1656d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            break;
1657d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1658d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        case 't':
1659d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (::strncmp (var_name_begin, "thread.", strlen("thread.")) == 0)
1660d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1661567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                if (exe_ctx)
1662d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1663567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                    Thread *thread = exe_ctx->GetThreadPtr();
1664567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                    if (thread)
1665d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1666567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        var_name_begin += ::strlen ("thread.");
1667567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0)
1668d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1669444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                                            s.Printf("0x%4.4llx", thread->GetID());
1670567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = true;
1671567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1672567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0)
1673567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1674567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            s.Printf("%u", thread->GetIndexID());
1675567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = true;
1676567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1677567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0)
1678567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1679567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            cstr = thread->GetName();
1680567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = cstr && cstr[0];
1681567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            if (var_success)
1682d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                                s.PutCString(cstr);
1683567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1684567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0)
1685567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1686567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            cstr = thread->GetQueueName();
1687567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = cstr && cstr[0];
1688567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            if (var_success)
1689567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                s.PutCString(cstr);
1690567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1691567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0)
1692567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1693567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            StopInfoSP stop_info_sp = thread->GetStopInfo ();
1694567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            if (stop_info_sp)
1695567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            {
1696567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                cstr = stop_info_sp->GetDescription();
1697567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                if (cstr && cstr[0])
1698567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                {
1699567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                    s.PutCString(cstr);
1700567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                    var_success = true;
1701567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                }
1702d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            }
1703d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
17041586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                        else if (::strncmp (var_name_begin, "return-value}", strlen("return-value}")) == 0)
17051586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                        {
17061586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                            StopInfoSP stop_info_sp = thread->GetStopInfo ();
17071586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                            if (stop_info_sp)
17081586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                            {
17091586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                ValueObjectSP return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
17101586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                if (return_valobj_sp)
17111586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                {
17121586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                    cstr = return_valobj_sp->GetValueAsCString ();
17131586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                    if (cstr && cstr[0])
17141586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                    {
17151586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                        s.PutCString(cstr);
17161586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                        var_success = true;
17171586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                    }
17181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                }
17191586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                            }
17201586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                        }
1721d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1722d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1723d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1724d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            else if (::strncmp (var_name_begin, "target.", strlen("target.")) == 0)
1725d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1726a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                Target *target = Target::GetTargetFromContexts (exe_ctx, sc);
1727a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                if (target)
1728d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1729d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    var_name_begin += ::strlen ("target.");
1730d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    if (::strncmp (var_name_begin, "arch}", strlen("arch}")) == 0)
1731d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1732d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        ArchSpec arch (target->GetArchitecture ());
1733d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (arch.IsValid())
1734d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1735940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                                            s.PutCString (arch.GetArchitectureName());
1736d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            var_success = true;
1737d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1738d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1739d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1740d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1741d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            break;
1742d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1743d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1744d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        case 'm':
1745d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (::strncmp (var_name_begin, "module.", strlen("module.")) == 0)
1746d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1747a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                if (sc && sc->module_sp.get())
1748d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1749a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                    Module *module = sc->module_sp.get();
1750d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    var_name_begin += ::strlen ("module.");
1751d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1752d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0)
1753d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1754d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (module->GetFileSpec())
1755d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1756d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            var_name_begin += ::strlen ("file.");
1757d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1758d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0)
1759d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            {
1760d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                                format_file_spec.GetFilename() = module->GetFileSpec().GetFilename();
1761d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                                var_success = format_file_spec;
1762d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            }
1763d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0)
1764d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            {
1765d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                                format_file_spec = module->GetFileSpec();
1766d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                                var_success = format_file_spec;
1767d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            }
1768d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1769d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1770d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1771d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1772d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            break;
1773d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1774d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1775d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        case 'f':
1776d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0)
1777d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1778d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                if (sc && sc->comp_unit != NULL)
1779d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1780d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    var_name_begin += ::strlen ("file.");
1781d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1782d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0)
1783d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1784d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        format_file_spec.GetFilename() = sc->comp_unit->GetFilename();
1785d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        var_success = format_file_spec;
1786d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1787d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0)
1788d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1789d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        format_file_spec = *sc->comp_unit;
1790d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        var_success = format_file_spec;
1791d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1792d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1793d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1794d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            else if (::strncmp (var_name_begin, "frame.", strlen("frame.")) == 0)
1795d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1796567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                if (exe_ctx)
1797d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1798567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                    StackFrame *frame = exe_ctx->GetFramePtr();
1799567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                    if (frame)
1800d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1801567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        var_name_begin += ::strlen ("frame.");
1802567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0)
1803567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1804567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            s.Printf("%u", frame->GetFrameIndex());
1805567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = true;
1806567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1807567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0)
1808567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1809567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            reg_kind = eRegisterKindGeneric;
1810567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            reg_num = LLDB_REGNUM_GENERIC_PC;
1811567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = true;
1812567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1813567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0)
1814567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1815567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            reg_kind = eRegisterKindGeneric;
1816567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            reg_num = LLDB_REGNUM_GENERIC_SP;
1817567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = true;
1818567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1819567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0)
1820567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1821567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            reg_kind = eRegisterKindGeneric;
1822567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            reg_num = LLDB_REGNUM_GENERIC_FP;
1823567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = true;
1824567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1825567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0)
1826567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        {
1827567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            reg_kind = eRegisterKindGeneric;
1828567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            reg_num = LLDB_REGNUM_GENERIC_FLAGS;
1829567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            var_success = true;
1830567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        }
1831567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0)
1832d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1833567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            reg_ctx = frame->GetRegisterContext().get();
1834567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            if (reg_ctx)
1835d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            {
1836567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                var_name_begin += ::strlen ("reg.");
1837567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                if (var_name_begin < var_name_end)
1838567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                {
1839567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                    std::string reg_name (var_name_begin, var_name_end);
1840567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                    reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str());
1841567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                    if (reg_info)
1842567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                        var_success = true;
1843567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                }
1844d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            }
1845d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1846d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1847d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1848d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1849d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            else if (::strncmp (var_name_begin, "function.", strlen("function.")) == 0)
1850d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1851d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                if (sc && (sc->function != NULL || sc->symbol != NULL))
1852d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1853d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    var_name_begin += ::strlen ("function.");
1854d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0)
1855d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1856d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (sc->function)
1857444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                                            s.Printf("function{0x%8.8llx}", sc->function->GetID());
1858d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        else
1859d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            s.Printf("symbol[%u]", sc->symbol->GetID());
1860d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1861d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        var_success = true;
1862d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1863d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0)
1864d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1865d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (sc->function)
1866d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            cstr = sc->function->GetName().AsCString (NULL);
1867d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        else if (sc->symbol)
1868d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            cstr = sc->symbol->GetName().AsCString (NULL);
1869d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (cstr)
1870d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1871d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            s.PutCString(cstr);
1872b7af177d19c625088864845c89c16465c424df5aGreg Clayton
1873b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                            if (sc->block)
1874b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                            {
1875b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                Block *inline_block = sc->block->GetContainingInlinedBlock ();
1876b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                if (inline_block)
1877b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                {
1878b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                    const InlineFunctionInfo *inline_info = sc->block->GetInlinedFunctionInfo();
1879b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                    if (inline_info)
1880b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                    {
1881b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                        s.PutCString(" [inlined] ");
1882b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                        inline_info->GetName().Dump(&s);
1883b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                    }
1884b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                }
1885b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                            }
1886d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            var_success = true;
1887d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1888d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1889d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    else if (::strncmp (var_name_begin, "addr-offset}", strlen("addr-offset}")) == 0)
1890d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1891d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        var_success = addr != NULL;
1892d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (var_success)
1893d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1894d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            format_addr = *addr;
1895d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            calculate_format_addr_function_offset = true;
1896d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1897d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1898d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    else if (::strncmp (var_name_begin, "line-offset}", strlen("line-offset}")) == 0)
1899d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1900d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        var_success = sc->line_entry.range.GetBaseAddress().IsValid();
1901d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (var_success)
1902d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1903d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            format_addr = sc->line_entry.range.GetBaseAddress();
1904d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            calculate_format_addr_function_offset = true;
1905d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1906d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1907d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    else if (::strncmp (var_name_begin, "pc-offset}", strlen("pc-offset}")) == 0)
1908d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1909567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        StackFrame *frame = exe_ctx->GetFramePtr();
1910567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        var_success = frame != NULL;
1911d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (var_success)
1912d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1913567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                            format_addr = frame->GetFrameCodeAddress();
1914d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            calculate_format_addr_function_offset = true;
1915d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1916d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1917d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1918d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1919d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            break;
1920d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1921d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        case 'l':
1922d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (::strncmp (var_name_begin, "line.", strlen("line.")) == 0)
1923d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1924d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                if (sc && sc->line_entry.IsValid())
1925d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1926d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    var_name_begin += ::strlen ("line.");
1927d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0)
1928d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1929d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        var_name_begin += ::strlen ("file.");
1930d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1931d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0)
1932d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1933d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            format_file_spec.GetFilename() = sc->line_entry.file.GetFilename();
1934d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            var_success = format_file_spec;
1935d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1936d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0)
1937d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1938d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            format_file_spec = sc->line_entry.file;
1939d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            var_success = format_file_spec;
1940d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1941d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1942d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    else if (::strncmp (var_name_begin, "number}", strlen("number}")) == 0)
1943d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1944d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        var_success = true;
1945d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        s.Printf("%u", sc->line_entry.line);
1946d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1947d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    else if ((::strncmp (var_name_begin, "start-addr}", strlen("start-addr}")) == 0) ||
1948d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                             (::strncmp (var_name_begin, "end-addr}", strlen("end-addr}")) == 0))
1949d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1950d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        var_success = sc && sc->line_entry.range.GetBaseAddress().IsValid();
1951d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (var_success)
1952d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
1953d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            format_addr = sc->line_entry.range.GetBaseAddress();
1954d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            if (var_name_begin[0] == 'e')
1955d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                                format_addr.Slide (sc->line_entry.range.GetByteSize());
1956d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
1957d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1958d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1959d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1960d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            break;
1961d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        }
1962d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1963d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        if (var_success)
1964d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        {
1965d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            // If format addr is valid, then we need to print an address
1966d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (reg_num != LLDB_INVALID_REGNUM)
1967d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1968567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                StackFrame *frame = exe_ctx->GetFramePtr();
1969d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                // We have a register value to display...
1970d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                if (reg_num == LLDB_REGNUM_GENERIC_PC && reg_kind == eRegisterKindGeneric)
1971d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1972567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                    format_addr = frame->GetFrameCodeAddress();
1973d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1974d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                else
1975d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1976d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    if (reg_ctx == NULL)
1977567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                        reg_ctx = frame->GetRegisterContext().get();
1978d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1979d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    if (reg_ctx)
1980d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
1981d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (reg_kind != kNumRegisterKinds)
1982d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(reg_kind, reg_num);
1983d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_num);
1984d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        var_success = reg_info != NULL;
1985d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
1986d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1987d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1988d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1989d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (reg_info != NULL)
1990d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
1991061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                RegisterValue reg_value;
1992061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                var_success = reg_ctx->ReadRegister (reg_info, reg_value);
1993061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                if (var_success)
1994d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
1995997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                                    reg_value.Dump(&s, reg_info, false, false, eFormatDefault);
1996d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
1997d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
1998d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
1999d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (format_file_spec)
2000d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
2001d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                s << format_file_spec;
2002d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
2003d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2004d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            // If format addr is valid, then we need to print an address
2005d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            if (format_addr.IsValid())
2006d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            {
2007a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                var_success = false;
2008a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton
2009d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                if (calculate_format_addr_function_offset)
2010d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
2011d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    Address func_addr;
2012d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2013a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                    if (sc)
2014a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                    {
2015a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                        if (sc->function)
2016b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                        {
2017a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                            func_addr = sc->function->GetAddressRange().GetBaseAddress();
2018b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                            if (sc->block)
2019b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                            {
2020b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                // Check to make sure we aren't in an inline
2021b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                // function. If we are, use the inline block
2022b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                // range that contains "format_addr" since
2023b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                // blocks can be discontiguous.
2024b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                Block *inline_block = sc->block->GetContainingInlinedBlock ();
2025b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                AddressRange inline_range;
2026b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                if (inline_block && inline_block->GetRangeContainingAddress (format_addr, inline_range))
2027b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                                    func_addr = inline_range.GetBaseAddress();
2028b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                            }
2029b7af177d19c625088864845c89c16465c424df5aGreg Clayton                                        }
2030a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                        else if (sc->symbol && sc->symbol->GetAddressRangePtr())
2031a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                            func_addr = sc->symbol->GetAddressRangePtr()->GetBaseAddress();
2032a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                    }
2033a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton
2034a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                    if (func_addr.IsValid())
2035d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    {
2036d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        if (func_addr.GetSection() == format_addr.GetSection())
2037d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        {
2038d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            addr_t func_file_addr = func_addr.GetFileAddress();
2039d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            addr_t addr_file_addr = format_addr.GetFileAddress();
2040d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            if (addr_file_addr > func_file_addr)
2041d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                                s.Printf(" + %llu", addr_file_addr - func_file_addr);
2042d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                            else if (addr_file_addr < func_file_addr)
2043d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                                s.Printf(" - %llu", func_file_addr - addr_file_addr);
2044a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                            var_success = true;
2045d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        }
2046d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        else
2047a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                        {
2048a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                            Target *target = Target::GetTargetFromContexts (exe_ctx, sc);
2049a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                            if (target)
2050a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                            {
2051a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                                addr_t func_load_addr = func_addr.GetLoadAddress (target);
2052a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                                addr_t addr_load_addr = format_addr.GetLoadAddress (target);
2053a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                                if (addr_load_addr > func_load_addr)
2054a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                                    s.Printf(" + %llu", addr_load_addr - func_load_addr);
2055a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                                else if (addr_load_addr < func_load_addr)
2056a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                                    s.Printf(" - %llu", func_load_addr - addr_load_addr);
2057a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                                var_success = true;
2058a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                            }
2059a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                        }
2060d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    }
2061d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
2062d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                else
2063d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                {
2064a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                    Target *target = Target::GetTargetFromContexts (exe_ctx, sc);
2065d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    addr_t vaddr = LLDB_INVALID_ADDRESS;
2066a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                    if (exe_ctx && !target->GetSectionLoadList().IsEmpty())
2067a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                        vaddr = format_addr.GetLoadAddress (target);
2068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    if (vaddr == LLDB_INVALID_ADDRESS)
2069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                        vaddr = format_addr.GetFileAddress ();
2070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                    if (vaddr != LLDB_INVALID_ADDRESS)
2072a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                    {
2073395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton                                        int addr_width = target->GetArchitecture().GetAddressByteSize() * 2;
20747fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton                                        if (addr_width == 0)
20757fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton                                            addr_width = 16;
20767fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton                                        s.Printf("0x%*.*llx", addr_width, addr_width, vaddr);
2077a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                        var_success = true;
2078a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                                    }
2079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                }
2080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            }
2081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        }
2082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                        if (var_success == false)
2084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                            success = false;
2085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    }
2086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    p = var_name_end;
2087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                }
2088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                else
2089d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    break;
2090d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            }
2091d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            else
2092d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            {
2093d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                // We got a dollar sign with no '{' after it, it must just be a dollar sign
2094d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                s.PutChar(*p);
2095d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            }
2096d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        }
2097d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        else if (*p == '\\')
2098d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        {
2099d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            ++p; // skip the slash
2100d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            switch (*p)
2101d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            {
2102d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case 'a': s.PutChar ('\a'); break;
2103d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case 'b': s.PutChar ('\b'); break;
2104d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case 'f': s.PutChar ('\f'); break;
2105d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case 'n': s.PutChar ('\n'); break;
2106d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case 'r': s.PutChar ('\r'); break;
2107d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case 't': s.PutChar ('\t'); break;
2108d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case 'v': s.PutChar ('\v'); break;
2109d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case '\'': s.PutChar ('\''); break;
2110d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case '\\': s.PutChar ('\\'); break;
2111d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case '0':
2112d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                // 1 to 3 octal chars
2113d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                {
2114a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    // Make a string that can hold onto the initial zero char,
2115a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    // up to 3 octal digits, and a terminating NULL.
2116a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    char oct_str[5] = { 0, 0, 0, 0, 0 };
2117a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton
2118a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    int i;
2119a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    for (i=0; (p[i] >= '0' && p[i] <= '7') && i<4; ++i)
2120a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                        oct_str[i] = p[i];
2121a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton
2122a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    // We don't want to consume the last octal character since
2123a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    // the main for loop will do this for us, so we advance p by
2124a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    // one less than i (even if i is zero)
2125a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    p += i - 1;
2126a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    unsigned long octal_value = ::strtoul (oct_str, NULL, 8);
2127a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    if (octal_value <= UINT8_MAX)
2128d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    {
2129a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                        char octal_char = octal_value;
2130a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                        s.Write (&octal_char, 1);
2131d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    }
2132d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                }
2133d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                break;
2134d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2135d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            case 'x':
2136d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                // hex number in the format
2137a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                if (isxdigit(p[1]))
2138d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                {
2139a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    ++p;    // Skip the 'x'
2140d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2141a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    // Make a string that can hold onto two hex chars plus a
2142a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    // NULL terminator
2143a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    char hex_str[3] = { 0,0,0 };
2144a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    hex_str[0] = *p;
2145a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    if (isxdigit(p[1]))
2146d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    {
2147a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                        ++p; // Skip the first of the two hex chars
2148a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                        hex_str[1] = *p;
2149d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                    }
2150a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton
2151a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    unsigned long hex_value = strtoul (hex_str, NULL, 16);
2152a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    if (hex_value <= UINT8_MAX)
2153a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                        s.PutChar (hex_value);
2154a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                }
2155a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                else
2156a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                {
2157a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                    s.PutChar('x');
2158d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                }
2159d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                break;
2160d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2161d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            default:
2162a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                // Just desensitize any other character by just printing what
2163a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                // came after the '\'
2164a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton                s << *p;
2165d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                break;
2166d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2167d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            }
2168d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2169d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        }
2170d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    }
2171d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    if (end)
2172d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        *end = p;
2173d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    return success;
2174d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton}
2175d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2176d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Debugger::SettingsController
2177d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
21786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
2179d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// class Debugger::SettingsController
21806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
21816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2182d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::SettingsController () :
2183987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    UserSettingsController ("", UserSettingsControllerSP())
21846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2185004afcb95736e97d071b1dd9b5254800e11e581cCaroline Tice    m_default_settings.reset (new DebuggerInstanceSettings (*this, false,
2186004afcb95736e97d071b1dd9b5254800e11e581cCaroline Tice                                                            InstanceSettings::GetDefaultName().AsCString()));
21876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
21886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2189d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::~SettingsController ()
21906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
21916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
21926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
21936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2194987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonInstanceSettingsSP
2195d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::CreateInstanceSettings (const char *instance_name)
21966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2197c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton    DebuggerInstanceSettings *new_settings = new DebuggerInstanceSettings (*GetSettingsController(),
2198004afcb95736e97d071b1dd9b5254800e11e581cCaroline Tice                                                                           false, instance_name);
2199987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    InstanceSettingsSP new_settings_sp (new_settings);
22006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return new_settings_sp;
22016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
22026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2203d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark DebuggerInstanceSettings
22046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
22056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//  class DebuggerInstanceSettings
22066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
22076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2208238c0a1e7b733cee539258faa656159c63f9e893Greg ClaytonDebuggerInstanceSettings::DebuggerInstanceSettings
2209238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton(
2210238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    UserSettingsController &owner,
2211238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    bool live_instance,
2212238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    const char *name
2213238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton) :
2214638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance),
2215238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_term_width (80),
2216be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    m_stop_source_before_count (3),
2217be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    m_stop_source_after_count (3),
2218be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    m_stop_disassembly_count (4),
2219be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    m_stop_disassembly_display (eStopDisassemblyTypeNoSource),
22206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_prompt (),
2221a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    m_frame_format (),
2222a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    m_thread_format (),
22235bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    m_script_lang (),
22249305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    m_use_external_editor (false),
22259305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    m_auto_confirm_on (false)
22266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2227396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice    // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called
2228396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice    // until the vtables for DebuggerInstanceSettings are properly set up, i.e. AFTER all the initializers.
2229396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice    // For this reason it has to be called here, rather than in the initializer or in the parent constructor.
223075b11a343a035ab426473a785a045f0614af9984Caroline Tice    // The same is true of CreateInstanceName().
223175b11a343a035ab426473a785a045f0614af9984Caroline Tice
223275b11a343a035ab426473a785a045f0614af9984Caroline Tice    if (GetInstanceName() == InstanceSettings::InvalidName())
223375b11a343a035ab426473a785a045f0614af9984Caroline Tice    {
223475b11a343a035ab426473a785a045f0614af9984Caroline Tice        ChangeInstanceName (std::string (CreateInstanceName().AsCString()));
223575b11a343a035ab426473a785a045f0614af9984Caroline Tice        m_owner.RegisterInstanceSettings (this);
223675b11a343a035ab426473a785a045f0614af9984Caroline Tice    }
2237396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice
2238396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice    if (live_instance)
22396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
2240987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        const InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
22416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        CopyInstanceSettings (pending_settings, false);
22426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
22436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
22446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
22456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::DebuggerInstanceSettings (const DebuggerInstanceSettings &rhs) :
2246990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    InstanceSettings (*Debugger::GetSettingsController(), CreateInstanceName ().AsCString()),
22476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_prompt (rhs.m_prompt),
2248a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    m_frame_format (rhs.m_frame_format),
2249a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    m_thread_format (rhs.m_thread_format),
22505bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    m_script_lang (rhs.m_script_lang),
22519305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    m_use_external_editor (rhs.m_use_external_editor),
22529305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    m_auto_confirm_on(rhs.m_auto_confirm_on)
22536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2254987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    const InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
22556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    CopyInstanceSettings (pending_settings, false);
22566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_owner.RemovePendingSettings (m_instance_name);
22576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
22586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
22596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::~DebuggerInstanceSettings ()
22606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
22616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
22626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
22636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings&
22646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::operator= (const DebuggerInstanceSettings &rhs)
22656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
22666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (this != &rhs)
22676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
2268d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        m_term_width = rhs.m_term_width;
22696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_prompt = rhs.m_prompt;
2270a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        m_frame_format = rhs.m_frame_format;
2271a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        m_thread_format = rhs.m_thread_format;
22726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_script_lang = rhs.m_script_lang;
22735bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice        m_use_external_editor = rhs.m_use_external_editor;
22749305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham        m_auto_confirm_on = rhs.m_auto_confirm_on;
22756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
22766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
22776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return *this;
22786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
22796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2280d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonbool
2281d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebuggerInstanceSettings::ValidTermWidthValue (const char *value, Error err)
2282d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{
2283d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    bool valid = false;
2284d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2285d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    // Verify we have a value string.
2286d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    if (value == NULL || value[0] == '\0')
2287d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    {
22889c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton        err.SetErrorString ("missing value, can't set terminal width without a value");
2289d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    }
2290d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    else
2291d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    {
2292d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        char *end = NULL;
2293d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        const uint32_t width = ::strtoul (value, &end, 0);
2294d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2295068a34f4d0dadb689e270a1f74a836ba4d8033daJohnny Chen        if (end && end[0] == '\0')
2296d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        {
22977a630d3016f751c625b560d6b5b1c5752e402cc4Johnny Chen            if (width >= 10 && width <= 1024)
2298d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                valid = true;
2299d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton            else
23009c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                err.SetErrorString ("invalid term-width value; value must be between 10 and 1024");
2301d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        }
2302d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        else
23039c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton            err.SetErrorStringWithFormat ("'%s' is not a valid unsigned integer string", value);
2304d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    }
2305d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2306d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    return valid;
2307d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton}
2308d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
2309d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
23106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
23116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name,
23126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          const char *index_value,
23136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          const char *value,
23146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          const ConstString &instance_name,
23156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          const SettingEntry &entry,
2316b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                          VarSetOperationType op,
23176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          Error &err,
23186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          bool pending)
23196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2320a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton
2321a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    if (var_name == TermWidthVarName())
2322a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    {
2323a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        if (ValidTermWidthValue (value, err))
2324a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        {
2325a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton            m_term_width = ::strtoul (value, NULL, 0);
2326a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        }
2327a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    }
2328a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    else if (var_name == PromptVarName())
23296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
23301d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice        UserSettingsController::UpdateStringVariable (op, m_prompt, value, err);
23316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (!pending)
23326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
233387097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice            // 'instance_name' is actually (probably) in the form '[<instance_name>]';  if so, we need to
233487097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice            // strip off the brackets before passing it to BroadcastPromptChange.
233587097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice
233687097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice            std::string tmp_instance_name (instance_name.AsCString());
233787097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice            if ((tmp_instance_name[0] == '[')
233887097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice                && (tmp_instance_name[instance_name.GetLength() - 1] == ']'))
233987097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice                tmp_instance_name = tmp_instance_name.substr (1, instance_name.GetLength() - 2);
234087097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice            ConstString new_name (tmp_instance_name.c_str());
234187097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice
234287097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice            BroadcastPromptChange (new_name, m_prompt.c_str());
23436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
23446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
2345a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    else if (var_name == GetFrameFormatName())
2346a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    {
2347a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        UserSettingsController::UpdateStringVariable (op, m_frame_format, value, err);
2348a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    }
2349a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    else if (var_name == GetThreadFormatName())
2350a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    {
2351a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        UserSettingsController::UpdateStringVariable (op, m_thread_format, value, err);
2352a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    }
23536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == ScriptLangVarName())
23546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
23556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        bool success;
23566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_script_lang = Args::StringToScriptLanguage (value, eScriptLanguageDefault,
23576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                      &success);
23586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
23595bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    else if (var_name == UseExternalEditorVarName ())
23605bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    {
236117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton        UserSettingsController::UpdateBooleanVariable (op, m_use_external_editor, value, false, err);
23625bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    }
23639305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    else if (var_name == AutoConfirmName ())
23649305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    {
236517cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton        UserSettingsController::UpdateBooleanVariable (op, m_auto_confirm_on, value, false, err);
23669305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    }
2367be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    else if (var_name == StopSourceContextBeforeName ())
2368be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    {
2369be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL);
2370be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        if (new_value != UINT32_MAX)
2371be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton            m_stop_source_before_count = new_value;
2372be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        else
2373be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton            err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopSourceContextAfterName ().GetCString());
2374be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    }
2375be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    else if (var_name == StopSourceContextAfterName ())
2376be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    {
2377be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL);
2378be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        if (new_value != UINT32_MAX)
2379be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton            m_stop_source_after_count = new_value;
2380be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        else
2381be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton            err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopSourceContextBeforeName ().GetCString());
2382be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    }
2383be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    else if (var_name == StopDisassemblyCountName ())
2384be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    {
2385be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL);
2386be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        if (new_value != UINT32_MAX)
2387be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton            m_stop_disassembly_count = new_value;
2388be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        else
2389be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton            err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopDisassemblyCountName ().GetCString());
2390be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    }
2391be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    else if (var_name == StopDisassemblyDisplayName ())
2392be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    {
2393be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        int new_value;
2394be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        UserSettingsController::UpdateEnumVariable (g_show_disassembly_enum_values, &new_value, value, err);
2395be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        if (err.Success())
2396be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton            m_stop_disassembly_display = (StopDisassemblyType)new_value;
2397be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    }
23986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
23996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2400bcb5b454767121980d937d2610ba762fdb575c45Caroline Ticebool
24016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry,
24026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                    const ConstString &var_name,
24035bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice                                                    StringList &value,
2404bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice                                                    Error *err)
24056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
24066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (var_name == PromptVarName())
24076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
2408a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        value.AppendString (m_prompt.c_str(), m_prompt.size());
24096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
24106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
24116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == ScriptLangVarName())
24126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
24136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        value.AppendString (ScriptInterpreter::LanguageToString (m_script_lang).c_str());
24146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
24151d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice    else if (var_name == TermWidthVarName())
24161d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice    {
24171d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice        StreamString width_str;
2418be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        width_str.Printf ("%u", m_term_width);
24191d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice        value.AppendString (width_str.GetData());
24201d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice    }
2421a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    else if (var_name == GetFrameFormatName ())
2422a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    {
2423a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        value.AppendString(m_frame_format.c_str(), m_frame_format.size());
2424a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    }
2425a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    else if (var_name == GetThreadFormatName ())
2426a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    {
2427a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton        value.AppendString(m_thread_format.c_str(), m_thread_format.size());
2428a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    }
24295bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    else if (var_name == UseExternalEditorVarName())
24305bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    {
24315bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice        if (m_use_external_editor)
24325bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice            value.AppendString ("true");
24335bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice        else
24345bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice            value.AppendString ("false");
24355bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    }
24369305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    else if (var_name == AutoConfirmName())
24379305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    {
24389305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham        if (m_auto_confirm_on)
24399305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham            value.AppendString ("true");
24409305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham        else
24419305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham            value.AppendString ("false");
24429305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    }
2443be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    else if (var_name == StopSourceContextAfterName ())
2444be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    {
2445be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        StreamString strm;
2446be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        strm.Printf ("%u", m_stop_source_before_count);
2447be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        value.AppendString (strm.GetData());
2448be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    }
2449be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    else if (var_name == StopSourceContextBeforeName ())
2450be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    {
2451be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        StreamString strm;
2452be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        strm.Printf ("%u", m_stop_source_after_count);
2453be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        value.AppendString (strm.GetData());
2454be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    }
2455be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    else if (var_name == StopDisassemblyCountName ())
2456be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    {
2457be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        StreamString strm;
2458be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        strm.Printf ("%u", m_stop_disassembly_count);
2459be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        value.AppendString (strm.GetData());
2460be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    }
2461be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    else if (var_name == StopDisassemblyDisplayName ())
2462be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    {
2463be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        if (m_stop_disassembly_display >= eStopDisassemblyTypeNever && m_stop_disassembly_display <= eStopDisassemblyTypeAlways)
2464be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton            value.AppendString (g_show_disassembly_enum_values[m_stop_disassembly_display].string_value);
2465be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton        else
2466be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton            value.AppendString ("<invalid>");
2467be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton    }
24685bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    else
2469bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice    {
2470bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice        if (err)
2471bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice            err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString());
2472bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice        return false;
2473bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice    }
2474bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice    return true;
24756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
24766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
24776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
2478987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebuggerInstanceSettings::CopyInstanceSettings (const InstanceSettingsSP &new_settings,
24796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                bool pending)
24806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
24816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (new_settings.get() == NULL)
24826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        return;
24836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
24846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    DebuggerInstanceSettings *new_debugger_settings = (DebuggerInstanceSettings *) new_settings.get();
24856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
24866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_prompt = new_debugger_settings->m_prompt;
24876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (!pending)
248887097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice    {
248987097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice        // 'instance_name' is actually (probably) in the form '[<instance_name>]';  if so, we need to
249087097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice        // strip off the brackets before passing it to BroadcastPromptChange.
249187097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice
249287097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice        std::string tmp_instance_name (m_instance_name.AsCString());
249387097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice        if ((tmp_instance_name[0] == '[')
249487097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice            && (tmp_instance_name[m_instance_name.GetLength() - 1] == ']'))
249587097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice            tmp_instance_name = tmp_instance_name.substr (1, m_instance_name.GetLength() - 2);
249687097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice        ConstString new_name (tmp_instance_name.c_str());
249787097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice
249887097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice        BroadcastPromptChange (new_name, m_prompt.c_str());
249987097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice    }
2500a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    m_frame_format = new_debugger_settings->m_frame_format;
2501a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    m_thread_format = new_debugger_settings->m_thread_format;
25025bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    m_term_width = new_debugger_settings->m_term_width;
25036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_script_lang = new_debugger_settings->m_script_lang;
25045bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    m_use_external_editor = new_debugger_settings->m_use_external_editor;
25059305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    m_auto_confirm_on = new_debugger_settings->m_auto_confirm_on;
25066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
25076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticebool
25106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::BroadcastPromptChange (const ConstString &instance_name, const char *new_prompt)
25116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
25126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    std::string tmp_prompt;
25136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (new_prompt != NULL)
25156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
25166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        tmp_prompt = new_prompt ;
25176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        int len = tmp_prompt.size();
25186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (len > 1
25196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            && (tmp_prompt[0] == '\'' || tmp_prompt[0] == '"')
25206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            && (tmp_prompt[len-1] == tmp_prompt[0]))
25216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
25226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            tmp_prompt = tmp_prompt.substr(1,len-2);
25236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
25246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        len = tmp_prompt.size();
25256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (tmp_prompt[len-1] != ' ')
25266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            tmp_prompt.append(" ");
25276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
25286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    EventSP new_event_sp;
25296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    new_event_sp.reset (new Event(CommandInterpreter::eBroadcastBitResetPrompt,
25306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                  new EventDataBytes (tmp_prompt.c_str())));
25316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (instance_name.GetLength() != 0)
25336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
25346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        // Set prompt for a particular instance.
25356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        Debugger *dbg = Debugger::FindDebuggerWithInstanceName (instance_name).get();
25366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (dbg != NULL)
25376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
25386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            dbg->GetCommandInterpreter().BroadcastEvent (new_event_sp);
25396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
25406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
25416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return true;
25436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
25446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString
25466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::CreateInstanceName ()
25476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
25486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static int instance_count = 1;
25496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    StreamString sstr;
25506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    sstr.Printf ("debugger_%d", instance_count);
25526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    ++instance_count;
25536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    const ConstString ret_val (sstr.GetData());
25556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return ret_val;
25576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
25586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25599305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham
25606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
2561d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// SettingsController Variable Tables
25626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
25636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry
2566d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::global_settings_table[] =
25676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
25686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice  //{ "var-name",    var-type,      "default", enum-table, init'd, hidden, "help-text"},
25691d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice  // The Debugger level global table should always be empty; all Debugger settable variables should be instance
25701d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice  // variables.
25716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {  NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
25726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice};
25736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
257409d501fc81fd6dd8f474ff385a1b1832d830daecGreg Clayton#define MODULE_WITH_FUNC "{ ${module.file.basename}{`${function.name}${function.pc-offset}}}"
2575a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton#define FILE_AND_LINE "{ at ${line.file.basename}:${line.number}}"
25766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2577a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton#define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id}"\
2578a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    "{, ${frame.pc}}"\
2579a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    MODULE_WITH_FUNC\
2580aa295176a951fd49393be23ad3bbf7924b4dcd91Greg Clayton    FILE_AND_LINE\
2581a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    "{, stop reason = ${thread.stop-reason}}"\
25821586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    "{, return value = ${thread.return-value}}"\
2583a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    "\\n"
2584a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton
25854a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton//#define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id}"\
25864a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton//    "{, ${frame.pc}}"\
25874a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton//    MODULE_WITH_FUNC\
25884a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton//    FILE_AND_LINE\
25894a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton//    "{, stop reason = ${thread.stop-reason}}"\
25904a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton//    "{, name = ${thread.name}}"\
25914a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton//    "{, queue = ${thread.queue}}"\
25924a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton//    "\\n"
25934a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton
2594a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton#define DEFAULT_FRAME_FORMAT "frame #${frame.index}: ${frame.pc}"\
2595a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    MODULE_WITH_FUNC\
2596a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    FILE_AND_LINE\
2597a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    "\\n"
25986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
25996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry
2600d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::instance_settings_table[] =
26016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2602a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton//  NAME                    Setting variable type   Default                 Enum  Init'd Hidden Help
2603a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton//  ======================= ======================= ======================  ====  ====== ====== ======================
2604a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton{   "frame-format",         eSetVarTypeString,      DEFAULT_FRAME_FORMAT,   NULL, false, false, "The default frame format string to use when displaying thread information." },
2605f8fa6ff7bf2f7115d1069559b8519a8f91bac88aGreg Clayton{   "prompt",               eSetVarTypeString,      "(lldb) ",              NULL, false, false, "The debugger command line prompt displayed for the user." },
26069305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham{   "script-lang",          eSetVarTypeString,      "python",               NULL, false, false, "The script language to be used for evaluating user-written scripts." },
26079305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham{   "term-width",           eSetVarTypeInt,         "80"    ,               NULL, false, false, "The maximum number of columns to use for displaying text." },
2608a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton{   "thread-format",        eSetVarTypeString,      DEFAULT_THREAD_FORMAT,  NULL, false, false, "The default thread format string to use when displaying thread information." },
2609be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{   "use-external-editor",  eSetVarTypeBoolean,     "false",                NULL, false, false, "Whether to use an external editor or not." },
2610be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{   "auto-confirm",         eSetVarTypeBoolean,     "false",                NULL, false, false, "If true all confirmation prompts will receive their default reply." },
2611be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{   "stop-line-count-before",eSetVarTypeInt,        "3",                    NULL, false, false, "The number of sources lines to display that come before the current source line when displaying a stopped context." },
2612be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{   "stop-line-count-after", eSetVarTypeInt,        "3",                    NULL, false, false, "The number of sources lines to display that come after the current source line when displaying a stopped context." },
2613be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{   "stop-disassembly-count",  eSetVarTypeInt,      "0",                    NULL, false, false, "The number of disassembly lines to show when displaying a stopped context." },
2614be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{   "stop-disassembly-display", eSetVarTypeEnum,    "no-source",           g_show_disassembly_enum_values, false, false, "Control when to display disassembly when displaying a stopped context." },
2615a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton{   NULL,                   eSetVarTypeNone,        NULL,                   NULL, false, false, NULL }
26166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice};
2617