diff options
author | Cameron Desrochers <cameron@moodycamel.com> | 2018-01-15 19:14:16 +0000 |
---|---|---|
committer | Cameron Desrochers <cameron@moodycamel.com> | 2018-01-15 19:14:16 +0000 |
commit | 505903c4d00516897e296b023bc1b9b3b3db31fc (patch) | |
tree | d8bd5fe635d93b5b7963aac107dd50f22943269a /include/clang/Lex | |
parent | c4a6d8a835497ca48da7b5945ee12d53aae53ce3 (diff) |
[PCH] Serialize skipped preprocessor ranges
The skipped preprocessor ranges are now serialized in the AST PCH file. This fixes, for example, libclang's clang_getSkippedRanges() returning zero ranges after reparsing a translation unit.
Differential Revision: https://reviews.llvm.org/D20124
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@322503 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Lex')
-rw-r--r-- | include/clang/Lex/PreprocessingRecord.h | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/include/clang/Lex/PreprocessingRecord.h b/include/clang/Lex/PreprocessingRecord.h index 5f7a6efcef..77da1eb26f 100644 --- a/include/clang/Lex/PreprocessingRecord.h +++ b/include/clang/Lex/PreprocessingRecord.h @@ -297,6 +297,9 @@ class Token; FileID FID) { return None; } + + /// \brief Read a preallocated skipped range from the external source. + virtual SourceRange ReadSkippedRange(unsigned Index) = 0; }; /// \brief A record of the steps taken while preprocessing a source file, @@ -322,6 +325,8 @@ class Token; /// \brief The set of ranges that were skipped by the preprocessor, std::vector<SourceRange> SkippedRanges; + bool SkippedRangesAllLoaded = true; + /// \brief Global (loaded or local) ID for a preprocessed entity. /// Negative values are used to indicate preprocessed entities /// loaded from the external source while non-negative values are used to @@ -377,6 +382,16 @@ class Token; /// corresponds to the first newly-allocated entity. unsigned allocateLoadedEntities(unsigned NumEntities); + /// \brief Allocate space for a new set of loaded preprocessed skipped + /// ranges. + /// + /// \returns The index into the set of loaded preprocessed ranges, which + /// corresponds to the first newly-allocated range. + unsigned allocateSkippedRanges(unsigned NumRanges); + + /// \brief Ensures that all external skipped ranges have been loaded. + void ensureSkippedRangesLoaded(); + /// \brief Register a new macro definition. void RegisterMacroDefinition(MacroInfo *Macro, MacroDefinitionRecord *Def); @@ -499,7 +514,8 @@ class Token; MacroDefinitionRecord *findMacroDefinition(const MacroInfo *MI); /// \brief Retrieve all ranges that got skipped while preprocessing. - const std::vector<SourceRange> &getSkippedRanges() const { + const std::vector<SourceRange> &getSkippedRanges() { + ensureSkippedRangesLoaded(); return SkippedRanges; } |