mirror of
https://github.com/intel/llvm.git
synced 2026-02-02 10:08:59 +08:00
Summary: Instead of accessing the fields directly, use accessor functions to provide access to the DIERef components. This allows us to decouple the external interface, from the internal representation. The external interface can use llvm::Optional and similar goodies, while the data can still be stored internally in a more compact representation. I also document the purpose of the existing DIERef fields. The main motivation for this change is a need to introduce an additional field to the DIERef class, but I believe the change has its own merit. Reviewers: JDevlieghere, aprantl, clayborg Subscribers: arphaman, lldb-commits Differential Revision: https://reviews.llvm.org/D63400 llvm-svn: 363910
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
//===-- NameToDIE.cpp -------------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "NameToDIE.h"
|
|
#include "lldb/Symbol/ObjectFile.h"
|
|
#include "lldb/Utility/ConstString.h"
|
|
#include "lldb/Utility/RegularExpression.h"
|
|
#include "lldb/Utility/Stream.h"
|
|
#include "lldb/Utility/StreamString.h"
|
|
|
|
#include "DWARFDebugInfo.h"
|
|
#include "DWARFDebugInfoEntry.h"
|
|
#include "SymbolFileDWARF.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
void NameToDIE::Finalize() {
|
|
m_map.Sort();
|
|
m_map.SizeToFit();
|
|
}
|
|
|
|
void NameToDIE::Insert(ConstString name, const DIERef &die_ref) {
|
|
assert(die_ref.unit_offset().hasValue());
|
|
m_map.Append(name, die_ref);
|
|
}
|
|
|
|
size_t NameToDIE::Find(ConstString name, DIEArray &info_array) const {
|
|
return m_map.GetValues(name, info_array);
|
|
}
|
|
|
|
size_t NameToDIE::Find(const RegularExpression ®ex,
|
|
DIEArray &info_array) const {
|
|
return m_map.GetValues(regex, info_array);
|
|
}
|
|
|
|
size_t NameToDIE::FindAllEntriesForCompileUnit(dw_offset_t cu_offset,
|
|
DIEArray &info_array) const {
|
|
const size_t initial_size = info_array.size();
|
|
const uint32_t size = m_map.GetSize();
|
|
for (uint32_t i = 0; i < size; ++i) {
|
|
const DIERef &die_ref = m_map.GetValueAtIndexUnchecked(i);
|
|
if (cu_offset == *die_ref.unit_offset())
|
|
info_array.push_back(die_ref);
|
|
}
|
|
return info_array.size() - initial_size;
|
|
}
|
|
|
|
void NameToDIE::Dump(Stream *s) {
|
|
const uint32_t size = m_map.GetSize();
|
|
for (uint32_t i = 0; i < size; ++i) {
|
|
s->Format("{0} \"{1}\"\n", m_map.GetValueAtIndexUnchecked(i),
|
|
m_map.GetCStringAtIndexUnchecked(i));
|
|
}
|
|
}
|
|
|
|
void NameToDIE::ForEach(
|
|
std::function<bool(ConstString name, const DIERef &die_ref)> const
|
|
&callback) const {
|
|
const uint32_t size = m_map.GetSize();
|
|
for (uint32_t i = 0; i < size; ++i) {
|
|
if (!callback(m_map.GetCStringAtIndexUnchecked(i),
|
|
m_map.GetValueAtIndexUnchecked(i)))
|
|
break;
|
|
}
|
|
}
|
|
|
|
void NameToDIE::Append(const NameToDIE &other) {
|
|
const uint32_t size = other.m_map.GetSize();
|
|
for (uint32_t i = 0; i < size; ++i) {
|
|
m_map.Append(other.m_map.GetCStringAtIndexUnchecked(i),
|
|
other.m_map.GetValueAtIndexUnchecked(i));
|
|
}
|
|
}
|