]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Breakpoint/BreakpointResolverFileLine.cpp
Import LLDB as of upstream SVN 241361 (git 612c075f)
[FreeBSD/FreeBSD.git] / source / Breakpoint / BreakpointResolverFileLine.cpp
1 //===-- BreakpointResolverFileLine.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/Breakpoint/BreakpointResolverFileLine.h"
11
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 #include "lldb/Breakpoint/BreakpointLocation.h"
17 #include "lldb/Core/Log.h"
18 #include "lldb/Core/Module.h"
19 #include "lldb/Core/StreamString.h"
20 #include "lldb/Symbol/CompileUnit.h"
21 #include "lldb/Symbol/Function.h"
22
23 using namespace lldb;
24 using namespace lldb_private;
25
26 //----------------------------------------------------------------------
27 // BreakpointResolverFileLine:
28 //----------------------------------------------------------------------
29 BreakpointResolverFileLine::BreakpointResolverFileLine
30 (
31     Breakpoint *bkpt,
32     const FileSpec &file_spec,
33     uint32_t line_no,
34     bool check_inlines,
35     bool skip_prologue,
36     bool exact_match
37 ) :
38     BreakpointResolver (bkpt, BreakpointResolver::FileLineResolver),
39     m_file_spec (file_spec),
40     m_line_number (line_no),
41     m_inlines (check_inlines),
42     m_skip_prologue(skip_prologue),
43     m_exact_match(exact_match)
44 {
45 }
46
47 BreakpointResolverFileLine::~BreakpointResolverFileLine ()
48 {
49 }
50
51 Searcher::CallbackReturn
52 BreakpointResolverFileLine::SearchCallback
53 (
54     SearchFilter &filter,
55     SymbolContext &context,
56     Address *addr,
57     bool containing
58 )
59 {
60     SymbolContextList sc_list;
61
62     assert (m_breakpoint != NULL);
63     
64     // There is a tricky bit here.  You can have two compilation units that #include the same file, and
65     // in one of them the function at m_line_number is used (and so code and a line entry for it is generated) but in the
66     // other it isn't.  If we considered the CU's independently, then in the second inclusion, we'd move the breakpoint 
67     // to the next function that actually generated code in the header file.  That would end up being confusing.
68     // So instead, we do the CU iterations by hand here, then scan through the complete list of matches, and figure out 
69     // the closest line number match, and only set breakpoints on that match.
70     
71     // Note also that if file_spec only had a file name and not a directory, there may be many different file spec's in
72     // the resultant list.  The closest line match for one will not be right for some totally different file.
73     // So we go through the match list and pull out the sets that have the same file spec in their line_entry
74     // and treat each set separately.
75     
76     const size_t num_comp_units = context.module_sp->GetNumCompileUnits();
77     for (size_t i = 0; i < num_comp_units; i++)
78     {
79         CompUnitSP cu_sp (context.module_sp->GetCompileUnitAtIndex (i));
80         if (cu_sp)
81         {
82             if (filter.CompUnitPasses(*cu_sp))
83                 cu_sp->ResolveSymbolContext (m_file_spec, m_line_number, m_inlines, m_exact_match, eSymbolContextEverything, sc_list);
84         }
85     }
86     StreamString s;
87     s.Printf ("for %s:%d ",
88                         m_file_spec.GetFilename().AsCString("<Unknown>"),
89                         m_line_number);
90
91     SetSCMatchesByLine (filter, sc_list, m_skip_prologue, s.GetData());
92
93     return Searcher::eCallbackReturnContinue;
94 }
95
96 Searcher::Depth
97 BreakpointResolverFileLine::GetDepth()
98 {
99     return Searcher::eDepthModule;
100 }
101
102 void
103 BreakpointResolverFileLine::GetDescription (Stream *s)
104 {
105     s->Printf ("file = '%s', line = %u, exact_match = %d", m_file_spec.GetPath().c_str(), m_line_number, m_exact_match);
106 }
107
108 void
109 BreakpointResolverFileLine::Dump (Stream *s) const
110 {
111
112 }
113
114 lldb::BreakpointResolverSP
115 BreakpointResolverFileLine::CopyForBreakpoint (Breakpoint &breakpoint)
116 {
117     lldb::BreakpointResolverSP ret_sp(new BreakpointResolverFileLine(&breakpoint,
118                                                                      m_file_spec,
119                                                                      m_line_number,
120                                                                      m_inlines,
121                                                                      m_skip_prologue,
122                                                                      m_exact_match));
123
124     return ret_sp;
125 }