1 //===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Core/FileLineResolver.h" 11 12 // Project includes 13 #include "lldb/Symbol/CompileUnit.h" 14 #include "lldb/Symbol/LineTable.h" 15 #include "lldb/Utility/Log.h" 16 #include "lldb/Utility/StreamString.h" 17 18 using namespace lldb; 19 using namespace lldb_private; 20 21 //---------------------------------------------------------------------- 22 // FileLineResolver: 23 //---------------------------------------------------------------------- 24 FileLineResolver::FileLineResolver(const FileSpec &file_spec, uint32_t line_no, 25 bool check_inlines) 26 : Searcher(), m_file_spec(file_spec), m_line_number(line_no), 27 m_inlines(check_inlines) {} 28 29 FileLineResolver::~FileLineResolver() {} 30 31 Searcher::CallbackReturn 32 FileLineResolver::SearchCallback(SearchFilter &filter, SymbolContext &context, 33 Address *addr, bool containing) { 34 CompileUnit *cu = context.comp_unit; 35 36 if (m_inlines || 37 m_file_spec.Compare(*cu, m_file_spec, (bool)m_file_spec.GetDirectory())) { 38 uint32_t start_file_idx = 0; 39 uint32_t file_idx = 40 cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false); 41 if (file_idx != UINT32_MAX) { 42 LineTable *line_table = cu->GetLineTable(); 43 if (line_table) { 44 if (m_line_number == 0) { 45 // Match all lines in a file... 46 const bool append = true; 47 while (file_idx != UINT32_MAX) { 48 line_table->FineLineEntriesForFileIndex(file_idx, append, 49 m_sc_list); 50 // Get the next file index in case we have multiple file 51 // entries for the same file 52 file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, 53 m_file_spec, false); 54 } 55 } else { 56 // Match a specific line in a file... 57 } 58 } 59 } 60 } 61 return Searcher::eCallbackReturnContinue; 62 } 63 64 Searcher::Depth FileLineResolver::GetDepth() { 65 return Searcher::eDepthCompUnit; 66 } 67 68 void FileLineResolver::GetDescription(Stream *s) { 69 s->Printf("File and line resolver for file: \"%s\" line: %u", 70 m_file_spec.GetPath().c_str(), m_line_number); 71 } 72 73 void FileLineResolver::Clear() { 74 m_file_spec.Clear(); 75 m_line_number = UINT32_MAX; 76 m_sc_list.Clear(); 77 m_inlines = true; 78 } 79 80 void FileLineResolver::Reset(const FileSpec &file_spec, uint32_t line, 81 bool check_inlines) { 82 m_file_spec = file_spec; 83 m_line_number = line; 84 m_sc_list.Clear(); 85 m_inlines = check_inlines; 86 } 87