diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-12-20 19:53:05 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-12-20 19:53:05 +0000 |
commit | 0b57cec536236d46e3dba9bd041533462f33dbb7 (patch) | |
tree | 56229dbdbbf76d18580f72f789003db17246c8d9 /contrib/llvm-project/clang/lib/Serialization/GeneratePCH.cpp | |
parent | 718ef55ec7785aae63f98f8ca05dc07ed399c16d (diff) |
Notes
Diffstat (limited to 'contrib/llvm-project/clang/lib/Serialization/GeneratePCH.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Serialization/GeneratePCH.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/contrib/llvm-project/clang/lib/Serialization/GeneratePCH.cpp b/contrib/llvm-project/clang/lib/Serialization/GeneratePCH.cpp new file mode 100644 index 000000000000..002233e49bb0 --- /dev/null +++ b/contrib/llvm-project/clang/lib/Serialization/GeneratePCH.cpp @@ -0,0 +1,78 @@ +//===--- GeneratePCH.cpp - Sema Consumer for PCH Generation -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file defines the PCHGenerator, which as a SemaConsumer that generates +// a PCH file. +// +//===----------------------------------------------------------------------===// + +#include "clang/AST/ASTContext.h" +#include "clang/Lex/HeaderSearch.h" +#include "clang/Lex/Preprocessor.h" +#include "clang/Sema/SemaConsumer.h" +#include "clang/Serialization/ASTWriter.h" +#include "llvm/Bitstream/BitstreamWriter.h" + +using namespace clang; + +PCHGenerator::PCHGenerator( + const Preprocessor &PP, InMemoryModuleCache &ModuleCache, + StringRef OutputFile, StringRef isysroot, std::shared_ptr<PCHBuffer> Buffer, + ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, + bool AllowASTWithErrors, bool IncludeTimestamps, + bool ShouldCacheASTInMemory) + : PP(PP), OutputFile(OutputFile), isysroot(isysroot.str()), + SemaPtr(nullptr), Buffer(std::move(Buffer)), Stream(this->Buffer->Data), + Writer(Stream, this->Buffer->Data, ModuleCache, Extensions, + IncludeTimestamps), + AllowASTWithErrors(AllowASTWithErrors), + ShouldCacheASTInMemory(ShouldCacheASTInMemory) { + this->Buffer->IsComplete = false; +} + +PCHGenerator::~PCHGenerator() { +} + +void PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) { + // Don't create a PCH if there were fatal failures during module loading. + if (PP.getModuleLoader().HadFatalFailure) + return; + + bool hasErrors = PP.getDiagnostics().hasErrorOccurred(); + if (hasErrors && !AllowASTWithErrors) + return; + + Module *Module = nullptr; + if (PP.getLangOpts().isCompilingModule()) { + Module = PP.getHeaderSearchInfo().lookupModule( + PP.getLangOpts().CurrentModule, /*AllowSearch*/ false); + if (!Module) { + assert(hasErrors && "emitting module but current module doesn't exist"); + return; + } + } + + // Emit the PCH file to the Buffer. + assert(SemaPtr && "No Sema?"); + Buffer->Signature = + Writer.WriteAST(*SemaPtr, OutputFile, Module, isysroot, + // For serialization we are lenient if the errors were + // only warn-as-error kind. + PP.getDiagnostics().hasUncompilableErrorOccurred(), + ShouldCacheASTInMemory); + + Buffer->IsComplete = true; +} + +ASTMutationListener *PCHGenerator::GetASTMutationListener() { + return &Writer; +} + +ASTDeserializationListener *PCHGenerator::GetASTDeserializationListener() { + return &Writer; +} |