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 13*2f3df613SZachary Turner #include "lldb/Core/FileSpecList.h" // for FileSpecList 141f746071SGreg Clayton #include "lldb/Symbol/CompileUnit.h" 15176761e5SGreg Clayton #include "lldb/Symbol/LineTable.h" 16*2f3df613SZachary Turner #include "lldb/Utility/ConstString.h" // for ConstString 17*2f3df613SZachary Turner #include "lldb/Utility/Stream.h" // for Stream 18*2f3df613SZachary Turner 19*2f3df613SZachary Turner #include <string> // for string 20*2f3df613SZachary Turner 21*2f3df613SZachary Turner namespace lldb_private { 22*2f3df613SZachary Turner class Address; 23*2f3df613SZachary Turner } 24176761e5SGreg Clayton 25176761e5SGreg Clayton using namespace lldb; 26176761e5SGreg Clayton using namespace lldb_private; 27176761e5SGreg Clayton 28176761e5SGreg Clayton //---------------------------------------------------------------------- 29176761e5SGreg Clayton // FileLineResolver: 30176761e5SGreg Clayton //---------------------------------------------------------------------- 31b9c1b51eSKate Stone FileLineResolver::FileLineResolver(const FileSpec &file_spec, uint32_t line_no, 32b9c1b51eSKate Stone bool check_inlines) 33b9c1b51eSKate Stone : Searcher(), m_file_spec(file_spec), m_line_number(line_no), 34b9c1b51eSKate Stone m_inlines(check_inlines) {} 35176761e5SGreg Clayton 36b9c1b51eSKate Stone FileLineResolver::~FileLineResolver() {} 37176761e5SGreg Clayton 38176761e5SGreg Clayton Searcher::CallbackReturn 39b9c1b51eSKate Stone FileLineResolver::SearchCallback(SearchFilter &filter, SymbolContext &context, 40b9c1b51eSKate Stone Address *addr, bool containing) { 41176761e5SGreg Clayton CompileUnit *cu = context.comp_unit; 42176761e5SGreg Clayton 43b9c1b51eSKate Stone if (m_inlines || 44b9c1b51eSKate Stone m_file_spec.Compare(*cu, m_file_spec, (bool)m_file_spec.GetDirectory())) { 45176761e5SGreg Clayton uint32_t start_file_idx = 0; 46b9c1b51eSKate Stone uint32_t file_idx = 47b9c1b51eSKate Stone cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false); 48b9c1b51eSKate Stone if (file_idx != UINT32_MAX) { 49176761e5SGreg Clayton LineTable *line_table = cu->GetLineTable(); 50b9c1b51eSKate Stone if (line_table) { 51b9c1b51eSKate Stone if (m_line_number == 0) { 52176761e5SGreg Clayton // Match all lines in a file... 53176761e5SGreg Clayton const bool append = true; 54b9c1b51eSKate Stone while (file_idx != UINT32_MAX) { 55b9c1b51eSKate Stone line_table->FineLineEntriesForFileIndex(file_idx, append, 56b9c1b51eSKate Stone m_sc_list); 57176761e5SGreg Clayton // Get the next file index in case we have multiple file 58176761e5SGreg Clayton // entries for the same file 59b9c1b51eSKate Stone file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, 60b9c1b51eSKate Stone m_file_spec, false); 61176761e5SGreg Clayton } 62b9c1b51eSKate Stone } else { 63176761e5SGreg Clayton // Match a specific line in a file... 64176761e5SGreg Clayton } 65176761e5SGreg Clayton } 66176761e5SGreg Clayton } 67176761e5SGreg Clayton } 68176761e5SGreg Clayton return Searcher::eCallbackReturnContinue; 69176761e5SGreg Clayton } 70176761e5SGreg Clayton 71b9c1b51eSKate Stone Searcher::Depth FileLineResolver::GetDepth() { 72176761e5SGreg Clayton return Searcher::eDepthCompUnit; 73176761e5SGreg Clayton } 74176761e5SGreg Clayton 75b9c1b51eSKate Stone void FileLineResolver::GetDescription(Stream *s) { 76b5ad4ec7SGreg Clayton s->Printf("File and line resolver for file: \"%s\" line: %u", 77b9c1b51eSKate Stone m_file_spec.GetPath().c_str(), m_line_number); 78176761e5SGreg Clayton } 79176761e5SGreg Clayton 80b9c1b51eSKate Stone void FileLineResolver::Clear() { 81176761e5SGreg Clayton m_file_spec.Clear(); 82176761e5SGreg Clayton m_line_number = UINT32_MAX; 83176761e5SGreg Clayton m_sc_list.Clear(); 84176761e5SGreg Clayton m_inlines = true; 85176761e5SGreg Clayton } 86176761e5SGreg Clayton 87b9c1b51eSKate Stone void FileLineResolver::Reset(const FileSpec &file_spec, uint32_t line, 88b9c1b51eSKate Stone bool check_inlines) { 89176761e5SGreg Clayton m_file_spec = file_spec; 90176761e5SGreg Clayton m_line_number = line; 91176761e5SGreg Clayton m_sc_list.Clear(); 92176761e5SGreg Clayton m_inlines = check_inlines; 93176761e5SGreg Clayton } 94