SourceManager.h revision 598df88bd6fc33c6fb330bc859bdc277795501f3
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SourceManager.h -----------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_SourceManager_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_SourceManager_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135f81547fd786584b10999c087528b323b5945896Eli Friedman// C Includes 1423b8abbe214c252028f6e09f79169529c846409dGreg Clayton// C++ Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map> 167884ab842f7f0be6c583eac2904f5763706816bcEli Friedman#include <vector> 177884ab842f7f0be6c583eac2904f5763706816bcEli Friedman 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/FileSpec.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SourceManager 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef SWIG 29538eb82a89a68dbc57251915080bd5152b333978Greg Clayton 30538eb82a89a68dbc57251915080bd5152b333978Greg Clayton class File 31538eb82a89a68dbc57251915080bd5152b333978Greg Clayton { 32538eb82a89a68dbc57251915080bd5152b333978Greg Clayton friend bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs); 33538eb82a89a68dbc57251915080bd5152b333978Greg Clayton public: 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner File (const FileSpec &file_spec, Target *target); 365c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton ~File(); 375c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t 395c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton DisplaySourceLines (uint32_t line, 405c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton uint32_t context_before, 4123b8abbe214c252028f6e09f79169529c846409dGreg Clayton uint32_t context_after, 427fb143064009e34dbb7a602924e9807375f72a46Greg Clayton Stream *s); 437fb143064009e34dbb7a602924e9807375f72a46Greg Clayton void 447fb143064009e34dbb7a602924e9807375f72a46Greg Clayton FindLinesMatchingRegex (RegularExpression& regex, 4523b8abbe214c252028f6e09f79169529c846409dGreg Clayton uint32_t start_line, 46d9b4425303fd48210ab104ca6573c869083a8480Greg Clayton uint32_t end_line, 4723b8abbe214c252028f6e09f79169529c846409dGreg Clayton std::vector<uint32_t> &match_lines); 4823b8abbe214c252028f6e09f79169529c846409dGreg Clayton 49d9b4425303fd48210ab104ca6573c869083a8480Greg Clayton bool 5023b8abbe214c252028f6e09f79169529c846409dGreg Clayton GetLine (uint32_t line_no, std::string &buffer); 5123b8abbe214c252028f6e09f79169529c846409dGreg Clayton 5223b8abbe214c252028f6e09f79169529c846409dGreg Clayton uint32_t 5323b8abbe214c252028f6e09f79169529c846409dGreg Clayton GetLineOffset (uint32_t line); 5423b8abbe214c252028f6e09f79169529c846409dGreg Clayton 5523b8abbe214c252028f6e09f79169529c846409dGreg Clayton bool 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineIsValid (uint32_t line); 575c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 585c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton bool 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileSpecMatches (const FileSpec &file_spec); 605c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 615c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton const FileSpec & 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetFileSpec () 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_file_spec; 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 665c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 675c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton protected: 6898f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice 69af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice bool 70888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton CalculateLineOffsets (uint32_t line = UINT32_MAX); 71af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice 72af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice FileSpec m_file_spec_orig; // The original file spec that was used (can be different from m_file_spec) 73b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 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) 746b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice TimeValue m_mod_time; // Keep the modification time that this file data is valid for 756b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice lldb::DataBufferSP m_data_sp; 766b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice typedef std::vector<uint32_t> LineOffsets; 77af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice LineOffsets m_offsets; 785c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton }; 795c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // SWIG 815c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef STD_SHARED_PTR(File) FileSP; 835c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 845c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton#ifndef SWIG 855c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 865c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton // The SourceFileCache class separates the source manager from the cache of source files, so the 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // cache can be stored in the Debugger, but the source managers can be per target. 885c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton class SourceFileCache 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceFileCache () {}; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~SourceFileCache() {}; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void AddSourceFile (const FileSP &file_sp); 95 FileSP FindSourceFile (const FileSpec &file_spec) const; 96 97 protected: 98 typedef std::map <FileSpec, FileSP> FileCache; 99 FileCache m_file_cache; 100 }; 101#endif 102 103 104 //------------------------------------------------------------------ 105 // Constructors and Destructors 106 //------------------------------------------------------------------ 107 // A source manager can be made with a non-null target, in which case it can use the path remappings to find 108 // source files that are not in their build locations. With no target it won't be able to do this. 109 SourceManager (Debugger &debugger); 110 SourceManager (Target &target); 111 112 ~SourceManager(); 113 114 115 FileSP 116 GetLastFile () 117 { 118 return m_last_file_sp; 119 } 120 121 size_t 122 DisplaySourceLines (const FileSpec &file, 123 uint32_t line, 124 uint32_t context_before, 125 uint32_t context_after, 126 Stream *s); 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 line, 140 uint32_t context_before, 141 uint32_t context_after, 142 const char* current_line_cstr, 143 Stream *s, 144 const SymbolContextList *bp_locs = NULL); 145 146 size_t 147 DisplayMoreWithLineNumbers (Stream *s, 148 const SymbolContextList *bp_locs = NULL); 149 150 bool 151 SetDefaultFileAndLine (const FileSpec &file_spec, uint32_t line); 152 153 bool 154 GetDefaultFileAndLine (FileSpec &file_spec, uint32_t &line); 155 156 bool 157 DefaultFileAndLineSet () 158 { 159 return (m_last_file_sp.get() != NULL); 160 } 161 162 void 163 FindLinesMatchingRegex (FileSpec &file_spec, 164 RegularExpression& regex, 165 uint32_t start_line, 166 uint32_t end_line, 167 std::vector<uint32_t> &match_lines); 168 169protected: 170 171 FileSP 172 GetFile (const FileSpec &file_spec); 173 174 //------------------------------------------------------------------ 175 // Classes that inherit from SourceManager can see and modify these 176 //------------------------------------------------------------------ 177 FileSP m_last_file_sp; 178 uint32_t m_last_file_line; 179 uint32_t m_last_file_context_before; 180 uint32_t m_last_file_context_after; 181 bool m_default_set; 182 Target *m_target; 183 Debugger *m_debugger; 184 185private: 186 //------------------------------------------------------------------ 187 // For SourceManager only 188 //------------------------------------------------------------------ 189 DISALLOW_COPY_AND_ASSIGN (SourceManager); 190}; 191 192bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs); 193} // namespace lldb_private 194 195#endif // liblldb_SourceManager_h_ 196