152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton//===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===// 252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// 352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// The LLVM Compiler Infrastructure 452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// 552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// This file is distributed under the University of Illinois Open Source 652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// License. See LICENSE.TXT for details. 752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// 852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton//===----------------------------------------------------------------------===// 952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 1052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/FileLineResolver.h" 1152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 1252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// Project includes 1352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/lldb-private-log.h" 1452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/Log.h" 1552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/StreamString.h" 1649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 1752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Symbol/LineTable.h" 1852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 1952c8b6e3205e11e90adc83521c01915fc13626deGreg Claytonusing namespace lldb; 2052c8b6e3205e11e90adc83521c01915fc13626deGreg Claytonusing namespace lldb_private; 2152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 2252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton//---------------------------------------------------------------------- 2352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// FileLineResolver: 2452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton//---------------------------------------------------------------------- 2552c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonFileLineResolver::FileLineResolver 2652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton( 2752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton const FileSpec &file_spec, 2852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton uint32_t line_no, 2952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton bool check_inlines 3052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton) : 3152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton Searcher (), 3252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_file_spec (file_spec), 3352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_line_number (line_no), 3452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_inlines (check_inlines) 3552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{ 3652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton} 3752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 3852c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonFileLineResolver::~FileLineResolver () 3952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{ 4052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton} 4152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 4252c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonSearcher::CallbackReturn 4352c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonFileLineResolver::SearchCallback 4452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton( 4552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton SearchFilter &filter, 4652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton SymbolContext &context, 4752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton Address *addr, 4852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton bool containing 4952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton) 5052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{ 5152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton CompileUnit *cu = context.comp_unit; 5252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 5352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (m_inlines || m_file_spec.Compare(*cu, m_file_spec, m_file_spec.GetDirectory())) 5452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 5552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton uint32_t start_file_idx = 0; 56d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham uint32_t file_idx = cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false); 5752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (file_idx != UINT32_MAX) 5852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 5952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton LineTable *line_table = cu->GetLineTable(); 6052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (line_table) 6152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 6252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (m_line_number == 0) 6352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 6452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton // Match all lines in a file... 6552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton const bool append = true; 6652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton while (file_idx != UINT32_MAX) 6752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 6852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton line_table->FineLineEntriesForFileIndex (file_idx, append, m_sc_list); 6952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton // Get the next file index in case we have multiple file 7052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton // entries for the same file 71d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, m_file_spec, false); 7252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 7352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 7452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton else 7552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 7652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton // Match a specific line in a file... 7752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 7852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 7952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 8052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 8152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton return Searcher::eCallbackReturnContinue; 8252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton} 8352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 8452c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonSearcher::Depth 8552c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonFileLineResolver::GetDepth() 8652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{ 8752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton return Searcher::eDepthCompUnit; 8852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton} 8952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 9052c8b6e3205e11e90adc83521c01915fc13626deGreg Claytonvoid 9152c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonFileLineResolver::GetDescription (Stream *s) 9252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{ 9397a19b21dacd9063bb5475812df7781777262198Greg Clayton s->Printf ("File and line resolver for file: \"%s\" line: %u", 9497a19b21dacd9063bb5475812df7781777262198Greg Clayton m_file_spec.GetPath().c_str(), 9552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_line_number); 9652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton} 9752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 9852c8b6e3205e11e90adc83521c01915fc13626deGreg Claytonvoid 9952c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonFileLineResolver::Clear() 10052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{ 10152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_file_spec.Clear(); 10252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_line_number = UINT32_MAX; 10352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_sc_list.Clear(); 10452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_inlines = true; 10552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton} 10652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 10752c8b6e3205e11e90adc83521c01915fc13626deGreg Claytonvoid 10852c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonFileLineResolver::Reset (const FileSpec &file_spec, 10952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton uint32_t line, 11052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton bool check_inlines) 11152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{ 11252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_file_spec = file_spec; 11352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_line_number = line; 11452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_sc_list.Clear(); 11552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_inlines = check_inlines; 11652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton} 11752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 118