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" 10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.h" 11b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h" 12f6eaba85SJohnny Chen #include "lldb/API/SBStream.h" 13b9c1b51eSKate Stone #include "lldb/API/SBTarget.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: 26b9c1b51eSKate Stone SourceManagerImpl(const lldb::DebuggerSP &debugger_sp) 27a3436f73SKazu Hirata : m_debugger_wp(debugger_sp) {} 28e37d605eSJim Ingham 29a3436f73SKazu Hirata SourceManagerImpl(const lldb::TargetSP &target_sp) : m_target_wp(target_sp) {} 30e37d605eSJim Ingham 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 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 73b9c1b51eSKate Stone SBSourceManager::SBSourceManager(const SBDebugger &debugger) { 74baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBSourceManager, (const lldb::SBDebugger &), 75baf5664fSJonas Devlieghere debugger); 76baf5664fSJonas Devlieghere 771c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<SourceManagerImpl>(debugger.get_sp()); 78e37d605eSJim Ingham } 79e37d605eSJim Ingham 80b9c1b51eSKate Stone SBSourceManager::SBSourceManager(const SBTarget &target) { 81baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBSourceManager, (const lldb::SBTarget &), target); 82baf5664fSJonas Devlieghere 831c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<SourceManagerImpl>(target.GetSP()); 84e37d605eSJim Ingham } 85e37d605eSJim Ingham 86b9c1b51eSKate Stone SBSourceManager::SBSourceManager(const SBSourceManager &rhs) { 87baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBSourceManager, (const lldb::SBSourceManager &), 88baf5664fSJonas Devlieghere rhs); 89baf5664fSJonas Devlieghere 90e37d605eSJim Ingham if (&rhs == this) 91e37d605eSJim Ingham return; 92e37d605eSJim Ingham 931c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<SourceManagerImpl>(*(rhs.m_opaque_up.get())); 94e37d605eSJim Ingham } 95e37d605eSJim Ingham 96b9c1b51eSKate Stone const lldb::SBSourceManager &SBSourceManager:: 97b9c1b51eSKate Stone operator=(const lldb::SBSourceManager &rhs) { 98baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBSourceManager &, 99baf5664fSJonas Devlieghere SBSourceManager, operator=,(const lldb::SBSourceManager &), 100baf5664fSJonas Devlieghere rhs); 101baf5664fSJonas Devlieghere 1021c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<SourceManagerImpl>(*(rhs.m_opaque_up.get())); 103*d232abc3SJonas Devlieghere return *this; 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 106866b7a65SJonas Devlieghere SBSourceManager::~SBSourceManager() = default; 10730fdc8d8SChris Lattner 108b9c1b51eSKate Stone size_t SBSourceManager::DisplaySourceLinesWithLineNumbers( 109b9c1b51eSKate Stone const SBFileSpec &file, uint32_t line, uint32_t context_before, 110b9c1b51eSKate Stone uint32_t context_after, const char *current_line_cstr, SBStream &s) { 111baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(size_t, SBSourceManager, DisplaySourceLinesWithLineNumbers, 112baf5664fSJonas Devlieghere (const lldb::SBFileSpec &, uint32_t, uint32_t, uint32_t, 113baf5664fSJonas Devlieghere const char *, lldb::SBStream &), 114baf5664fSJonas Devlieghere file, line, context_before, context_after, 115baf5664fSJonas Devlieghere current_line_cstr, s); 116baf5664fSJonas Devlieghere 1179666ba75STodd Fiala const uint32_t column = 0; 1189666ba75STodd Fiala return DisplaySourceLinesWithLineNumbersAndColumn( 1199666ba75STodd Fiala file.ref(), line, column, context_before, context_after, 1209666ba75STodd Fiala current_line_cstr, s); 1219666ba75STodd Fiala } 1229666ba75STodd Fiala 1239666ba75STodd Fiala size_t SBSourceManager::DisplaySourceLinesWithLineNumbersAndColumn( 1249666ba75STodd Fiala const SBFileSpec &file, uint32_t line, uint32_t column, 1259666ba75STodd Fiala uint32_t context_before, uint32_t context_after, 1269666ba75STodd Fiala const char *current_line_cstr, SBStream &s) { 127baf5664fSJonas Devlieghere LLDB_RECORD_METHOD( 128baf5664fSJonas Devlieghere size_t, SBSourceManager, DisplaySourceLinesWithLineNumbersAndColumn, 129baf5664fSJonas Devlieghere (const lldb::SBFileSpec &, uint32_t, uint32_t, uint32_t, uint32_t, 130baf5664fSJonas Devlieghere const char *, lldb::SBStream &), 131baf5664fSJonas Devlieghere file, line, column, context_before, context_after, current_line_cstr, s); 132baf5664fSJonas Devlieghere 133248a1305SKonrad Kleine if (m_opaque_up == nullptr) 134efabb123SGreg Clayton return 0; 135efabb123SGreg Clayton 136d5b44036SJonas Devlieghere return m_opaque_up->DisplaySourceLinesWithLineNumbers( 1379666ba75STodd Fiala file.ref(), line, column, context_before, context_after, 1389666ba75STodd Fiala current_line_cstr, s.get()); 13930fdc8d8SChris Lattner } 140