clang  10.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 
14 #include "clang/AST/ASTContext.h"
15 #include "clang/Lex/HeaderSearch.h"
16 #include "clang/Lex/Preprocessor.h"
19 #include "llvm/Bitstream/BitstreamWriter.h"
20 
21 using 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()) {
52  Module = PP.getHeaderSearchInfo().lookupModule(
53  PP.getLangOpts().CurrentModule, /*AllowSearch*/ false);
54  if (!Module) {
55  assert(hasErrors && "emitting module but current module doesn't exist");
56  return;
57  }
58  }
59 
60  // Emit the PCH file to the Buffer.
61  assert(SemaPtr && "No Sema?");
62  Buffer->Signature =
63  Writer.WriteAST(*SemaPtr, OutputFile, Module, isysroot,
64  // For serialization we are lenient if the errors were
65  // only warn-as-error kind.
67  ShouldCacheASTInMemory);
68 
69  Buffer->IsComplete = true;
70 }
71 
73  return &Writer;
74 }
75 
77  return &Writer;
78 }
Defines the clang::ASTContext interface.
bool hasErrorOccurred() const
Definition: Diagnostic.h:753
bool isCompilingModule() const
Are we compiling a module interface (.cppm or module map)?
Definition: LangOptions.h:313
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:168
void HandleTranslationUnit(ASTContext &Ctx) override
HandleTranslationUnit - This method is called when the ASTs for entire translation unit have been par...
Definition: GeneratePCH.cpp:41
Definition: Format.h:2445
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
~PCHGenerator() override
Definition: GeneratePCH.cpp:38
const LangOptions & getLangOpts() const
Definition: Preprocessor.h:907
Describes a module or submodule.
Definition: Module.h:64
HeaderSearch & getHeaderSearchInfo() const
Definition: Preprocessor.h:912
std::string CurrentModule
The name of the current module, of which the main source file is a part.
Definition: LangOptions.h:277
ASTFileSignature WriteAST(Sema &SemaRef, const std::string &OutputFile, Module *WritingModule, StringRef isysroot, bool hasErrors=false, bool ShouldCacheASTInMemory=false)
Write a precompiled header for the given semantic analysis.
Definition: ASTWriter.cpp:4290
ASTDeserializationListener * GetASTDeserializationListener() override
If the consumer is interested in entities being deserialized from AST files, it should return a point...
Definition: GeneratePCH.cpp:76
bool hasUncompilableErrorOccurred() const
Errors that actually prevent compilation, not those that are upgraded from a warning by -Werror...
Definition: Diagnostic.h:757
Defines the clang::Preprocessor interface.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
In-memory cache for modules.
ASTMutationListener * GetASTMutationListener() override
If the consumer is interested in entities getting modified after their initial creation, it should return a pointer to an ASTMutationListener here.
Definition: GeneratePCH.cpp:72
Dataflow Directional Tag Classes.
Module * lookupModule(StringRef ModuleName, bool AllowSearch=true, bool AllowExtraModuleMapSearch=false)
Lookup a module Search for a module with the given name.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with this preprocessor.
Definition: Preprocessor.h:929
DiagnosticsEngine & getDiagnostics() const
Definition: Preprocessor.h:904
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Definition: Preprocessor.h:128