GeneratePCH.cpp revision 226633
1212795Sdim//===--- GeneratePCH.cpp - AST Consumer for PCH Generation ------*- C++ -*-===// 2212795Sdim// 3212795Sdim// The LLVM Compiler Infrastructure 4212795Sdim// 5212795Sdim// This file is distributed under the University of Illinois Open Source 6212795Sdim// License. See LICENSE.TXT for details. 7212795Sdim// 8212795Sdim//===----------------------------------------------------------------------===// 9212795Sdim// 10212795Sdim// This file defines the CreatePCHGenerate function, which creates an 11212795Sdim// ASTConsumer that generates a PCH file. 12212795Sdim// 13212795Sdim//===----------------------------------------------------------------------===// 14212795Sdim 15212795Sdim#include "clang/Frontend/ASTConsumers.h" 16212795Sdim#include "clang/Serialization/ASTWriter.h" 17212795Sdim#include "clang/Sema/SemaConsumer.h" 18212795Sdim#include "clang/AST/ASTContext.h" 19212795Sdim#include "clang/AST/ASTConsumer.h" 20212795Sdim#include "clang/Lex/Preprocessor.h" 21212795Sdim#include "clang/Basic/FileManager.h" 22218893Sdim#include "clang/Basic/FileSystemStatCache.h" 23212795Sdim#include "llvm/Bitcode/BitstreamWriter.h" 24212795Sdim#include "llvm/Support/raw_ostream.h" 25212795Sdim#include <string> 26212795Sdim 27212795Sdimusing namespace clang; 28212795Sdim 29212795SdimPCHGenerator::PCHGenerator(const Preprocessor &PP, 30226633Sdim StringRef OutputFile, 31226633Sdim bool IsModule, 32226633Sdim StringRef isysroot, 33226633Sdim raw_ostream *OS) 34226633Sdim : PP(PP), OutputFile(OutputFile), IsModule(IsModule), 35226633Sdim isysroot(isysroot.str()), Out(OS), 36226633Sdim SemaPtr(0), StatCalls(0), Stream(Buffer), Writer(Stream) { 37212795Sdim // Install a stat() listener to keep track of all of the stat() 38212795Sdim // calls. 39218893Sdim StatCalls = new MemorizeStatCalls(); 40226633Sdim PP.getFileManager().addStatCache(StatCalls, /*AtBeginning=*/false); 41212795Sdim} 42212795Sdim 43226633SdimPCHGenerator::~PCHGenerator() { 44226633Sdim} 45226633Sdim 46212795Sdimvoid PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) { 47212795Sdim if (PP.getDiagnostics().hasErrorOccurred()) 48212795Sdim return; 49218893Sdim 50212795Sdim // Emit the PCH file 51212795Sdim assert(SemaPtr && "No Sema?"); 52226633Sdim Writer.WriteAST(*SemaPtr, StatCalls, OutputFile, IsModule, isysroot); 53212795Sdim 54212795Sdim // Write the generated bitstream to "Out". 55212795Sdim Out->write((char *)&Buffer.front(), Buffer.size()); 56212795Sdim 57212795Sdim // Make sure it hits disk now. 58212795Sdim Out->flush(); 59212795Sdim 60212795Sdim // Free up some memory, in case the process is kept alive. 61212795Sdim Buffer.clear(); 62212795Sdim} 63212795Sdim 64218893SdimASTMutationListener *PCHGenerator::GetASTMutationListener() { 65226633Sdim return &Writer; 66218893Sdim} 67218893Sdim 68212795SdimASTDeserializationListener *PCHGenerator::GetASTDeserializationListener() { 69212795Sdim return &Writer; 70212795Sdim} 71