124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- VariableList.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/VariableList.h" 116bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 126bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton#include "lldb/Core/RegularExpression.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Block.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// VariableList constructor 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::VariableList() : 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_variables() 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::~VariableList() 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 366bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg ClaytonVariableList::AddVariable(const VariableSP &var_sp) 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 386bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton m_variables.push_back(var_sp); 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 416bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Claytonbool 426bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg ClaytonVariableList::AddVariableIfUnique (const lldb::VariableSP &var_sp) 436bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton{ 446bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton if (FindVariableIndex (var_sp) == UINT32_MAX) 456bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 466bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton m_variables.push_back(var_sp); 476bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return true; 486bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 496bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return false; 506bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton} 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::AddVariables(VariableList *variable_list) 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5549ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (variable_list) 5649ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 5749ce8969d3154e1560106cfe530444c09410f217Greg Clayton std::copy(variable_list->m_variables.begin(), // source begin 5849ce8969d3154e1560106cfe530444c09410f217Greg Clayton variable_list->m_variables.end(), // source end 5949ce8969d3154e1560106cfe530444c09410f217Greg Clayton back_inserter(m_variables)); // destination 6049ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::Clear() 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_variables.clear(); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableSP 7036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonVariableList::GetVariableAtIndex(size_t idx) const 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 726bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton VariableSP var_sp; 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < m_variables.size()) 746bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton var_sp = m_variables[idx]; 756bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return var_sp; 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 785d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg ClaytonVariableSP 7936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonVariableList::RemoveVariableAtIndex(size_t idx) 805d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton{ 815d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton VariableSP var_sp; 825d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton if (idx < m_variables.size()) 835d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton { 845d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton var_sp = m_variables[idx]; 855d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton m_variables.erase (m_variables.begin() + idx); 865d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton } 875d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton return var_sp; 885d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton} 895d81f49f0b45f8810cfaf1fa3437aa72bed0c3afGreg Clayton 906bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Claytonuint32_t 916bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg ClaytonVariableList::FindVariableIndex (const VariableSP &var_sp) 926bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton{ 936bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton iterator pos, end = m_variables.end(); 946bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton for (pos = m_variables.begin(); pos != end; ++pos) 956bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 966bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton if (pos->get() == var_sp.get()) 976bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return std::distance (m_variables.begin(), pos); 986bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 996bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return UINT32_MAX; 1006bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton} 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableSP 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::FindVariable(const ConstString& name) 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VariableSP var_sp; 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner iterator pos, end = m_variables.end(); 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_variables.begin(); pos != end; ++pos) 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1093bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if ((*pos)->NameMatches(name)) 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_sp = (*pos); 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return var_sp; 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1186bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Claytonsize_t 1196bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg ClaytonVariableList::AppendVariablesIfUnique (const RegularExpression& regex, VariableList &var_list, size_t& total_matches) 1206bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton{ 1216bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton const size_t initial_size = var_list.GetSize(); 1226bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton iterator pos, end = m_variables.end(); 1236bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton for (pos = m_variables.begin(); pos != end; ++pos) 1246bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 1253bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if ((*pos)->NameMatches (regex)) 1266bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 1276bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton // Note the total matches found 1286bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton total_matches++; 1296bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton // Only add this variable if it isn't already in the "var_list" 1306bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton var_list.AddVariableIfUnique (*pos); 1316bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 1326bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 1336bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton // Return the number of new unique variables added to "var_list" 1346bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return var_list.GetSize() - initial_size; 1356bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton} 1366bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 137994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granatasize_t 138994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico GranataVariableList::AppendVariablesWithScope (lldb::ValueType type, 139994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata VariableList &var_list, 140994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata bool if_unique) 141994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata{ 142994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata const size_t initial_size = var_list.GetSize(); 143994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata iterator pos, end = m_variables.end(); 144994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata for (pos = m_variables.begin(); pos != end; ++pos) 145994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata { 146994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata if ((*pos)->GetScope() == type) 147994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata { 148994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata if (if_unique) 149994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata var_list.AddVariableIfUnique (*pos); 150994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata else 151994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata var_list.AddVariable(*pos); 152994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata } 153994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata } 154994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata // Return the number of new unique variables added to "var_list" 155994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata return var_list.GetSize() - initial_size; 156994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata} 157994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata 15817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Claytonuint32_t 15917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonVariableList::FindIndexForVariable (Variable* variable) 16017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton{ 16117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton VariableSP var_sp; 16217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton iterator pos; 16317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton const iterator begin = m_variables.begin(); 16417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton const iterator end = m_variables.end(); 16517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton for (pos = m_variables.begin(); pos != end; ++pos) 16617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 16717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if ((*pos).get() == variable) 16817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return std::distance (begin, pos); 16917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 17017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return UINT32_MAX; 17117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton} 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::MemorySize() const 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t mem_size = sizeof(VariableList); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator pos, end = m_variables.end(); 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_variables.begin(); pos != end; ++pos) 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mem_size += (*pos)->MemorySize(); 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return mem_size; 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::GetSize() const 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_variables.size(); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::Dump(Stream *s, bool show_context) const 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// s.Printf("%.*p: ", (int)sizeof(void*) * 2, this); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// s.Indent(); 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// s << "VariableList\n"; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator pos, end = m_variables.end(); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_variables.begin(); pos != end; ++pos) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (*pos)->Dump(s, show_context); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 202