SourceManager.h revision a01b0fa183a5bd0110722bf17401882b1672635f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- SourceManager.h -----------------------------------------*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef liblldb_SourceManager_h_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define liblldb_SourceManager_h_ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C Includes 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++ Includes 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Other libraries and framework includes 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Project includes 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/lldb-private.h" 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "lldb/Host/FileSpec.h" 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace lldb_private { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SourceManager 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SWIG 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class File 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) File (const FileSpec &file_spec, Target *target); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~File(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisplaySourceLines (uint32_t line, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t context_before, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t context_after, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stream *s); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindLinesMatchingRegex (RegularExpression& regex, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t start_line, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t end_line, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint32_t> &match_lines); 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetLine (uint32_t line_no, std::string &buffer); 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32_t 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLineOffset (uint32_t line); 54 55 bool 56 LineIsValid (uint32_t line); 57 58 bool 59 FileSpecMatches (const FileSpec &file_spec); 60 61 const FileSpec & 62 GetFileSpec () 63 { 64 return m_file_spec; 65 } 66 67 uint32_t 68 GetSourceMapModificationID() const 69 { 70 return m_source_map_mod_id; 71 } 72 73 protected: 74 75 bool 76 CalculateLineOffsets (uint32_t line = UINT32_MAX); 77 78 FileSpec m_file_spec_orig; // The original file spec that was used (can be different from m_file_spec) 79 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) 80 TimeValue m_mod_time; // Keep the modification time that this file data is valid for 81 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 82 lldb::DataBufferSP m_data_sp; 83 typedef std::vector<uint32_t> LineOffsets; 84 LineOffsets m_offsets; 85 }; 86 87#endif // SWIG 88 89 typedef STD_SHARED_PTR(File) FileSP; 90 91#ifndef SWIG 92 93 // The SourceFileCache class separates the source manager from the cache of source files, so the 94 // cache can be stored in the Debugger, but the source managers can be per target. 95 class SourceFileCache 96 { 97 public: 98 SourceFileCache () {} 99 ~SourceFileCache() {} 100 101 void AddSourceFile (const FileSP &file_sp); 102 FileSP FindSourceFile (const FileSpec &file_spec) const; 103 104 protected: 105 typedef std::map <FileSpec, FileSP> FileCache; 106 FileCache m_file_cache; 107 }; 108#endif 109 110 111 //------------------------------------------------------------------ 112 // Constructors and Destructors 113 //------------------------------------------------------------------ 114 // A source manager can be made with a non-null target, in which case it can use the path remappings to find 115 // source files that are not in their build locations. With no target it won't be able to do this. 116 SourceManager (Debugger &debugger); 117 SourceManager (Target &target); 118 119 ~SourceManager(); 120 121 122 FileSP 123 GetLastFile () 124 { 125 return m_last_file_sp; 126 } 127 128 size_t 129 DisplaySourceLinesWithLineNumbers (const FileSpec &file, 130 uint32_t line, 131 uint32_t context_before, 132 uint32_t context_after, 133 const char* current_line_cstr, 134 Stream *s, 135 const SymbolContextList *bp_locs = NULL); 136 137 // This variant uses the last file we visited. 138 size_t 139 DisplaySourceLinesWithLineNumbersUsingLastFile (uint32_t start_line, 140 uint32_t count, 141 uint32_t curr_line, 142 const char* current_line_cstr, 143 Stream *s, 144 const SymbolContextList *bp_locs = NULL); 145 146 size_t 147 DisplayMoreWithLineNumbers (Stream *s, 148 uint32_t count, 149 bool reverse, 150 const SymbolContextList *bp_locs = NULL); 151 152 bool 153 SetDefaultFileAndLine (const FileSpec &file_spec, uint32_t line); 154 155 bool 156 GetDefaultFileAndLine (FileSpec &file_spec, uint32_t &line); 157 158 bool 159 DefaultFileAndLineSet () 160 { 161 return (m_last_file_sp.get() != NULL); 162 } 163 164 void 165 FindLinesMatchingRegex (FileSpec &file_spec, 166 RegularExpression& regex, 167 uint32_t start_line, 168 uint32_t end_line, 169 std::vector<uint32_t> &match_lines); 170 171protected: 172 173 FileSP 174 GetFile (const FileSpec &file_spec); 175 176 //------------------------------------------------------------------ 177 // Classes that inherit from SourceManager can see and modify these 178 //------------------------------------------------------------------ 179 FileSP m_last_file_sp; 180 uint32_t m_last_line; 181 uint32_t m_last_count; 182 bool m_default_set; 183 Target *m_target; 184 Debugger *m_debugger; 185 186private: 187 //------------------------------------------------------------------ 188 // For SourceManager only 189 //------------------------------------------------------------------ 190 DISALLOW_COPY_AND_ASSIGN (SourceManager); 191}; 192 193bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs); 194} // namespace lldb_private 195 196#endif // liblldb_SourceManager_h_ 197