xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/Serialization/PCHContainerOperations.cpp (revision 7330f729ccf0bd976a06f95fad452fe774fc7fd1)
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