124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- BreakpointResolverFileLine.cpp --------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointResolverFileLine.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocation.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h"
2149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// BreakpointResolverFileLine:
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::BreakpointResolverFileLine
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Breakpoint *bkpt,
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const FileSpec &file_spec,
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t line_no,
352cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham    bool check_inlines,
362cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham    bool skip_prologue
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
38a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    BreakpointResolver (bkpt, BreakpointResolver::FileLineResolver),
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file_spec (file_spec),
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_line_number (line_no),
412cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham    m_inlines (check_inlines),
422cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham    m_skip_prologue(skip_prologue)
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::~BreakpointResolverFileLine ()
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSearcher::CallbackReturn
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::SearchCallback
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SearchFilter &filter,
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext &context,
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Address *addr,
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool containing
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextList sc_list;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (m_breakpoint != NULL);
62952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
63a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
64a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // There is a tricky bit here.  You can have two compilation units that #include the same file, and
65a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // 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
66a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // other it isn't.  If we considered the CU's independently, then in the second inclusion, we'd move the breakpoint
67a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // to the next function that actually generated code in the header file.  That would end up being confusing.
68a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // So instead, we do the CU iterations by hand here, then scan through the complete list of matches, and figure out
69a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // the closest line number match, and only set breakpoints on that match.
70a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
71a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // Note also that if file_spec only had a file name and not a directory, there may be many different file spec's in
72a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // the resultant list.  The closest line match for one will not be right for some totally different file.
73a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // So we go through the match list and pull out the sets that have the same file spec in their line_entry
74a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    // and treat each set separately.
75a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
7636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t num_comp_units = context.module_sp->GetNumCompileUnits();
7736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    for (size_t i = 0; i < num_comp_units; i++)
78a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    {
79a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        CompUnitSP cu_sp (context.module_sp->GetCompileUnitAtIndex (i));
80c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton        if (cu_sp)
81c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton        {
82c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton            if (filter.CompUnitPasses(*cu_sp))
83c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton                cu_sp->ResolveSymbolContext (m_file_spec, m_line_number, m_inlines, false, eSymbolContextEverything, sc_list);
84c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton        }
85a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    }
86a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
87a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    while (sc_list.GetSize() > 0)
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
89a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        SymbolContextList tmp_sc_list;
903e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs        unsigned current_idx = 0;
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
92a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        bool first_entry = true;
93a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
94a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        FileSpec match_file_spec;
95a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        uint32_t closest_line_number = UINT32_MAX;
96a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
97a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        // Pull out the first entry, and all the others that match its file spec, and stuff them in the tmp list.
98a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        while (current_idx < sc_list.GetSize())
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
100a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            bool matches;
101a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
102a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            sc_list.GetContextAtIndex (current_idx, sc);
103a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            if (first_entry)
104a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            {
105a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                match_file_spec = sc.line_entry.file;
106a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                matches = true;
107a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                first_entry = false;
108a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            }
109a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            else
110a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                matches = (sc.line_entry.file == match_file_spec);
111a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
112a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            if (matches)
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
114a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                tmp_sc_list.Append (sc);
115a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                sc_list.RemoveContextAtIndex(current_idx);
116a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
117a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                // ResolveSymbolContext will always return a number that is >= the line number you pass in.
118a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                // So the smaller line number is always better.
119a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                if (sc.line_entry.line < closest_line_number)
120a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                    closest_line_number = sc.line_entry.line;
121a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            }
122a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            else
123a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                current_idx++;
124a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        }
125a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
126fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        // Okay, we've found the closest line number match, now throw away all the others:
127fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham
128fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        current_idx = 0;
129fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        while (current_idx < tmp_sc_list.GetSize())
130fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        {
131fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham            if (tmp_sc_list.GetContextAtIndex(current_idx, sc))
132fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham            {
133fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                if (sc.line_entry.line != closest_line_number)
134fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                    tmp_sc_list.RemoveContextAtIndex(current_idx);
135fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                else
136fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                    current_idx++;
137fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham            }
138fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        }
139fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham
140fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        // Next go through and see if there are line table entries that are contiguous, and if so keep only the
141fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        // first of the contiguous range:
142fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham
143fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        lldb::addr_t last_end_addr = LLDB_INVALID_ADDRESS;
144fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        current_idx = 0;
145fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        while (current_idx < tmp_sc_list.GetSize())
146fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        {
147fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham            if (tmp_sc_list.GetContextAtIndex(current_idx, sc))
148fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham            {
149fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                lldb::addr_t start_file_addr = sc.line_entry.range.GetBaseAddress().GetFileAddress();
150fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                lldb::addr_t end_file_addr   = start_file_addr + sc.line_entry.range.GetByteSize();
151fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham
152fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                if (start_file_addr == last_end_addr)
153fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                    tmp_sc_list.RemoveContextAtIndex(current_idx);
154fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                else
155fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                    current_idx++;
156fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham
157fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                last_end_addr = end_file_addr;
158fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham            }
159fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham        }
160fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham
161a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        // and make breakpoints out of the closest line number match.
162a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
163a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        uint32_t tmp_sc_list_size = tmp_sc_list.GetSize();
164a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
165a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        for (uint32_t i = 0; i < tmp_sc_list_size; i++)
166a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham        {
167a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            if (tmp_sc_list.GetContextAtIndex(i, sc))
168a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham            {
169fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                Address line_start = sc.line_entry.range.GetBaseAddress();
170fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                if (line_start.IsValid())
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
172fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                    if (filter.AddressPasses(line_start))
17303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                    {
174fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                        // If the line number is before the prologue end, move it there...
175fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                        bool skipped_prologue = false;
176fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                        if (m_skip_prologue)
177a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                        {
178fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                            if (sc.function)
1792cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                            {
180fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                Address prologue_addr(sc.function->GetAddressRange().GetBaseAddress());
181fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                if (prologue_addr.IsValid() && (line_start == prologue_addr))
1822cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                {
183fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                    const uint32_t prologue_byte_size = sc.function->GetPrologueByteSize();
184fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                    if (prologue_byte_size)
1852cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                    {
186fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                        prologue_addr.Slide(prologue_byte_size);
187fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham
188fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                        if (filter.AddressPasses(prologue_addr))
1892cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                        {
190fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                            skipped_prologue = true;
191fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                            line_start = prologue_addr;
1922cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                        }
1932cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                    }
1942cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                                }
1952cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham                            }
196a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                        }
197fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham
198fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                        BreakpointLocationSP bp_loc_sp (m_breakpoint->AddLocation(line_start));
199fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                        if (log && bp_loc_sp && !m_breakpoint->IsInternal())
200a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                        {
201fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                            StreamString s;
202fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                            bp_loc_sp->GetDescription (&s, lldb::eDescriptionLevelVerbose);
203fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                            log->Printf ("Added location (skipped prologue: %s): %s \n", skipped_prologue ? "yes" : "no", s.GetData());
204a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                        }
205a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                    }
206fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                    else if (log)
207a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                    {
208fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                        log->Printf ("Breakpoint at file address 0x%" PRIx64 " for %s:%d didn't pass the filter.\n",
209fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                     line_start.GetFileAddress(),
210fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                     m_file_spec.GetFilename().AsCString("<Unknown>"),
211fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                     m_line_number);
21203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                    }
21303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                }
214a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham                else
21503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                {
216fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                    if (log)
217fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                        log->Printf ("error: Unable to set breakpoint at file address 0x%" PRIx64 " for %s:%d\n",
218fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                     line_start.GetFileAddress(),
219fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                     m_file_spec.GetFilename().AsCString("<Unknown>"),
220fd24bb5d30de81259a12e7aef2546bbc8be63eb5Jim Ingham                                     m_line_number);
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
225a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Searcher::eCallbackReturnContinue;
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSearcher::Depth
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::GetDepth()
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
232a44297a3a58c46fe88a37e3de18ce97c4c85edc5Jim Ingham    return Searcher::eDepthModule;
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::GetDescription (Stream *s)
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
238706498107f1dd7c58bda10c1c4f653257fc6e8ebGreg Clayton    s->Printf ("file = '%s', line = %u", m_file_spec.GetPath().c_str(), m_line_number);
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::Dump (Stream *s) const
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
247