1254721Semaste//===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Core/FileLineResolver.h"
11254721Semaste
12254721Semaste// Project includes
13254721Semaste#include "lldb/lldb-private-log.h"
14254721Semaste#include "lldb/Core/Log.h"
15254721Semaste#include "lldb/Core/StreamString.h"
16254721Semaste#include "lldb/Symbol/CompileUnit.h"
17254721Semaste#include "lldb/Symbol/LineTable.h"
18254721Semaste
19254721Semasteusing namespace lldb;
20254721Semasteusing namespace lldb_private;
21254721Semaste
22254721Semaste//----------------------------------------------------------------------
23254721Semaste// FileLineResolver:
24254721Semaste//----------------------------------------------------------------------
25254721SemasteFileLineResolver::FileLineResolver
26254721Semaste(
27254721Semaste    const FileSpec &file_spec,
28254721Semaste    uint32_t line_no,
29254721Semaste    bool check_inlines
30254721Semaste) :
31254721Semaste    Searcher (),
32254721Semaste    m_file_spec (file_spec),
33254721Semaste    m_line_number (line_no),
34254721Semaste    m_inlines (check_inlines)
35254721Semaste{
36254721Semaste}
37254721Semaste
38254721SemasteFileLineResolver::~FileLineResolver ()
39254721Semaste{
40254721Semaste}
41254721Semaste
42254721SemasteSearcher::CallbackReturn
43254721SemasteFileLineResolver::SearchCallback
44254721Semaste(
45254721Semaste    SearchFilter &filter,
46254721Semaste    SymbolContext &context,
47254721Semaste    Address *addr,
48254721Semaste    bool containing
49254721Semaste)
50254721Semaste{
51254721Semaste    CompileUnit *cu = context.comp_unit;
52254721Semaste
53263363Semaste    if (m_inlines || m_file_spec.Compare(*cu, m_file_spec, (bool)m_file_spec.GetDirectory()))
54254721Semaste    {
55254721Semaste        uint32_t start_file_idx = 0;
56254721Semaste        uint32_t file_idx = cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false);
57254721Semaste        if (file_idx != UINT32_MAX)
58254721Semaste        {
59254721Semaste            LineTable *line_table = cu->GetLineTable();
60254721Semaste            if (line_table)
61254721Semaste            {
62254721Semaste                if (m_line_number == 0)
63254721Semaste                {
64254721Semaste                    // Match all lines in a file...
65254721Semaste                    const bool append = true;
66254721Semaste                    while (file_idx != UINT32_MAX)
67254721Semaste                    {
68254721Semaste                        line_table->FineLineEntriesForFileIndex (file_idx, append, m_sc_list);
69254721Semaste                        // Get the next file index in case we have multiple file
70254721Semaste                        // entries for the same file
71254721Semaste                        file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, m_file_spec, false);
72254721Semaste                    }
73254721Semaste                }
74254721Semaste                else
75254721Semaste                {
76254721Semaste                    // Match a specific line in a file...
77254721Semaste                }
78254721Semaste            }
79254721Semaste        }
80254721Semaste    }
81254721Semaste    return Searcher::eCallbackReturnContinue;
82254721Semaste}
83254721Semaste
84254721SemasteSearcher::Depth
85254721SemasteFileLineResolver::GetDepth()
86254721Semaste{
87254721Semaste    return Searcher::eDepthCompUnit;
88254721Semaste}
89254721Semaste
90254721Semastevoid
91254721SemasteFileLineResolver::GetDescription (Stream *s)
92254721Semaste{
93254721Semaste    s->Printf ("File and line resolver for file: \"%s\" line: %u",
94254721Semaste               m_file_spec.GetPath().c_str(),
95254721Semaste               m_line_number);
96254721Semaste}
97254721Semaste
98254721Semastevoid
99254721SemasteFileLineResolver::Clear()
100254721Semaste{
101254721Semaste    m_file_spec.Clear();
102254721Semaste    m_line_number = UINT32_MAX;
103254721Semaste    m_sc_list.Clear();
104254721Semaste    m_inlines = true;
105254721Semaste}
106254721Semaste
107254721Semastevoid
108254721SemasteFileLineResolver::Reset (const FileSpec &file_spec,
109254721Semaste                         uint32_t line,
110254721Semaste                         bool check_inlines)
111254721Semaste{
112254721Semaste    m_file_spec = file_spec;
113254721Semaste    m_line_number = line;
114254721Semaste    m_sc_list.Clear();
115254721Semaste    m_inlines = check_inlines;
116254721Semaste}
117254721Semaste
118