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