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