1254721Semaste//===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/Core/FileLineResolver.h" 11254721Semaste 12254721Semaste// Project includes 13254721Semaste#include "lldb/lldb-private-log.h" 14254721Semaste#include "lldb/Core/Log.h" 15254721Semaste#include "lldb/Core/StreamString.h" 16254721Semaste#include "lldb/Symbol/CompileUnit.h" 17254721Semaste#include "lldb/Symbol/LineTable.h" 18254721Semaste 19254721Semasteusing namespace lldb; 20254721Semasteusing namespace lldb_private; 21254721Semaste 22254721Semaste//---------------------------------------------------------------------- 23254721Semaste// FileLineResolver: 24254721Semaste//---------------------------------------------------------------------- 25254721SemasteFileLineResolver::FileLineResolver 26254721Semaste( 27254721Semaste const FileSpec &file_spec, 28254721Semaste uint32_t line_no, 29254721Semaste bool check_inlines 30254721Semaste) : 31254721Semaste Searcher (), 32254721Semaste m_file_spec (file_spec), 33254721Semaste m_line_number (line_no), 34254721Semaste m_inlines (check_inlines) 35254721Semaste{ 36254721Semaste} 37254721Semaste 38254721SemasteFileLineResolver::~FileLineResolver () 39254721Semaste{ 40254721Semaste} 41254721Semaste 42254721SemasteSearcher::CallbackReturn 43254721SemasteFileLineResolver::SearchCallback 44254721Semaste( 45254721Semaste SearchFilter &filter, 46254721Semaste SymbolContext &context, 47254721Semaste Address *addr, 48254721Semaste bool containing 49254721Semaste) 50254721Semaste{ 51254721Semaste CompileUnit *cu = context.comp_unit; 52254721Semaste 53263363Semaste if (m_inlines || m_file_spec.Compare(*cu, m_file_spec, (bool)m_file_spec.GetDirectory())) 54254721Semaste { 55254721Semaste uint32_t start_file_idx = 0; 56254721Semaste uint32_t file_idx = cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false); 57254721Semaste if (file_idx != UINT32_MAX) 58254721Semaste { 59254721Semaste LineTable *line_table = cu->GetLineTable(); 60254721Semaste if (line_table) 61254721Semaste { 62254721Semaste if (m_line_number == 0) 63254721Semaste { 64254721Semaste // Match all lines in a file... 65254721Semaste const bool append = true; 66254721Semaste while (file_idx != UINT32_MAX) 67254721Semaste { 68254721Semaste line_table->FineLineEntriesForFileIndex (file_idx, append, m_sc_list); 69254721Semaste // Get the next file index in case we have multiple file 70254721Semaste // entries for the same file 71254721Semaste file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, m_file_spec, false); 72254721Semaste } 73254721Semaste } 74254721Semaste else 75254721Semaste { 76254721Semaste // Match a specific line in a file... 77254721Semaste } 78254721Semaste } 79254721Semaste } 80254721Semaste } 81254721Semaste return Searcher::eCallbackReturnContinue; 82254721Semaste} 83254721Semaste 84254721SemasteSearcher::Depth 85254721SemasteFileLineResolver::GetDepth() 86254721Semaste{ 87254721Semaste return Searcher::eDepthCompUnit; 88254721Semaste} 89254721Semaste 90254721Semastevoid 91254721SemasteFileLineResolver::GetDescription (Stream *s) 92254721Semaste{ 93254721Semaste s->Printf ("File and line resolver for file: \"%s\" line: %u", 94254721Semaste m_file_spec.GetPath().c_str(), 95254721Semaste m_line_number); 96254721Semaste} 97254721Semaste 98254721Semastevoid 99254721SemasteFileLineResolver::Clear() 100254721Semaste{ 101254721Semaste m_file_spec.Clear(); 102254721Semaste m_line_number = UINT32_MAX; 103254721Semaste m_sc_list.Clear(); 104254721Semaste m_inlines = true; 105254721Semaste} 106254721Semaste 107254721Semastevoid 108254721SemasteFileLineResolver::Reset (const FileSpec &file_spec, 109254721Semaste uint32_t line, 110254721Semaste bool check_inlines) 111254721Semaste{ 112254721Semaste m_file_spec = file_spec; 113254721Semaste m_line_number = line; 114254721Semaste m_sc_list.Clear(); 115254721Semaste m_inlines = check_inlines; 116254721Semaste} 117254721Semaste 118