Files
clang-p2996/lldb/source/Plugins/SymbolFile/DWARF/DWARFIndex.h
Felipe de Azevedo Piovezan 4d5c9ad9c3 [lldb] Use LLVM's implementation of AppleTables for apple_{names,namespaces}
All the new code should match the behavior of the old exactly.

Of note, the custom queries used to be implemented inside `HashedNameToDIE.cpp`
(which is the LLDB implementation of the tables). However, when porting to LLVM,
we believe they don't belong inside the LLVM table implementation:

1. They don't require any knowledge about the table itself
2. They are not relevant for other users of these classes.
3. They use LLDB data structures.

As such, we implement these custom queries inside AppleDWARFIndex.cpp.

Types and Objective-C tables are done separately, as they have slightly
different functionality that require rewriting more code.

Differential Revision: https://reviews.llvm.org/D153866
2023-06-28 08:31:02 -04:00

108 lines
4.1 KiB
C++

//===-- DWARFIndex.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_DWARFINDEX_H
#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFINDEX_H
#include "Plugins/SymbolFile/DWARF/DIERef.h"
#include "Plugins/SymbolFile/DWARF/DWARFDIE.h"
#include "Plugins/SymbolFile/DWARF/DWARFFormValue.h"
#include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
#include "lldb/Core/Module.h"
#include "lldb/Target/Statistics.h"
class DWARFDeclContext;
class DWARFDIE;
namespace lldb_private {
class DWARFIndex {
public:
DWARFIndex(Module &module) : m_module(module) {}
virtual ~DWARFIndex();
virtual void Preload() = 0;
/// Finds global variables with the given base name. Any additional filtering
/// (e.g., to only retrieve variables from a given context) should be done by
/// the consumer.
virtual void
GetGlobalVariables(ConstString basename,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void
GetGlobalVariables(const RegularExpression &regex,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
/// \a cu must be the skeleton unit if possible, not GetNonSkeletonUnit().
virtual void
GetGlobalVariables(DWARFUnit &cu,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void
GetObjCMethods(ConstString class_name,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void
GetCompleteObjCClass(ConstString class_name, bool must_be_implementation,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void GetTypes(ConstString name,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void GetTypes(const DWARFDeclContext &context,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void
GetNamespaces(ConstString name,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void
GetFunctions(const Module::LookupInfo &lookup_info, SymbolFileDWARF &dwarf,
const CompilerDeclContext &parent_decl_ctx,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void
GetFunctions(const RegularExpression &regex,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void Dump(Stream &s) = 0;
StatsDuration::Duration GetIndexTime() { return m_index_time; }
protected:
Module &m_module;
StatsDuration m_index_time;
/// Helper function implementing common logic for processing function dies. If
/// the function given by "ref" matches search criteria given by
/// "parent_decl_ctx" and "name_type_mask", it is inserted into the "dies"
/// vector.
bool ProcessFunctionDIE(const Module::LookupInfo &lookup_info, DIERef ref,
SymbolFileDWARF &dwarf,
const CompilerDeclContext &parent_decl_ctx,
llvm::function_ref<bool(DWARFDIE die)> callback);
class DIERefCallbackImpl {
public:
DIERefCallbackImpl(const DWARFIndex &index,
llvm::function_ref<bool(DWARFDIE die)> callback,
llvm::StringRef name);
bool operator()(DIERef ref) const;
bool operator()(const llvm::AppleAcceleratorTable::Entry &entry) const;
private:
const DWARFIndex &m_index;
SymbolFileDWARF &m_dwarf;
const llvm::function_ref<bool(DWARFDIE die)> m_callback;
const llvm::StringRef m_name;
};
DIERefCallbackImpl
DIERefCallback(llvm::function_ref<bool(DWARFDIE die)> callback,
llvm::StringRef name = {}) const {
return DIERefCallbackImpl(*this, callback, name);
}
void ReportInvalidDIERef(DIERef ref, llvm::StringRef name) const;
};
} // namespace lldb_private
#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFINDEX_H