LLDB mainline
SourceManager.h
Go to the documentation of this file.
1//===-- SourceManager.h -----------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_CORE_SOURCEMANAGER_H
10#define LLDB_CORE_SOURCEMANAGER_H
11
14#include "lldb/lldb-defines.h"
15#include "lldb/lldb-forward.h"
16
17#include "llvm/Support/Chrono.h"
18#include "llvm/Support/RWMutex.h"
19
20#include <cstddef>
21#include <cstdint>
22#include <map>
23#include <memory>
24#include <optional>
25#include <string>
26#include <vector>
27
28namespace lldb_private {
30class Stream;
31class SymbolContextList;
32class Target;
33
35public:
36 class File {
37 friend bool operator==(const SourceManager::File &lhs,
38 const SourceManager::File &rhs);
39
40 public:
41 File(lldb::SupportFileSP support_file_sp, lldb::TargetSP target_sp);
42 File(lldb::SupportFileSP support_file_sp, lldb::DebuggerSP debugger_sp);
43
44 bool ModificationTimeIsStale() const;
45 bool PathRemappingIsStale() const;
46
47 size_t DisplaySourceLines(uint32_t line, std::optional<size_t> column,
48 uint32_t context_before, uint32_t context_after,
49 Stream *s);
50 void FindLinesMatchingRegex(RegularExpression &regex, uint32_t start_line,
51 uint32_t end_line,
52 std::vector<uint32_t> &match_lines);
53
54 bool GetLine(uint32_t line_no, std::string &buffer);
55
56 uint32_t GetLineOffset(uint32_t line);
57
58 bool LineIsValid(uint32_t line);
59
61 assert(m_support_file_sp && "SupportFileSP must always be valid");
62 return m_support_file_sp;
63 }
64
66
67 const char *PeekLineData(uint32_t line);
68
69 uint32_t GetLineLength(uint32_t line, bool include_newline_chars);
70
71 uint32_t GetNumLines();
72
73 llvm::sys::TimePoint<> GetTimestamp() const { return m_mod_time; }
74
75 const Checksum &GetChecksum() const { return m_checksum; }
76
77 std::once_flag &GetChecksumWarningOnceFlag() {
79 }
80
81 protected:
82 /// Set file and update modification time.
83 void SetSupportFile(lldb::SupportFileSP support_file_sp);
84
85 bool CalculateLineOffsets(uint32_t line = UINT32_MAX);
86
87 /// The support file. If the target has source mappings, this might be
88 /// different from the original support file passed to the constructor.
90
91 /// Keep track of the on-disk checksum.
93
94 /// Once flag for emitting a checksum mismatch warning.
96
97 // Keep the modification time that this file data is valid for
98 llvm::sys::TimePoint<> m_mod_time;
99
100 // If the target uses path remappings, be sure to clear our notion of a
101 // source file if the path modification ID changes
104 typedef std::vector<uint32_t> LineOffsets;
108
109 private:
110 void CommonInitializer(lldb::SupportFileSP support_file_sp,
111 lldb::TargetSP target_sp);
112 };
113
114 typedef std::shared_ptr<File> FileSP;
115
116 /// The SourceFileCache class separates the source manager from the cache of
117 /// source files. There is one source manager per Target but both the Debugger
118 /// and the Process have their own source caches.
119 ///
120 /// The SourceFileCache just handles adding, storing, removing and looking up
121 /// source files. The caching policies are implemented in
122 /// SourceManager::GetFile.
124 public:
125 SourceFileCache() = default;
126 ~SourceFileCache() = default;
127
128 void AddSourceFile(const FileSpec &file_spec, FileSP file_sp);
129 void RemoveSourceFile(const FileSP &file_sp);
130
131 FileSP FindSourceFile(const FileSpec &file_spec) const;
132
133 // Removes all elements from the cache.
134 void Clear() { m_file_cache.clear(); }
135
136 void Dump(Stream &stream) const;
137
138 private:
139 void AddSourceFileImpl(const FileSpec &file_spec, FileSP file_sp);
140
141 typedef std::map<FileSpec, FileSP> FileCache;
143
144 mutable llvm::sys::RWMutex m_mutex;
145 };
146
147 /// A source manager can be made with a valid Target, in which case it can use
148 /// the path remappings to find source files that are not in their build
149 /// locations. Without a target it won't be able to do this.
150 /// @{
151 SourceManager(const lldb::DebuggerSP &debugger_sp);
152 SourceManager(const lldb::TargetSP &target_sp);
153 /// @}
154
156
158
160 lldb::SupportFileSP support_file_sp, uint32_t line, uint32_t column,
161 uint32_t context_before, uint32_t context_after,
162 const char *current_line_cstr, Stream *s,
163 const SymbolContextList *bp_locs = nullptr);
164
165 // This variant uses the last file we visited.
167 uint32_t start_line, uint32_t count, uint32_t curr_line, uint32_t column,
168 const char *current_line_cstr, Stream *s,
169 const SymbolContextList *bp_locs = nullptr);
170
171 size_t DisplayMoreWithLineNumbers(Stream *s, uint32_t count, bool reverse,
172 const SymbolContextList *bp_locs = nullptr);
173
174 bool SetDefaultFileAndLine(lldb::SupportFileSP support_file_sp,
175 uint32_t line);
176
179 uint32_t line;
182 };
183
184 std::optional<SupportFileAndLine> GetDefaultFileAndLine();
185
187 return (GetFile(m_last_support_file_sp).get() != nullptr);
188 }
189
190 void FindLinesMatchingRegex(lldb::SupportFileSP support_file_sp,
191 RegularExpression &regex, uint32_t start_line,
192 uint32_t end_line,
193 std::vector<uint32_t> &match_lines);
194
195 FileSP GetFile(lldb::SupportFileSP support_file_sp);
196
197protected:
199 uint32_t m_last_line;
200 uint32_t m_last_count;
204
205private:
206 SourceManager(const SourceManager &) = delete;
207 const SourceManager &operator=(const SourceManager &) = delete;
208};
209
210bool operator==(const SourceManager::File &lhs, const SourceManager::File &rhs);
211
212} // namespace lldb_private
213
214#endif // LLDB_CORE_SOURCEMANAGER_H
A file utility class.
Definition: FileSpec.h:56
std::once_flag & GetChecksumWarningOnceFlag()
Definition: SourceManager.h:77
llvm::sys::TimePoint m_mod_time
Definition: SourceManager.h:98
uint32_t GetSourceMapModificationID() const
Definition: SourceManager.h:65
void FindLinesMatchingRegex(RegularExpression &regex, uint32_t start_line, uint32_t end_line, std::vector< uint32_t > &match_lines)
std::vector< uint32_t > LineOffsets
const char * PeekLineData(uint32_t line)
Checksum m_checksum
Keep track of the on-disk checksum.
Definition: SourceManager.h:92
uint32_t GetLineLength(uint32_t line, bool include_newline_chars)
bool CalculateLineOffsets(uint32_t line=UINT32_MAX)
lldb::SupportFileSP GetSupportFile() const
Definition: SourceManager.h:60
void CommonInitializer(lldb::SupportFileSP support_file_sp, lldb::TargetSP target_sp)
friend bool operator==(const SourceManager::File &lhs, const SourceManager::File &rhs)
bool GetLine(uint32_t line_no, std::string &buffer)
uint32_t GetLineOffset(uint32_t line)
void SetSupportFile(lldb::SupportFileSP support_file_sp)
Set file and update modification time.
const Checksum & GetChecksum() const
Definition: SourceManager.h:75
size_t DisplaySourceLines(uint32_t line, std::optional< size_t > column, uint32_t context_before, uint32_t context_after, Stream *s)
lldb::SupportFileSP m_support_file_sp
The support file.
Definition: SourceManager.h:89
llvm::sys::TimePoint GetTimestamp() const
Definition: SourceManager.h:73
std::once_flag m_checksum_warning_once_flag
Once flag for emitting a checksum mismatch warning.
Definition: SourceManager.h:95
The SourceFileCache class separates the source manager from the cache of source files.
void AddSourceFileImpl(const FileSpec &file_spec, FileSP file_sp)
void RemoveSourceFile(const FileSP &file_sp)
FileSP FindSourceFile(const FileSpec &file_spec) const
void AddSourceFile(const FileSpec &file_spec, FileSP file_sp)
std::map< FileSpec, FileSP > FileCache
void FindLinesMatchingRegex(lldb::SupportFileSP support_file_sp, RegularExpression &regex, uint32_t start_line, uint32_t end_line, std::vector< uint32_t > &match_lines)
SourceManager(const SourceManager &)=delete
bool SetDefaultFileAndLine(lldb::SupportFileSP support_file_sp, uint32_t line)
size_t DisplaySourceLinesWithLineNumbersUsingLastFile(uint32_t start_line, uint32_t count, uint32_t curr_line, uint32_t column, const char *current_line_cstr, Stream *s, const SymbolContextList *bp_locs=nullptr)
std::shared_ptr< File > FileSP
const SourceManager & operator=(const SourceManager &)=delete
std::optional< SupportFileAndLine > GetDefaultFileAndLine()
lldb::SupportFileSP m_last_support_file_sp
lldb::DebuggerWP m_debugger_wp
FileSP GetFile(lldb::SupportFileSP support_file_sp)
size_t DisplayMoreWithLineNumbers(Stream *s, uint32_t count, bool reverse, const SymbolContextList *bp_locs=nullptr)
size_t DisplaySourceLinesWithLineNumbers(lldb::SupportFileSP support_file_sp, uint32_t line, uint32_t column, uint32_t context_before, uint32_t context_after, const char *current_line_cstr, Stream *s, const SymbolContextList *bp_locs=nullptr)
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
Defines a list of symbol context objects.
#define UINT32_MAX
Definition: lldb-defines.h:19
A class that represents a running process on the host machine.
bool operator==(const Address &lhs, const Address &rhs)
Definition: Address.cpp:1023
std::shared_ptr< lldb_private::SupportFile > SupportFileSP
Definition: lldb-forward.h:479
std::weak_ptr< lldb_private::Debugger > DebuggerWP
Definition: lldb-forward.h:340
std::shared_ptr< lldb_private::Debugger > DebuggerSP
Definition: lldb-forward.h:339
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
Definition: lldb-forward.h:336
std::weak_ptr< lldb_private::Target > TargetWP
Definition: lldb-forward.h:449
std::shared_ptr< lldb_private::Target > TargetSP
Definition: lldb-forward.h:448
SupportFileAndLine(lldb::SupportFileSP support_file_sp, uint32_t line)