Summary: When we added support for type units in dwo files, we changed the "manual" dwarf index to index _all_ dwarf units in the dwo file instead of just the split unit belonging to our skeleton unit. This was fine for dwo files, as they contain only a single compile units and type units do not have a split type unit which would point to them. However, this does not work for dwp files because, these files do contain multiple split compile units, and the current approach means that each unit gets indexed multiple times (once for each split unit => n^2 complexity). This patch teaches the manual dwarf index to treat dwp files specially. Any type units in the dwp file added to the main list of compile units and indexed with them in a single batch. Split compile units in dwp files are still indexed as a part of their skeleton unit -- this is done because we need the DW_AT_language attribute from the skeleton unit to index them properly. Handling of dwo files remains unchanged -- all units (type and skeleton) are indexed when we reach the dwo file through the split unit. Reviewers: clayborg, JDevlieghere, aprantl Subscribers: arphaman, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D74964
83 lines
3.6 KiB
C++
83 lines
3.6 KiB
C++
//===-- DebugNamesDWARFIndex.h ---------------------------------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DEBUGNAMESDWARFINDEX_H
|
|
#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DEBUGNAMESDWARFINDEX_H
|
|
|
|
#include "Plugins/SymbolFile/DWARF/DWARFIndex.h"
|
|
#include "Plugins/SymbolFile/DWARF/LogChannelDWARF.h"
|
|
#include "Plugins/SymbolFile/DWARF/ManualDWARFIndex.h"
|
|
#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
|
|
#include "lldb/Utility/ConstString.h"
|
|
#include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
|
|
|
|
namespace lldb_private {
|
|
class DebugNamesDWARFIndex : public DWARFIndex {
|
|
public:
|
|
static llvm::Expected<std::unique_ptr<DebugNamesDWARFIndex>>
|
|
Create(Module &module, DWARFDataExtractor debug_names,
|
|
DWARFDataExtractor debug_str, SymbolFileDWARF &dwarf);
|
|
|
|
void Preload() override { m_fallback.Preload(); }
|
|
|
|
void GetGlobalVariables(ConstString basename, DIEArray &offsets) override;
|
|
void GetGlobalVariables(const RegularExpression ®ex,
|
|
DIEArray &offsets) override;
|
|
void GetGlobalVariables(const DWARFUnit &cu, DIEArray &offsets) override;
|
|
void GetObjCMethods(ConstString class_name, DIEArray &offsets) override {}
|
|
void GetCompleteObjCClass(ConstString class_name, bool must_be_implementation,
|
|
DIEArray &offsets) override;
|
|
void GetTypes(ConstString name, DIEArray &offsets) override;
|
|
void GetTypes(const DWARFDeclContext &context, DIEArray &offsets) override;
|
|
void GetNamespaces(ConstString name, DIEArray &offsets) override;
|
|
void GetFunctions(ConstString name, SymbolFileDWARF &dwarf,
|
|
const CompilerDeclContext &parent_decl_ctx,
|
|
uint32_t name_type_mask,
|
|
std::vector<DWARFDIE> &dies) override;
|
|
void GetFunctions(const RegularExpression ®ex,
|
|
DIEArray &offsets) override;
|
|
|
|
void ReportInvalidDIERef(const DIERef &ref, llvm::StringRef name) override {}
|
|
void Dump(Stream &s) override;
|
|
|
|
private:
|
|
DebugNamesDWARFIndex(Module &module,
|
|
std::unique_ptr<llvm::DWARFDebugNames> debug_names_up,
|
|
DWARFDataExtractor debug_names_data,
|
|
DWARFDataExtractor debug_str_data,
|
|
SymbolFileDWARF &dwarf)
|
|
: DWARFIndex(module), m_debug_info(dwarf.DebugInfo()),
|
|
m_debug_names_data(debug_names_data), m_debug_str_data(debug_str_data),
|
|
m_debug_names_up(std::move(debug_names_up)),
|
|
m_fallback(module, dwarf, GetUnits(*m_debug_names_up)) {}
|
|
|
|
DWARFDebugInfo &m_debug_info;
|
|
|
|
// LLVM DWARFDebugNames will hold a non-owning reference to this data, so keep
|
|
// track of the ownership here.
|
|
DWARFDataExtractor m_debug_names_data;
|
|
DWARFDataExtractor m_debug_str_data;
|
|
|
|
using DebugNames = llvm::DWARFDebugNames;
|
|
std::unique_ptr<DebugNames> m_debug_names_up;
|
|
ManualDWARFIndex m_fallback;
|
|
|
|
llvm::Optional<DIERef> ToDIERef(const DebugNames::Entry &entry);
|
|
void Append(const DebugNames::Entry &entry, DIEArray &offsets);
|
|
|
|
static void MaybeLogLookupError(llvm::Error error,
|
|
const DebugNames::NameIndex &ni,
|
|
llvm::StringRef name);
|
|
|
|
static llvm::DenseSet<dw_offset_t> GetUnits(const DebugNames &debug_names);
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DEBUGNAMESDWARFINDEX_H
|