GeneratePCH.cpp revision d560ce3b66325ff22cd3aca23c6de3143bd74d24
197ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//===--- GeneratePCH.cpp - Sema Consumer for PCH Generation -----*- C++ -*-===//
297ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//
397ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//                     The LLVM Compiler Infrastructure
497ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//
597ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// This file is distributed under the University of Illinois Open Source
697ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// License. See LICENSE.TXT for details.
797ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//
897ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//===----------------------------------------------------------------------===//
997ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//
1097ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//  This file defines the PCHGenerator, which as a SemaConsumer that generates
1197ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//  a PCH file.
1297ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//
1397ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//===----------------------------------------------------------------------===//
1497ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu
1597ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu#include "clang/Serialization/ASTWriter.h"
1697ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu#include "clang/AST/ASTConsumer.h"
1797ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu#include "clang/AST/ASTContext.h"
1897ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu#include "clang/Basic/FileManager.h"
1997ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu#include "clang/Lex/Preprocessor.h"
2097ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu#include "clang/Sema/SemaConsumer.h"
21b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek#include "llvm/Bitcode/BitstreamWriter.h"
22b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek#include "llvm/Support/raw_ostream.h"
2387a05f1fe8ae14044f182b015b279e0a6f4cbdd1Mike Stump#include <string>
2497ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu
2597ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xuusing namespace clang;
2697ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu
2758f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed KremenekPCHGenerator::PCHGenerator(const Preprocessor &PP,
2858f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek                           StringRef OutputFile,
2958f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek                           clang::Module *Module,
3058f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek                           StringRef isysroot,
3158f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek                           raw_ostream *OS)
3258f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek  : PP(PP), OutputFile(OutputFile), Module(Module),
3397ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu    isysroot(isysroot.str()), Out(OS),
342376002038c8b904acd20be754aedd1a7471be71Ted Kremenek    SemaPtr(0), Stream(Buffer), Writer(Stream) {
3597ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu}
362376002038c8b904acd20be754aedd1a7471be71Ted Kremenek
3797ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing XuPCHGenerator::~PCHGenerator() {
3897ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu}
3987a05f1fe8ae14044f182b015b279e0a6f4cbdd1Mike Stump
4097ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xuvoid PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) {
4197ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu  if (PP.getDiagnostics().hasErrorOccurred())
4282cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek    return;
4382cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek
4482cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek  // Emit the PCH file
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(SemaPtr && "No Sema?");
4682cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek  Writer.WriteAST(*SemaPtr, OutputFile, Module, isysroot);
4782cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek
4882cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek  // Write the generated bitstream to "Out".
4997ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu  Out->write((char *)&Buffer.front(), Buffer.size());
501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5197ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu  // Make sure it hits disk now.
5297ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu  Out->flush();
5397ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu
5497ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu  // Free up some memory, in case the process is kept alive.
5597ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu  Buffer.clear();
561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
5797ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu
5897ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing XuASTMutationListener *PCHGenerator::GetASTMutationListener() {
5997ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu  return &Writer;
6097ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu}
6197ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu
6297ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing XuASTDeserializationListener *PCHGenerator::GetASTDeserializationListener() {
6397ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu  return &Writer;
6497ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu}
6597ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu