diff options
Diffstat (limited to 'lldb/source/Core/SourceManager.cpp')
| -rw-r--r-- | lldb/source/Core/SourceManager.cpp | 79 | 
1 files changed, 47 insertions, 32 deletions
| diff --git a/lldb/source/Core/SourceManager.cpp b/lldb/source/Core/SourceManager.cpp index 8e0cc57f80c1..7414dd281d43 100644 --- a/lldb/source/Core/SourceManager.cpp +++ b/lldb/source/Core/SourceManager.cpp @@ -1,4 +1,4 @@ -//===-- SourceManager.cpp ---------------------------------------*- C++ -*-===// +//===-- SourceManager.cpp -------------------------------------------------===//  //  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.  // See https://llvm.org/LICENSE.txt for license information. @@ -22,6 +22,7 @@  #include "lldb/Symbol/SymbolContext.h"  #include "lldb/Target/PathMappingList.h"  #include "lldb/Target/Target.h" +#include "lldb/Utility/AnsiTerminal.h"  #include "lldb/Utility/ConstString.h"  #include "lldb/Utility/DataBuffer.h"  #include "lldb/Utility/DataBufferLLVM.h" @@ -51,27 +52,24 @@ static inline bool is_newline_char(char ch) { return ch == '\n' || ch == '\r'; }  // SourceManager constructor  SourceManager::SourceManager(const TargetSP &target_sp) -    : m_last_file_sp(), m_last_line(0), m_last_count(0), m_default_set(false), +    : m_last_line(0), m_last_count(0), m_default_set(false),        m_target_wp(target_sp),        m_debugger_wp(target_sp->GetDebugger().shared_from_this()) {}  SourceManager::SourceManager(const DebuggerSP &debugger_sp) -    : m_last_file_sp(), m_last_line(0), m_last_count(0), m_default_set(false), -      m_target_wp(), m_debugger_wp(debugger_sp) {} +    : m_last_line(0), m_last_count(0), m_default_set(false), m_target_wp(), +      m_debugger_wp(debugger_sp) {}  // Destructor  SourceManager::~SourceManager() {}  SourceManager::FileSP SourceManager::GetFile(const FileSpec &file_spec) { -  bool same_as_previous = -      m_last_file_sp && -      FileSpec::Match(file_spec, m_last_file_sp->GetFileSpec()); +  if (!file_spec) +    return nullptr;    DebuggerSP debugger_sp(m_debugger_wp.lock());    FileSP file_sp; -  if (same_as_previous) -    file_sp = m_last_file_sp; -  else if (debugger_sp) +  if (debugger_sp && debugger_sp->GetUseSourceCache())      file_sp = debugger_sp->GetSourceFileCache().FindSourceFile(file_spec);    TargetSP target_sp(m_target_wp.lock()); @@ -94,7 +92,7 @@ SourceManager::FileSP SourceManager::GetFile(const FileSpec &file_spec) {      else        file_sp = std::make_shared<File>(file_spec, debugger_sp); -    if (debugger_sp) +    if (debugger_sp && debugger_sp->GetUseSourceCache())        debugger_sp->GetSourceFileCache().AddSourceFile(file_sp);    }    return file_sp; @@ -148,6 +146,10 @@ static bool should_show_stop_column_with_caret(DebuggerSP debugger_sp) {    return value == eStopShowColumnCaret;  } +static bool should_show_stop_line_with_ansi(DebuggerSP debugger_sp) { +  return debugger_sp && debugger_sp->GetUseColor(); +} +  size_t SourceManager::DisplaySourceLinesWithLineNumbersUsingLastFile(      uint32_t start_line, uint32_t count, uint32_t curr_line, uint32_t column,      const char *current_line_cstr, Stream *s, @@ -173,10 +175,10 @@ size_t SourceManager::DisplaySourceLinesWithLineNumbersUsingLastFile(    m_last_line = start_line;    m_last_count = count; -  if (m_last_file_sp.get()) { +  if (FileSP last_file_sp = GetLastFile()) {      const uint32_t end_line = start_line + count - 1;      for (uint32_t line = start_line; line <= end_line; ++line) { -      if (!m_last_file_sp->LineIsValid(line)) { +      if (!last_file_sp->LineIsValid(line)) {          m_last_line = UINT32_MAX;          break;        } @@ -191,8 +193,20 @@ size_t SourceManager::DisplaySourceLinesWithLineNumbersUsingLastFile(            ::snprintf(prefix, sizeof(prefix), "    ");        } -      s->Printf("%s%2.2s %-4u\t", prefix, -                line == curr_line ? current_line_cstr : "", line); +      char buffer[3]; +      sprintf(buffer, "%2.2s", (line == curr_line) ? current_line_cstr : ""); +      std::string current_line_highlight(buffer); + +      auto debugger_sp = m_debugger_wp.lock(); +      if (should_show_stop_line_with_ansi(debugger_sp)) { +        current_line_highlight = ansi::FormatAnsiTerminalCodes( +            (debugger_sp->GetStopShowLineMarkerAnsiPrefix() + +             current_line_highlight + +             debugger_sp->GetStopShowLineMarkerAnsiSuffix()) +                .str()); +      } + +      s->Printf("%s%s %-4u\t", prefix, current_line_highlight.c_str(), line);        // So far we treated column 0 as a special 'no column value', but        // DisplaySourceLines starts counting columns from 0 (and no column is @@ -202,12 +216,12 @@ size_t SourceManager::DisplaySourceLinesWithLineNumbersUsingLastFile(          columnToHighlight = column - 1;        size_t this_line_size = -          m_last_file_sp->DisplaySourceLines(line, columnToHighlight, 0, 0, s); +          last_file_sp->DisplaySourceLines(line, columnToHighlight, 0, 0, s);        if (column != 0 && line == curr_line && -          should_show_stop_column_with_caret(m_debugger_wp.lock())) { +          should_show_stop_column_with_caret(debugger_sp)) {          // Display caret cursor.          std::string src_line; -        m_last_file_sp->GetLine(line, src_line); +        last_file_sp->GetLine(line, src_line);          s->Printf("    \t");          // Insert a space for every non-tab character in the source line.          for (size_t i = 0; i + 1 < column && i < src_line.length(); ++i) @@ -238,10 +252,11 @@ size_t SourceManager::DisplaySourceLinesWithLineNumbers(    else      start_line = 1; -  if (m_last_file_sp.get() != file_sp.get()) { +  FileSP last_file_sp(GetLastFile()); +  if (last_file_sp.get() != file_sp.get()) {      if (line == 0)        m_last_line = 0; -    m_last_file_sp = file_sp; +    m_last_file_spec = file_spec;    }    return DisplaySourceLinesWithLineNumbersUsingLastFile(        start_line, count, line, column, current_line_cstr, s, bp_locs); @@ -251,14 +266,15 @@ size_t SourceManager::DisplayMoreWithLineNumbers(      Stream *s, uint32_t count, bool reverse, const SymbolContextList *bp_locs) {    // If we get called before anybody has set a default file and line, then try    // to figure it out here. -  const bool have_default_file_line = m_last_file_sp && m_last_line > 0; +  FileSP last_file_sp(GetLastFile()); +  const bool have_default_file_line = last_file_sp && m_last_line > 0;    if (!m_default_set) {      FileSpec tmp_spec;      uint32_t tmp_line;      GetDefaultFileAndLine(tmp_spec, tmp_line);    } -  if (m_last_file_sp) { +  if (last_file_sp) {      if (m_last_line == UINT32_MAX)        return 0; @@ -293,22 +309,21 @@ size_t SourceManager::DisplayMoreWithLineNumbers(  bool SourceManager::SetDefaultFileAndLine(const FileSpec &file_spec,                                            uint32_t line) { -  FileSP old_file_sp = m_last_file_sp; -  m_last_file_sp = GetFile(file_spec); -    m_default_set = true; -  if (m_last_file_sp) { +  FileSP file_sp(GetFile(file_spec)); + +  if (file_sp) {      m_last_line = line; +    m_last_file_spec = file_spec;      return true;    } else { -    m_last_file_sp = old_file_sp;      return false;    }  }  bool SourceManager::GetDefaultFileAndLine(FileSpec &file_spec, uint32_t &line) { -  if (m_last_file_sp) { -    file_spec = m_last_file_sp->GetFileSpec(); +  if (FileSP last_file_sp = GetLastFile()) { +    file_spec = m_last_file_spec;      line = m_last_line;      return true;    } else if (!m_default_set) { @@ -325,7 +340,7 @@ bool SourceManager::GetDefaultFileAndLine(FileSpec &file_spec, uint32_t &line) {          ConstString main_name("main");          bool symbols_okay = false; // Force it to be a debug symbol.          bool inlines_okay = true; -        executable_ptr->FindFunctions(main_name, nullptr, +        executable_ptr->FindFunctions(main_name, CompilerDeclContext(),                                        lldb::eFunctionNameTypeBase, inlines_okay,                                        symbols_okay, sc_list);          size_t num_matches = sc_list.GetSize(); @@ -338,7 +353,7 @@ bool SourceManager::GetDefaultFileAndLine(FileSpec &file_spec, uint32_t &line) {                      .GetBaseAddress()                      .CalculateSymbolContextLineEntry(line_entry)) {                SetDefaultFileAndLine(line_entry.file, line_entry.line); -              file_spec = m_last_file_sp->GetFileSpec(); +              file_spec = m_last_file_spec;                line = m_last_line;                return true;              } @@ -679,7 +694,7 @@ bool SourceManager::File::GetLine(uint32_t line_no, std::string &buffer) {  }  void SourceManager::SourceFileCache::AddSourceFile(const FileSP &file_sp) { -  FileSpec file_spec; +  FileSpec file_spec = file_sp->GetFileSpec();    FileCache::iterator pos = m_file_cache.find(file_spec);    if (pos == m_file_cache.end())      m_file_cache[file_spec] = file_sp; | 
