180814287SRaphael Isemann //===-- VariableList.cpp --------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner
930fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
1046747022SGreg Clayton
1130fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
1230fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
13b9c1b51eSKate Stone #include "lldb/Symbol/Function.h"
14bf9a7730SZachary Turner #include "lldb/Utility/RegularExpression.h"
1530fdc8d8SChris Lattner
1630fdc8d8SChris Lattner using namespace lldb;
1730fdc8d8SChris Lattner using namespace lldb_private;
1830fdc8d8SChris Lattner
1930fdc8d8SChris Lattner // VariableList constructor
VariableList()20b9c1b51eSKate Stone VariableList::VariableList() : m_variables() {}
2130fdc8d8SChris Lattner
2230fdc8d8SChris Lattner // Destructor
23*fd2433e1SJonas Devlieghere VariableList::~VariableList() = default;
2430fdc8d8SChris Lattner
AddVariable(const VariableSP & var_sp)25b9c1b51eSKate Stone void VariableList::AddVariable(const VariableSP &var_sp) {
2646747022SGreg Clayton m_variables.push_back(var_sp);
2730fdc8d8SChris Lattner }
2830fdc8d8SChris Lattner
AddVariableIfUnique(const lldb::VariableSP & var_sp)29b9c1b51eSKate Stone bool VariableList::AddVariableIfUnique(const lldb::VariableSP &var_sp) {
30b9c1b51eSKate Stone if (FindVariableIndex(var_sp) == UINT32_MAX) {
3146747022SGreg Clayton m_variables.push_back(var_sp);
3246747022SGreg Clayton return true;
3346747022SGreg Clayton }
3446747022SGreg Clayton return false;
3546747022SGreg Clayton }
3630fdc8d8SChris Lattner
AddVariables(VariableList * variable_list)37b9c1b51eSKate Stone void VariableList::AddVariables(VariableList *variable_list) {
38b9c1b51eSKate Stone if (variable_list) {
3930fdc8d8SChris Lattner std::copy(variable_list->m_variables.begin(), // source begin
4030fdc8d8SChris Lattner variable_list->m_variables.end(), // source end
4130fdc8d8SChris Lattner back_inserter(m_variables)); // destination
4230fdc8d8SChris Lattner }
431f746071SGreg Clayton }
4430fdc8d8SChris Lattner
Clear()45b9c1b51eSKate Stone void VariableList::Clear() { m_variables.clear(); }
4630fdc8d8SChris Lattner
GetVariableAtIndex(size_t idx) const47b9c1b51eSKate Stone VariableSP VariableList::GetVariableAtIndex(size_t idx) const {
4846747022SGreg Clayton VariableSP var_sp;
4930fdc8d8SChris Lattner if (idx < m_variables.size())
5046747022SGreg Clayton var_sp = m_variables[idx];
5146747022SGreg Clayton return var_sp;
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner
RemoveVariableAtIndex(size_t idx)54b9c1b51eSKate Stone VariableSP VariableList::RemoveVariableAtIndex(size_t idx) {
55884fb694SGreg Clayton VariableSP var_sp;
56b9c1b51eSKate Stone if (idx < m_variables.size()) {
57884fb694SGreg Clayton var_sp = m_variables[idx];
58884fb694SGreg Clayton m_variables.erase(m_variables.begin() + idx);
59884fb694SGreg Clayton }
60884fb694SGreg Clayton return var_sp;
61884fb694SGreg Clayton }
62884fb694SGreg Clayton
FindVariableIndex(const VariableSP & var_sp)63b9c1b51eSKate Stone uint32_t VariableList::FindVariableIndex(const VariableSP &var_sp) {
6446747022SGreg Clayton iterator pos, end = m_variables.end();
65b9c1b51eSKate Stone for (pos = m_variables.begin(); pos != end; ++pos) {
6646747022SGreg Clayton if (pos->get() == var_sp.get())
6746747022SGreg Clayton return std::distance(m_variables.begin(), pos);
6846747022SGreg Clayton }
6946747022SGreg Clayton return UINT32_MAX;
7046747022SGreg Clayton }
7130fdc8d8SChris Lattner
FindVariable(ConstString name,bool include_static_members)720e4c4821SAdrian Prantl VariableSP VariableList::FindVariable(ConstString name,
73b9c1b51eSKate Stone bool include_static_members) {
7430fdc8d8SChris Lattner VariableSP var_sp;
7530fdc8d8SChris Lattner iterator pos, end = m_variables.end();
76b9c1b51eSKate Stone for (pos = m_variables.begin(); pos != end; ++pos) {
77b9c1b51eSKate Stone if ((*pos)->NameMatches(name)) {
78b9c1b51eSKate Stone if (include_static_members || !(*pos)->IsStaticMember()) {
7930fdc8d8SChris Lattner var_sp = (*pos);
8030fdc8d8SChris Lattner break;
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner }
8310bc1a4eSPaul Herman }
8430fdc8d8SChris Lattner return var_sp;
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner
FindVariable(ConstString name,lldb::ValueType value_type,bool include_static_members)870e4c4821SAdrian Prantl VariableSP VariableList::FindVariable(ConstString name,
88b9c1b51eSKate Stone lldb::ValueType value_type,
89b9c1b51eSKate Stone bool include_static_members) {
9008a04327SEnrico Granata VariableSP var_sp;
9108a04327SEnrico Granata iterator pos, end = m_variables.end();
92b9c1b51eSKate Stone for (pos = m_variables.begin(); pos != end; ++pos) {
93b9c1b51eSKate Stone if ((*pos)->NameMatches(name) && (*pos)->GetScope() == value_type) {
94b9c1b51eSKate Stone if (include_static_members || !(*pos)->IsStaticMember()) {
9508a04327SEnrico Granata var_sp = (*pos);
9608a04327SEnrico Granata break;
9708a04327SEnrico Granata }
9808a04327SEnrico Granata }
9910bc1a4eSPaul Herman }
10008a04327SEnrico Granata return var_sp;
10108a04327SEnrico Granata }
10208a04327SEnrico Granata
AppendVariablesIfUnique(VariableList & var_list)103b9c1b51eSKate Stone size_t VariableList::AppendVariablesIfUnique(VariableList &var_list) {
1048a2a0dfbSEnrico Granata const size_t initial_size = var_list.GetSize();
1058a2a0dfbSEnrico Granata iterator pos, end = m_variables.end();
1068a2a0dfbSEnrico Granata for (pos = m_variables.begin(); pos != end; ++pos)
1078a2a0dfbSEnrico Granata var_list.AddVariableIfUnique(*pos);
1088a2a0dfbSEnrico Granata return var_list.GetSize() - initial_size;
1098a2a0dfbSEnrico Granata }
1108a2a0dfbSEnrico Granata
AppendVariablesIfUnique(const RegularExpression & regex,VariableList & var_list,size_t & total_matches)111b9c1b51eSKate Stone size_t VariableList::AppendVariablesIfUnique(const RegularExpression ®ex,
112b9c1b51eSKate Stone VariableList &var_list,
113b9c1b51eSKate Stone size_t &total_matches) {
11446747022SGreg Clayton const size_t initial_size = var_list.GetSize();
11546747022SGreg Clayton iterator pos, end = m_variables.end();
116b9c1b51eSKate Stone for (pos = m_variables.begin(); pos != end; ++pos) {
117b9c1b51eSKate Stone if ((*pos)->NameMatches(regex)) {
11846747022SGreg Clayton // Note the total matches found
11946747022SGreg Clayton total_matches++;
12046747022SGreg Clayton // Only add this variable if it isn't already in the "var_list"
12146747022SGreg Clayton var_list.AddVariableIfUnique(*pos);
12246747022SGreg Clayton }
12346747022SGreg Clayton }
12446747022SGreg Clayton // Return the number of new unique variables added to "var_list"
12546747022SGreg Clayton return var_list.GetSize() - initial_size;
12646747022SGreg Clayton }
12746747022SGreg Clayton
AppendVariablesWithScope(lldb::ValueType type,VariableList & var_list,bool if_unique)128b9c1b51eSKate Stone size_t VariableList::AppendVariablesWithScope(lldb::ValueType type,
129cc7f9bf5SEnrico Granata VariableList &var_list,
130b9c1b51eSKate Stone bool if_unique) {
131cc7f9bf5SEnrico Granata const size_t initial_size = var_list.GetSize();
132cc7f9bf5SEnrico Granata iterator pos, end = m_variables.end();
133b9c1b51eSKate Stone for (pos = m_variables.begin(); pos != end; ++pos) {
134b9c1b51eSKate Stone if ((*pos)->GetScope() == type) {
135cc7f9bf5SEnrico Granata if (if_unique)
136cc7f9bf5SEnrico Granata var_list.AddVariableIfUnique(*pos);
137cc7f9bf5SEnrico Granata else
138cc7f9bf5SEnrico Granata var_list.AddVariable(*pos);
139cc7f9bf5SEnrico Granata }
140cc7f9bf5SEnrico Granata }
141cc7f9bf5SEnrico Granata // Return the number of new unique variables added to "var_list"
142cc7f9bf5SEnrico Granata return var_list.GetSize() - initial_size;
143cc7f9bf5SEnrico Granata }
144cc7f9bf5SEnrico Granata
FindIndexForVariable(Variable * variable)145b9c1b51eSKate Stone uint32_t VariableList::FindIndexForVariable(Variable *variable) {
146288bdf9cSGreg Clayton VariableSP var_sp;
147288bdf9cSGreg Clayton iterator pos;
148288bdf9cSGreg Clayton const iterator begin = m_variables.begin();
149288bdf9cSGreg Clayton const iterator end = m_variables.end();
150b9c1b51eSKate Stone for (pos = m_variables.begin(); pos != end; ++pos) {
151288bdf9cSGreg Clayton if ((*pos).get() == variable)
152288bdf9cSGreg Clayton return std::distance(begin, pos);
153288bdf9cSGreg Clayton }
154288bdf9cSGreg Clayton return UINT32_MAX;
155288bdf9cSGreg Clayton }
15630fdc8d8SChris Lattner
MemorySize() const157b9c1b51eSKate Stone size_t VariableList::MemorySize() const {
15830fdc8d8SChris Lattner size_t mem_size = sizeof(VariableList);
15930fdc8d8SChris Lattner const_iterator pos, end = m_variables.end();
16030fdc8d8SChris Lattner for (pos = m_variables.begin(); pos != end; ++pos)
16130fdc8d8SChris Lattner mem_size += (*pos)->MemorySize();
16230fdc8d8SChris Lattner return mem_size;
16330fdc8d8SChris Lattner }
16430fdc8d8SChris Lattner
GetSize() const165b9c1b51eSKate Stone size_t VariableList::GetSize() const { return m_variables.size(); }
16630fdc8d8SChris Lattner
Dump(Stream * s,bool show_context) const167b9c1b51eSKate Stone void VariableList::Dump(Stream *s, bool show_context) const {
16830fdc8d8SChris Lattner // s.Printf("%.*p: ", (int)sizeof(void*) * 2, this);
16930fdc8d8SChris Lattner // s.Indent();
17030fdc8d8SChris Lattner // s << "VariableList\n";
17130fdc8d8SChris Lattner
17230fdc8d8SChris Lattner const_iterator pos, end = m_variables.end();
173b9c1b51eSKate Stone for (pos = m_variables.begin(); pos != end; ++pos) {
17430fdc8d8SChris Lattner (*pos)->Dump(s, show_context);
17530fdc8d8SChris Lattner }
17630fdc8d8SChris Lattner }
177