GeneratePCH.cpp revision 55fc873017f10f6f566b182b70f6fc22aefa3464
133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//===--- GeneratePCH.cpp - Sema Consumer for PCH Generation -----*- C++ -*-===// 233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// 333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// The LLVM Compiler Infrastructure 433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// 533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// This file is distributed under the University of Illinois Open Source 633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// License. See LICENSE.TXT for details. 733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// 833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//===----------------------------------------------------------------------===// 933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// 1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// This file defines the PCHGenerator, which as a SemaConsumer that generates 1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// a PCH file. 1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// 1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//===----------------------------------------------------------------------===// 1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "clang/Serialization/ASTWriter.h" 1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "clang/AST/ASTConsumer.h" 1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "clang/AST/ASTContext.h" 1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "clang/Basic/FileManager.h" 1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "clang/Lex/Preprocessor.h" 2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "clang/Sema/SemaConsumer.h" 2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "llvm/Bitcode/BitstreamWriter.h" 2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "llvm/Support/raw_ostream.h" 2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include <string> 2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgusing namespace clang; 2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgPCHGenerator::PCHGenerator(const Preprocessor &PP, 283c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org StringRef OutputFile, 2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org clang::Module *Module, 3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org StringRef isysroot, 3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org raw_ostream *OS) 3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org : PP(PP), OutputFile(OutputFile), Module(Module), 3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org isysroot(isysroot.str()), Out(OS), 3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org SemaPtr(0), Stream(Buffer), Writer(Stream) { 3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 3633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgPCHGenerator::~PCHGenerator() { 3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 40a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgvoid PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) { 41a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org if (PP.getDiagnostics().hasErrorOccurred()) 42a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org return; 43a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 44a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // Emit the PCH file 45a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org assert(SemaPtr && "No Sema?"); 46a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org Writer.WriteAST(*SemaPtr, OutputFile, Module, isysroot); 47a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 48a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // Write the generated bitstream to "Out". 4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Out->write((char *)&Buffer.front(), Buffer.size()); 5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // Make sure it hits disk now. 5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Out->flush(); 5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // Free up some memory, in case the process is kept alive. 5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Buffer.clear(); 5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 5733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgPPMutationListener *PCHGenerator::GetPPMutationListener() { 5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return &Writer; 6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgASTMutationListener *PCHGenerator::GetASTMutationListener() { 6333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return &Writer; 6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgASTDeserializationListener *PCHGenerator::GetASTDeserializationListener() { 6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return &Writer; 6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org