15ffd83dbSDimitry Andric //===-- AddressResolverFileLine.cpp ---------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/Core/AddressResolverFileLine.h"
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric #include "lldb/Core/Address.h"
120b57cec5SDimitry Andric #include "lldb/Core/AddressRange.h"
130b57cec5SDimitry Andric #include "lldb/Symbol/CompileUnit.h"
140b57cec5SDimitry Andric #include "lldb/Symbol/LineEntry.h"
150b57cec5SDimitry Andric #include "lldb/Symbol/SymbolContext.h"
160b57cec5SDimitry Andric #include "lldb/Utility/ConstString.h"
170b57cec5SDimitry Andric #include "lldb/Utility/Log.h"
180b57cec5SDimitry Andric #include "lldb/Utility/Logging.h"
190b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
200b57cec5SDimitry Andric #include "lldb/Utility/StreamString.h"
210b57cec5SDimitry Andric #include "lldb/lldb-enumerations.h"
220b57cec5SDimitry Andric #include "lldb/lldb-types.h"
230b57cec5SDimitry Andric 
24*5f7ddb14SDimitry Andric #include <cinttypes>
250b57cec5SDimitry Andric #include <vector>
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric using namespace lldb;
280b57cec5SDimitry Andric using namespace lldb_private;
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric // AddressResolverFileLine:
AddressResolverFileLine(SourceLocationSpec location_spec)31*5f7ddb14SDimitry Andric AddressResolverFileLine::AddressResolverFileLine(
32*5f7ddb14SDimitry Andric     SourceLocationSpec location_spec)
33*5f7ddb14SDimitry Andric     : AddressResolver(), m_src_location_spec(location_spec) {}
340b57cec5SDimitry Andric 
35*5f7ddb14SDimitry Andric AddressResolverFileLine::~AddressResolverFileLine() = default;
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric Searcher::CallbackReturn
SearchCallback(SearchFilter & filter,SymbolContext & context,Address * addr)380b57cec5SDimitry Andric AddressResolverFileLine::SearchCallback(SearchFilter &filter,
399dba64beSDimitry Andric                                         SymbolContext &context, Address *addr) {
400b57cec5SDimitry Andric   SymbolContextList sc_list;
410b57cec5SDimitry Andric   CompileUnit *cu = context.comp_unit;
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
440b57cec5SDimitry Andric 
45*5f7ddb14SDimitry Andric   // TODO: Handle SourceLocationSpec column information
46*5f7ddb14SDimitry Andric   cu->ResolveSymbolContext(m_src_location_spec, eSymbolContextEverything,
47*5f7ddb14SDimitry Andric                            sc_list);
48480093f4SDimitry Andric   uint32_t sc_list_size = sc_list.GetSize();
490b57cec5SDimitry Andric   for (uint32_t i = 0; i < sc_list_size; i++) {
500b57cec5SDimitry Andric     SymbolContext sc;
510b57cec5SDimitry Andric     if (sc_list.GetContextAtIndex(i, sc)) {
520b57cec5SDimitry Andric       Address line_start = sc.line_entry.range.GetBaseAddress();
530b57cec5SDimitry Andric       addr_t byte_size = sc.line_entry.range.GetByteSize();
540b57cec5SDimitry Andric       if (line_start.IsValid()) {
550b57cec5SDimitry Andric         AddressRange new_range(line_start, byte_size);
560b57cec5SDimitry Andric         m_address_ranges.push_back(new_range);
570b57cec5SDimitry Andric       } else {
589dba64beSDimitry Andric         LLDB_LOGF(log,
590b57cec5SDimitry Andric                   "error: Unable to resolve address at file address 0x%" PRIx64
600b57cec5SDimitry Andric                   " for %s:%d\n",
610b57cec5SDimitry Andric                   line_start.GetFileAddress(),
62*5f7ddb14SDimitry Andric                   m_src_location_spec.GetFileSpec().GetFilename().AsCString(
63*5f7ddb14SDimitry Andric                       "<Unknown>"),
64*5f7ddb14SDimitry Andric                   m_src_location_spec.GetLine().getValueOr(0));
650b57cec5SDimitry Andric       }
660b57cec5SDimitry Andric     }
670b57cec5SDimitry Andric   }
680b57cec5SDimitry Andric   return Searcher::eCallbackReturnContinue;
690b57cec5SDimitry Andric }
700b57cec5SDimitry Andric 
GetDepth()710b57cec5SDimitry Andric lldb::SearchDepth AddressResolverFileLine::GetDepth() {
720b57cec5SDimitry Andric   return lldb::eSearchDepthCompUnit;
730b57cec5SDimitry Andric }
740b57cec5SDimitry Andric 
GetDescription(Stream * s)750b57cec5SDimitry Andric void AddressResolverFileLine::GetDescription(Stream *s) {
76*5f7ddb14SDimitry Andric   s->Printf(
77*5f7ddb14SDimitry Andric       "File and line address - file: \"%s\" line: %u",
78*5f7ddb14SDimitry Andric       m_src_location_spec.GetFileSpec().GetFilename().AsCString("<Unknown>"),
79*5f7ddb14SDimitry Andric       m_src_location_spec.GetLine().getValueOr(0));
800b57cec5SDimitry Andric }
81