summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/SourceManager.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2017-06-05 18:10:11 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2017-06-05 18:10:11 +0000
commitab75597ddac52f24e9cbd794cded195262ef670e (patch)
treee56b185f5dd213beefde2b261ef32997fd13024e /clang/lib/Basic/SourceManager.cpp
parentca5e153fb19286766f988ead99a26b9a2a9beea6 (diff)
downloadbcm5719-llvm-ab75597ddac52f24e9cbd794cded195262ef670e.tar.gz
bcm5719-llvm-ab75597ddac52f24e9cbd794cded195262ef670e.zip
Rather than rejecting attempts to run preprocessor-only actions on AST files,
replay the steps taken to create the AST file with the preprocessor-only action installed to produce preprocessed output. This can be used to produce the preprocessed text for an existing .pch or .pcm file. llvm-svn: 304726
Diffstat (limited to 'clang/lib/Basic/SourceManager.cpp')
-rw-r--r--clang/lib/Basic/SourceManager.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index c5cff74ac97..c0cd2a8d2a1 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -345,6 +345,41 @@ void SourceManager::clearIDTables() {
createExpansionLoc(SourceLocation(),SourceLocation(),SourceLocation(), 1);
}
+void SourceManager::initializeForReplay(const SourceManager &Old) {
+ assert(MainFileID.isInvalid() && "expected uninitialized SourceManager");
+
+ auto CloneContentCache = [&](const ContentCache *Cache) -> ContentCache * {
+ auto *Clone = new (ContentCacheAlloc.Allocate<ContentCache>()) ContentCache;
+ Clone->OrigEntry = Cache->OrigEntry;
+ Clone->ContentsEntry = Cache->ContentsEntry;
+ Clone->BufferOverridden = Cache->BufferOverridden;
+ Clone->IsSystemFile = Cache->IsSystemFile;
+ Clone->IsTransient = Cache->IsTransient;
+ Clone->replaceBuffer(Cache->getRawBuffer(), /*DoNotFree*/true);
+ return Clone;
+ };
+
+ // Set up our main file ID as a copy of the old source manager's main file.
+ const SLocEntry &OldMainFile = Old.getSLocEntry(Old.getMainFileID());
+ assert(OldMainFile.isFile() && "main file is macro expansion?");
+ setMainFileID(createFileID(
+ CloneContentCache(OldMainFile.getFile().getContentCache()),
+ SourceLocation(), OldMainFile.getFile().getFileCharacteristic(), 0, 0));
+
+ // Ensure all SLocEntries are loaded from the external source.
+ for (unsigned I = 0, N = Old.LoadedSLocEntryTable.size(); I != N; ++I)
+ if (!Old.SLocEntryLoaded[I])
+ Old.loadSLocEntry(I, nullptr);
+
+ // Inherit any content cache data from the old source manager.
+ for (auto &FileInfo : Old.FileInfos) {
+ SrcMgr::ContentCache *&Slot = FileInfos[FileInfo.first];
+ if (Slot)
+ continue;
+ Slot = CloneContentCache(FileInfo.second);
+ }
+}
+
/// getOrCreateContentCache - Create or return a cached ContentCache for the
/// specified file.
const ContentCache *
OpenPOWER on IntegriCloud