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, ®ex_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