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