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/Core/Log.h" 14176761e5SGreg Clayton #include "lldb/Core/StreamString.h" 151f746071SGreg Clayton #include "lldb/Symbol/CompileUnit.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 //---------------------------------------------------------------------- 24*b9c1b51eSKate Stone FileLineResolver::FileLineResolver(const FileSpec &file_spec, uint32_t line_no, 25*b9c1b51eSKate Stone bool check_inlines) 26*b9c1b51eSKate Stone : Searcher(), m_file_spec(file_spec), m_line_number(line_no), 27*b9c1b51eSKate Stone m_inlines(check_inlines) {} 28176761e5SGreg Clayton 29*b9c1b51eSKate Stone FileLineResolver::~FileLineResolver() {} 30176761e5SGreg Clayton 31176761e5SGreg Clayton Searcher::CallbackReturn 32*b9c1b51eSKate Stone FileLineResolver::SearchCallback(SearchFilter &filter, SymbolContext &context, 33*b9c1b51eSKate Stone Address *addr, bool containing) { 34176761e5SGreg Clayton CompileUnit *cu = context.comp_unit; 35176761e5SGreg Clayton 36*b9c1b51eSKate Stone if (m_inlines || 37*b9c1b51eSKate Stone m_file_spec.Compare(*cu, m_file_spec, (bool)m_file_spec.GetDirectory())) { 38176761e5SGreg Clayton uint32_t start_file_idx = 0; 39*b9c1b51eSKate Stone uint32_t file_idx = 40*b9c1b51eSKate Stone cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false); 41*b9c1b51eSKate Stone if (file_idx != UINT32_MAX) { 42176761e5SGreg Clayton LineTable *line_table = cu->GetLineTable(); 43*b9c1b51eSKate Stone if (line_table) { 44*b9c1b51eSKate Stone if (m_line_number == 0) { 45176761e5SGreg Clayton // Match all lines in a file... 46176761e5SGreg Clayton const bool append = true; 47*b9c1b51eSKate Stone while (file_idx != UINT32_MAX) { 48*b9c1b51eSKate Stone line_table->FineLineEntriesForFileIndex(file_idx, append, 49*b9c1b51eSKate Stone m_sc_list); 50176761e5SGreg Clayton // Get the next file index in case we have multiple file 51176761e5SGreg Clayton // entries for the same file 52*b9c1b51eSKate Stone file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, 53*b9c1b51eSKate Stone m_file_spec, false); 54176761e5SGreg Clayton } 55*b9c1b51eSKate Stone } else { 56176761e5SGreg Clayton // Match a specific line in a file... 57176761e5SGreg Clayton } 58176761e5SGreg Clayton } 59176761e5SGreg Clayton } 60176761e5SGreg Clayton } 61176761e5SGreg Clayton return Searcher::eCallbackReturnContinue; 62176761e5SGreg Clayton } 63176761e5SGreg Clayton 64*b9c1b51eSKate Stone Searcher::Depth FileLineResolver::GetDepth() { 65176761e5SGreg Clayton return Searcher::eDepthCompUnit; 66176761e5SGreg Clayton } 67176761e5SGreg Clayton 68*b9c1b51eSKate Stone void FileLineResolver::GetDescription(Stream *s) { 69b5ad4ec7SGreg Clayton s->Printf("File and line resolver for file: \"%s\" line: %u", 70*b9c1b51eSKate Stone m_file_spec.GetPath().c_str(), m_line_number); 71176761e5SGreg Clayton } 72176761e5SGreg Clayton 73*b9c1b51eSKate Stone void FileLineResolver::Clear() { 74176761e5SGreg Clayton m_file_spec.Clear(); 75176761e5SGreg Clayton m_line_number = UINT32_MAX; 76176761e5SGreg Clayton m_sc_list.Clear(); 77176761e5SGreg Clayton m_inlines = true; 78176761e5SGreg Clayton } 79176761e5SGreg Clayton 80*b9c1b51eSKate Stone void FileLineResolver::Reset(const FileSpec &file_spec, uint32_t line, 81*b9c1b51eSKate Stone bool check_inlines) { 82176761e5SGreg Clayton m_file_spec = file_spec; 83176761e5SGreg Clayton m_line_number = line; 84176761e5SGreg Clayton m_sc_list.Clear(); 85176761e5SGreg Clayton m_inlines = check_inlines; 86176761e5SGreg Clayton } 87