1254721Semaste//===-- SourceManager.h -----------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#ifndef liblldb_SourceManager_h_ 11254721Semaste#define liblldb_SourceManager_h_ 12254721Semaste 13254721Semaste// C Includes 14254721Semaste// C++ Includes 15254721Semaste#include <map> 16254721Semaste#include <vector> 17254721Semaste 18254721Semaste// Other libraries and framework includes 19254721Semaste// Project includes 20254721Semaste#include "lldb/lldb-private.h" 21254721Semaste#include "lldb/Host/FileSpec.h" 22254721Semaste 23254721Semastenamespace lldb_private { 24254721Semaste 25254721Semasteclass SourceManager 26254721Semaste{ 27254721Semastepublic: 28254721Semaste#ifndef SWIG 29254721Semaste 30254721Semaste class File 31254721Semaste { 32254721Semaste friend bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs); 33254721Semaste public: 34254721Semaste 35254721Semaste File (const FileSpec &file_spec, Target *target); 36254721Semaste ~File(); 37254721Semaste 38254721Semaste size_t 39254721Semaste DisplaySourceLines (uint32_t line, 40254721Semaste uint32_t context_before, 41254721Semaste uint32_t context_after, 42254721Semaste Stream *s); 43254721Semaste void 44254721Semaste FindLinesMatchingRegex (RegularExpression& regex, 45254721Semaste uint32_t start_line, 46254721Semaste uint32_t end_line, 47254721Semaste std::vector<uint32_t> &match_lines); 48254721Semaste 49254721Semaste bool 50254721Semaste GetLine (uint32_t line_no, std::string &buffer); 51254721Semaste 52254721Semaste uint32_t 53254721Semaste GetLineOffset (uint32_t line); 54254721Semaste 55254721Semaste bool 56254721Semaste LineIsValid (uint32_t line); 57254721Semaste 58254721Semaste bool 59254721Semaste FileSpecMatches (const FileSpec &file_spec); 60254721Semaste 61254721Semaste const FileSpec & 62254721Semaste GetFileSpec () 63254721Semaste { 64254721Semaste return m_file_spec; 65254721Semaste } 66254721Semaste 67254721Semaste uint32_t 68254721Semaste GetSourceMapModificationID() const 69254721Semaste { 70254721Semaste return m_source_map_mod_id; 71254721Semaste } 72254721Semaste 73269024Semaste const char * 74269024Semaste PeekLineData (uint32_t line); 75269024Semaste 76269024Semaste uint32_t 77269024Semaste GetLineLength (uint32_t line, bool include_newline_chars); 78269024Semaste 79269024Semaste uint32_t 80269024Semaste GetNumLines (); 81269024Semaste 82254721Semaste protected: 83254721Semaste 84254721Semaste bool 85254721Semaste CalculateLineOffsets (uint32_t line = UINT32_MAX); 86254721Semaste 87254721Semaste FileSpec m_file_spec_orig; // The original file spec that was used (can be different from m_file_spec) 88254721Semaste FileSpec m_file_spec; // The actualy file spec being used (if the target has source mappings, this might be different from m_file_spec_orig) 89254721Semaste TimeValue m_mod_time; // Keep the modification time that this file data is valid for 90254721Semaste uint32_t m_source_map_mod_id; // If the target uses path remappings, be sure to clear our notion of a source file if the path modification ID changes 91254721Semaste lldb::DataBufferSP m_data_sp; 92254721Semaste typedef std::vector<uint32_t> LineOffsets; 93254721Semaste LineOffsets m_offsets; 94254721Semaste }; 95254721Semaste 96254721Semaste#endif // SWIG 97254721Semaste 98254721Semaste typedef std::shared_ptr<File> FileSP; 99254721Semaste 100254721Semaste#ifndef SWIG 101254721Semaste 102254721Semaste // The SourceFileCache class separates the source manager from the cache of source files, so the 103254721Semaste // cache can be stored in the Debugger, but the source managers can be per target. 104254721Semaste class SourceFileCache 105254721Semaste { 106254721Semaste public: 107254721Semaste SourceFileCache () {} 108254721Semaste ~SourceFileCache() {} 109254721Semaste 110254721Semaste void AddSourceFile (const FileSP &file_sp); 111254721Semaste FileSP FindSourceFile (const FileSpec &file_spec) const; 112254721Semaste 113254721Semaste protected: 114254721Semaste typedef std::map <FileSpec, FileSP> FileCache; 115254721Semaste FileCache m_file_cache; 116254721Semaste }; 117254721Semaste#endif 118254721Semaste 119254721Semaste 120254721Semaste //------------------------------------------------------------------ 121254721Semaste // Constructors and Destructors 122254721Semaste //------------------------------------------------------------------ 123254721Semaste // A source manager can be made with a non-null target, in which case it can use the path remappings to find 124254721Semaste // source files that are not in their build locations. With no target it won't be able to do this. 125254721Semaste SourceManager (const lldb::DebuggerSP &debugger_sp); 126254721Semaste SourceManager (const lldb::TargetSP &target_sp); 127254721Semaste 128254721Semaste ~SourceManager(); 129254721Semaste 130254721Semaste 131254721Semaste FileSP 132254721Semaste GetLastFile () 133254721Semaste { 134254721Semaste return m_last_file_sp; 135254721Semaste } 136254721Semaste 137254721Semaste size_t 138254721Semaste DisplaySourceLinesWithLineNumbers (const FileSpec &file, 139254721Semaste uint32_t line, 140254721Semaste uint32_t context_before, 141254721Semaste uint32_t context_after, 142254721Semaste const char* current_line_cstr, 143254721Semaste Stream *s, 144254721Semaste const SymbolContextList *bp_locs = NULL); 145254721Semaste 146254721Semaste // This variant uses the last file we visited. 147254721Semaste size_t 148254721Semaste DisplaySourceLinesWithLineNumbersUsingLastFile (uint32_t start_line, 149254721Semaste uint32_t count, 150254721Semaste uint32_t curr_line, 151254721Semaste const char* current_line_cstr, 152254721Semaste Stream *s, 153254721Semaste const SymbolContextList *bp_locs = NULL); 154254721Semaste 155254721Semaste size_t 156254721Semaste DisplayMoreWithLineNumbers (Stream *s, 157254721Semaste uint32_t count, 158254721Semaste bool reverse, 159254721Semaste const SymbolContextList *bp_locs = NULL); 160254721Semaste 161254721Semaste bool 162254721Semaste SetDefaultFileAndLine (const FileSpec &file_spec, uint32_t line); 163254721Semaste 164254721Semaste bool 165254721Semaste GetDefaultFileAndLine (FileSpec &file_spec, uint32_t &line); 166254721Semaste 167254721Semaste bool 168254721Semaste DefaultFileAndLineSet () 169254721Semaste { 170254721Semaste return (m_last_file_sp.get() != NULL); 171254721Semaste } 172254721Semaste 173254721Semaste void 174254721Semaste FindLinesMatchingRegex (FileSpec &file_spec, 175254721Semaste RegularExpression& regex, 176254721Semaste uint32_t start_line, 177254721Semaste uint32_t end_line, 178254721Semaste std::vector<uint32_t> &match_lines); 179269024Semaste 180269024Semaste FileSP 181269024Semaste GetFile (const FileSpec &file_spec); 182254721Semaste 183254721Semasteprotected: 184254721Semaste 185254721Semaste //------------------------------------------------------------------ 186254721Semaste // Classes that inherit from SourceManager can see and modify these 187254721Semaste //------------------------------------------------------------------ 188254721Semaste FileSP m_last_file_sp; 189254721Semaste uint32_t m_last_line; 190254721Semaste uint32_t m_last_count; 191254721Semaste bool m_default_set; 192254721Semaste lldb::TargetWP m_target_wp; 193254721Semaste lldb::DebuggerWP m_debugger_wp; 194254721Semaste 195254721Semasteprivate: 196254721Semaste //------------------------------------------------------------------ 197254721Semaste // For SourceManager only 198254721Semaste //------------------------------------------------------------------ 199254721Semaste DISALLOW_COPY_AND_ASSIGN (SourceManager); 200254721Semaste}; 201254721Semaste 202254721Semastebool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs); 203254721Semaste} // namespace lldb_private 204254721Semaste 205254721Semaste#endif // liblldb_SourceManager_h_ 206