From f3b0046ba9de24fe9a77260b47a6bfa6cb1ac02a Mon Sep 17 00:00:00 2001 From: Richard Trieu Date: Wed, 12 Dec 2018 02:53:59 +0000 Subject: [PATCH] Move PCHContainerOperations from Frontend to Serialization Fix a layering violation. Frontend depends on Serialization, so anything used by both should be in Serialization. llvm-svn: 348907 --- .../clang/Frontend/PCHContainerOperations.h | 104 +----------------- clang/include/clang/Serialization/ASTWriter.h | 2 +- .../clang/Serialization/PCHContainerOperations.h | 117 +++++++++++++++++++++ clang/include/clang/module.modulemap | 3 - clang/lib/Frontend/ASTUnit.cpp | 2 +- clang/lib/Frontend/CMakeLists.txt | 1 - clang/lib/Serialization/ASTReader.cpp | 2 +- clang/lib/Serialization/CMakeLists.txt | 1 + clang/lib/Serialization/GlobalModuleIndex.cpp | 2 +- clang/lib/Serialization/ModuleManager.cpp | 2 +- .../PCHContainerOperations.cpp | 4 +- 11 files changed, 126 insertions(+), 114 deletions(-) create mode 100644 clang/include/clang/Serialization/PCHContainerOperations.h rename clang/lib/{Frontend => Serialization}/PCHContainerOperations.cpp (94%) diff --git a/clang/include/clang/Frontend/PCHContainerOperations.h b/clang/include/clang/Frontend/PCHContainerOperations.h index 63d35e1..675efba 100644 --- a/clang/include/clang/Frontend/PCHContainerOperations.h +++ b/clang/include/clang/Frontend/PCHContainerOperations.h @@ -10,108 +10,6 @@ #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; -} - -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 llvm::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 llvm::StringRef getFormat() const = 0; - - /// Returns the serialized AST inside the PCH container Buffer. - virtual llvm::StringRef ExtractPCH(llvm::MemoryBufferRef Buffer) const = 0; -}; - -/// Implements write operations for a raw pass-through PCH container. -class RawPCHContainerWriter : public PCHContainerWriter { - llvm::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 { - llvm::StringRef getFormat() const override { return "raw"; } - - /// Simply returns the buffer contained in Buffer. - llvm::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(llvm::StringRef Format) { - return Writers[Format].get(); - } - const PCHContainerReader *getReaderOrNull(llvm::StringRef Format) { - return Readers[Format].get(); - } - const PCHContainerReader &getRawReader() { - return *getReaderOrNull("raw"); - } -}; - -} +#include "clang/Serialization/PCHContainerOperations.h" #endif diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index da8b10a..11af30a 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -26,10 +26,10 @@ #include "clang/AST/TypeLoc.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/SourceLocation.h" -#include "clang/Frontend/PCHContainerOperations.h" #include "clang/Sema/SemaConsumer.h" #include "clang/Serialization/ASTBitCodes.h" #include "clang/Serialization/ASTDeserializationListener.h" +#include "clang/Serialization/PCHContainerOperations.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" diff --git a/clang/include/clang/Serialization/PCHContainerOperations.h b/clang/include/clang/Serialization/PCHContainerOperations.h new file mode 100644 index 0000000..2a91d98 --- /dev/null +++ b/clang/include/clang/Serialization/PCHContainerOperations.h @@ -0,0 +1,117 @@ +//===--- Serialization/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_SERIALIZATION_PCHCONTAINEROPERATIONS_H +#define LLVM_CLANG_SERIALIZATION_PCHCONTAINEROPERATIONS_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; +} + +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 llvm::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 llvm::StringRef getFormat() const = 0; + + /// Returns the serialized AST inside the PCH container Buffer. + virtual llvm::StringRef ExtractPCH(llvm::MemoryBufferRef Buffer) const = 0; +}; + +/// Implements write operations for a raw pass-through PCH container. +class RawPCHContainerWriter : public PCHContainerWriter { + llvm::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 { + llvm::StringRef getFormat() const override { return "raw"; } + + /// Simply returns the buffer contained in Buffer. + llvm::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(llvm::StringRef Format) { + return Writers[Format].get(); + } + const PCHContainerReader *getReaderOrNull(llvm::StringRef Format) { + return Readers[Format].get(); + } + const PCHContainerReader &getRawReader() { + return *getReaderOrNull("raw"); + } +}; + +} + +#endif diff --git a/clang/include/clang/module.modulemap b/clang/include/clang/module.modulemap index 1f6eacc..cbcb62e 100644 --- a/clang/include/clang/module.modulemap +++ b/clang/include/clang/module.modulemap @@ -103,9 +103,6 @@ module Clang_Frontend { textual header "Frontend/LangStandards.def" module * { export * } - - // FIXME: This violates layers. - exclude header "Frontend/PCHContainerOperations.h" } module Clang_FrontendTool { requires cplusplus umbrella "FrontendTool" module * { export * } } diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 05e47af..c7b2551 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -44,7 +44,6 @@ #include "clang/Frontend/FrontendDiagnostic.h" #include "clang/Frontend/FrontendOptions.h" #include "clang/Frontend/MultiplexConsumer.h" -#include "clang/Frontend/PCHContainerOperations.h" #include "clang/Frontend/PrecompiledPreamble.h" #include "clang/Frontend/Utils.h" #include "clang/Lex/HeaderSearch.h" @@ -63,6 +62,7 @@ #include "clang/Serialization/ASTWriter.h" #include "clang/Serialization/ContinuousRangeMap.h" #include "clang/Serialization/Module.h" +#include "clang/Serialization/PCHContainerOperations.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/IntrusiveRefCntPtr.h" diff --git a/clang/lib/Frontend/CMakeLists.txt b/clang/lib/Frontend/CMakeLists.txt index a207ccc..3bd1595 100644 --- a/clang/lib/Frontend/CMakeLists.txt +++ b/clang/lib/Frontend/CMakeLists.txt @@ -36,7 +36,6 @@ add_clang_library(clangFrontend LogDiagnosticPrinter.cpp ModuleDependencyCollector.cpp MultiplexConsumer.cpp - PCHContainerOperations.cpp PrecompiledPreamble.cpp PrintPreprocessedOutput.cpp SerializedDiagnosticPrinter.cpp diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 0147e3a..67ab601 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -61,7 +61,6 @@ #include "clang/Basic/TargetOptions.h" #include "clang/Basic/TokenKinds.h" #include "clang/Basic/Version.h" -#include "clang/Frontend/PCHContainerOperations.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/HeaderSearchOptions.h" #include "clang/Lex/MacroInfo.h" @@ -81,6 +80,7 @@ #include "clang/Serialization/Module.h" #include "clang/Serialization/ModuleFileExtension.h" #include "clang/Serialization/ModuleManager.h" +#include "clang/Serialization/PCHContainerOperations.h" #include "clang/Serialization/SerializationDiagnostic.h" #include "llvm/ADT/APFloat.h" #include "llvm/ADT/APInt.h" diff --git a/clang/lib/Serialization/CMakeLists.txt b/clang/lib/Serialization/CMakeLists.txt index 95b33c3..a312cb9 100644 --- a/clang/lib/Serialization/CMakeLists.txt +++ b/clang/lib/Serialization/CMakeLists.txt @@ -17,6 +17,7 @@ add_clang_library(clangSerialization Module.cpp ModuleFileExtension.cpp ModuleManager.cpp + PCHContainerOperations.cpp ADDITIONAL_HEADERS ASTCommon.h diff --git a/clang/lib/Serialization/GlobalModuleIndex.cpp b/clang/lib/Serialization/GlobalModuleIndex.cpp index 3733638..e7642a3 100644 --- a/clang/lib/Serialization/GlobalModuleIndex.cpp +++ b/clang/lib/Serialization/GlobalModuleIndex.cpp @@ -12,12 +12,12 @@ //===----------------------------------------------------------------------===// #include "ASTReaderInternals.h" -#include "clang/Frontend/PCHContainerOperations.h" #include "clang/Basic/FileManager.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Serialization/ASTBitCodes.h" #include "clang/Serialization/GlobalModuleIndex.h" #include "clang/Serialization/Module.h" +#include "clang/Serialization/PCHContainerOperations.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/MapVector.h" #include "llvm/ADT/SmallString.h" diff --git a/clang/lib/Serialization/ModuleManager.cpp b/clang/lib/Serialization/ModuleManager.cpp index 683ba8f..54e0c08 100644 --- a/clang/lib/Serialization/ModuleManager.cpp +++ b/clang/lib/Serialization/ModuleManager.cpp @@ -16,11 +16,11 @@ #include "clang/Basic/FileManager.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/MemoryBufferCache.h" -#include "clang/Frontend/PCHContainerOperations.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/ModuleMap.h" #include "clang/Serialization/GlobalModuleIndex.h" #include "clang/Serialization/Module.h" +#include "clang/Serialization/PCHContainerOperations.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" diff --git a/clang/lib/Frontend/PCHContainerOperations.cpp b/clang/lib/Serialization/PCHContainerOperations.cpp similarity index 94% rename from clang/lib/Frontend/PCHContainerOperations.cpp rename to clang/lib/Serialization/PCHContainerOperations.cpp index 340e8ce..fbc613e 100644 --- a/clang/lib/Frontend/PCHContainerOperations.cpp +++ b/clang/lib/Serialization/PCHContainerOperations.cpp @@ -1,4 +1,4 @@ -//===--- Frontend/PCHContainerOperations.cpp - PCH Containers ---*- C++ -*-===// +//=== Serialization/PCHContainerOperations.cpp - PCH Containers -*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "clang/Frontend/PCHContainerOperations.h" +#include "clang/Serialization/PCHContainerOperations.h" #include "clang/AST/ASTConsumer.h" #include "clang/Lex/ModuleLoader.h" #include "llvm/Bitcode/BitstreamReader.h" -- 2.7.4