xref: /openbsd-src/gnu/llvm/lldb/source/Core/AddressResolverFileLine.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1dda28197Spatrick //===-- AddressResolverFileLine.cpp ---------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9061da546Spatrick #include "lldb/Core/AddressResolverFileLine.h"
10061da546Spatrick 
11061da546Spatrick #include "lldb/Core/Address.h"
12061da546Spatrick #include "lldb/Core/AddressRange.h"
13061da546Spatrick #include "lldb/Symbol/CompileUnit.h"
14061da546Spatrick #include "lldb/Symbol/LineEntry.h"
15061da546Spatrick #include "lldb/Symbol/SymbolContext.h"
16061da546Spatrick #include "lldb/Utility/ConstString.h"
17*f6aab3d8Srobert #include "lldb/Utility/LLDBLog.h"
18061da546Spatrick #include "lldb/Utility/Log.h"
19061da546Spatrick #include "lldb/Utility/Stream.h"
20061da546Spatrick #include "lldb/Utility/StreamString.h"
21061da546Spatrick #include "lldb/lldb-enumerations.h"
22061da546Spatrick #include "lldb/lldb-types.h"
23061da546Spatrick 
24be691f3bSpatrick #include <cinttypes>
25061da546Spatrick #include <vector>
26061da546Spatrick 
27061da546Spatrick using namespace lldb;
28061da546Spatrick using namespace lldb_private;
29061da546Spatrick 
30061da546Spatrick // AddressResolverFileLine:
AddressResolverFileLine(SourceLocationSpec location_spec)31be691f3bSpatrick AddressResolverFileLine::AddressResolverFileLine(
32be691f3bSpatrick     SourceLocationSpec location_spec)
33be691f3bSpatrick     : AddressResolver(), m_src_location_spec(location_spec) {}
34061da546Spatrick 
35be691f3bSpatrick AddressResolverFileLine::~AddressResolverFileLine() = default;
36061da546Spatrick 
37061da546Spatrick Searcher::CallbackReturn
SearchCallback(SearchFilter & filter,SymbolContext & context,Address * addr)38061da546Spatrick AddressResolverFileLine::SearchCallback(SearchFilter &filter,
39061da546Spatrick                                         SymbolContext &context, Address *addr) {
40061da546Spatrick   SymbolContextList sc_list;
41061da546Spatrick   CompileUnit *cu = context.comp_unit;
42061da546Spatrick 
43*f6aab3d8Srobert   Log *log = GetLog(LLDBLog::Breakpoints);
44061da546Spatrick 
45be691f3bSpatrick   // TODO: Handle SourceLocationSpec column information
46be691f3bSpatrick   cu->ResolveSymbolContext(m_src_location_spec, eSymbolContextEverything,
47be691f3bSpatrick                            sc_list);
48061da546Spatrick   uint32_t sc_list_size = sc_list.GetSize();
49061da546Spatrick   for (uint32_t i = 0; i < sc_list_size; i++) {
50061da546Spatrick     SymbolContext sc;
51061da546Spatrick     if (sc_list.GetContextAtIndex(i, sc)) {
52061da546Spatrick       Address line_start = sc.line_entry.range.GetBaseAddress();
53061da546Spatrick       addr_t byte_size = sc.line_entry.range.GetByteSize();
54061da546Spatrick       if (line_start.IsValid()) {
55061da546Spatrick         AddressRange new_range(line_start, byte_size);
56061da546Spatrick         m_address_ranges.push_back(new_range);
57061da546Spatrick       } else {
58061da546Spatrick         LLDB_LOGF(log,
59061da546Spatrick                   "error: Unable to resolve address at file address 0x%" PRIx64
60061da546Spatrick                   " for %s:%d\n",
61061da546Spatrick                   line_start.GetFileAddress(),
62be691f3bSpatrick                   m_src_location_spec.GetFileSpec().GetFilename().AsCString(
63be691f3bSpatrick                       "<Unknown>"),
64*f6aab3d8Srobert                   m_src_location_spec.GetLine().value_or(0));
65061da546Spatrick       }
66061da546Spatrick     }
67061da546Spatrick   }
68061da546Spatrick   return Searcher::eCallbackReturnContinue;
69061da546Spatrick }
70061da546Spatrick 
GetDepth()71061da546Spatrick lldb::SearchDepth AddressResolverFileLine::GetDepth() {
72061da546Spatrick   return lldb::eSearchDepthCompUnit;
73061da546Spatrick }
74061da546Spatrick 
GetDescription(Stream * s)75061da546Spatrick void AddressResolverFileLine::GetDescription(Stream *s) {
76be691f3bSpatrick   s->Printf(
77be691f3bSpatrick       "File and line address - file: \"%s\" line: %u",
78be691f3bSpatrick       m_src_location_spec.GetFileSpec().GetFilename().AsCString("<Unknown>"),
79*f6aab3d8Srobert       m_src_location_spec.GetLine().value_or(0));
80061da546Spatrick }
81