summaryrefslogtreecommitdiff
path: root/lldb/source/Core/SourceManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Core/SourceManager.cpp')
-rw-r--r--lldb/source/Core/SourceManager.cpp79
1 files changed, 47 insertions, 32 deletions
diff --git a/lldb/source/Core/SourceManager.cpp b/lldb/source/Core/SourceManager.cpp
index 8e0cc57f80c11..7414dd281d43a 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;