VariableList.cpp revision 3bc52d0a96c18be384028a90914f534ac252fbe4
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{ 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::copy( variable_list->m_variables.begin(), // source begin 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner variable_list->m_variables.end(), // source end 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner back_inserter(m_variables)); // destination 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::Clear() 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_variables.clear(); 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableSP 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::GetVariableAtIndex(uint32_t idx) 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 696bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton VariableSP var_sp; 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < m_variables.size()) 716bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton var_sp = m_variables[idx]; 726bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return var_sp; 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 756bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Claytonuint32_t 766bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg ClaytonVariableList::FindVariableIndex (const VariableSP &var_sp) 776bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton{ 786bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton iterator pos, end = m_variables.end(); 796bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton for (pos = m_variables.begin(); pos != end; ++pos) 806bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 816bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton if (pos->get() == var_sp.get()) 826bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return std::distance (m_variables.begin(), pos); 836bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 846bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return UINT32_MAX; 856bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton} 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableSP 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::FindVariable(const ConstString& name) 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VariableSP var_sp; 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner iterator pos, end = m_variables.end(); 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_variables.begin(); pos != end; ++pos) 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 943bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if ((*pos)->NameMatches(name)) 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_sp = (*pos); 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return var_sp; 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1036bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Claytonsize_t 1046bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg ClaytonVariableList::AppendVariablesIfUnique (const RegularExpression& regex, VariableList &var_list, size_t& total_matches) 1056bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton{ 1066bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton const size_t initial_size = var_list.GetSize(); 1076bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton iterator pos, end = m_variables.end(); 1086bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton for (pos = m_variables.begin(); pos != end; ++pos) 1096bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 1103bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if ((*pos)->NameMatches (regex)) 1116bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 1126bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton // Note the total matches found 1136bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton total_matches++; 1146bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton // Only add this variable if it isn't already in the "var_list" 1156bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton var_list.AddVariableIfUnique (*pos); 1166bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 1176bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 1186bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton // Return the number of new unique variables added to "var_list" 1196bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return var_list.GetSize() - initial_size; 1206bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton} 1216bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 12217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Claytonuint32_t 12317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonVariableList::FindIndexForVariable (Variable* variable) 12417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton{ 12517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton VariableSP var_sp; 12617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton iterator pos; 12717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton const iterator begin = m_variables.begin(); 12817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton const iterator end = m_variables.end(); 12917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton for (pos = m_variables.begin(); pos != end; ++pos) 13017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 13117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if ((*pos).get() == variable) 13217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return std::distance (begin, pos); 13317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 13417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return UINT32_MAX; 13517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton} 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::MemorySize() const 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t mem_size = sizeof(VariableList); 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator pos, end = m_variables.end(); 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_variables.begin(); pos != end; ++pos) 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mem_size += (*pos)->MemorySize(); 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return mem_size; 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::GetSize() const 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_variables.size(); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableList::Dump(Stream *s, bool show_context) const 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// s.Printf("%.*p: ", (int)sizeof(void*) * 2, this); 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// s.Indent(); 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// s << "VariableList\n"; 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator pos, end = m_variables.end(); 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_variables.begin(); pos != end; ++pos) 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (*pos)->Dump(s, show_context); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167