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