124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Variable.cpp --------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
143bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton#include "lldb/Core/RegularExpression.h"
155d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton#include "lldb/Core/ValueObject.h"
165d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton#include "lldb/Core/ValueObjectVariable.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Block.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
215d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton#include "lldb/Symbol/VariableList.h"
225c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton#include "lldb/Target/ABI.h"
23eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Process.h"
24b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton#include "lldb/Target/RegisterContext.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
27eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Variable constructor
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
353bc52d0a96c18be384028a90914f534ac252fbe4Greg ClaytonVariable::Variable
363bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton(
373bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    lldb::user_id_t uid,
383bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name,
393bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *mangled,   // The mangled variable name for variables in namespaces
4037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    const lldb::SymbolFileTypeSP &symfile_type_sp,
413bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    ValueType scope,
423bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    SymbolContextScope *context,
433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    Declaration* decl_ptr,
443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const DWARFExpression& location,
453bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    bool external,
463bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    bool artificial
473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton) :
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID(uid),
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name(name),
50c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton    m_mangled (ConstString(mangled), true),
5137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    m_symfile_type_sp(symfile_type_sp),
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_scope(scope),
534fb08150367853dae24bb92904356788e919a72fGreg Clayton    m_owner_scope(context),
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_declaration(decl_ptr),
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_location(location),
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_external(external),
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_artificial(artificial)
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariable::~Variable()
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
693bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonconst ConstString&
703bc52d0a96c18be384028a90914f534ac252fbe4Greg ClaytonVariable::GetName() const
713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton{
723bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (m_mangled)
733bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return m_mangled.GetName();
743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    return m_name;
753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton}
763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
773bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonbool
783bc52d0a96c18be384028a90914f534ac252fbe4Greg ClaytonVariable::NameMatches (const RegularExpression& regex) const
793bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton{
803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (regex.Execute (m_name.AsCString()))
813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return true;
823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    return m_mangled.NameMatches (regex);
833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton}
843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
8537bb8ddd443da172f42bb8657f15ec856a525c84Greg ClaytonType *
8637bb8ddd443da172f42bb8657f15ec856a525c84Greg ClaytonVariable::GetType()
8737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton{
8837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    if (m_symfile_type_sp)
8937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        return m_symfile_type_sp->GetType();
9037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    return NULL;
9137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton}
9237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariable::Dump(Stream *s, bool show_context) const
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
967e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf("%p: ", this);
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *s << "Variable" << (const UserID&)*this;
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_name)
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", name = \"" << m_name << "\"";
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    if (m_symfile_type_sp)
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        Type *type = m_symfile_type_sp->GetType();
10637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        if (type)
10737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        {
10837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            *s << ", type = {" << type->GetID() << "} " << (void*)type << " (";
10937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            type->DumpTypeName(s);
11037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            s->PutChar(')');
11137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        }
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_scope != eValueTypeInvalid)
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(", scope = ");
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (m_scope)
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eValueTypeVariableGlobal:       s->PutCString(m_external ? "global" : "static"); break;
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eValueTypeVariableArgument:    s->PutCString("parameter"); break;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eValueTypeVariableLocal:        s->PutCString("local"); break;
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:            *s << "??? (" << m_scope << ')';
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1264fb08150367853dae24bb92904356788e919a72fGreg Clayton    if (show_context && m_owner_scope != NULL)
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(", context = ( ");
1294fb08150367853dae24bb92904356788e919a72fGreg Clayton        m_owner_scope->DumpSymbolContext(s);
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(" )");
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1331924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    bool show_fullpaths = false;
1341924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    m_declaration.Dump(s, show_fullpaths);
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_location.IsValid())
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(", location = ");
139178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        lldb::addr_t loclist_base_addr = LLDB_INVALID_ADDRESS;
140178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        if (m_location.IsLocationList())
141178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        {
142178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton            SymbolContext variable_sc;
143178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton            m_owner_scope->CalculateSymbolContext(&variable_sc);
144178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton            if (variable_sc.function)
145178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                loclist_base_addr = variable_sc.function->GetAddressRange().GetBaseAddress().GetFileAddress();
146178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        }
1475c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton        ABI *abi = NULL;
1485c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton        if (m_owner_scope)
1495c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton        {
1503508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            ModuleSP module_sp (m_owner_scope->CalculateSymbolContextModule());
1513508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            if (module_sp)
1523508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                abi = ABI::FindPlugin (module_sp->GetArchitecture()).get();
1535c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton        }
1545c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton        m_location.GetDescription(s, lldb::eDescriptionLevelBrief, loclist_base_addr, abi);
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_external)
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(", external");
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_artificial)
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(", artificial");
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
166fb81642e03567a3413d94cdb632b6005a0ad4273Greg Claytonbool
167fb81642e03567a3413d94cdb632b6005a0ad4273Greg ClaytonVariable::DumpDeclaration (Stream *s, bool show_fullpaths, bool show_module)
168fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton{
169fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton    bool dumped_declaration_info = false;
170fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton    if (m_owner_scope)
171fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton    {
172fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        SymbolContext sc;
173fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        m_owner_scope->CalculateSymbolContext(&sc);
174fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        sc.block = NULL;
175fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        sc.line_entry.Clear();
176fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        bool show_inlined_frames = false;
177fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton
178fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        dumped_declaration_info = sc.DumpStopContext (s,
179fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton                                                      NULL,
180fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton                                                      Address(),
181fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton                                                      show_fullpaths,
182fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton                                                      show_module,
183fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton                                                      show_inlined_frames);
184fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton
185fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        if (sc.function)
186fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton            s->PutChar(':');
187fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton    }
188fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton    if (m_declaration.DumpStopContext (s, false))
189fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        dumped_declaration_info = true;
190fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton    return dumped_declaration_info;
191fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton}
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariable::MemorySize() const
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sizeof(Variable);
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariable::CalculateSymbolContext (SymbolContext *sc)
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2034fb08150367853dae24bb92904356788e919a72fGreg Clayton    if (m_owner_scope)
2044fb08150367853dae24bb92904356788e919a72fGreg Clayton        m_owner_scope->CalculateSymbolContext(sc);
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
206a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton        sc->Clear(false);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
21082f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonVariable::LocationIsValidForFrame (StackFrame *frame)
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    // Is the variable is described by a single location?
21382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (!m_location.IsLocationList())
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        // Yes it is, the location is valid.
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
21782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    }
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (frame)
22082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    {
22182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        Function *function = frame->GetSymbolContext(eSymbolContextFunction).function;
22282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (function)
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
224289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton            TargetSP target_sp (frame->CalculateTarget());
225289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton
226289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton            addr_t loclist_base_load_addr = function->GetAddressRange().GetBaseAddress().GetLoadAddress (target_sp.get());
227178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton            if (loclist_base_load_addr == LLDB_INVALID_ADDRESS)
228178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                return false;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // It is a location list. We just need to tell if the location
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // list contains the current address when converted to a load
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // address
23282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            return m_location.LocationListContainsAddress (loclist_base_load_addr,
233289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton                                                           frame->GetFrameCodeAddress().GetLoadAddress (target_sp.get()));
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
23582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    }
23682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return false;
23782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton}
23882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
23982f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool
2409b82f8637b65c90e91c2827245550a1bb5e8df91Greg ClaytonVariable::LocationIsValidForAddress (const Address &address)
2419b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton{
2429b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    // Be sure to resolve the address to section offset prior to
2439b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    // calling this function.
2449b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    if (address.IsSectionOffset())
2459b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    {
2469b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton        SymbolContext sc;
2479b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton        CalculateSymbolContext(&sc);
2483508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        if (sc.module_sp == address.GetModule())
2499b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton        {
2509b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            // Is the variable is described by a single location?
2519b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            if (!m_location.IsLocationList())
2529b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            {
2539b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                // Yes it is, the location is valid.
2549b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                return true;
2559b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            }
2569b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton
2579b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            if (sc.function)
2589b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            {
2599b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                addr_t loclist_base_file_addr = sc.function->GetAddressRange().GetBaseAddress().GetFileAddress();
2609b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                if (loclist_base_file_addr == LLDB_INVALID_ADDRESS)
2619b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                    return false;
2629b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                // It is a location list. We just need to tell if the location
2639b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                // list contains the current address when converted to a load
2649b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                // address
2659b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                return m_location.LocationListContainsAddress (loclist_base_file_addr,
2669b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                                                               address.GetFileAddress());
2679b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            }
2689b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton        }
2699b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    }
2709b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    return false;
2719b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton}
2729b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton
2739b82f8637b65c90e91c2827245550a1bb5e8df91Greg Claytonbool
27482f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonVariable::IsInScope (StackFrame *frame)
27582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{
27682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    switch (m_scope)
27782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    {
27882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    case eValueTypeRegister:
27982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    case eValueTypeRegisterSet:
28082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        return frame != NULL;
28182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
28282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    case eValueTypeConstResult:
28382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    case eValueTypeVariableGlobal:
28482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    case eValueTypeVariableStatic:
28524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        return true;
28624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
28782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    case eValueTypeVariableArgument:
28882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    case eValueTypeVariableLocal:
28982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (frame)
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We don't have a location list, we just need to see if the block
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // that this variable was defined in is currently
293a357ecfaec0c9c718e26d5558499622110993e73Greg Clayton            Block *deepest_frame_block = frame->GetSymbolContext(eSymbolContextBlock).block;
294a357ecfaec0c9c718e26d5558499622110993e73Greg Clayton            if (deepest_frame_block)
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolContext variable_sc;
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                CalculateSymbolContext (&variable_sc);
29882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // Check for static or global variable defined at the compile unit
29982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // level that wasn't defined in a block
30082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                if (variable_sc.block == NULL)
30182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    return true;
30282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
303a357ecfaec0c9c718e26d5558499622110993e73Greg Clayton                if (variable_sc.block == deepest_frame_block)
304178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                    return true;
305a357ecfaec0c9c718e26d5558499622110993e73Greg Clayton                return variable_sc.block->Contains (deepest_frame_block);
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3165d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg ClaytonError
3175d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg ClaytonVariable::GetValuesForVariableExpressionPath (const char *variable_expr_path,
3185d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                              ExecutionContextScope *scope,
3195d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                              GetVariableCallback callback,
3205d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                              void *baton,
3215d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                              VariableList &variable_list,
3225d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                              ValueObjectList &valobj_list)
3235d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton{
3245d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton    Error error;
3255d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton    if (variable_expr_path && callback)
3265d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton    {
3275d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton        switch (variable_expr_path[0])
3285d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton        {
3295d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton        case '*':
3305d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton            {
3315d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                error = Variable::GetValuesForVariableExpressionPath (variable_expr_path + 1,
3325d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      scope,
3335d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      callback,
3345d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      baton,
3355d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      variable_list,
3365d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      valobj_list);
3375d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                if (error.Success())
3385d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                {
3395d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    for (uint32_t i=0; i<valobj_list.GetSize(); )
3405d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    {
3415d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        Error tmp_error;
3425d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        ValueObjectSP valobj_sp (valobj_list.GetValueObjectAtIndex(i)->Dereference(tmp_error));
3435d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        if (tmp_error.Fail())
3445d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        {
3455d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            variable_list.RemoveVariableAtIndex (i);
3465d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            valobj_list.RemoveValueObjectAtIndex (i);
3475d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        }
3485d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        else
3495d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        {
3505d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            valobj_list.SetValueObjectAtIndex (i, valobj_sp);
3515d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            ++i;
3525d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        }
3535d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    }
3545d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                }
3555d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                else
3565d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                {
3575d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    error.SetErrorString ("unknown error");
3585d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                }
3595d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                return error;
3605d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton            }
3615d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton            break;
3625d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton
3635d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton        case '&':
3645d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton            {
3655d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                error = Variable::GetValuesForVariableExpressionPath (variable_expr_path + 1,
3665d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      scope,
3675d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      callback,
3685d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      baton,
3695d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      variable_list,
3705d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                      valobj_list);
3715d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                if (error.Success())
3725d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                {
3735d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    for (uint32_t i=0; i<valobj_list.GetSize(); )
3745d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    {
3755d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        Error tmp_error;
3765d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        ValueObjectSP valobj_sp (valobj_list.GetValueObjectAtIndex(i)->AddressOf(tmp_error));
3775d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        if (tmp_error.Fail())
3785d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        {
3795d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            variable_list.RemoveVariableAtIndex (i);
3805d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            valobj_list.RemoveValueObjectAtIndex (i);
3815d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        }
3825d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        else
3835d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        {
3845d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            valobj_list.SetValueObjectAtIndex (i, valobj_sp);
3855d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            ++i;
3865d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        }
3875d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    }
3885d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                }
3895d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                else
3905d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                {
3915d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    error.SetErrorString ("unknown error");
3925d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                }
3935d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                return error;
3945d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton            }
3955d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton            break;
3965d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton
3975d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton        default:
3985d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton            {
39900af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                static RegularExpression g_regex ("^([A-Za-z_:][A-Za-z_0-9:]*)(.*)");
40000af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                RegularExpression::Match regex_match(1);
40100af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                if (g_regex.Execute(variable_expr_path, &regex_match))
4025d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                {
4035d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    std::string variable_name;
40400af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                    if (regex_match.GetMatchAtIndex(variable_expr_path, 1, variable_name))
4055d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    {
4065d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        variable_list.Clear();
4075d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        if (callback (baton, variable_name.c_str(), variable_list))
4085d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        {
4095d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            uint32_t i=0;
4105d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            while (i < variable_list.GetSize())
4115d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            {
4125d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                VariableSP var_sp (variable_list.GetVariableAtIndex (i));
4135d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                ValueObjectSP valobj_sp;
4145d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                if (var_sp)
4155d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                {
4165d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                    ValueObjectSP variable_valobj_sp(ValueObjectVariable::Create (scope, var_sp));
4175d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                    if (variable_valobj_sp)
4185d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                    {
419fcf17936a03f8464bb64eaca910666b14be6b3d1Greg Clayton                                        const char *variable_sub_expr_path = variable_expr_path + variable_name.size();
420fcf17936a03f8464bb64eaca910666b14be6b3d1Greg Clayton                                        if (*variable_sub_expr_path)
4215d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                        {
4225d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            const char* first_unparsed = NULL;
4235d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            ValueObject::ExpressionPathScanEndReason reason_to_stop;
4245d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            ValueObject::ExpressionPathEndResultType final_value_type;
4255d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            ValueObject::GetValueForExpressionPathOptions options;
4265d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            ValueObject::ExpressionPathAftermath final_task_on_target;
4275d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton
428fcf17936a03f8464bb64eaca910666b14be6b3d1Greg Clayton                                            valobj_sp = variable_valobj_sp->GetValueForExpressionPath (variable_sub_expr_path,
4295d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                                                       &first_unparsed,
4305d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                                                       &reason_to_stop,
4315d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                                                       &final_value_type,
4325d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                                                       options,
4335d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                                                       &final_task_on_target);
4345d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            if (!valobj_sp)
4355d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            {
4365d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                error.SetErrorStringWithFormat ("invalid expression path '%s' for variable '%s'",
437fcf17936a03f8464bb64eaca910666b14be6b3d1Greg Clayton                                                                                variable_sub_expr_path,
4385d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                                                                var_sp->GetName().GetCString());
4395d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            }
4405d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                        }
4415d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                        else
4425d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                        {
4435d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            // Just the name of a variable with no extras
4445d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                            valobj_sp = variable_valobj_sp;
4455d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                        }
4465d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                    }
4475d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                }
4485d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton
4495d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                if (!var_sp || !valobj_sp)
4505d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                {
4515d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                    variable_list.RemoveVariableAtIndex (i);
4525d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                }
4535d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                else
4545d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                {
4555d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                    valobj_list.Append(valobj_sp);
4565d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                    ++i;
4575d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                }
4585d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            }
4595d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton
4605d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            if (variable_list.GetSize() > 0)
4615d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            {
4625d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                error.Clear();
4635d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                                return error;
4645d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                            }
4655d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                        }
4665d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                    }
4675d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton                }
4686630d1f9164193070d4747dab332b783c54491feGreg Clayton                error.SetErrorStringWithFormat ("unable to extract a variable name from '%s'", variable_expr_path);
4695d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton            }
4705d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton            break;
4715d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton        }
4725d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton    }
4735d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton    error.SetErrorString ("unknown error");
4745d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton    return error;
4755d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton}
4765d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton
4779b82f8637b65c90e91c2827245550a1bb5e8df91Greg Claytonbool
4789b82f8637b65c90e91c2827245550a1bb5e8df91Greg ClaytonVariable::DumpLocationForAddress (Stream *s, const Address &address)
4799b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton{
4809b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    // Be sure to resolve the address to section offset prior to
4819b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    // calling this function.
4829b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    if (address.IsSectionOffset())
4839b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    {
4849b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton        SymbolContext sc;
4859b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton        CalculateSymbolContext(&sc);
4863508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        if (sc.module_sp == address.GetModule())
4879b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton        {
4885c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton            ABI *abi = NULL;
4895c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton            if (m_owner_scope)
4905c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton            {
4913508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                ModuleSP module_sp (m_owner_scope->CalculateSymbolContextModule());
4923508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                if (module_sp)
4933508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    abi = ABI::FindPlugin (module_sp->GetArchitecture()).get();
4945c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton            }
4955c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton
4969b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            const addr_t file_addr = address.GetFileAddress();
4979b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            if (sc.function)
4989b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            {
4999b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                if (sc.function->GetAddressRange().ContainsFileAddress(address))
5009b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                {
5019b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                    addr_t loclist_base_file_addr = sc.function->GetAddressRange().GetBaseAddress().GetFileAddress();
5029b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                    if (loclist_base_file_addr == LLDB_INVALID_ADDRESS)
5039b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                        return false;
5049b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                    return m_location.DumpLocationForAddress (s,
5059b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                                                              eDescriptionLevelBrief,
5069b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                                                              loclist_base_file_addr,
5075c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                                                              file_addr,
5085c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                                                              abi);
5099b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                }
5109b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            }
5119b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton            return m_location.DumpLocationForAddress (s,
5129b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                                                      eDescriptionLevelBrief,
5139b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton                                                      LLDB_INVALID_ADDRESS,
5145c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                                                      file_addr,
5155c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton                                                      abi);
5169b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton        }
5179b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    }
5189b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton    return false;
519946618a80e17d210e6592e94d10a15ad592572baGreg Clayton}
520946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
521946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
522946618a80e17d210e6592e94d10a15ad592572baGreg Claytonstatic void
523946618a80e17d210e6592e94d10a15ad592572baGreg ClaytonPrivateAutoComplete (StackFrame *frame,
524946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     const std::string &partial_path,
525946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     const std::string &prefix_path, // Anything that has been resolved already will be in here
526946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     const ClangASTType& clang_type,
527946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     StringList &matches,
528946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     bool &word_complete);
529946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
530946618a80e17d210e6592e94d10a15ad592572baGreg Claytonstatic void
531946618a80e17d210e6592e94d10a15ad592572baGreg ClaytonPrivateAutoCompleteMembers (StackFrame *frame,
532946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            const std::string &partial_member_name,
533946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            const std::string &partial_path,
534946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            const std::string &prefix_path, // Anything that has been resolved already will be in here
535946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            const ClangASTType& clang_type,
536946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            StringList &matches,
537946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            bool &word_complete);
538946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
539946618a80e17d210e6592e94d10a15ad592572baGreg Claytonstatic void
540946618a80e17d210e6592e94d10a15ad592572baGreg ClaytonPrivateAutoCompleteMembers (StackFrame *frame,
541946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            const std::string &partial_member_name,
542946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            const std::string &partial_path,
543946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            const std::string &prefix_path, // Anything that has been resolved already will be in here
544946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            const ClangASTType& clang_type,
545946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            StringList &matches,
546946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            bool &word_complete)
547946618a80e17d210e6592e94d10a15ad592572baGreg Clayton{
548946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
549946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    // We are in a type parsing child members
55052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const uint32_t num_bases = clang_type.GetNumDirectBaseClasses();
551946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
552946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    if (num_bases > 0)
553946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    {
554946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        for (uint32_t i = 0; i < num_bases; ++i)
555946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        {
55652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ClangASTType base_class_type (clang_type.GetDirectBaseClassAtIndex (i, NULL));
557946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
558946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            PrivateAutoCompleteMembers (frame,
559946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        partial_member_name,
560946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        partial_path,
561946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        prefix_path,
562946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        base_class_type.GetCanonicalType(),
563946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        matches,
564946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        word_complete);
565946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        }
566946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    }
567946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
56852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const uint32_t num_vbases = clang_type.GetNumVirtualBaseClasses();
569946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
570946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    if (num_vbases > 0)
571946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    {
572946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        for (uint32_t i = 0; i < num_vbases; ++i)
573946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        {
57452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ClangASTType vbase_class_type (clang_type.GetVirtualBaseClassAtIndex(i,NULL));
575946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
576946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            PrivateAutoCompleteMembers (frame,
577946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        partial_member_name,
578946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        partial_path,
579946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        prefix_path,
580946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        vbase_class_type.GetCanonicalType(),
581946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        matches,
582946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                        word_complete);
583946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        }
584946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    }
585946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
586946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    // We are in a type parsing child members
58752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const uint32_t num_fields = clang_type.GetNumFields();
588946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
589946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    if (num_fields > 0)
590946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    {
591946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        for (uint32_t i = 0; i < num_fields; ++i)
592946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        {
593946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            std::string member_name;
594946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
59552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ClangASTType member_clang_type = clang_type.GetFieldAtIndex (i, member_name, NULL, NULL, NULL);
596946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
597946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            if (partial_member_name.empty() ||
598946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                member_name.find(partial_member_name) == 0)
599946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            {
600946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                if (member_name == partial_member_name)
601946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                {
602946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    PrivateAutoComplete (frame,
603946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                         partial_path,
604946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                         prefix_path + member_name, // Anything that has been resolved already will be in here
605946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                         member_clang_type.GetCanonicalType(),
606946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                         matches,
607946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                         word_complete);
608946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                }
609946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                else
610946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                {
611946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    matches.AppendString (prefix_path + member_name);
612946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                }
613946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            }
614946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        }
615946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    }
616946618a80e17d210e6592e94d10a15ad592572baGreg Clayton}
617946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
618946618a80e17d210e6592e94d10a15ad592572baGreg Claytonstatic void
619946618a80e17d210e6592e94d10a15ad592572baGreg ClaytonPrivateAutoComplete (StackFrame *frame,
620946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     const std::string &partial_path,
621946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     const std::string &prefix_path, // Anything that has been resolved already will be in here
622946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     const ClangASTType& clang_type,
623946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     StringList &matches,
624946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                     bool &word_complete)
625946618a80e17d210e6592e94d10a15ad592572baGreg Clayton{
626946618a80e17d210e6592e94d10a15ad592572baGreg Clayton//    printf ("\nPrivateAutoComplete()\n\tprefix_path = '%s'\n\tpartial_path = '%s'\n", prefix_path.c_str(), partial_path.c_str());
627946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    std::string remaining_partial_path;
628946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
629946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    const lldb::TypeClass type_class = clang_type.GetTypeClass();
630946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    if (partial_path.empty())
631946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    {
632946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        if (clang_type.IsValid())
633946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        {
634946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            switch (type_class)
635946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            {
636946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                default:
637946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassArray:
638946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassBlockPointer:
639946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassBuiltin:
640946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassComplexFloat:
641946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassComplexInteger:
642946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassEnumeration:
643946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassFunction:
644946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassMemberPointer:
645946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassReference:
646946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassTypedef:
647946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassVector:
648946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    {
649946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        matches.AppendString (prefix_path);
650946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        word_complete = matches.GetSize() == 1;
651946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    }
652946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    break;
653946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
654946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassClass:
655946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassStruct:
656946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassUnion:
657946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    if (prefix_path.back() != '.')
658946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        matches.AppendString (prefix_path + '.');
659946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    break;
660946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
661946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassObjCObject:
662946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassObjCInterface:
663946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    break;
664946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassObjCObjectPointer:
665946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                case eTypeClassPointer:
666946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    {
667946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        bool omit_empty_base_classes = true;
66852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (clang_type.GetNumChildren (omit_empty_base_classes) > 0)
669946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            matches.AppendString (prefix_path + "->");
670946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        else
671946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        {
672946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            matches.AppendString (prefix_path);
673946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            word_complete = true;
674946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        }
675946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    }
676946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    break;
677946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            }
678946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        }
679946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        else
680946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        {
681946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            if (frame)
682946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            {
683946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                const bool get_file_globals = true;
684946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
685946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                VariableList *variable_list = frame->GetVariableList(get_file_globals);
686946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
687946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                const size_t num_variables = variable_list->GetSize();
688946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                for (size_t i=0; i<num_variables; ++i)
689946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                {
690946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    Variable *variable = variable_list->GetVariableAtIndex(i).get();
691946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    matches.AppendString (variable->GetName().AsCString());
692946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                }
693946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            }
694946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        }
695946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    }
696946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    else
697946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    {
698946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        const char ch = partial_path[0];
699946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        switch (ch)
700946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        {
701946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        case '*':
702946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            if (prefix_path.empty())
703946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            {
704946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                PrivateAutoComplete (frame,
705946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     partial_path.substr(1),
706946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     std::string("*"),
707946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     clang_type,
708946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     matches,
709946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     word_complete);
710946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            }
711946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            break;
7129b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton
713946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        case '&':
714946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            if (prefix_path.empty())
715946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            {
716946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                PrivateAutoComplete (frame,
717946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     partial_path.substr(1),
718946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     std::string("&"),
719946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     clang_type,
720946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     matches,
721946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                     word_complete);
722946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            }
723946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            break;
724946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
725946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        case '-':
726946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            if (partial_path[1] == '>' && !prefix_path.empty())
727946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            {
728946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                switch (type_class)
729946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                {
730946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    case lldb::eTypeClassPointer:
731946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        {
73252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ClangASTType pointee_type(clang_type.GetPointeeType());
733946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            if (partial_path[2])
734946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            {
735946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                // If there is more after the "->", then search deeper
736946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                PrivateAutoComplete (frame,
737946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                     partial_path.substr(2),
738946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                     prefix_path + "->",
739946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                     pointee_type.GetCanonicalType(),
740946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                     matches,
741946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                     word_complete);
742946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            }
743946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            else
744946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            {
745946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                // Nothing after the "->", so list all members
746946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                PrivateAutoCompleteMembers (frame,
747946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                            std::string(),
748946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                            std::string(),
749946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                            prefix_path + "->",
750946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                            pointee_type.GetCanonicalType(),
751946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                            matches,
752946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                            word_complete);
753946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            }
754946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        }
755946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    default:
756946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        break;
757946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                }
758946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            }
759946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            break;
760946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
761946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        case '.':
762946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            if (clang_type.IsValid())
763946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            {
764946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                switch (type_class)
765946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                {
766946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    case lldb::eTypeClassUnion:
767946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    case lldb::eTypeClassStruct:
768946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    case lldb::eTypeClassClass:
769946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        if (partial_path[1])
770946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        {
771946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            // If there is more after the ".", then search deeper
772946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            PrivateAutoComplete (frame,
773946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                 partial_path.substr(1),
774946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                 prefix_path + ".",
775946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                 clang_type,
776946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                 matches,
777946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                 word_complete);
778946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
779946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        }
780946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        else
781946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        {
782946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            // Nothing after the ".", so list all members
783946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            PrivateAutoCompleteMembers (frame,
784946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                        std::string(),
785946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                        partial_path,
786946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                        prefix_path + ".",
787946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                        clang_type,
788946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                        matches,
789946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                        word_complete);
790946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        }
791946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    default:
792946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        break;
793946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                }
794946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            }
795946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            break;
796946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        default:
797946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            if (isalpha(ch) || ch == '_' || ch == '$')
798946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            {
799946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                const size_t partial_path_len = partial_path.size();
800946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                size_t pos = 1;
801946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                while (pos < partial_path_len)
802946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                {
803946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    const char curr_ch = partial_path[pos];
804946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    if (isalnum(curr_ch) || curr_ch == '_'  || curr_ch == '$')
805946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    {
806946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        ++pos;
807946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        continue;
808946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    }
809946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    break;
810946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                }
811946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
812946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                std::string token(partial_path, 0, pos);
813946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                remaining_partial_path = partial_path.substr(pos);
814946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
815946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                if (clang_type.IsValid())
816946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                {
817946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    PrivateAutoCompleteMembers (frame,
818946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                token,
819946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                remaining_partial_path,
820946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                prefix_path,
821946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                clang_type,
822946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                matches,
823946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                word_complete);
824946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                }
825946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                else if (frame)
826946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                {
827946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    // We haven't found our variable yet
828946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    const bool get_file_globals = true;
829946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
830946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    VariableList *variable_list = frame->GetVariableList(get_file_globals);
831946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
832946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    const size_t num_variables = variable_list->GetSize();
833946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    for (size_t i=0; i<num_variables; ++i)
834946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    {
835946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        Variable *variable = variable_list->GetVariableAtIndex(i).get();
836946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        const char *variable_name = variable->GetName().AsCString();
837946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        if (strstr(variable_name, token.c_str()) == variable_name)
838946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        {
839946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            if (strcmp (variable_name, token.c_str()) == 0)
840946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            {
841946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                Type *variable_type = variable->GetType();
842946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                if (variable_type)
843946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                {
84452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    ClangASTType variable_clang_type (variable_type->GetClangForwardType());
845946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                    PrivateAutoComplete (frame,
846946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                         remaining_partial_path,
847946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                         prefix_path + token, // Anything that has been resolved already will be in here
848946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                         variable_clang_type.GetCanonicalType(),
849946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                         matches,
850946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                                         word_complete);
851946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                }
852946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                else
853946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                {
854946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                    matches.AppendString (prefix_path + variable_name);
855946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                }
856946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            }
857946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            else if (remaining_partial_path.empty())
858946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            {
859946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                                matches.AppendString (prefix_path + variable_name);
860946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                            }
861946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        }
862946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                    }
863946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                }
864946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            }
865946618a80e17d210e6592e94d10a15ad592572baGreg Clayton            break;
866946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        }
867946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    }
868946618a80e17d210e6592e94d10a15ad592572baGreg Clayton}
869946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
870946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
871946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
872946618a80e17d210e6592e94d10a15ad592572baGreg Claytonsize_t
873946618a80e17d210e6592e94d10a15ad592572baGreg ClaytonVariable::AutoComplete (const ExecutionContext &exe_ctx,
874946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        const char *partial_path_cstr,
875946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        StringList &matches,
876946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                        bool &word_complete)
877946618a80e17d210e6592e94d10a15ad592572baGreg Clayton{
878946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    word_complete = false;
879946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    std::string partial_path;
880946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    std::string prefix_path;
881946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    ClangASTType clang_type;
882946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    if (partial_path_cstr && partial_path_cstr[0])
883946618a80e17d210e6592e94d10a15ad592572baGreg Clayton        partial_path = partial_path_cstr;
884946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
885946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    PrivateAutoComplete (exe_ctx.GetFramePtr(),
886946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                         partial_path,
887946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                         prefix_path,
888946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                         clang_type,
889946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                         matches,
890946618a80e17d210e6592e94d10a15ad592572baGreg Clayton                         word_complete);
891946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
892946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    return matches.GetSize();
8939b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton}
8949b82f8637b65c90e91c2827245550a1bb5e8df91Greg Clayton
895