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