clang  3.7.0
GeneratePCH.cpp
Go to the documentation of this file.
1 //===--- GeneratePCH.cpp - Sema Consumer for PCH Generation -----*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the PCHGenerator, which as a SemaConsumer that generates
11 // a PCH file.
12 //
13 //===----------------------------------------------------------------------===//
14 
16 #include "clang/AST/ASTConsumer.h"
17 #include "clang/AST/ASTContext.h"
19 #include "clang/Lex/Preprocessor.h"
21 #include "llvm/Bitcode/BitstreamWriter.h"
22 #include <string>
23 
24 using namespace clang;
25 
26 PCHGenerator::PCHGenerator(const Preprocessor &PP, StringRef OutputFile,
27  clang::Module *Module, StringRef isysroot,
28  std::shared_ptr<PCHBuffer> Buffer,
29  bool AllowASTWithErrors)
30  : PP(PP), OutputFile(OutputFile), Module(Module), isysroot(isysroot.str()),
31  SemaPtr(nullptr), Buffer(Buffer), Stream(Buffer->Data), Writer(Stream),
32  AllowASTWithErrors(AllowASTWithErrors) {
33  Buffer->IsComplete = false;
34 }
35 
37 }
38 
40  // Don't create a PCH if there were fatal failures during module loading.
42  return;
43 
44  bool hasErrors = PP.getDiagnostics().hasErrorOccurred();
45  if (hasErrors && !AllowASTWithErrors)
46  return;
47 
48  // Emit the PCH file to the Buffer.
49  assert(SemaPtr && "No Sema?");
50  Writer.WriteAST(*SemaPtr, OutputFile, Module, isysroot, hasErrors);
51 
52  Buffer->IsComplete = true;
53 }
54 
56  return &Writer;
57 }
58 
60  return &Writer;
61 }
Defines the clang::ASTContext interface.
Defines the clang::FileManager interface and associated types.
bool hasErrorOccurred() const
Definition: Diagnostic.h:573
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:89
void HandleTranslationUnit(ASTContext &Ctx) override
Definition: GeneratePCH.cpp:39
~PCHGenerator() override
Definition: GeneratePCH.cpp:36
Describes a module or submodule.
Definition: Basic/Module.h:49
void WriteAST(Sema &SemaRef, const std::string &OutputFile, Module *WritingModule, StringRef isysroot, bool hasErrors=false)
Write a precompiled header for the given semantic analysis.
Definition: ASTWriter.cpp:4063
ASTDeserializationListener * GetASTDeserializationListener() override
If the consumer is interested in entities being deserialized from AST files, it should return a point...
Definition: GeneratePCH.cpp:59
Defines the clang::Preprocessor interface.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with this preprocessor.
Definition: Preprocessor.h:704
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
PCHGenerator(const Preprocessor &PP, StringRef OutputFile, clang::Module *Module, StringRef isysroot, std::shared_ptr< PCHBuffer > Buffer, bool AllowASTWithErrors=false)
Definition: GeneratePCH.cpp:26
DiagnosticsEngine & getDiagnostics() const
Definition: Preprocessor.h:676
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:55
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Definition: Preprocessor.h:96