180814287SRaphael Isemann //===-- SBSourceManager.cpp -----------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner
94c5de699SEli Friedman #include "lldb/API/SBSourceManager.h"
10b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h"
11f6eaba85SJohnny Chen #include "lldb/API/SBStream.h"
12b9c1b51eSKate Stone #include "lldb/API/SBTarget.h"
13*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
1430fdc8d8SChris Lattner
1530fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
16e37d605eSJim Ingham #include "lldb/Core/Debugger.h"
17b9c1b51eSKate Stone #include "lldb/Core/SourceManager.h"
1830fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
19bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
2030fdc8d8SChris Lattner
21e37d605eSJim Ingham #include "lldb/Target/Target.h"
2230fdc8d8SChris Lattner
23b9c1b51eSKate Stone namespace lldb_private {
24b9c1b51eSKate Stone class SourceManagerImpl {
25e37d605eSJim Ingham public:
SourceManagerImpl(const lldb::DebuggerSP & debugger_sp)26b9c1b51eSKate Stone SourceManagerImpl(const lldb::DebuggerSP &debugger_sp)
27a3436f73SKazu Hirata : m_debugger_wp(debugger_sp) {}
28e37d605eSJim Ingham
SourceManagerImpl(const lldb::TargetSP & target_sp)29a3436f73SKazu Hirata SourceManagerImpl(const lldb::TargetSP &target_sp) : m_target_wp(target_sp) {}
30e37d605eSJim Ingham
SourceManagerImpl(const SourceManagerImpl & rhs)31b9c1b51eSKate Stone SourceManagerImpl(const SourceManagerImpl &rhs) {
32e37d605eSJim Ingham if (&rhs == this)
33e37d605eSJim Ingham return;
349585fbfcSGreg Clayton m_debugger_wp = rhs.m_debugger_wp;
359585fbfcSGreg Clayton m_target_wp = rhs.m_target_wp;
36e37d605eSJim Ingham }
37e37d605eSJim Ingham
DisplaySourceLinesWithLineNumbers(const lldb_private::FileSpec & file,uint32_t line,uint32_t column,uint32_t context_before,uint32_t context_after,const char * current_line_cstr,lldb_private::Stream * s)38b9c1b51eSKate Stone size_t DisplaySourceLinesWithLineNumbers(const lldb_private::FileSpec &file,
399666ba75STodd Fiala uint32_t line, uint32_t column,
40e37d605eSJim Ingham uint32_t context_before,
41e37d605eSJim Ingham uint32_t context_after,
42e37d605eSJim Ingham const char *current_line_cstr,
43b9c1b51eSKate Stone lldb_private::Stream *s) {
4444d6d2c5SJohnny Chen if (!file)
45e37d605eSJim Ingham return 0;
46e37d605eSJim Ingham
479585fbfcSGreg Clayton lldb::TargetSP target_sp(m_target_wp.lock());
48b9c1b51eSKate Stone if (target_sp) {
49b9c1b51eSKate Stone return target_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers(
509666ba75STodd Fiala file, line, column, context_before, context_after, current_line_cstr,
519666ba75STodd Fiala s);
52b9c1b51eSKate Stone } else {
539585fbfcSGreg Clayton lldb::DebuggerSP debugger_sp(m_debugger_wp.lock());
54b9c1b51eSKate Stone if (debugger_sp) {
55b9c1b51eSKate Stone return debugger_sp->GetSourceManager()
569666ba75STodd Fiala .DisplaySourceLinesWithLineNumbers(file, line, column,
579666ba75STodd Fiala context_before, context_after,
589666ba75STodd Fiala current_line_cstr, s);
599585fbfcSGreg Clayton }
609585fbfcSGreg Clayton }
61e37d605eSJim Ingham return 0;
62e37d605eSJim Ingham }
63e37d605eSJim Ingham
64e37d605eSJim Ingham private:
659585fbfcSGreg Clayton lldb::DebuggerWP m_debugger_wp;
669585fbfcSGreg Clayton lldb::TargetWP m_target_wp;
67e37d605eSJim Ingham };
689a37766eSGreg Clayton }
699a37766eSGreg Clayton
709a37766eSGreg Clayton using namespace lldb;
719a37766eSGreg Clayton using namespace lldb_private;
72e37d605eSJim Ingham
SBSourceManager(const SBDebugger & debugger)73b9c1b51eSKate Stone SBSourceManager::SBSourceManager(const SBDebugger &debugger) {
74*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, debugger);
75baf5664fSJonas Devlieghere
761c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<SourceManagerImpl>(debugger.get_sp());
77e37d605eSJim Ingham }
78e37d605eSJim Ingham
SBSourceManager(const SBTarget & target)79b9c1b51eSKate Stone SBSourceManager::SBSourceManager(const SBTarget &target) {
80*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, target);
81baf5664fSJonas Devlieghere
821c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<SourceManagerImpl>(target.GetSP());
83e37d605eSJim Ingham }
84e37d605eSJim Ingham
SBSourceManager(const SBSourceManager & rhs)85b9c1b51eSKate Stone SBSourceManager::SBSourceManager(const SBSourceManager &rhs) {
86*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
87baf5664fSJonas Devlieghere
88e37d605eSJim Ingham if (&rhs == this)
89e37d605eSJim Ingham return;
90e37d605eSJim Ingham
911c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<SourceManagerImpl>(*(rhs.m_opaque_up.get()));
92e37d605eSJim Ingham }
93e37d605eSJim Ingham
94b9c1b51eSKate Stone const lldb::SBSourceManager &SBSourceManager::
operator =(const lldb::SBSourceManager & rhs)95b9c1b51eSKate Stone operator=(const lldb::SBSourceManager &rhs) {
96*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
97baf5664fSJonas Devlieghere
981c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<SourceManagerImpl>(*(rhs.m_opaque_up.get()));
99d232abc3SJonas Devlieghere return *this;
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner
102866b7a65SJonas Devlieghere SBSourceManager::~SBSourceManager() = default;
10330fdc8d8SChris Lattner
DisplaySourceLinesWithLineNumbers(const SBFileSpec & file,uint32_t line,uint32_t context_before,uint32_t context_after,const char * current_line_cstr,SBStream & s)104b9c1b51eSKate Stone size_t SBSourceManager::DisplaySourceLinesWithLineNumbers(
105b9c1b51eSKate Stone const SBFileSpec &file, uint32_t line, uint32_t context_before,
106b9c1b51eSKate Stone uint32_t context_after, const char *current_line_cstr, SBStream &s) {
107*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, file, line, context_before, context_after,
108baf5664fSJonas Devlieghere current_line_cstr, s);
109baf5664fSJonas Devlieghere
1109666ba75STodd Fiala const uint32_t column = 0;
1119666ba75STodd Fiala return DisplaySourceLinesWithLineNumbersAndColumn(
1129666ba75STodd Fiala file.ref(), line, column, context_before, context_after,
1139666ba75STodd Fiala current_line_cstr, s);
1149666ba75STodd Fiala }
1159666ba75STodd Fiala
DisplaySourceLinesWithLineNumbersAndColumn(const SBFileSpec & file,uint32_t line,uint32_t column,uint32_t context_before,uint32_t context_after,const char * current_line_cstr,SBStream & s)1169666ba75STodd Fiala size_t SBSourceManager::DisplaySourceLinesWithLineNumbersAndColumn(
1179666ba75STodd Fiala const SBFileSpec &file, uint32_t line, uint32_t column,
1189666ba75STodd Fiala uint32_t context_before, uint32_t context_after,
1199666ba75STodd Fiala const char *current_line_cstr, SBStream &s) {
120*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, file, line, column, context_before, context_after,
121*1755f5b1SJonas Devlieghere current_line_cstr, s);
122baf5664fSJonas Devlieghere
123248a1305SKonrad Kleine if (m_opaque_up == nullptr)
124efabb123SGreg Clayton return 0;
125efabb123SGreg Clayton
126d5b44036SJonas Devlieghere return m_opaque_up->DisplaySourceLinesWithLineNumbers(
1279666ba75STodd Fiala file.ref(), line, column, context_before, context_after,
1289666ba75STodd Fiala current_line_cstr, s.get());
12930fdc8d8SChris Lattner }
130