1*176761e5SGreg Clayton //===-- FileLineResolver.cpp ------------------------------------*- C++ -*-===//
2*176761e5SGreg Clayton //
3*176761e5SGreg Clayton //                     The LLVM Compiler Infrastructure
4*176761e5SGreg Clayton //
5*176761e5SGreg Clayton // This file is distributed under the University of Illinois Open Source
6*176761e5SGreg Clayton // License. See LICENSE.TXT for details.
7*176761e5SGreg Clayton //
8*176761e5SGreg Clayton //===----------------------------------------------------------------------===//
9*176761e5SGreg Clayton 
10*176761e5SGreg Clayton #include "lldb/Core/FileLineResolver.h"
11*176761e5SGreg Clayton 
12*176761e5SGreg Clayton // Project includes
13*176761e5SGreg Clayton #include "lldb/lldb-private-log.h"
14*176761e5SGreg Clayton #include "lldb/Core/Log.h"
15*176761e5SGreg Clayton #include "lldb/Core/StreamString.h"
16*176761e5SGreg Clayton #include "lldb/Symbol/LineTable.h"
17*176761e5SGreg Clayton 
18*176761e5SGreg Clayton using namespace lldb;
19*176761e5SGreg Clayton using namespace lldb_private;
20*176761e5SGreg Clayton 
21*176761e5SGreg Clayton //----------------------------------------------------------------------
22*176761e5SGreg Clayton // FileLineResolver:
23*176761e5SGreg Clayton //----------------------------------------------------------------------
24*176761e5SGreg Clayton FileLineResolver::FileLineResolver
25*176761e5SGreg Clayton (
26*176761e5SGreg Clayton     const FileSpec &file_spec,
27*176761e5SGreg Clayton     uint32_t line_no,
28*176761e5SGreg Clayton     bool check_inlines
29*176761e5SGreg Clayton ) :
30*176761e5SGreg Clayton     Searcher (),
31*176761e5SGreg Clayton     m_file_spec (file_spec),
32*176761e5SGreg Clayton     m_line_number (line_no),
33*176761e5SGreg Clayton     m_inlines (check_inlines)
34*176761e5SGreg Clayton {
35*176761e5SGreg Clayton }
36*176761e5SGreg Clayton 
37*176761e5SGreg Clayton FileLineResolver::~FileLineResolver ()
38*176761e5SGreg Clayton {
39*176761e5SGreg Clayton }
40*176761e5SGreg Clayton 
41*176761e5SGreg Clayton Searcher::CallbackReturn
42*176761e5SGreg Clayton FileLineResolver::SearchCallback
43*176761e5SGreg Clayton (
44*176761e5SGreg Clayton     SearchFilter &filter,
45*176761e5SGreg Clayton     SymbolContext &context,
46*176761e5SGreg Clayton     Address *addr,
47*176761e5SGreg Clayton     bool containing
48*176761e5SGreg Clayton )
49*176761e5SGreg Clayton {
50*176761e5SGreg Clayton     CompileUnit *cu = context.comp_unit;
51*176761e5SGreg Clayton 
52*176761e5SGreg Clayton     if (m_inlines || m_file_spec.Compare(*cu, m_file_spec, m_file_spec.GetDirectory()))
53*176761e5SGreg Clayton     {
54*176761e5SGreg Clayton         uint32_t start_file_idx = 0;
55*176761e5SGreg Clayton         uint32_t file_idx = cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec);
56*176761e5SGreg Clayton         if (file_idx != UINT32_MAX)
57*176761e5SGreg Clayton         {
58*176761e5SGreg Clayton             LineTable *line_table = cu->GetLineTable();
59*176761e5SGreg Clayton             if (line_table)
60*176761e5SGreg Clayton             {
61*176761e5SGreg Clayton                 if (m_line_number == 0)
62*176761e5SGreg Clayton                 {
63*176761e5SGreg Clayton                     // Match all lines in a file...
64*176761e5SGreg Clayton                     const bool append = true;
65*176761e5SGreg Clayton                     while (file_idx != UINT32_MAX)
66*176761e5SGreg Clayton                     {
67*176761e5SGreg Clayton                         line_table->FineLineEntriesForFileIndex (file_idx, append, m_sc_list);
68*176761e5SGreg Clayton                         // Get the next file index in case we have multiple file
69*176761e5SGreg Clayton                         // entries for the same file
70*176761e5SGreg Clayton                         file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, m_file_spec);
71*176761e5SGreg Clayton                     }
72*176761e5SGreg Clayton                 }
73*176761e5SGreg Clayton                 else
74*176761e5SGreg Clayton                 {
75*176761e5SGreg Clayton                     // Match a specific line in a file...
76*176761e5SGreg Clayton                 }
77*176761e5SGreg Clayton             }
78*176761e5SGreg Clayton         }
79*176761e5SGreg Clayton     }
80*176761e5SGreg Clayton     return Searcher::eCallbackReturnContinue;
81*176761e5SGreg Clayton }
82*176761e5SGreg Clayton 
83*176761e5SGreg Clayton Searcher::Depth
84*176761e5SGreg Clayton FileLineResolver::GetDepth()
85*176761e5SGreg Clayton {
86*176761e5SGreg Clayton     return Searcher::eDepthCompUnit;
87*176761e5SGreg Clayton }
88*176761e5SGreg Clayton 
89*176761e5SGreg Clayton void
90*176761e5SGreg Clayton FileLineResolver::GetDescription (Stream *s)
91*176761e5SGreg Clayton {
92*176761e5SGreg Clayton     s->Printf ("File and line resolver for file: \"%s%s%s\" line: %u",
93*176761e5SGreg Clayton                m_file_spec.GetDirectory().GetCString(),
94*176761e5SGreg Clayton                m_file_spec.GetDirectory() ? "/" : "",
95*176761e5SGreg Clayton                m_file_spec.GetFilename().GetCString(),
96*176761e5SGreg Clayton                m_line_number);
97*176761e5SGreg Clayton }
98*176761e5SGreg Clayton 
99*176761e5SGreg Clayton void
100*176761e5SGreg Clayton FileLineResolver::Clear()
101*176761e5SGreg Clayton {
102*176761e5SGreg Clayton     m_file_spec.Clear();
103*176761e5SGreg Clayton     m_line_number = UINT32_MAX;
104*176761e5SGreg Clayton     m_sc_list.Clear();
105*176761e5SGreg Clayton     m_inlines = true;
106*176761e5SGreg Clayton }
107*176761e5SGreg Clayton 
108*176761e5SGreg Clayton void
109*176761e5SGreg Clayton FileLineResolver::Reset (const FileSpec &file_spec,
110*176761e5SGreg Clayton                          uint32_t line,
111*176761e5SGreg Clayton                          bool check_inlines)
112*176761e5SGreg Clayton {
113*176761e5SGreg Clayton     m_file_spec = file_spec;
114*176761e5SGreg Clayton     m_line_number = line;
115*176761e5SGreg Clayton     m_sc_list.Clear();
116*176761e5SGreg Clayton     m_inlines = check_inlines;
117*176761e5SGreg Clayton }
118*176761e5SGreg Clayton 
119