clang 17.0.0git
GeneratePCH.cpp
Go to the documentation of this file.
1//===--- GeneratePCH.cpp - Sema Consumer for PCH Generation -----*- C++ -*-===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the PCHGenerator, which as a SemaConsumer that generates
10// a PCH file.
11//
12//===----------------------------------------------------------------------===//
13
19#include "llvm/Bitstream/BitstreamWriter.h"
20
21using namespace clang;
22
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,
32 IncludeTimestamps),
33 AllowASTWithErrors(AllowASTWithErrors),
34 ShouldCacheASTInMemory(ShouldCacheASTInMemory) {
35 this->Buffer->IsComplete = false;
36}
37
39}
40
42 // Don't create a PCH if there were fatal failures during module loading.
44 return;
45
46 bool hasErrors = PP.getDiagnostics().hasErrorOccurred();
47 if (hasErrors && !AllowASTWithErrors)
48 return;
49
50 Module *Module = nullptr;
51 if (PP.getLangOpts().isCompilingModule()) {
54 /*AllowSearch*/ false);
55 if (!Module) {
56 assert(hasErrors && "emitting module but current module doesn't exist");
57 return;
58 }
59 }
60
61 // Errors that do not prevent the PCH from being written should not cause the
62 // overall compilation to fail either.
63 if (AllowASTWithErrors)
65
66 // Emit the PCH file to the Buffer.
67 assert(SemaPtr && "No Sema?");
68 Buffer->Signature =
69 Writer.WriteAST(*SemaPtr, OutputFile, Module, isysroot,
70 // For serialization we are lenient if the errors were
71 // only warn-as-error kind.
73 ShouldCacheASTInMemory);
74
75 Buffer->IsComplete = true;
76}
77
79 return &Writer;
80}
81
83 return &Writer;
84}
Defines the clang::ASTContext interface.
Defines the clang::Preprocessor interface.
const char * Data
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:182
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
ASTFileSignature WriteAST(Sema &SemaRef, StringRef OutputFile, Module *WritingModule, StringRef isysroot, bool hasErrors=false, bool ShouldCacheASTInMemory=false)
Write a precompiled header for the given semantic analysis.
Definition: ASTWriter.cpp:4545
bool hasErrorOccurred() const
Definition: Diagnostic.h:838
DiagnosticConsumer * getClient()
Definition: Diagnostic.h:567
bool hasUncompilableErrorOccurred() const
Errors that actually prevent compilation, not those that are upgraded from a warning by -Werror.
Definition: Diagnostic.h:842
Module * lookupModule(StringRef ModuleName, SourceLocation ImportLoc=SourceLocation(), bool AllowSearch=true, bool AllowExtraModuleMapSearch=false)
Lookup a module Search for a module with the given name.
In-memory cache for modules.
bool isCompilingModule() const
Are we compiling a module?
Definition: LangOptions.h:514
std::string CurrentModule
The name of the current module, of which the main source file is a part.
Definition: LangOptions.h:437
Describes a module or submodule.
Definition: Module.h:98
ASTMutationListener * GetASTMutationListener() override
If the consumer is interested in entities getting modified after their initial creation,...
Definition: GeneratePCH.cpp:78
~PCHGenerator() override
Definition: GeneratePCH.cpp:38
ASTDeserializationListener * GetASTDeserializationListener() override
If the consumer is interested in entities being deserialized from AST files, it should return a point...
Definition: GeneratePCH.cpp:82
void HandleTranslationUnit(ASTContext &Ctx) override
HandleTranslationUnit - This method is called when the ASTs for entire translation unit have been par...
Definition: GeneratePCH.cpp:41
PCHGenerator(const Preprocessor &PP, InMemoryModuleCache &ModuleCache, StringRef OutputFile, StringRef isysroot, std::shared_ptr< PCHBuffer > Buffer, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, bool AllowASTWithErrors=false, bool IncludeTimestamps=true, bool ShouldCacheASTInMemory=false)
Definition: GeneratePCH.cpp:23
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Definition: Preprocessor.h:128
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with this preprocessor.
HeaderSearch & getHeaderSearchInfo() const
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
Encodes a location in the source.
Definition: Format.h:4756