aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/lldb/source/Core/FileLineResolver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/lldb/source/Core/FileLineResolver.cpp')
-rw-r--r--contrib/llvm-project/lldb/source/Core/FileLineResolver.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/contrib/llvm-project/lldb/source/Core/FileLineResolver.cpp b/contrib/llvm-project/lldb/source/Core/FileLineResolver.cpp
new file mode 100644
index 000000000000..7c3cf70572ee
--- /dev/null
+++ b/contrib/llvm-project/lldb/source/Core/FileLineResolver.cpp
@@ -0,0 +1,89 @@
+//===-- FileLineResolver.cpp ----------------------------------------------===//
+//
+// 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/Core/FileLineResolver.h"
+
+#include "lldb/Symbol/CompileUnit.h"
+#include "lldb/Symbol/LineTable.h"
+#include "lldb/Utility/ConstString.h"
+#include "lldb/Utility/FileSpecList.h"
+#include "lldb/Utility/Stream.h"
+
+#include <string>
+
+namespace lldb_private {
+class Address;
+}
+
+using namespace lldb;
+using namespace lldb_private;
+
+// FileLineResolver:
+FileLineResolver::FileLineResolver(const FileSpec &file_spec, uint32_t line_no,
+ bool check_inlines)
+ : Searcher(), m_file_spec(file_spec), m_line_number(line_no),
+ m_inlines(check_inlines) {}
+
+FileLineResolver::~FileLineResolver() = default;
+
+Searcher::CallbackReturn
+FileLineResolver::SearchCallback(SearchFilter &filter, SymbolContext &context,
+ Address *addr) {
+ CompileUnit *cu = context.comp_unit;
+
+ if (m_inlines || m_file_spec.Compare(cu->GetPrimaryFile(), m_file_spec,
+ (bool)m_file_spec.GetDirectory())) {
+ uint32_t start_file_idx = 0;
+ uint32_t file_idx =
+ cu->GetSupportFiles().FindFileIndex(start_file_idx, m_file_spec, false);
+ if (file_idx != UINT32_MAX) {
+ LineTable *line_table = cu->GetLineTable();
+ if (line_table) {
+ if (m_line_number == 0) {
+ // Match all lines in a file...
+ const bool append = true;
+ while (file_idx != UINT32_MAX) {
+ line_table->FindLineEntriesForFileIndex(file_idx, append,
+ m_sc_list);
+ // Get the next file index in case we have multiple file entries
+ // for the same file
+ file_idx = cu->GetSupportFiles().FindFileIndex(file_idx + 1,
+ m_file_spec, false);
+ }
+ } else {
+ // Match a specific line in a file...
+ }
+ }
+ }
+ }
+ return Searcher::eCallbackReturnContinue;
+}
+
+lldb::SearchDepth FileLineResolver::GetDepth() {
+ return lldb::eSearchDepthCompUnit;
+}
+
+void FileLineResolver::GetDescription(Stream *s) {
+ s->Printf("File and line resolver for file: \"%s\" line: %u",
+ m_file_spec.GetPath().c_str(), m_line_number);
+}
+
+void FileLineResolver::Clear() {
+ m_file_spec.Clear();
+ m_line_number = UINT32_MAX;
+ m_sc_list.Clear();
+ m_inlines = true;
+}
+
+void FileLineResolver::Reset(const FileSpec &file_spec, uint32_t line,
+ bool check_inlines) {
+ m_file_spec = file_spec;
+ m_line_number = line;
+ m_sc_list.Clear();
+ m_inlines = check_inlines;
+}