BreakpointResolverFileLine.cpp revision 24943d2ee8bfaa7cf5893e4709143924157a5c1e
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"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// BreakpointResolverFileLine:
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::BreakpointResolverFileLine
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Breakpoint *bkpt,
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const FileSpec &file_spec,
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t line_no,
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool check_inlines
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointResolver (bkpt),
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file_spec (file_spec),
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_line_number (line_no),
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_inlines (check_inlines)
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::~BreakpointResolverFileLine ()
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSearcher::CallbackReturn
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::SearchCallback
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SearchFilter &filter,
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext &context,
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Address *addr,
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool containing
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextList sc_list;
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t sc_list_size;
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnit *cu = context.comp_unit;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (m_breakpoint != NULL);
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc_list_size = cu->ResolveSymbolContext (m_file_spec, m_line_number, m_inlines, false, eSymbolContextEverything, sc_list);
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (int i = 0; i < sc_list_size; i++)
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc_list.GetContextAtIndex(i, sc))
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Address line_start = sc.line_entry.range.GetBaseAddress();
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (line_start.IsValid())
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                BreakpointLocationSP bp_loc_sp (m_breakpoint->AddLocation(line_start));
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (log && bp_loc_sp && !m_breakpoint->IsInternal())
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    StreamString s;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    bp_loc_sp->GetDescription (&s, lldb::eDescriptionLevelVerbose);
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log->Printf ("Added location: %s\n", s.GetData());
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (log)
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log->Printf ("error: Unable to set breakpoint at file address 0x%llx for %s:%d\n",
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 line_start.GetFileAddress(),
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 m_file_spec.GetFilename().AsCString("<Unknown>"),
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 m_line_number);
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if 0
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s << "error: Breakpoint at '" << pos->c_str() << "' isn't resolved yet: \n";
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.line_entry.address.Dump(&s, Address::DumpStyleSectionNameOffset))
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s.EOL();
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.line_entry.address.Dump(&s, Address::DumpStyleSectionPointerOffset))
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s.EOL();
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.line_entry.address.Dump(&s, Address::DumpStyleFileAddress))
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s.EOL();
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.line_entry.address.Dump(&s, Address::DumpStyleLoadAddress))
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s.EOL();
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Searcher::eCallbackReturnContinue;
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSearcher::Depth
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::GetDepth()
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Searcher::eDepthCompUnit;
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::GetDescription (Stream *s)
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf ("File and line breakpoint - file: \"%s\" line: %u", m_file_spec.GetFilename().AsCString(), m_line_number);
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointResolverFileLine::Dump (Stream *s) const
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123