blob: dcee2fd541252132dae854aca3be2201ccf5ae53 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- 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"
Greg Clayton1f746072012-08-29 21:13:06 +000018#include "lldb/Core/Module.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Core/StreamString.h"
Greg Clayton1f746072012-08-29 21:13:06 +000020#include "lldb/Symbol/CompileUnit.h"
21#include "lldb/Symbol/Function.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022#include "lldb/lldb-private-log.h"
23
24using namespace lldb;
25using namespace lldb_private;
26
27//----------------------------------------------------------------------
28// BreakpointResolverFileLine:
29//----------------------------------------------------------------------
30BreakpointResolverFileLine::BreakpointResolverFileLine
31(
32 Breakpoint *bkpt,
33 const FileSpec &file_spec,
34 uint32_t line_no,
Jim Inghama8558b62012-05-22 00:12:20 +000035 bool check_inlines,
36 bool skip_prologue
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037) :
Johnny Chenb7234e42010-10-28 17:27:46 +000038 BreakpointResolver (bkpt, BreakpointResolver::FileLineResolver),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039 m_file_spec (file_spec),
40 m_line_number (line_no),
Jim Inghama8558b62012-05-22 00:12:20 +000041 m_inlines (check_inlines),
42 m_skip_prologue(skip_prologue)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043{
44}
45
46BreakpointResolverFileLine::~BreakpointResolverFileLine ()
47{
48}
49
50Searcher::CallbackReturn
51BreakpointResolverFileLine::SearchCallback
52(
53 SearchFilter &filter,
54 SymbolContext &context,
55 Address *addr,
56 bool containing
57)
58{
59 SymbolContextList sc_list;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060
61 assert (m_breakpoint != NULL);
Jim Inghambc2f9182012-01-13 02:04:05 +000062
63 // There is a tricky bit here. You can have two compilation units that #include the same file, and
64 // 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
65 // other it isn't. If we considered the CU's independently, then in the second inclusion, we'd move the breakpoint
66 // to the next function that actually generated code in the header file. That would end up being confusing.
67 // So instead, we do the CU iterations by hand here, then scan through the complete list of matches, and figure out
68 // the closest line number match, and only set breakpoints on that match.
69
70 // Note also that if file_spec only had a file name and not a directory, there may be many different file spec's in
71 // the resultant list. The closest line match for one will not be right for some totally different file.
72 // So we go through the match list and pull out the sets that have the same file spec in their line_entry
73 // and treat each set separately.
74
Greg Claytonc7bece562013-01-25 18:06:21 +000075 const size_t num_comp_units = context.module_sp->GetNumCompileUnits();
76 for (size_t i = 0; i < num_comp_units; i++)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000077 {
Jim Inghambc2f9182012-01-13 02:04:05 +000078 CompUnitSP cu_sp (context.module_sp->GetCompileUnitAtIndex (i));
Greg Clayton2dafd8e2012-04-23 22:00:21 +000079 if (cu_sp)
80 {
81 if (filter.CompUnitPasses(*cu_sp))
82 cu_sp->ResolveSymbolContext (m_file_spec, m_line_number, m_inlines, false, eSymbolContextEverything, sc_list);
83 }
Jim Inghambc2f9182012-01-13 02:04:05 +000084 }
Jim Inghamf6423732013-09-27 01:16:58 +000085 StreamString s;
86 s.Printf ("for %s:%d ",
87 m_file_spec.GetFilename().AsCString("<Unknown>"),
88 m_line_number);
Jim Inghambc2f9182012-01-13 02:04:05 +000089
Jim Inghamf6423732013-09-27 01:16:58 +000090 SetSCMatchesByLine (filter, sc_list, m_skip_prologue, s.GetData());
91
Chris Lattner30fdc8d2010-06-08 16:52:24 +000092 return Searcher::eCallbackReturnContinue;
93}
94
95Searcher::Depth
96BreakpointResolverFileLine::GetDepth()
97{
Jim Inghambc2f9182012-01-13 02:04:05 +000098 return Searcher::eDepthModule;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000099}
100
101void
102BreakpointResolverFileLine::GetDescription (Stream *s)
103{
Greg Clayton405fab92013-06-13 19:39:56 +0000104 s->Printf ("file = '%s', line = %u", m_file_spec.GetPath().c_str(), m_line_number);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000105}
106
107void
108BreakpointResolverFileLine::Dump (Stream *s) const
109{
110
111}
112