1 //===--- GeneratePCH.cpp - Sema Consumer for PCH Generation -----*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file defines the PCHGenerator, which as a SemaConsumer that generates
12 //===----------------------------------------------------------------------===//
14 #include "clang/AST/ASTContext.h"
15 #include "clang/Lex/HeaderSearch.h"
16 #include "clang/Lex/Preprocessor.h"
17 #include "clang/Sema/SemaConsumer.h"
18 #include "clang/Serialization/ASTWriter.h"
19 #include "llvm/Bitstream/BitstreamWriter.h"
21 using namespace clang
;
23 PCHGenerator::PCHGenerator(
24 const Preprocessor
&PP
, InMemoryModuleCache
&ModuleCache
,
25 StringRef OutputFile
, StringRef isysroot
, std::shared_ptr
<PCHBuffer
> Buffer
,
26 ArrayRef
<std::shared_ptr
<ModuleFileExtension
>> Extensions
,
27 bool AllowASTWithErrors
, bool IncludeTimestamps
,
28 bool ShouldCacheASTInMemory
)
29 : PP(PP
), OutputFile(OutputFile
), isysroot(isysroot
.str()),
30 SemaPtr(nullptr), Buffer(std::move(Buffer
)), Stream(this->Buffer
->Data
),
31 Writer(Stream
, this->Buffer
->Data
, ModuleCache
, Extensions
,
33 AllowASTWithErrors(AllowASTWithErrors
),
34 ShouldCacheASTInMemory(ShouldCacheASTInMemory
) {
35 this->Buffer
->IsComplete
= false;
38 PCHGenerator::~PCHGenerator() {
41 void PCHGenerator::HandleTranslationUnit(ASTContext
&Ctx
) {
42 // Don't create a PCH if there were fatal failures during module loading.
43 if (PP
.getModuleLoader().HadFatalFailure
)
46 bool hasErrors
= PP
.getDiagnostics().hasErrorOccurred();
47 if (hasErrors
&& !AllowASTWithErrors
)
50 Module
*Module
= nullptr;
51 if (PP
.getLangOpts().isCompilingModule()) {
52 Module
= PP
.getHeaderSearchInfo().lookupModule(
53 PP
.getLangOpts().CurrentModule
, SourceLocation(),
54 /*AllowSearch*/ false);
56 assert(hasErrors
&& "emitting module but current module doesn't exist");
61 // Errors that do not prevent the PCH from being written should not cause the
62 // overall compilation to fail either.
63 if (AllowASTWithErrors
)
64 PP
.getDiagnostics().getClient()->clear();
66 // Emit the PCH file to the Buffer.
67 assert(SemaPtr
&& "No Sema?");
69 Writer
.WriteAST(*SemaPtr
, OutputFile
, Module
, isysroot
,
70 // For serialization we are lenient if the errors were
71 // only warn-as-error kind.
72 PP
.getDiagnostics().hasUncompilableErrorOccurred(),
73 ShouldCacheASTInMemory
);
75 Buffer
->IsComplete
= true;
78 ASTMutationListener
*PCHGenerator::GetASTMutationListener() {
82 ASTDeserializationListener
*PCHGenerator::GetASTDeserializationListener() {