Path: blob/main/contrib/llvm-project/lldb/source/Core/FileLineResolver.cpp
39587 views
//===-- FileLineResolver.cpp ----------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/Core/FileLineResolver.h"910#include "lldb/Symbol/CompileUnit.h"11#include "lldb/Symbol/LineTable.h"12#include "lldb/Utility/ConstString.h"13#include "lldb/Utility/FileSpecList.h"14#include "lldb/Utility/Stream.h"1516#include <string>1718namespace lldb_private {19class Address;20}2122using namespace lldb;23using namespace lldb_private;2425// FileLineResolver:26FileLineResolver::FileLineResolver(const FileSpec &file_spec, uint32_t line_no,27bool check_inlines)28: Searcher(), m_file_spec(file_spec), m_line_number(line_no),29m_inlines(check_inlines) {}3031FileLineResolver::~FileLineResolver() = default;3233Searcher::CallbackReturn34FileLineResolver::SearchCallback(SearchFilter &filter, SymbolContext &context,35Address *addr) {36CompileUnit *cu = context.comp_unit;3738if (m_inlines || m_file_spec.Compare(cu->GetPrimaryFile(), m_file_spec,39(bool)m_file_spec.GetDirectory())) {40uint32_t start_file_idx = 0;41uint32_t file_idx =42cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false);43if (file_idx != UINT32_MAX) {44LineTable *line_table = cu->GetLineTable();45if (line_table) {46if (m_line_number == 0) {47// Match all lines in a file...48const bool append = true;49while (file_idx != UINT32_MAX) {50line_table->FindLineEntriesForFileIndex(file_idx, append,51m_sc_list);52// Get the next file index in case we have multiple file entries53// for the same file54file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1,55m_file_spec, false);56}57} else {58// Match a specific line in a file...59}60}61}62}63return Searcher::eCallbackReturnContinue;64}6566lldb::SearchDepth FileLineResolver::GetDepth() {67return lldb::eSearchDepthCompUnit;68}6970void FileLineResolver::GetDescription(Stream *s) {71s->Printf("File and line resolver for file: \"%s\" line: %u",72m_file_spec.GetPath().c_str(), m_line_number);73}7475void FileLineResolver::Clear() {76m_file_spec.Clear();77m_line_number = UINT32_MAX;78m_sc_list.Clear();79m_inlines = true;80}8182void FileLineResolver::Reset(const FileSpec &file_spec, uint32_t line,83bool check_inlines) {84m_file_spec = file_spec;85m_line_number = line;86m_sc_list.Clear();87m_inlines = check_inlines;88}899091