brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · b563d1c Raw
111 lines · c
1//===-- DWARFDeclContext.h --------------------------------------*- C++ -*-===//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#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H10#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H11 12#include "DWARFDefines.h"13#include "lldb/Utility/ConstString.h"14#include "llvm/ADT/StringExtras.h"15 16#include <cassert>17#include <string>18#include <vector>19 20namespace lldb_private::plugin {21namespace dwarf {22// DWARFDeclContext23//24// A class that represents a declaration context all the way down to a25// DIE. This is useful when trying to find a DIE in one DWARF to a DIE26// in another DWARF file.27 28class DWARFDeclContext {29public:30  struct Entry {31    Entry() = default;32    Entry(dw_tag_t t, const char *n) : tag(t), name(n) {}33 34    bool NameMatches(const Entry &rhs) const {35      if (name == rhs.name)36        return true;37      else if (name && rhs.name)38        return strcmp(name, rhs.name) == 0;39      return false;40    }41 42    /// Returns the name of this entry if it has one, or the appropriate43    /// "anonymous {namespace, class, struct, union}".44    const char *GetName() const;45 46    // Test operator47    explicit operator bool() const { return tag != 0; }48 49    dw_tag_t tag = llvm::dwarf::DW_TAG_null;50    const char *name = nullptr;51  };52 53  DWARFDeclContext() : m_entries() {}54 55  DWARFDeclContext(llvm::ArrayRef<Entry> entries) {56    llvm::append_range(m_entries, entries);57  }58 59  void AppendDeclContext(dw_tag_t tag, const char *name) {60    m_entries.push_back(Entry(tag, name));61  }62 63  bool operator==(const DWARFDeclContext &rhs) const;64  bool operator!=(const DWARFDeclContext &rhs) const { return !(*this == rhs); }65 66  uint32_t GetSize() const { return m_entries.size(); }67 68  Entry &operator[](uint32_t idx) {69    assert(idx < m_entries.size() && "invalid index");70    return m_entries[idx];71  }72 73  const Entry &operator[](uint32_t idx) const {74    assert(idx < m_entries.size() && "invalid index");75    return m_entries[idx];76  }77 78  const char *GetQualifiedName() const;79 80  // Same as GetQualifiedName, but the life time of the returned string will81  // be that of the LLDB session.82  ConstString GetQualifiedNameAsConstString() const {83    return ConstString(GetQualifiedName());84  }85 86  void Clear() {87    m_entries.clear();88    m_qualified_name.clear();89  }90 91  friend llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,92                                       const DWARFDeclContext &ctx) {93    OS << "DWARFDeclContext{";94    llvm::ListSeparator LS;95    for (const Entry &e : ctx.m_entries) {96      OS << LS << "{" << DW_TAG_value_to_name(e.tag) << ", " << e.GetName()97         << "}";98    }99    return OS << "}";100  }101 102protected:103  typedef std::vector<Entry> collection;104  collection m_entries;105  mutable std::string m_qualified_name;106};107} // namespace dwarf108} // namespace lldb_private::plugin109 110#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H111