1254721Semaste//===-- AddressResolverFileLine.cpp -----------------------------*- C++ -*-===//
2254721Semaste//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6254721Semaste//
7254721Semaste//===----------------------------------------------------------------------===//
8254721Semaste
9254721Semaste#include "lldb/Core/AddressResolverFileLine.h"
10254721Semaste
11344779Sdim#include "lldb/Core/Address.h"
12344779Sdim#include "lldb/Core/AddressRange.h"
13254721Semaste#include "lldb/Symbol/CompileUnit.h"
14344779Sdim#include "lldb/Symbol/LineEntry.h"
15254721Semaste#include "lldb/Symbol/SymbolContext.h"
16344779Sdim#include "lldb/Utility/ConstString.h"
17321369Sdim#include "lldb/Utility/Log.h"
18344779Sdim#include "lldb/Utility/Logging.h"
19344779Sdim#include "lldb/Utility/Stream.h"
20321369Sdim#include "lldb/Utility/StreamString.h"
21344779Sdim#include "lldb/lldb-enumerations.h"
22344779Sdim#include "lldb/lldb-types.h"
23254721Semaste
24344779Sdim#include <inttypes.h>
25344779Sdim#include <vector>
26321369Sdim
27254721Semasteusing namespace lldb;
28254721Semasteusing namespace lldb_private;
29254721Semaste
30254721Semaste// AddressResolverFileLine:
31314564SdimAddressResolverFileLine::AddressResolverFileLine(const FileSpec &file_spec,
32314564Sdim                                                 uint32_t line_no,
33314564Sdim                                                 bool check_inlines)
34314564Sdim    : AddressResolver(), m_file_spec(file_spec), m_line_number(line_no),
35314564Sdim      m_inlines(check_inlines) {}
36254721Semaste
37314564SdimAddressResolverFileLine::~AddressResolverFileLine() {}
38254721Semaste
39254721SemasteSearcher::CallbackReturn
40314564SdimAddressResolverFileLine::SearchCallback(SearchFilter &filter,
41360784Sdim                                        SymbolContext &context, Address *addr) {
42314564Sdim  SymbolContextList sc_list;
43314564Sdim  CompileUnit *cu = context.comp_unit;
44254721Semaste
45314564Sdim  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
46254721Semaste
47360784Sdim  cu->ResolveSymbolContext(m_file_spec, m_line_number, m_inlines, false,
48360784Sdim                           eSymbolContextEverything, sc_list);
49360784Sdim  uint32_t sc_list_size = sc_list.GetSize();
50314564Sdim  for (uint32_t i = 0; i < sc_list_size; i++) {
51314564Sdim    SymbolContext sc;
52314564Sdim    if (sc_list.GetContextAtIndex(i, sc)) {
53314564Sdim      Address line_start = sc.line_entry.range.GetBaseAddress();
54314564Sdim      addr_t byte_size = sc.line_entry.range.GetByteSize();
55314564Sdim      if (line_start.IsValid()) {
56314564Sdim        AddressRange new_range(line_start, byte_size);
57314564Sdim        m_address_ranges.push_back(new_range);
58314564Sdim        if (log) {
59314564Sdim          StreamString s;
60314564Sdim          // new_bp_loc->GetDescription (&s, lldb::eDescriptionLevelVerbose);
61360784Sdim          // LLDB_LOGF(log, "Added address: %s\n", s.GetData());
62254721Semaste        }
63314564Sdim      } else {
64360784Sdim        LLDB_LOGF(log,
65360784Sdim                  "error: Unable to resolve address at file address 0x%" PRIx64
66360784Sdim                  " for %s:%d\n",
67360784Sdim                  line_start.GetFileAddress(),
68360784Sdim                  m_file_spec.GetFilename().AsCString("<Unknown>"),
69360784Sdim                  m_line_number);
70314564Sdim      }
71254721Semaste    }
72314564Sdim  }
73314564Sdim  return Searcher::eCallbackReturnContinue;
74254721Semaste}
75254721Semaste
76344779Sdimlldb::SearchDepth AddressResolverFileLine::GetDepth() {
77344779Sdim  return lldb::eSearchDepthCompUnit;
78254721Semaste}
79254721Semaste
80314564Sdimvoid AddressResolverFileLine::GetDescription(Stream *s) {
81314564Sdim  s->Printf("File and line address - file: \"%s\" line: %u",
82314564Sdim            m_file_spec.GetFilename().AsCString("<Unknown>"), m_line_number);
83254721Semaste}
84