diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-05-18 22:50:54 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-05-18 22:50:54 +0000 |
commit | 39d7c4d2d980651c4263b67cf0ab61dec34cd76b (patch) | |
tree | 7c84e3a5626a8919ada8deea9e796ff53ff92c22 /lib/Frontend/GeneratePCH.cpp | |
parent | c6d656e2b0491f224ddd48507627b51d630d749a (diff) |
Move ASTConsumers.h to include/clang/Frontend, and move the associated
.cpp files to lib/Frontend. (As proposed on cfe-dev.)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72060 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/GeneratePCH.cpp')
-rw-r--r-- | lib/Frontend/GeneratePCH.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/Frontend/GeneratePCH.cpp b/lib/Frontend/GeneratePCH.cpp new file mode 100644 index 0000000000..8be88ce381 --- /dev/null +++ b/lib/Frontend/GeneratePCH.cpp @@ -0,0 +1,78 @@ +//===--- GeneratePCH.cpp - AST Consumer for PCH Generation ------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the CreatePCHGenerate function, which creates an +// ASTConsume that generates a PCH file. +// +//===----------------------------------------------------------------------===// + +#include "clang/Frontend/ASTConsumers.h" +#include "clang/Frontend/PCHWriter.h" +#include "clang/Sema/SemaConsumer.h" +#include "clang/AST/ASTContext.h" +#include "clang/AST/ASTConsumer.h" +#include "clang/Lex/Preprocessor.h" +#include "clang/Basic/FileManager.h" +#include "llvm/Bitcode/BitstreamWriter.h" +#include "llvm/System/Path.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Streams.h" +#include <string> + +using namespace clang; +using namespace llvm; + +namespace { + class VISIBILITY_HIDDEN PCHGenerator : public SemaConsumer { + const Preprocessor &PP; + llvm::raw_ostream *Out; + Sema *SemaPtr; + MemorizeStatCalls *StatCalls; // owned by the FileManager + + public: + explicit PCHGenerator(const Preprocessor &PP, llvm::raw_ostream *Out); + virtual void InitializeSema(Sema &S) { SemaPtr = &S; } + virtual void HandleTranslationUnit(ASTContext &Ctx); + }; +} + +PCHGenerator::PCHGenerator(const Preprocessor &PP, llvm::raw_ostream *OS) + : PP(PP), Out(OS), SemaPtr(0), StatCalls(0) { + + // Install a stat() listener to keep track of all of the stat() + // calls. + StatCalls = new MemorizeStatCalls; + PP.getFileManager().setStatCache(StatCalls); +} + +void PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) { + if (PP.getDiagnostics().hasErrorOccurred()) + return; + + // Write the PCH contents into a buffer + std::vector<unsigned char> Buffer; + BitstreamWriter Stream(Buffer); + PCHWriter Writer(Stream); + + // Emit the PCH file + assert(SemaPtr && "No Sema?"); + Writer.WritePCH(*SemaPtr, StatCalls); + + // Write the generated bitstream to "Out". + Out->write((char *)&Buffer.front(), Buffer.size()); + + // Make sure it hits disk now. + Out->flush(); +} + +ASTConsumer *clang::CreatePCHGenerator(const Preprocessor &PP, + llvm::raw_ostream *OS) { + return new PCHGenerator(PP, OS); +} |