1254721Semaste//===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===// 2254721Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6254721Semaste// 7254721Semaste//===----------------------------------------------------------------------===// 8254721Semaste 9254721Semaste#include "lldb/Core/FileLineResolver.h" 10254721Semaste 11344779Sdim#include "lldb/Core/FileSpecList.h" 12254721Semaste#include "lldb/Symbol/CompileUnit.h" 13254721Semaste#include "lldb/Symbol/LineTable.h" 14344779Sdim#include "lldb/Utility/ConstString.h" 15344779Sdim#include "lldb/Utility/Stream.h" 16254721Semaste 17344779Sdim#include <string> 18321369Sdim 19321369Sdimnamespace lldb_private { 20321369Sdimclass Address; 21321369Sdim} 22321369Sdim 23254721Semasteusing namespace lldb; 24254721Semasteusing namespace lldb_private; 25254721Semaste 26254721Semaste// FileLineResolver: 27314564SdimFileLineResolver::FileLineResolver(const FileSpec &file_spec, uint32_t line_no, 28314564Sdim bool check_inlines) 29314564Sdim : Searcher(), m_file_spec(file_spec), m_line_number(line_no), 30314564Sdim m_inlines(check_inlines) {} 31254721Semaste 32314564SdimFileLineResolver::~FileLineResolver() {} 33254721Semaste 34254721SemasteSearcher::CallbackReturn 35314564SdimFileLineResolver::SearchCallback(SearchFilter &filter, SymbolContext &context, 36360784Sdim Address *addr) { 37314564Sdim CompileUnit *cu = context.comp_unit; 38254721Semaste 39360784Sdim if (m_inlines || m_file_spec.Compare(cu->GetPrimaryFile(), m_file_spec, 40360784Sdim (bool)m_file_spec.GetDirectory())) { 41314564Sdim uint32_t start_file_idx = 0; 42314564Sdim uint32_t file_idx = 43314564Sdim cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false); 44314564Sdim if (file_idx != UINT32_MAX) { 45314564Sdim LineTable *line_table = cu->GetLineTable(); 46314564Sdim if (line_table) { 47314564Sdim if (m_line_number == 0) { 48314564Sdim // Match all lines in a file... 49314564Sdim const bool append = true; 50314564Sdim while (file_idx != UINT32_MAX) { 51314564Sdim line_table->FineLineEntriesForFileIndex(file_idx, append, 52314564Sdim m_sc_list); 53341825Sdim // Get the next file index in case we have multiple file entries 54341825Sdim // for the same file 55314564Sdim file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, 56314564Sdim m_file_spec, false); 57314564Sdim } 58314564Sdim } else { 59314564Sdim // Match a specific line in a file... 60254721Semaste } 61314564Sdim } 62254721Semaste } 63314564Sdim } 64314564Sdim return Searcher::eCallbackReturnContinue; 65254721Semaste} 66254721Semaste 67344779Sdimlldb::SearchDepth FileLineResolver::GetDepth() { 68344779Sdim return lldb::eSearchDepthCompUnit; 69254721Semaste} 70254721Semaste 71314564Sdimvoid FileLineResolver::GetDescription(Stream *s) { 72314564Sdim s->Printf("File and line resolver for file: \"%s\" line: %u", 73314564Sdim m_file_spec.GetPath().c_str(), m_line_number); 74254721Semaste} 75254721Semaste 76314564Sdimvoid FileLineResolver::Clear() { 77314564Sdim m_file_spec.Clear(); 78314564Sdim m_line_number = UINT32_MAX; 79314564Sdim m_sc_list.Clear(); 80314564Sdim m_inlines = true; 81254721Semaste} 82254721Semaste 83314564Sdimvoid FileLineResolver::Reset(const FileSpec &file_spec, uint32_t line, 84314564Sdim bool check_inlines) { 85314564Sdim m_file_spec = file_spec; 86314564Sdim m_line_number = line; 87314564Sdim m_sc_list.Clear(); 88314564Sdim m_inlines = check_inlines; 89254721Semaste} 90