1176761e5SGreg Clayton //===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===// 2176761e5SGreg Clayton // 3176761e5SGreg Clayton // The LLVM Compiler Infrastructure 4176761e5SGreg Clayton // 5176761e5SGreg Clayton // This file is distributed under the University of Illinois Open Source 6176761e5SGreg Clayton // License. See LICENSE.TXT for details. 7176761e5SGreg Clayton // 8176761e5SGreg Clayton //===----------------------------------------------------------------------===// 9176761e5SGreg Clayton 10176761e5SGreg Clayton #include "lldb/Core/FileLineResolver.h" 11176761e5SGreg Clayton 12176761e5SGreg Clayton // Project includes 13176761e5SGreg Clayton #include "lldb/lldb-private-log.h" 14176761e5SGreg Clayton #include "lldb/Core/Log.h" 15176761e5SGreg Clayton #include "lldb/Core/StreamString.h" 161f746071SGreg Clayton #include "lldb/Symbol/CompileUnit.h" 17176761e5SGreg Clayton #include "lldb/Symbol/LineTable.h" 18176761e5SGreg Clayton 19176761e5SGreg Clayton using namespace lldb; 20176761e5SGreg Clayton using namespace lldb_private; 21176761e5SGreg Clayton 22176761e5SGreg Clayton //---------------------------------------------------------------------- 23176761e5SGreg Clayton // FileLineResolver: 24176761e5SGreg Clayton //---------------------------------------------------------------------- 25176761e5SGreg Clayton FileLineResolver::FileLineResolver 26176761e5SGreg Clayton ( 27176761e5SGreg Clayton const FileSpec &file_spec, 28176761e5SGreg Clayton uint32_t line_no, 29176761e5SGreg Clayton bool check_inlines 30176761e5SGreg Clayton ) : 31176761e5SGreg Clayton Searcher (), 32176761e5SGreg Clayton m_file_spec (file_spec), 33176761e5SGreg Clayton m_line_number (line_no), 34176761e5SGreg Clayton m_inlines (check_inlines) 35176761e5SGreg Clayton { 36176761e5SGreg Clayton } 37176761e5SGreg Clayton 38176761e5SGreg Clayton FileLineResolver::~FileLineResolver () 39176761e5SGreg Clayton { 40176761e5SGreg Clayton } 41176761e5SGreg Clayton 42176761e5SGreg Clayton Searcher::CallbackReturn 43176761e5SGreg Clayton FileLineResolver::SearchCallback 44176761e5SGreg Clayton ( 45176761e5SGreg Clayton SearchFilter &filter, 46176761e5SGreg Clayton SymbolContext &context, 47176761e5SGreg Clayton Address *addr, 48176761e5SGreg Clayton bool containing 49176761e5SGreg Clayton ) 50176761e5SGreg Clayton { 51176761e5SGreg Clayton CompileUnit *cu = context.comp_unit; 52176761e5SGreg Clayton 53176761e5SGreg Clayton if (m_inlines || m_file_spec.Compare(*cu, m_file_spec, m_file_spec.GetDirectory())) 54176761e5SGreg Clayton { 55176761e5SGreg Clayton uint32_t start_file_idx = 0; 5687df91b8SJim Ingham uint32_t file_idx = cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false); 57176761e5SGreg Clayton if (file_idx != UINT32_MAX) 58176761e5SGreg Clayton { 59176761e5SGreg Clayton LineTable *line_table = cu->GetLineTable(); 60176761e5SGreg Clayton if (line_table) 61176761e5SGreg Clayton { 62176761e5SGreg Clayton if (m_line_number == 0) 63176761e5SGreg Clayton { 64176761e5SGreg Clayton // Match all lines in a file... 65176761e5SGreg Clayton const bool append = true; 66176761e5SGreg Clayton while (file_idx != UINT32_MAX) 67176761e5SGreg Clayton { 68176761e5SGreg Clayton line_table->FineLineEntriesForFileIndex (file_idx, append, m_sc_list); 69176761e5SGreg Clayton // Get the next file index in case we have multiple file 70176761e5SGreg Clayton // entries for the same file 7187df91b8SJim Ingham file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, m_file_spec, false); 72176761e5SGreg Clayton } 73176761e5SGreg Clayton } 74176761e5SGreg Clayton else 75176761e5SGreg Clayton { 76176761e5SGreg Clayton // Match a specific line in a file... 77176761e5SGreg Clayton } 78176761e5SGreg Clayton } 79176761e5SGreg Clayton } 80176761e5SGreg Clayton } 81176761e5SGreg Clayton return Searcher::eCallbackReturnContinue; 82176761e5SGreg Clayton } 83176761e5SGreg Clayton 84176761e5SGreg Clayton Searcher::Depth 85176761e5SGreg Clayton FileLineResolver::GetDepth() 86176761e5SGreg Clayton { 87176761e5SGreg Clayton return Searcher::eDepthCompUnit; 88176761e5SGreg Clayton } 89176761e5SGreg Clayton 90176761e5SGreg Clayton void 91176761e5SGreg Clayton FileLineResolver::GetDescription (Stream *s) 92176761e5SGreg Clayton { 93*b5ad4ec7SGreg Clayton s->Printf ("File and line resolver for file: \"%s\" line: %u", 94*b5ad4ec7SGreg Clayton m_file_spec.GetPath().c_str(), 95176761e5SGreg Clayton m_line_number); 96176761e5SGreg Clayton } 97176761e5SGreg Clayton 98176761e5SGreg Clayton void 99176761e5SGreg Clayton FileLineResolver::Clear() 100176761e5SGreg Clayton { 101176761e5SGreg Clayton m_file_spec.Clear(); 102176761e5SGreg Clayton m_line_number = UINT32_MAX; 103176761e5SGreg Clayton m_sc_list.Clear(); 104176761e5SGreg Clayton m_inlines = true; 105176761e5SGreg Clayton } 106176761e5SGreg Clayton 107176761e5SGreg Clayton void 108176761e5SGreg Clayton FileLineResolver::Reset (const FileSpec &file_spec, 109176761e5SGreg Clayton uint32_t line, 110176761e5SGreg Clayton bool check_inlines) 111176761e5SGreg Clayton { 112176761e5SGreg Clayton m_file_spec = file_spec; 113176761e5SGreg Clayton m_line_number = line; 114176761e5SGreg Clayton m_sc_list.Clear(); 115176761e5SGreg Clayton m_inlines = check_inlines; 116176761e5SGreg Clayton } 117176761e5SGreg Clayton 118