//===--- Frontend/PCHContainerOperations.h - PCH Containers -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_PCH_CONTAINER_OPERATIONS_H #define LLVM_CLANG_PCH_CONTAINER_OPERATIONS_H #include "clang/Basic/Module.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/Support/MemoryBuffer.h" #include namespace llvm { class raw_pwrite_stream; } using llvm::StringRef; namespace clang { class ASTConsumer; class CodeGenOptions; class DiagnosticsEngine; class CompilerInstance; struct PCHBuffer { ASTFileSignature Signature; llvm::SmallVector Data; bool IsComplete; }; /// This abstract interface provides operations for creating /// containers for serialized ASTs (precompiled headers and clang /// modules). class PCHContainerWriter { public: virtual ~PCHContainerWriter() = 0; virtual StringRef getFormat() const = 0; /// Return an ASTConsumer that can be chained with a /// PCHGenerator that produces a wrapper file format containing a /// serialized AST bitstream. virtual std::unique_ptr CreatePCHContainerGenerator(CompilerInstance &CI, const std::string &MainFileName, const std::string &OutputFileName, std::unique_ptr OS, std::shared_ptr Buffer) const = 0; }; /// This abstract interface provides operations for unwrapping /// containers for serialized ASTs (precompiled headers and clang /// modules). class PCHContainerReader { public: virtual ~PCHContainerReader() = 0; /// Equivalent to the format passed to -fmodule-format= virtual StringRef getFormat() const = 0; /// Returns the serialized AST inside the PCH container Buffer. virtual StringRef ExtractPCH(llvm::MemoryBufferRef Buffer) const = 0; }; /// Implements write operations for a raw pass-through PCH container. class RawPCHContainerWriter : public PCHContainerWriter { StringRef getFormat() const override { return "raw"; } /// Return an ASTConsumer that can be chained with a /// PCHGenerator that writes the module to a flat file. std::unique_ptr CreatePCHContainerGenerator(CompilerInstance &CI, const std::string &MainFileName, const std::string &OutputFileName, std::unique_ptr OS, std::shared_ptr Buffer) const override; }; /// Implements read operations for a raw pass-through PCH container. class RawPCHContainerReader : public PCHContainerReader { StringRef getFormat() const override { return "raw"; } /// Simply returns the buffer contained in Buffer. StringRef ExtractPCH(llvm::MemoryBufferRef Buffer) const override; }; /// A registry of PCHContainerWriter and -Reader objects for different formats. class PCHContainerOperations { llvm::StringMap> Writers; llvm::StringMap> Readers; public: /// Automatically registers a RawPCHContainerWriter and /// RawPCHContainerReader. PCHContainerOperations(); void registerWriter(std::unique_ptr Writer) { Writers[Writer->getFormat()] = std::move(Writer); } void registerReader(std::unique_ptr Reader) { Readers[Reader->getFormat()] = std::move(Reader); } const PCHContainerWriter *getWriterOrNull(StringRef Format) { return Writers[Format].get(); } const PCHContainerReader *getReaderOrNull(StringRef Format) { return Readers[Format].get(); } const PCHContainerReader &getRawReader() { return *getReaderOrNull("raw"); } }; } #endif