summaryrefslogtreecommitdiffstats
path: root/include/clang/Lex
diff options
context:
space:
mode:
authorCameron Desrochers <cameron@moodycamel.com>2018-01-15 19:14:16 +0000
committerCameron Desrochers <cameron@moodycamel.com>2018-01-15 19:14:16 +0000
commit505903c4d00516897e296b023bc1b9b3b3db31fc (patch)
treed8bd5fe635d93b5b7963aac107dd50f22943269a /include/clang/Lex
parentc4a6d8a835497ca48da7b5945ee12d53aae53ce3 (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.h18
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;
}