diff options
Diffstat (limited to 'gdb/source-cache.h')
-rw-r--r-- | gdb/source-cache.h | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/gdb/source-cache.h b/gdb/source-cache.h index 0c8b14e..b6e8690 100644 --- a/gdb/source-cache.h +++ b/gdb/source-cache.h @@ -19,12 +19,20 @@ #ifndef SOURCE_CACHE_H #define SOURCE_CACHE_H -/* This caches highlighted source text, keyed by the source file's - full name. A size-limited LRU cache is used. +#include <unordered_map> +#include <unordered_set> + +/* This caches two things related to source files. + + First, it caches highlighted source text, keyed by the source + file's full name. A size-limited LRU cache is used. Highlighting depends on the GNU Source Highlight library. When not - available, this cache will fall back on reading plain text from the - appropriate file. */ + available or when highlighting fails for some reason, this cache + will instead store the un-highlighted source text. + + Second, this will cache the file offsets corresponding to the start + of each line of a source file. This cache is not size-limited. */ class source_cache { public: @@ -33,11 +41,23 @@ public: { } + /* This returns the vector of file offsets for the symtab S, + computing the vector first if needed. + + On failure, returns false. + + On success, returns true and sets *OFFSETS. This pointer is not + guaranteed to remain valid across other calls to get_source_lines + or get_line_charpos. */ + bool get_line_charpos (struct symtab *s, + const std::vector<off_t> **offsets); + /* Get the source text for the source file in symtab S. FIRST_LINE and LAST_LINE are the first and last lines to return; line - numbers are 1-based. If the file cannot be read, false is - returned. Otherwise, LINES_OUT is set to the desired text. The - returned text may include ANSI terminal escapes. */ + numbers are 1-based. If the file cannot be read, or if the line + numbers are out of range, false is returned. Otherwise, + LINES_OUT is set to the desired text. The returned text may + include ANSI terminal escapes. */ bool get_source_lines (struct symtab *s, int first_line, int last_line, std::string *lines_out); @@ -45,6 +65,7 @@ public: void clear () { m_source_map.clear (); + m_offset_cache.clear (); } private: @@ -59,12 +80,21 @@ private: }; /* A helper function for get_source_lines reads a source file. - Returns false on error. If no error, the contents of the file - are put into *LINES_OUT, and returns true. */ - bool get_plain_source_lines (struct symtab *s, std::string *lines_out); + Returns the contents of the file; or throws an exception on + error. This also updates m_offset_cache. */ + std::string get_plain_source_lines (struct symtab *s, + const std::string &fullname); - /* The contents of the cache. */ + /* A helper function that the data for the given symtab is entered + into both caches. Returns false on error. */ + bool ensure (struct symtab *s); + + /* The contents of the source text cache. */ std::vector<source_text> m_source_map; + + /* The file offset cache. The key is the full name of the source + file. */ + std::unordered_map<std::string, std::vector<off_t>> m_offset_cache; }; /* The global source cache. */ |