FileLineResolver.cpp revision 263363
1176998Sphk//===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===// 2176998Sphk// 3178068Sru// The LLVM Compiler Infrastructure 4178068Sru// 5176998Sphk// This file is distributed under the University of Illinois Open Source 6178068Sru// License. See LICENSE.TXT for details. 7178068Sru// 8176998Sphk//===----------------------------------------------------------------------===// 9178068Sru 10176998Sphk#include "lldb/Core/FileLineResolver.h" 11249657Sed 12249657Sed// Project includes 13176998Sphk#include "lldb/lldb-private-log.h" 14#include "lldb/Core/Log.h" 15#include "lldb/Core/StreamString.h" 16#include "lldb/Symbol/CompileUnit.h" 17#include "lldb/Symbol/LineTable.h" 18 19using namespace lldb; 20using namespace lldb_private; 21 22//---------------------------------------------------------------------- 23// FileLineResolver: 24//---------------------------------------------------------------------- 25FileLineResolver::FileLineResolver 26( 27 const FileSpec &file_spec, 28 uint32_t line_no, 29 bool check_inlines 30) : 31 Searcher (), 32 m_file_spec (file_spec), 33 m_line_number (line_no), 34 m_inlines (check_inlines) 35{ 36} 37 38FileLineResolver::~FileLineResolver () 39{ 40} 41 42Searcher::CallbackReturn 43FileLineResolver::SearchCallback 44( 45 SearchFilter &filter, 46 SymbolContext &context, 47 Address *addr, 48 bool containing 49) 50{ 51 CompileUnit *cu = context.comp_unit; 52 53 if (m_inlines || m_file_spec.Compare(*cu, m_file_spec, (bool)m_file_spec.GetDirectory())) 54 { 55 uint32_t start_file_idx = 0; 56 uint32_t file_idx = cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false); 57 if (file_idx != UINT32_MAX) 58 { 59 LineTable *line_table = cu->GetLineTable(); 60 if (line_table) 61 { 62 if (m_line_number == 0) 63 { 64 // Match all lines in a file... 65 const bool append = true; 66 while (file_idx != UINT32_MAX) 67 { 68 line_table->FineLineEntriesForFileIndex (file_idx, append, m_sc_list); 69 // Get the next file index in case we have multiple file 70 // entries for the same file 71 file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, m_file_spec, false); 72 } 73 } 74 else 75 { 76 // Match a specific line in a file... 77 } 78 } 79 } 80 } 81 return Searcher::eCallbackReturnContinue; 82} 83 84Searcher::Depth 85FileLineResolver::GetDepth() 86{ 87 return Searcher::eDepthCompUnit; 88} 89 90void 91FileLineResolver::GetDescription (Stream *s) 92{ 93 s->Printf ("File and line resolver for file: \"%s\" line: %u", 94 m_file_spec.GetPath().c_str(), 95 m_line_number); 96} 97 98void 99FileLineResolver::Clear() 100{ 101 m_file_spec.Clear(); 102 m_line_number = UINT32_MAX; 103 m_sc_list.Clear(); 104 m_inlines = true; 105} 106 107void 108FileLineResolver::Reset (const FileSpec &file_spec, 109 uint32_t line, 110 bool check_inlines) 111{ 112 m_file_spec = file_spec; 113 m_line_number = line; 114 m_sc_list.Clear(); 115 m_inlines = check_inlines; 116} 117 118