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" 16176761e5SGreg Clayton #include "lldb/Symbol/LineTable.h" 17176761e5SGreg Clayton 18176761e5SGreg Clayton using namespace lldb; 19176761e5SGreg Clayton using namespace lldb_private; 20176761e5SGreg Clayton 21176761e5SGreg Clayton //---------------------------------------------------------------------- 22176761e5SGreg Clayton // FileLineResolver: 23176761e5SGreg Clayton //---------------------------------------------------------------------- 24176761e5SGreg Clayton FileLineResolver::FileLineResolver 25176761e5SGreg Clayton ( 26176761e5SGreg Clayton const FileSpec &file_spec, 27176761e5SGreg Clayton uint32_t line_no, 28176761e5SGreg Clayton bool check_inlines 29176761e5SGreg Clayton ) : 30176761e5SGreg Clayton Searcher (), 31176761e5SGreg Clayton m_file_spec (file_spec), 32176761e5SGreg Clayton m_line_number (line_no), 33176761e5SGreg Clayton m_inlines (check_inlines) 34176761e5SGreg Clayton { 35176761e5SGreg Clayton } 36176761e5SGreg Clayton 37176761e5SGreg Clayton FileLineResolver::~FileLineResolver () 38176761e5SGreg Clayton { 39176761e5SGreg Clayton } 40176761e5SGreg Clayton 41176761e5SGreg Clayton Searcher::CallbackReturn 42176761e5SGreg Clayton FileLineResolver::SearchCallback 43176761e5SGreg Clayton ( 44176761e5SGreg Clayton SearchFilter &filter, 45176761e5SGreg Clayton SymbolContext &context, 46176761e5SGreg Clayton Address *addr, 47176761e5SGreg Clayton bool containing 48176761e5SGreg Clayton ) 49176761e5SGreg Clayton { 50176761e5SGreg Clayton CompileUnit *cu = context.comp_unit; 51176761e5SGreg Clayton 52176761e5SGreg Clayton if (m_inlines || m_file_spec.Compare(*cu, m_file_spec, m_file_spec.GetDirectory())) 53176761e5SGreg Clayton { 54176761e5SGreg Clayton uint32_t start_file_idx = 0; 55*87df91b8SJim Ingham uint32_t file_idx = cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false); 56176761e5SGreg Clayton if (file_idx != UINT32_MAX) 57176761e5SGreg Clayton { 58176761e5SGreg Clayton LineTable *line_table = cu->GetLineTable(); 59176761e5SGreg Clayton if (line_table) 60176761e5SGreg Clayton { 61176761e5SGreg Clayton if (m_line_number == 0) 62176761e5SGreg Clayton { 63176761e5SGreg Clayton // Match all lines in a file... 64176761e5SGreg Clayton const bool append = true; 65176761e5SGreg Clayton while (file_idx != UINT32_MAX) 66176761e5SGreg Clayton { 67176761e5SGreg Clayton line_table->FineLineEntriesForFileIndex (file_idx, append, m_sc_list); 68176761e5SGreg Clayton // Get the next file index in case we have multiple file 69176761e5SGreg Clayton // entries for the same file 70*87df91b8SJim Ingham file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, m_file_spec, false); 71176761e5SGreg Clayton } 72176761e5SGreg Clayton } 73176761e5SGreg Clayton else 74176761e5SGreg Clayton { 75176761e5SGreg Clayton // Match a specific line in a file... 76176761e5SGreg Clayton } 77176761e5SGreg Clayton } 78176761e5SGreg Clayton } 79176761e5SGreg Clayton } 80176761e5SGreg Clayton return Searcher::eCallbackReturnContinue; 81176761e5SGreg Clayton } 82176761e5SGreg Clayton 83176761e5SGreg Clayton Searcher::Depth 84176761e5SGreg Clayton FileLineResolver::GetDepth() 85176761e5SGreg Clayton { 86176761e5SGreg Clayton return Searcher::eDepthCompUnit; 87176761e5SGreg Clayton } 88176761e5SGreg Clayton 89176761e5SGreg Clayton void 90176761e5SGreg Clayton FileLineResolver::GetDescription (Stream *s) 91176761e5SGreg Clayton { 92176761e5SGreg Clayton s->Printf ("File and line resolver for file: \"%s%s%s\" line: %u", 93176761e5SGreg Clayton m_file_spec.GetDirectory().GetCString(), 94176761e5SGreg Clayton m_file_spec.GetDirectory() ? "/" : "", 95176761e5SGreg Clayton m_file_spec.GetFilename().GetCString(), 96176761e5SGreg Clayton m_line_number); 97176761e5SGreg Clayton } 98176761e5SGreg Clayton 99176761e5SGreg Clayton void 100176761e5SGreg Clayton FileLineResolver::Clear() 101176761e5SGreg Clayton { 102176761e5SGreg Clayton m_file_spec.Clear(); 103176761e5SGreg Clayton m_line_number = UINT32_MAX; 104176761e5SGreg Clayton m_sc_list.Clear(); 105176761e5SGreg Clayton m_inlines = true; 106176761e5SGreg Clayton } 107176761e5SGreg Clayton 108176761e5SGreg Clayton void 109176761e5SGreg Clayton FileLineResolver::Reset (const FileSpec &file_spec, 110176761e5SGreg Clayton uint32_t line, 111176761e5SGreg Clayton bool check_inlines) 112176761e5SGreg Clayton { 113176761e5SGreg Clayton m_file_spec = file_spec; 114176761e5SGreg Clayton m_line_number = line; 115176761e5SGreg Clayton m_sc_list.Clear(); 116176761e5SGreg Clayton m_inlines = check_inlines; 117176761e5SGreg Clayton } 118176761e5SGreg Clayton 119