brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · 9d7c05f Raw
135 lines · cpp
1//===-- TypeMap.cpp -------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include <vector>10 11#include "llvm/Support/FormattedStream.h"12#include "llvm/Support/raw_ostream.h"13 14#include "lldb/Symbol/SymbolFile.h"15#include "lldb/Symbol/SymbolVendor.h"16#include "lldb/Symbol/Type.h"17#include "lldb/Symbol/TypeMap.h"18 19using namespace lldb;20using namespace lldb_private;21 22TypeMap::TypeMap() : m_types() {}23 24// Destructor25TypeMap::~TypeMap() = default;26 27void TypeMap::Insert(const TypeSP &type_sp) {28  // Just push each type on the back for now. We will worry about uniquing29  // later30  if (type_sp)31    m_types.insert(std::make_pair(type_sp->GetID(), type_sp));32}33 34bool TypeMap::InsertUnique(const TypeSP &type_sp) {35  if (type_sp) {36    user_id_t type_uid = type_sp->GetID();37    iterator pos, end = m_types.end();38 39    for (pos = m_types.find(type_uid);40         pos != end && pos->second->GetID() == type_uid; ++pos) {41      if (pos->second.get() == type_sp.get())42        return false;43    }44    Insert(type_sp);45  }46  return true;47}48 49// Find a base type by its unique ID.50// TypeSP51// TypeMap::FindType(lldb::user_id_t uid)52//{53//    iterator pos = m_types.find(uid);54//    if (pos != m_types.end())55//        return pos->second;56//    return TypeSP();57//}58 59// Find a type by name.60// TypeMap61// TypeMap::FindTypes (ConstString name)62//{63//    // Do we ever need to make a lookup by name map? Here we are doing64//    // a linear search which isn't going to be fast.65//    TypeMap types(m_ast.getTargetInfo()->getTriple().getTriple().c_str());66//    iterator pos, end;67//    for (pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)68//        if (pos->second->GetName() == name)69//            types.Insert (pos->second);70//    return types;71//}72 73void TypeMap::Clear() { m_types.clear(); }74 75uint32_t TypeMap::GetSize() const { return m_types.size(); }76 77bool TypeMap::Empty() const { return m_types.empty(); }78 79// GetTypeAtIndex isn't used a lot for large type lists, currently only for80// type lists that are returned for "image dump -t TYPENAME" commands and other81// simple symbol queries that grab the first result...82 83TypeSP TypeMap::GetTypeAtIndex(uint32_t idx) {84  iterator pos, end;85  uint32_t i = idx;86  for (pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) {87    if (i == 0)88      return pos->second;89    --i;90  }91  return TypeSP();92}93 94lldb::TypeSP TypeMap::FirstType() const {95  if (m_types.empty())96    return TypeSP();97  return m_types.begin()->second;98}99 100void TypeMap::ForEach(101    std::function<bool(const lldb::TypeSP &type_sp)> const &callback) const {102  for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) {103    if (!callback(pos->second))104      break;105  }106}107 108void TypeMap::ForEach(109    std::function<bool(lldb::TypeSP &type_sp)> const &callback) {110  for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) {111    if (!callback(pos->second))112      break;113  }114}115 116bool TypeMap::Remove(const lldb::TypeSP &type_sp) {117  if (type_sp) {118    lldb::user_id_t uid = type_sp->GetID();119    for (iterator pos = m_types.find(uid), end = m_types.end();120         pos != end && pos->first == uid; ++pos) {121      if (pos->second == type_sp) {122        m_types.erase(pos);123        return true;124      }125    }126  }127  return false;128}129 130void TypeMap::Dump(Stream *s, bool show_context,131                   lldb::DescriptionLevel level) const {132  for (const auto &pair : m_types)133    pair.second->Dump(s, show_context, level);134}135