1234353Sdim//===--- GeneratePCH.cpp - Sema 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// 10234353Sdim// This file defines the PCHGenerator, which as a SemaConsumer that generates 11234353Sdim// a PCH file. 12212795Sdim// 13212795Sdim//===----------------------------------------------------------------------===// 14212795Sdim 15212795Sdim#include "clang/Serialization/ASTWriter.h" 16249423Sdim#include "clang/AST/ASTConsumer.h" 17212795Sdim#include "clang/AST/ASTContext.h" 18249423Sdim#include "clang/Basic/FileManager.h" 19212795Sdim#include "clang/Lex/Preprocessor.h" 20249423Sdim#include "clang/Sema/SemaConsumer.h" 21212795Sdim#include "llvm/Bitcode/BitstreamWriter.h" 22212795Sdim#include "llvm/Support/raw_ostream.h" 23212795Sdim#include <string> 24212795Sdim 25212795Sdimusing namespace clang; 26212795Sdim 27212795SdimPCHGenerator::PCHGenerator(const Preprocessor &PP, 28226633Sdim StringRef OutputFile, 29234353Sdim clang::Module *Module, 30226633Sdim StringRef isysroot, 31226633Sdim raw_ostream *OS) 32234353Sdim : PP(PP), OutputFile(OutputFile), Module(Module), 33226633Sdim isysroot(isysroot.str()), Out(OS), 34243830Sdim SemaPtr(0), Stream(Buffer), Writer(Stream) { 35212795Sdim} 36212795Sdim 37226633SdimPCHGenerator::~PCHGenerator() { 38226633Sdim} 39226633Sdim 40212795Sdimvoid PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) { 41212795Sdim if (PP.getDiagnostics().hasErrorOccurred()) 42212795Sdim return; 43218893Sdim 44212795Sdim // Emit the PCH file 45212795Sdim assert(SemaPtr && "No Sema?"); 46243830Sdim Writer.WriteAST(*SemaPtr, OutputFile, Module, isysroot); 47212795Sdim 48212795Sdim // Write the generated bitstream to "Out". 49212795Sdim Out->write((char *)&Buffer.front(), Buffer.size()); 50212795Sdim 51212795Sdim // Make sure it hits disk now. 52212795Sdim Out->flush(); 53212795Sdim 54212795Sdim // Free up some memory, in case the process is kept alive. 55212795Sdim Buffer.clear(); 56212795Sdim} 57212795Sdim 58218893SdimASTMutationListener *PCHGenerator::GetASTMutationListener() { 59226633Sdim return &Writer; 60218893Sdim} 61218893Sdim 62212795SdimASTDeserializationListener *PCHGenerator::GetASTDeserializationListener() { 63212795Sdim return &Writer; 64212795Sdim} 65