1 //===-- AddressResolverFileLine.cpp ---------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "lldb/Core/AddressResolverFileLine.h"
11 #include "lldb/Core/Address.h"
12 #include "lldb/Core/AddressRange.h"
13 #include "lldb/Symbol/CompileUnit.h"
14 #include "lldb/Symbol/LineEntry.h"
15 #include "lldb/Symbol/SymbolContext.h"
16 #include "lldb/Utility/ConstString.h"
17 #include "lldb/Utility/LLDBLog.h"
18 #include "lldb/Utility/Log.h"
19 #include "lldb/Utility/Stream.h"
20 #include "lldb/Utility/StreamString.h"
21 #include "lldb/lldb-enumerations.h"
22 #include "lldb/lldb-types.h"
28 using namespace lldb_private
;
30 // AddressResolverFileLine:
31 AddressResolverFileLine::AddressResolverFileLine(
32 SourceLocationSpec location_spec
)
33 : AddressResolver(), m_src_location_spec(location_spec
) {}
35 AddressResolverFileLine::~AddressResolverFileLine() = default;
37 Searcher::CallbackReturn
38 AddressResolverFileLine::SearchCallback(SearchFilter
&filter
,
39 SymbolContext
&context
, Address
*addr
) {
40 SymbolContextList sc_list
;
41 CompileUnit
*cu
= context
.comp_unit
;
43 Log
*log
= GetLog(LLDBLog::Breakpoints
);
45 // TODO: Handle SourceLocationSpec column information
46 cu
->ResolveSymbolContext(m_src_location_spec
, eSymbolContextEverything
,
48 for (const SymbolContext
&sc
: sc_list
) {
49 Address line_start
= sc
.line_entry
.range
.GetBaseAddress();
50 addr_t byte_size
= sc
.line_entry
.range
.GetByteSize();
51 if (line_start
.IsValid()) {
52 AddressRange
new_range(line_start
, byte_size
);
53 m_address_ranges
.push_back(new_range
);
56 "error: Unable to resolve address at file address 0x%" PRIx64
58 line_start
.GetFileAddress(),
59 m_src_location_spec
.GetFileSpec().GetFilename().AsCString(
61 m_src_location_spec
.GetLine().value_or(0));
64 return Searcher::eCallbackReturnContinue
;
67 lldb::SearchDepth
AddressResolverFileLine::GetDepth() {
68 return lldb::eSearchDepthCompUnit
;
71 void AddressResolverFileLine::GetDescription(Stream
*s
) {
73 "File and line address - file: \"%s\" line: %u",
74 m_src_location_spec
.GetFileSpec().GetFilename().AsCString("<Unknown>"),
75 m_src_location_spec
.GetLine().value_or(0));