diff options
| author | Ed Maste <emaste@FreeBSD.org> | 2013-08-23 17:46:38 +0000 | 
|---|---|---|
| committer | Ed Maste <emaste@FreeBSD.org> | 2013-08-23 17:46:38 +0000 | 
| commit | f034231a6a1fd5d6395206c1651de8cd9402cca3 (patch) | |
| tree | f561dabc721ad515599172c16da3a4400b7f4aec /source/Core/AddressResolverFileLine.cpp | |
Notes
Diffstat (limited to 'source/Core/AddressResolverFileLine.cpp')
| -rw-r--r-- | source/Core/AddressResolverFileLine.cpp | 102 | 
1 files changed, 102 insertions, 0 deletions
diff --git a/source/Core/AddressResolverFileLine.cpp b/source/Core/AddressResolverFileLine.cpp new file mode 100644 index 000000000000..f7004c8bb089 --- /dev/null +++ b/source/Core/AddressResolverFileLine.cpp @@ -0,0 +1,102 @@ +//===-- AddressResolverFileLine.cpp -----------------------------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Core/AddressResolverFileLine.h" + +// Project includes +#include "lldb/Core/Log.h" +#include "lldb/Core/StreamString.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/SymbolContext.h" +#include "lldb/lldb-private-log.h" + +using namespace lldb; +using namespace lldb_private; + +//---------------------------------------------------------------------- +// AddressResolverFileLine: +//---------------------------------------------------------------------- +AddressResolverFileLine::AddressResolverFileLine +( +    const FileSpec &file_spec, +    uint32_t line_no, +    bool check_inlines +) : +    AddressResolver (), +    m_file_spec (file_spec), +    m_line_number (line_no), +    m_inlines (check_inlines) +{ +} + +AddressResolverFileLine::~AddressResolverFileLine () +{ +} + +Searcher::CallbackReturn +AddressResolverFileLine::SearchCallback +( +    SearchFilter &filter, +    SymbolContext &context, +    Address *addr, +    bool containing +) +{ +    SymbolContextList sc_list; +    uint32_t sc_list_size; +    CompileUnit *cu = context.comp_unit; + +    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); + +    sc_list_size = cu->ResolveSymbolContext (m_file_spec, m_line_number, m_inlines, false, eSymbolContextEverything, +                                             sc_list); +    for (uint32_t i = 0; i < sc_list_size; i++) +    { +        SymbolContext sc; +        if (sc_list.GetContextAtIndex(i, sc)) +        { +            Address line_start = sc.line_entry.range.GetBaseAddress(); +            addr_t byte_size = sc.line_entry.range.GetByteSize(); +            if (line_start.IsValid()) +            { +                AddressRange new_range (line_start, byte_size); +                m_address_ranges.push_back (new_range); +                if (log) +                { +                    StreamString s; +                    //new_bp_loc->GetDescription (&s, lldb::eDescriptionLevelVerbose); +                    //log->Printf ("Added address: %s\n", s.GetData()); +                } +            } +            else +            { +                if (log) +                  log->Printf ("error: Unable to resolve address at file address 0x%" PRIx64 " for %s:%d\n", +                               line_start.GetFileAddress(), +                               m_file_spec.GetFilename().AsCString("<Unknown>"), +                               m_line_number); +            } +        } +    } +    return Searcher::eCallbackReturnContinue; +} + +Searcher::Depth +AddressResolverFileLine::GetDepth() +{ +    return Searcher::eDepthCompUnit; +} + +void +AddressResolverFileLine::GetDescription (Stream *s) +{ +    s->Printf ("File and line address - file: \"%s\" line: %u", m_file_spec.GetFilename().AsCString(), m_line_number); +} + +  | 
