1*7330f729Sjoerg //=== Serialization/PCHContainerOperations.cpp - PCH Containers -*- C++ -*-===//
2*7330f729Sjoerg //
3*7330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*7330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
5*7330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*7330f729Sjoerg //
7*7330f729Sjoerg //===----------------------------------------------------------------------===//
8*7330f729Sjoerg //
9*7330f729Sjoerg // This file defines PCHContainerOperations and RawPCHContainerOperation.
10*7330f729Sjoerg //
11*7330f729Sjoerg //===----------------------------------------------------------------------===//
12*7330f729Sjoerg
13*7330f729Sjoerg #include "clang/Serialization/PCHContainerOperations.h"
14*7330f729Sjoerg #include "clang/AST/ASTConsumer.h"
15*7330f729Sjoerg #include "clang/Lex/ModuleLoader.h"
16*7330f729Sjoerg #include "llvm/Bitstream/BitstreamReader.h"
17*7330f729Sjoerg #include "llvm/Support/raw_ostream.h"
18*7330f729Sjoerg #include <utility>
19*7330f729Sjoerg
20*7330f729Sjoerg using namespace clang;
21*7330f729Sjoerg
~PCHContainerWriter()22*7330f729Sjoerg PCHContainerWriter::~PCHContainerWriter() {}
~PCHContainerReader()23*7330f729Sjoerg PCHContainerReader::~PCHContainerReader() {}
24*7330f729Sjoerg
25*7330f729Sjoerg namespace {
26*7330f729Sjoerg
27*7330f729Sjoerg /// A PCHContainerGenerator that writes out the PCH to a flat file.
28*7330f729Sjoerg class RawPCHContainerGenerator : public ASTConsumer {
29*7330f729Sjoerg std::shared_ptr<PCHBuffer> Buffer;
30*7330f729Sjoerg std::unique_ptr<raw_pwrite_stream> OS;
31*7330f729Sjoerg
32*7330f729Sjoerg public:
RawPCHContainerGenerator(std::unique_ptr<llvm::raw_pwrite_stream> OS,std::shared_ptr<PCHBuffer> Buffer)33*7330f729Sjoerg RawPCHContainerGenerator(std::unique_ptr<llvm::raw_pwrite_stream> OS,
34*7330f729Sjoerg std::shared_ptr<PCHBuffer> Buffer)
35*7330f729Sjoerg : Buffer(std::move(Buffer)), OS(std::move(OS)) {}
36*7330f729Sjoerg
37*7330f729Sjoerg ~RawPCHContainerGenerator() override = default;
38*7330f729Sjoerg
HandleTranslationUnit(ASTContext & Ctx)39*7330f729Sjoerg void HandleTranslationUnit(ASTContext &Ctx) override {
40*7330f729Sjoerg if (Buffer->IsComplete) {
41*7330f729Sjoerg // Make sure it hits disk now.
42*7330f729Sjoerg *OS << Buffer->Data;
43*7330f729Sjoerg OS->flush();
44*7330f729Sjoerg }
45*7330f729Sjoerg // Free the space of the temporary buffer.
46*7330f729Sjoerg llvm::SmallVector<char, 0> Empty;
47*7330f729Sjoerg Buffer->Data = std::move(Empty);
48*7330f729Sjoerg }
49*7330f729Sjoerg };
50*7330f729Sjoerg
51*7330f729Sjoerg } // anonymous namespace
52*7330f729Sjoerg
CreatePCHContainerGenerator(CompilerInstance & CI,const std::string & MainFileName,const std::string & OutputFileName,std::unique_ptr<llvm::raw_pwrite_stream> OS,std::shared_ptr<PCHBuffer> Buffer) const53*7330f729Sjoerg std::unique_ptr<ASTConsumer> RawPCHContainerWriter::CreatePCHContainerGenerator(
54*7330f729Sjoerg CompilerInstance &CI, const std::string &MainFileName,
55*7330f729Sjoerg const std::string &OutputFileName, std::unique_ptr<llvm::raw_pwrite_stream> OS,
56*7330f729Sjoerg std::shared_ptr<PCHBuffer> Buffer) const {
57*7330f729Sjoerg return std::make_unique<RawPCHContainerGenerator>(std::move(OS), Buffer);
58*7330f729Sjoerg }
59*7330f729Sjoerg
60*7330f729Sjoerg StringRef
ExtractPCH(llvm::MemoryBufferRef Buffer) const61*7330f729Sjoerg RawPCHContainerReader::ExtractPCH(llvm::MemoryBufferRef Buffer) const {
62*7330f729Sjoerg return Buffer.getBuffer();
63*7330f729Sjoerg }
64*7330f729Sjoerg
PCHContainerOperations()65*7330f729Sjoerg PCHContainerOperations::PCHContainerOperations() {
66*7330f729Sjoerg registerWriter(std::make_unique<RawPCHContainerWriter>());
67*7330f729Sjoerg registerReader(std::make_unique<RawPCHContainerReader>());
68*7330f729Sjoerg }
69