187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===--- Frontend/PCHContainerOperations.cpp - PCH Containers ---*- C++ -*-===// 287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// The LLVM Compiler Infrastructure 487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// License. See LICENSE.TXT for details. 787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===// 987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// This file defines PCHContainerOperations and RawPCHContainerOperation. 1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===// 1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Frontend/PCHContainerOperations.h" 1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/AST/ASTConsumer.h" 164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Lex/ModuleLoader.h" 1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "llvm/Bitcode/BitstreamReader.h" 1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "llvm/Support/raw_ostream.h" 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include <utility> 2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarusing namespace clang; 2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 234967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarPCHContainerWriter::~PCHContainerWriter() {} 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarPCHContainerReader::~PCHContainerReader() {} 254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace { 2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 2887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief A PCHContainerGenerator that writes out the PCH to a flat file. 2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass RawPCHContainerGenerator : public ASTConsumer { 3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::shared_ptr<PCHBuffer> Buffer; 3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar raw_pwrite_stream *OS; 3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic: 3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RawPCHContainerGenerator(llvm::raw_pwrite_stream *OS, 3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::shared_ptr<PCHBuffer> Buffer) 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : Buffer(std::move(Buffer)), OS(OS) {} 3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ~RawPCHContainerGenerator() override = default; 3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void HandleTranslationUnit(ASTContext &Ctx) override { 4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Buffer->IsComplete) { 4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Make sure it hits disk now. 4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar *OS << Buffer->Data; 4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OS->flush(); 4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Free the space of the temporary buffer. 4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::SmallVector<char, 0> Empty; 4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Buffer->Data = std::move(Empty); 4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}; 5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // anonymous namespace 5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstd::unique_ptr<ASTConsumer> RawPCHContainerWriter::CreatePCHContainerGenerator( 5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CompilerInstance &CI, const std::string &MainFileName, 5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const std::string &OutputFileName, llvm::raw_pwrite_stream *OS, 5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::shared_ptr<PCHBuffer> Buffer) const { 5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return llvm::make_unique<RawPCHContainerGenerator>(OS, Buffer); 5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid RawPCHContainerReader::ExtractPCH( 6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::MemoryBufferRef Buffer, llvm::BitstreamReader &StreamFile) const { 6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar StreamFile.init((const unsigned char *)Buffer.getBufferStart(), 6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (const unsigned char *)Buffer.getBufferEnd()); 6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarPCHContainerOperations::PCHContainerOperations() { 6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar registerWriter(llvm::make_unique<RawPCHContainerWriter>()); 6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar registerReader(llvm::make_unique<RawPCHContainerReader>()); 7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 71