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