diff options
Diffstat (limited to 'source/Plugins/SymbolFile/DWARF/DWARFIndex.cpp')
| -rw-r--r-- | source/Plugins/SymbolFile/DWARF/DWARFIndex.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/source/Plugins/SymbolFile/DWARF/DWARFIndex.cpp b/source/Plugins/SymbolFile/DWARF/DWARFIndex.cpp new file mode 100644 index 000000000000..4577f0557a1d --- /dev/null +++ b/source/Plugins/SymbolFile/DWARF/DWARFIndex.cpp @@ -0,0 +1,68 @@ +//===-- DWARFIndex.cpp -----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "Plugins/SymbolFile/DWARF/DWARFIndex.h" +#include "Plugins/SymbolFile/DWARF/DWARFDIE.h" +#include "Plugins/SymbolFile/DWARF/DWARFDebugInfo.h" + +#include "Plugins/Language/ObjC/ObjCLanguage.h" + +using namespace lldb_private; +using namespace lldb; + +DWARFIndex::~DWARFIndex() = default; + +void DWARFIndex::ProcessFunctionDIE(llvm::StringRef name, DIERef ref, + DWARFDebugInfo &info, + const CompilerDeclContext &parent_decl_ctx, + uint32_t name_type_mask, + std::vector<DWARFDIE> &dies) { + DWARFDIE die = info.GetDIE(ref); + if (!die) { + ReportInvalidDIEOffset(ref.die_offset, name); + return; + } + + // Exit early if we're searching exclusively for methods or selectors and + // we have a context specified (no methods in namespaces). + uint32_t looking_for_nonmethods = + name_type_mask & ~(eFunctionNameTypeMethod | eFunctionNameTypeSelector); + if (!looking_for_nonmethods && parent_decl_ctx.IsValid()) + return; + + // Otherwise, we need to also check that the context matches. If it does not + // match, we do nothing. + if (!SymbolFileDWARF::DIEInDeclContext(&parent_decl_ctx, die)) + return; + + // In case of a full match, we just insert everything we find. + if (name_type_mask & eFunctionNameTypeFull) { + dies.push_back(die); + return; + } + + // If looking for ObjC selectors, we need to also check if the name is a + // possible selector. + if (name_type_mask & eFunctionNameTypeSelector && + ObjCLanguage::IsPossibleObjCMethodName(die.GetName())) { + dies.push_back(die); + return; + } + + bool looking_for_methods = name_type_mask & lldb::eFunctionNameTypeMethod; + bool looking_for_functions = name_type_mask & lldb::eFunctionNameTypeBase; + if (looking_for_methods || looking_for_functions) { + // If we're looking for either methods or functions, we definitely want this + // die. Otherwise, only keep it if the die type matches what we are + // searching for. + if ((looking_for_methods && looking_for_functions) || + looking_for_methods == die.IsMethod()) + dies.push_back(die); + } +} |
