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
13176761e5SGreg Clayton #include "lldb/lldb-private-log.h"
14176761e5SGreg Clayton #include "lldb/Core/Log.h"
15176761e5SGreg Clayton #include "lldb/Core/StreamString.h"
16176761e5SGreg Clayton #include "lldb/Symbol/LineTable.h"
17176761e5SGreg Clayton 
18176761e5SGreg Clayton using namespace lldb;
19176761e5SGreg Clayton using namespace lldb_private;
20176761e5SGreg Clayton 
21176761e5SGreg Clayton //----------------------------------------------------------------------
22176761e5SGreg Clayton // FileLineResolver:
23176761e5SGreg Clayton //----------------------------------------------------------------------
24176761e5SGreg Clayton FileLineResolver::FileLineResolver
25176761e5SGreg Clayton (
26176761e5SGreg Clayton     const FileSpec &file_spec,
27176761e5SGreg Clayton     uint32_t line_no,
28176761e5SGreg Clayton     bool check_inlines
29176761e5SGreg Clayton ) :
30176761e5SGreg Clayton     Searcher (),
31176761e5SGreg Clayton     m_file_spec (file_spec),
32176761e5SGreg Clayton     m_line_number (line_no),
33176761e5SGreg Clayton     m_inlines (check_inlines)
34176761e5SGreg Clayton {
35176761e5SGreg Clayton }
36176761e5SGreg Clayton 
37176761e5SGreg Clayton FileLineResolver::~FileLineResolver ()
38176761e5SGreg Clayton {
39176761e5SGreg Clayton }
40176761e5SGreg Clayton 
41176761e5SGreg Clayton Searcher::CallbackReturn
42176761e5SGreg Clayton FileLineResolver::SearchCallback
43176761e5SGreg Clayton (
44176761e5SGreg Clayton     SearchFilter &filter,
45176761e5SGreg Clayton     SymbolContext &context,
46176761e5SGreg Clayton     Address *addr,
47176761e5SGreg Clayton     bool containing
48176761e5SGreg Clayton )
49176761e5SGreg Clayton {
50176761e5SGreg Clayton     CompileUnit *cu = context.comp_unit;
51176761e5SGreg Clayton 
52176761e5SGreg Clayton     if (m_inlines || m_file_spec.Compare(*cu, m_file_spec, m_file_spec.GetDirectory()))
53176761e5SGreg Clayton     {
54176761e5SGreg Clayton         uint32_t start_file_idx = 0;
55*87df91b8SJim Ingham         uint32_t file_idx = cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false);
56176761e5SGreg Clayton         if (file_idx != UINT32_MAX)
57176761e5SGreg Clayton         {
58176761e5SGreg Clayton             LineTable *line_table = cu->GetLineTable();
59176761e5SGreg Clayton             if (line_table)
60176761e5SGreg Clayton             {
61176761e5SGreg Clayton                 if (m_line_number == 0)
62176761e5SGreg Clayton                 {
63176761e5SGreg Clayton                     // Match all lines in a file...
64176761e5SGreg Clayton                     const bool append = true;
65176761e5SGreg Clayton                     while (file_idx != UINT32_MAX)
66176761e5SGreg Clayton                     {
67176761e5SGreg Clayton                         line_table->FineLineEntriesForFileIndex (file_idx, append, m_sc_list);
68176761e5SGreg Clayton                         // Get the next file index in case we have multiple file
69176761e5SGreg Clayton                         // entries for the same file
70*87df91b8SJim Ingham                         file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1, m_file_spec, false);
71176761e5SGreg Clayton                     }
72176761e5SGreg Clayton                 }
73176761e5SGreg Clayton                 else
74176761e5SGreg Clayton                 {
75176761e5SGreg Clayton                     // Match a specific line in a file...
76176761e5SGreg Clayton                 }
77176761e5SGreg Clayton             }
78176761e5SGreg Clayton         }
79176761e5SGreg Clayton     }
80176761e5SGreg Clayton     return Searcher::eCallbackReturnContinue;
81176761e5SGreg Clayton }
82176761e5SGreg Clayton 
83176761e5SGreg Clayton Searcher::Depth
84176761e5SGreg Clayton FileLineResolver::GetDepth()
85176761e5SGreg Clayton {
86176761e5SGreg Clayton     return Searcher::eDepthCompUnit;
87176761e5SGreg Clayton }
88176761e5SGreg Clayton 
89176761e5SGreg Clayton void
90176761e5SGreg Clayton FileLineResolver::GetDescription (Stream *s)
91176761e5SGreg Clayton {
92176761e5SGreg Clayton     s->Printf ("File and line resolver for file: \"%s%s%s\" line: %u",
93176761e5SGreg Clayton                m_file_spec.GetDirectory().GetCString(),
94176761e5SGreg Clayton                m_file_spec.GetDirectory() ? "/" : "",
95176761e5SGreg Clayton                m_file_spec.GetFilename().GetCString(),
96176761e5SGreg Clayton                m_line_number);
97176761e5SGreg Clayton }
98176761e5SGreg Clayton 
99176761e5SGreg Clayton void
100176761e5SGreg Clayton FileLineResolver::Clear()
101176761e5SGreg Clayton {
102176761e5SGreg Clayton     m_file_spec.Clear();
103176761e5SGreg Clayton     m_line_number = UINT32_MAX;
104176761e5SGreg Clayton     m_sc_list.Clear();
105176761e5SGreg Clayton     m_inlines = true;
106176761e5SGreg Clayton }
107176761e5SGreg Clayton 
108176761e5SGreg Clayton void
109176761e5SGreg Clayton FileLineResolver::Reset (const FileSpec &file_spec,
110176761e5SGreg Clayton                          uint32_t line,
111176761e5SGreg Clayton                          bool check_inlines)
112176761e5SGreg Clayton {
113176761e5SGreg Clayton     m_file_spec = file_spec;
114176761e5SGreg Clayton     m_line_number = line;
115176761e5SGreg Clayton     m_sc_list.Clear();
116176761e5SGreg Clayton     m_inlines = check_inlines;
117176761e5SGreg Clayton }
118176761e5SGreg Clayton 
119