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