diff options
Diffstat (limited to 'lldb/source/API/SBSourceManager.cpp')
| -rw-r--r-- | lldb/source/API/SBSourceManager.cpp | 164 | 
1 files changed, 164 insertions, 0 deletions
diff --git a/lldb/source/API/SBSourceManager.cpp b/lldb/source/API/SBSourceManager.cpp new file mode 100644 index 0000000000000..9c4ce3c7f4e3a --- /dev/null +++ b/lldb/source/API/SBSourceManager.cpp @@ -0,0 +1,164 @@ +//===-- SBSourceManager.cpp -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "lldb/API/SBSourceManager.h" +#include "SBReproducerPrivate.h" +#include "lldb/API/SBDebugger.h" +#include "lldb/API/SBStream.h" +#include "lldb/API/SBTarget.h" + +#include "lldb/API/SBFileSpec.h" +#include "lldb/Core/Debugger.h" +#include "lldb/Core/SourceManager.h" +#include "lldb/Core/StreamFile.h" +#include "lldb/Utility/Stream.h" + +#include "lldb/Target/Target.h" + +namespace lldb_private { +class SourceManagerImpl { +public: +  SourceManagerImpl(const lldb::DebuggerSP &debugger_sp) +      : m_debugger_wp(debugger_sp), m_target_wp() {} + +  SourceManagerImpl(const lldb::TargetSP &target_sp) +      : m_debugger_wp(), m_target_wp(target_sp) {} + +  SourceManagerImpl(const SourceManagerImpl &rhs) { +    if (&rhs == this) +      return; +    m_debugger_wp = rhs.m_debugger_wp; +    m_target_wp = rhs.m_target_wp; +  } + +  size_t 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) { +    if (!file) +      return 0; + +    lldb::TargetSP target_sp(m_target_wp.lock()); +    if (target_sp) { +      return target_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers( +          file, line, column, context_before, context_after, current_line_cstr, +          s); +    } else { +      lldb::DebuggerSP debugger_sp(m_debugger_wp.lock()); +      if (debugger_sp) { +        return debugger_sp->GetSourceManager() +            .DisplaySourceLinesWithLineNumbers(file, line, column, +                                               context_before, context_after, +                                               current_line_cstr, s); +      } +    } +    return 0; +  } + +private: +  lldb::DebuggerWP m_debugger_wp; +  lldb::TargetWP m_target_wp; +}; +} + +using namespace lldb; +using namespace lldb_private; + +SBSourceManager::SBSourceManager(const SBDebugger &debugger) { +  LLDB_RECORD_CONSTRUCTOR(SBSourceManager, (const lldb::SBDebugger &), +                          debugger); + +  m_opaque_up.reset(new SourceManagerImpl(debugger.get_sp())); +} + +SBSourceManager::SBSourceManager(const SBTarget &target) { +  LLDB_RECORD_CONSTRUCTOR(SBSourceManager, (const lldb::SBTarget &), target); + +  m_opaque_up.reset(new SourceManagerImpl(target.GetSP())); +} + +SBSourceManager::SBSourceManager(const SBSourceManager &rhs) { +  LLDB_RECORD_CONSTRUCTOR(SBSourceManager, (const lldb::SBSourceManager &), +                          rhs); + +  if (&rhs == this) +    return; + +  m_opaque_up.reset(new SourceManagerImpl(*(rhs.m_opaque_up.get()))); +} + +const lldb::SBSourceManager &SBSourceManager:: +operator=(const lldb::SBSourceManager &rhs) { +  LLDB_RECORD_METHOD(const lldb::SBSourceManager &, +                     SBSourceManager, operator=,(const lldb::SBSourceManager &), +                     rhs); + +  m_opaque_up.reset(new SourceManagerImpl(*(rhs.m_opaque_up.get()))); +  return LLDB_RECORD_RESULT(*this); +} + +SBSourceManager::~SBSourceManager() {} + +size_t SBSourceManager::DisplaySourceLinesWithLineNumbers( +    const SBFileSpec &file, uint32_t line, uint32_t context_before, +    uint32_t context_after, const char *current_line_cstr, SBStream &s) { +  LLDB_RECORD_METHOD(size_t, SBSourceManager, DisplaySourceLinesWithLineNumbers, +                     (const lldb::SBFileSpec &, uint32_t, uint32_t, uint32_t, +                      const char *, lldb::SBStream &), +                     file, line, context_before, context_after, +                     current_line_cstr, s); + +  const uint32_t column = 0; +  return DisplaySourceLinesWithLineNumbersAndColumn( +      file.ref(), line, column, context_before, context_after, +      current_line_cstr, s); +} + +size_t SBSourceManager::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) { +  LLDB_RECORD_METHOD( +      size_t, SBSourceManager, DisplaySourceLinesWithLineNumbersAndColumn, +      (const lldb::SBFileSpec &, uint32_t, uint32_t, uint32_t, uint32_t, +       const char *, lldb::SBStream &), +      file, line, column, context_before, context_after, current_line_cstr, s); + +  if (m_opaque_up == nullptr) +    return 0; + +  return m_opaque_up->DisplaySourceLinesWithLineNumbers( +      file.ref(), line, column, context_before, context_after, +      current_line_cstr, s.get()); +} + +namespace lldb_private { +namespace repro { + +template <> +void RegisterMethods<SBSourceManager>(Registry &R) { +  LLDB_REGISTER_CONSTRUCTOR(SBSourceManager, (const lldb::SBDebugger &)); +  LLDB_REGISTER_CONSTRUCTOR(SBSourceManager, (const lldb::SBTarget &)); +  LLDB_REGISTER_CONSTRUCTOR(SBSourceManager, (const lldb::SBSourceManager &)); +  LLDB_REGISTER_METHOD( +      const lldb::SBSourceManager &, +      SBSourceManager, operator=,(const lldb::SBSourceManager &)); +  LLDB_REGISTER_METHOD(size_t, SBSourceManager, +                       DisplaySourceLinesWithLineNumbers, +                       (const lldb::SBFileSpec &, uint32_t, uint32_t, +                        uint32_t, const char *, lldb::SBStream &)); +  LLDB_REGISTER_METHOD(size_t, SBSourceManager, +                       DisplaySourceLinesWithLineNumbersAndColumn, +                       (const lldb::SBFileSpec &, uint32_t, uint32_t, +                        uint32_t, uint32_t, const char *, lldb::SBStream &)); +} + +} +}  | 
