| //===-- SourceManager.h -----------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef liblldb_SourceManager_h_ |
| #define liblldb_SourceManager_h_ |
| |
| #include "lldb/Utility/FileSpec.h" |
| #include "lldb/lldb-defines.h" // for DISALLOW_COPY_AND_ASSIGN |
| #include "lldb/lldb-forward.h" // for DebuggerSP, DebuggerWP, DataBufferSP |
| |
| #include "llvm/Support/Chrono.h" |
| |
| #include <cstdint> // for uint32_t, UINT32_MAX |
| #include <map> |
| #include <memory> |
| #include <stddef.h> // for size_t |
| #include <string> // for string |
| #include <vector> |
| |
| namespace lldb_private { |
| class RegularExpression; |
| } |
| namespace lldb_private { |
| class Stream; |
| } |
| namespace lldb_private { |
| class SymbolContextList; |
| } |
| namespace lldb_private { |
| class Target; |
| } |
| |
| namespace lldb_private { |
| |
| class SourceManager { |
| public: |
| #ifndef SWIG |
| class File { |
| friend bool operator==(const SourceManager::File &lhs, |
| const SourceManager::File &rhs); |
| |
| public: |
| File(const FileSpec &file_spec, Target *target); |
| File(const FileSpec &file_spec, lldb::DebuggerSP debugger_sp); |
| ~File() = default; |
| |
| void UpdateIfNeeded(); |
| |
| size_t DisplaySourceLines(uint32_t line, uint32_t column, |
| uint32_t context_before, uint32_t context_after, |
| Stream *s); |
| void FindLinesMatchingRegex(RegularExpression ®ex, uint32_t start_line, |
| uint32_t end_line, |
| std::vector<uint32_t> &match_lines); |
| |
| bool GetLine(uint32_t line_no, std::string &buffer); |
| |
| uint32_t GetLineOffset(uint32_t line); |
| |
| bool LineIsValid(uint32_t line); |
| |
| bool FileSpecMatches(const FileSpec &file_spec); |
| |
| const FileSpec &GetFileSpec() { return m_file_spec; } |
| |
| uint32_t GetSourceMapModificationID() const { return m_source_map_mod_id; } |
| |
| const char *PeekLineData(uint32_t line); |
| |
| uint32_t GetLineLength(uint32_t line, bool include_newline_chars); |
| |
| uint32_t GetNumLines(); |
| |
| protected: |
| bool CalculateLineOffsets(uint32_t line = UINT32_MAX); |
| |
| FileSpec m_file_spec_orig; // The original file spec that was used (can be |
| // different from m_file_spec) |
| FileSpec m_file_spec; // The actually file spec being used (if the target |
| // has source mappings, this might be different from |
| // m_file_spec_orig) |
| |
| // Keep the modification time that this file data is valid for |
| llvm::sys::TimePoint<> m_mod_time; |
| |
| // If the target uses path remappings, be sure to clear our notion of a |
| // source file if the path modification ID changes |
| uint32_t m_source_map_mod_id = 0; |
| lldb::DataBufferSP m_data_sp; |
| typedef std::vector<uint32_t> LineOffsets; |
| LineOffsets m_offsets; |
| lldb::DebuggerWP m_debugger_wp; |
| |
| private: |
| void CommonInitializer(const FileSpec &file_spec, Target *target); |
| }; |
| #endif // SWIG |
| |
| typedef std::shared_ptr<File> FileSP; |
| |
| #ifndef SWIG |
| // The SourceFileCache class separates the source manager from the cache of |
| // source files, so the cache can be stored in the Debugger, but the source |
| // managers can be per target. |
| class SourceFileCache { |
| public: |
| SourceFileCache() = default; |
| ~SourceFileCache() = default; |
| |
| void AddSourceFile(const FileSP &file_sp); |
| FileSP FindSourceFile(const FileSpec &file_spec) const; |
| |
| protected: |
| typedef std::map<FileSpec, FileSP> FileCache; |
| FileCache m_file_cache; |
| }; |
| #endif // SWIG |
| |
| //------------------------------------------------------------------ |
| // Constructors and Destructors |
| //------------------------------------------------------------------ |
| // A source manager can be made with a non-null target, in which case it can |
| // use the path remappings to find |
| // source files that are not in their build locations. With no target it |
| // won't be able to do this. |
| SourceManager(const lldb::DebuggerSP &debugger_sp); |
| SourceManager(const lldb::TargetSP &target_sp); |
| |
| ~SourceManager(); |
| |
| FileSP GetLastFile() { return m_last_file_sp; } |
| |
| size_t |
| DisplaySourceLinesWithLineNumbers(const FileSpec &file, 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); |
| |
| // This variant uses the last file we visited. |
| 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); |
| |
| size_t DisplayMoreWithLineNumbers(Stream *s, uint32_t count, bool reverse, |
| const SymbolContextList *bp_locs = nullptr); |
| |
| bool SetDefaultFileAndLine(const FileSpec &file_spec, uint32_t line); |
| |
| bool GetDefaultFileAndLine(FileSpec &file_spec, uint32_t &line); |
| |
| bool DefaultFileAndLineSet() { return (m_last_file_sp.get() != nullptr); } |
| |
| void FindLinesMatchingRegex(FileSpec &file_spec, RegularExpression ®ex, |
| uint32_t start_line, uint32_t end_line, |
| std::vector<uint32_t> &match_lines); |
| |
| FileSP GetFile(const FileSpec &file_spec); |
| |
| protected: |
| FileSP m_last_file_sp; |
| uint32_t m_last_line; |
| uint32_t m_last_count; |
| bool m_default_set; |
| lldb::TargetWP m_target_wp; |
| lldb::DebuggerWP m_debugger_wp; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(SourceManager); |
| }; |
| |
| bool operator==(const SourceManager::File &lhs, const SourceManager::File &rhs); |
| |
| } // namespace lldb_private |
| |
| #endif // liblldb_SourceManager_h_ |