diff options
Diffstat (limited to 'clang/lib/Serialization/PCHContainerOperations.cpp')
| -rw-r--r-- | clang/lib/Serialization/PCHContainerOperations.cpp | 68 | 
1 files changed, 68 insertions, 0 deletions
| diff --git a/clang/lib/Serialization/PCHContainerOperations.cpp b/clang/lib/Serialization/PCHContainerOperations.cpp new file mode 100644 index 000000000000..d4990fce2d99 --- /dev/null +++ b/clang/lib/Serialization/PCHContainerOperations.cpp @@ -0,0 +1,68 @@ +//=== Serialization/PCHContainerOperations.cpp - PCH Containers -*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +//  This file defines PCHContainerOperations and RawPCHContainerOperation. +// +//===----------------------------------------------------------------------===// + +#include "clang/Serialization/PCHContainerOperations.h" +#include "clang/AST/ASTConsumer.h" +#include "clang/Lex/ModuleLoader.h" +#include "llvm/Bitstream/BitstreamReader.h" +#include "llvm/Support/raw_ostream.h" +#include <utility> + +using namespace clang; + +PCHContainerWriter::~PCHContainerWriter() {} +PCHContainerReader::~PCHContainerReader() {} + +namespace { + +/// A PCHContainerGenerator that writes out the PCH to a flat file. +class RawPCHContainerGenerator : public ASTConsumer { +  std::shared_ptr<PCHBuffer> Buffer; +  std::unique_ptr<raw_pwrite_stream> OS; + +public: +  RawPCHContainerGenerator(std::unique_ptr<llvm::raw_pwrite_stream> OS, +                           std::shared_ptr<PCHBuffer> Buffer) +      : Buffer(std::move(Buffer)), OS(std::move(OS)) {} + +  ~RawPCHContainerGenerator() override = default; + +  void HandleTranslationUnit(ASTContext &Ctx) override { +    if (Buffer->IsComplete) { +      // Make sure it hits disk now. +      *OS << Buffer->Data; +      OS->flush(); +    } +    // Free the space of the temporary buffer. +    llvm::SmallVector<char, 0> Empty; +    Buffer->Data = std::move(Empty); +  } +}; + +} // anonymous namespace + +std::unique_ptr<ASTConsumer> RawPCHContainerWriter::CreatePCHContainerGenerator( +    CompilerInstance &CI, const std::string &MainFileName, +    const std::string &OutputFileName, std::unique_ptr<llvm::raw_pwrite_stream> OS, +    std::shared_ptr<PCHBuffer> Buffer) const { +  return std::make_unique<RawPCHContainerGenerator>(std::move(OS), Buffer); +} + +StringRef +RawPCHContainerReader::ExtractPCH(llvm::MemoryBufferRef Buffer) const { +  return Buffer.getBuffer(); +} + +PCHContainerOperations::PCHContainerOperations() { +  registerWriter(std::make_unique<RawPCHContainerWriter>()); +  registerReader(std::make_unique<RawPCHContainerReader>()); +} | 
