Home | History | Annotate | Download | only in Core
      1 //===-- SourceManager.h -----------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_SourceManager_h_
     11 #define liblldb_SourceManager_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 #include <map>
     16 #include <vector>
     17 
     18 // Other libraries and framework includes
     19 // Project includes
     20 #include "lldb/lldb-private.h"
     21 #include "lldb/Host/FileSpec.h"
     22 
     23 namespace lldb_private {
     24 
     25 class SourceManager
     26 {
     27 public:
     28 #ifndef SWIG
     29 
     30     class File
     31     {
     32     friend bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs);
     33     public:
     34 
     35         File (const FileSpec &file_spec, Target *target);
     36         ~File();
     37 
     38         size_t
     39         DisplaySourceLines (uint32_t line,
     40                             uint32_t context_before,
     41                             uint32_t context_after,
     42                             Stream *s);
     43         void
     44         FindLinesMatchingRegex (RegularExpression& regex,
     45                                 uint32_t start_line,
     46                                 uint32_t end_line,
     47                                 std::vector<uint32_t> &match_lines);
     48 
     49         bool
     50         GetLine (uint32_t line_no, std::string &buffer);
     51 
     52         uint32_t
     53         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 (const lldb::DebuggerSP &debugger_sp);
    117     SourceManager (const lldb::TargetSP &target_sp);
    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 
    171 protected:
    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     lldb::TargetWP m_target_wp;
    184     lldb::DebuggerWP m_debugger_wp;
    185 
    186 private:
    187     //------------------------------------------------------------------
    188     // For SourceManager only
    189     //------------------------------------------------------------------
    190     DISALLOW_COPY_AND_ASSIGN (SourceManager);
    191 };
    192 
    193 bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs);
    194 } // namespace lldb_private
    195 
    196 #endif  // liblldb_SourceManager_h_
    197