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