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