r242499 - Make the clang module container format selectable from the command line.

Adrian Prantl aprantl at apple.com
Fri Jul 17 09:11:16 PDT 2015


I would recommend taking this commit into the 3.7 branch. It removes a dependency on CodeGen from clang-check and libclang and thus reduces the size of the derived binaries significantly.

-- adrian

> On Jul 16, 2015, at 6:19 PM, Adrian Prantl <aprantl at apple.com> wrote:
> 
> Author: adrian
> Date: Thu Jul 16 20:19:54 2015
> New Revision: 242499
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=242499&view=rev
> Log:
> Make the clang module container format selectable from the command line.
> - introduces a new cc1 option -fmodule-format=[raw,obj]
>  with 'raw' being the default
> - supports arbitrary module container formats that libclang is agnostic to
> - adds the format to the module hash to avoid collisions
> - splits the old PCHContainerOperations into PCHContainerWriter and
>  a PCHContainerReader.
> 
> Thanks to Richard Smith for reviewing this patch!
> 
> Modified:
>    cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td
>    cfe/trunk/include/clang/CodeGen/ObjectFilePCHContainerOperations.h
>    cfe/trunk/include/clang/Driver/CC1Options.td
>    cfe/trunk/include/clang/Frontend/ASTUnit.h
>    cfe/trunk/include/clang/Frontend/CompilerInstance.h
>    cfe/trunk/include/clang/Frontend/PCHContainerOperations.h
>    cfe/trunk/include/clang/Frontend/Utils.h
>    cfe/trunk/include/clang/Lex/HeaderSearchOptions.h
>    cfe/trunk/include/clang/Serialization/ASTReader.h
>    cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h
>    cfe/trunk/include/clang/Serialization/ModuleManager.h
>    cfe/trunk/include/clang/Tooling/Refactoring.h
>    cfe/trunk/include/clang/Tooling/Tooling.h
>    cfe/trunk/lib/ARCMigrate/ARCMT.cpp
>    cfe/trunk/lib/Basic/FileManager.cpp
>    cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp
>    cfe/trunk/lib/Frontend/ASTMerge.cpp
>    cfe/trunk/lib/Frontend/ASTUnit.cpp
>    cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp
>    cfe/trunk/lib/Frontend/CompilerInstance.cpp
>    cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>    cfe/trunk/lib/Frontend/FrontendAction.cpp
>    cfe/trunk/lib/Frontend/FrontendActions.cpp
>    cfe/trunk/lib/Frontend/InitPreprocessor.cpp
>    cfe/trunk/lib/Frontend/PCHContainerOperations.cpp
>    cfe/trunk/lib/Lex/HeaderSearch.cpp
>    cfe/trunk/lib/Serialization/ASTReader.cpp
>    cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp
>    cfe/trunk/lib/Serialization/ModuleManager.cpp
>    cfe/trunk/test/Modules/pch_container.m
>    cfe/trunk/tools/arcmt-test/arcmt-test.cpp
>    cfe/trunk/tools/clang-check/CMakeLists.txt
>    cfe/trunk/tools/clang-check/ClangCheck.cpp
>    cfe/trunk/tools/driver/cc1_main.cpp
>    cfe/trunk/tools/libclang/CIndex.cpp
>    cfe/trunk/tools/libclang/CIndexer.h
>    cfe/trunk/tools/libclang/CMakeLists.txt
>    cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h
> 
> Modified: cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td Thu Jul 16 20:19:54 2015
> @@ -195,6 +195,8 @@ def err_unable_to_make_temp : Error<
> 
> // Modules
> def err_module_file_conflict : Error<"module '%0' found in both '%1' and '%2'">;
> +def err_module_format_unhandled : Error<
> +  "no handler registered for module format '%0'">;
> 
> // TransformActions
> // TODO: Use a custom category name to distinguish rewriter errors.
> 
> Modified: cfe/trunk/include/clang/CodeGen/ObjectFilePCHContainerOperations.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/CodeGen/ObjectFilePCHContainerOperations.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/CodeGen/ObjectFilePCHContainerOperations.h (original)
> +++ cfe/trunk/include/clang/CodeGen/ObjectFilePCHContainerOperations.h Thu Jul 16 20:19:54 2015
> @@ -14,30 +14,32 @@
> 
> namespace clang {
> 
> -/// \brief A PCHContainerOperations implementation that uses LLVM to
> +/// A PCHContainerWriter implementation that uses LLVM to
> /// wraps Clang modules inside a COFF, ELF, or Mach-O container.
> -class ObjectFilePCHContainerOperations
> -  : public PCHContainerOperations {
> -  /// \brief Return an ASTConsumer that can be chained with a
> +class ObjectFilePCHContainerWriter : public PCHContainerWriter {
> +  StringRef getFormat() const override { return "obj"; }
> +
> +  /// Return an ASTConsumer that can be chained with a
>   /// PCHGenerator that produces a wrapper file format
>   /// that also contains full debug info for the module.
> -  std::unique_ptr<ASTConsumer>
> -    CreatePCHContainerGenerator(
> +  std::unique_ptr<ASTConsumer> CreatePCHContainerGenerator(
>       DiagnosticsEngine &Diags, const HeaderSearchOptions &HSO,
>       const PreprocessorOptions &PPO, const TargetOptions &TO,
>       const LangOptions &LO, const std::string &MainFileName,
>       const std::string &OutputFileName, llvm::raw_pwrite_stream *OS,
>       std::shared_ptr<PCHBuffer> Buffer) const override;
> +};
> +
> +/// A PCHContainerReader implementation that uses LLVM to
> +/// wraps Clang modules inside a COFF, ELF, or Mach-O container.
> +class ObjectFilePCHContainerReader : public PCHContainerReader {
> +  StringRef getFormat() const override { return "obj"; }
> 
> -  /// \brief Initialize an llvm::BitstreamReader with the serialized
> +  /// Initialize an llvm::BitstreamReader with the serialized
>   /// AST inside the PCH container Buffer.
>   void ExtractPCH(llvm::MemoryBufferRef Buffer,
>                   llvm::BitstreamReader &StreamFile) const override;
> -
> -
> };
> -
> }
> 
> -
> #endif
> 
> Modified: cfe/trunk/include/clang/Driver/CC1Options.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/CC1Options.td (original)
> +++ cfe/trunk/include/clang/Driver/CC1Options.td Thu Jul 16 20:19:54 2015
> @@ -369,6 +369,9 @@ def fmodules_local_submodule_visibility
>   Flag<["-"], "fmodules-local-submodule-visibility">,
>   HelpText<"Enforce name visibility rules across submodules of the same "
>            "top-level module.">;
> +def fmodule_format_EQ : Joined<["-"], "fmodule-format=">,
> +  HelpText<"Select the container format for clang modules and PCH. "
> +           "Supported options are 'raw' and 'obj'.">;
> def fno_modules_hide_internal_linkage :
>   Flag<["-"], "fno-modules-hide-internal-linkage">,
>   HelpText<"Make all declarations visible to redeclaration lookup, "
> 
> Modified: cfe/trunk/include/clang/Frontend/ASTUnit.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/ASTUnit.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/ASTUnit.h (original)
> +++ cfe/trunk/include/clang/Frontend/ASTUnit.h Thu Jul 16 20:19:54 2015
> @@ -57,6 +57,7 @@ class FileManager;
> class HeaderSearch;
> class Preprocessor;
> class PCHContainerOperations;
> +class PCHContainerReader;
> class SourceManager;
> class TargetInfo;
> class ASTFrontendAction;
> @@ -725,8 +726,7 @@ public:
>   ///
>   /// \returns - The initialized ASTUnit or null if the AST failed to load.
>   static std::unique_ptr<ASTUnit> LoadFromASTFile(
> -      const std::string &Filename,
> -      std::shared_ptr<PCHContainerOperations> PCHContainerOps,
> +      const std::string &Filename, const PCHContainerReader &PCHContainerRdr,
>       IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
>       const FileSystemOptions &FileSystemOpts, bool OnlyLocalDecls = false,
>       ArrayRef<RemappedFile> RemappedFiles = None,
> 
> Modified: cfe/trunk/include/clang/Frontend/CompilerInstance.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CompilerInstance.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/CompilerInstance.h (original)
> +++ cfe/trunk/include/clang/Frontend/CompilerInstance.h Thu Jul 16 20:19:54 2015
> @@ -183,7 +183,7 @@ class CompilerInstance : public ModuleLo
> public:
>   explicit CompilerInstance(
>       std::shared_ptr<PCHContainerOperations> PCHContainerOps =
> -          std::make_shared<RawPCHContainerOperations>(),
> +          std::make_shared<PCHContainerOperations>(),
>       bool BuildingModule = false);
>   ~CompilerInstance() override;
> 
> @@ -508,6 +508,34 @@ public:
>     return ThePCHContainerOperations;
>   }
> 
> +  /// Return the appropriate PCHContainerWriter depending on the
> +  /// current CodeGenOptions.
> +  const PCHContainerWriter &getPCHContainerWriter() const {
> +    assert(Invocation && "cannot determine module format without invocation");
> +    StringRef Format = getHeaderSearchOpts().ModuleFormat;
> +    auto *Writer = ThePCHContainerOperations->getWriterOrNull(Format);
> +    if (!Writer) {
> +      if (Diagnostics)
> +        Diagnostics->Report(diag::err_module_format_unhandled) << Format;
> +      llvm::report_fatal_error("unknown module format");
> +    }
> +    return *Writer;
> +  }
> +
> +  /// Return the appropriate PCHContainerReader depending on the
> +  /// current CodeGenOptions.
> +  const PCHContainerReader &getPCHContainerReader() const {
> +    assert(Invocation && "cannot determine module format without invocation");
> +    StringRef Format = getHeaderSearchOpts().ModuleFormat;
> +    auto *Reader = ThePCHContainerOperations->getReaderOrNull(Format);
> +    if (!Reader) {
> +      if (Diagnostics)
> +        Diagnostics->Report(diag::err_module_format_unhandled) << Format;
> +      llvm::report_fatal_error("unknown module format");
> +    }
> +    return *Reader;
> +  }
> +
>   /// }
>   /// @name Code Completion
>   /// {
> @@ -621,7 +649,7 @@ public:
>   static IntrusiveRefCntPtr<ASTReader> createPCHExternalASTSource(
>       StringRef Path, StringRef Sysroot, bool DisablePCHValidation,
>       bool AllowPCHWithCompilerErrors, Preprocessor &PP, ASTContext &Context,
> -      const PCHContainerOperations &PCHContainerOps,
> +      const PCHContainerReader &PCHContainerRdr,
>       void *DeserializationListener, bool OwnDeserializationListener,
>       bool Preamble, bool UseGlobalModuleIndex);
> 
> 
> Modified: cfe/trunk/include/clang/Frontend/PCHContainerOperations.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/PCHContainerOperations.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/PCHContainerOperations.h (original)
> +++ cfe/trunk/include/clang/Frontend/PCHContainerOperations.h Thu Jul 16 20:19:54 2015
> @@ -11,6 +11,7 @@
> #define LLVM_CLANG_PCH_CONTAINER_OPERATIONS_H
> 
> #include "llvm/ADT/SmallVector.h"
> +#include "llvm/ADT/StringMap.h"
> #include "llvm/Support/MemoryBuffer.h"
> #include <memory>
> 
> @@ -19,6 +20,8 @@ class raw_pwrite_stream;
> class BitstreamReader;
> }
> 
> +using llvm::StringRef;
> +
> namespace clang {
> 
> class ASTConsumer;
> @@ -33,14 +36,16 @@ struct PCHBuffer {
>   bool IsComplete;
>   llvm::SmallVector<char, 0> Data;
> };
> +  
> +/// 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;
> 
> -/// \brief This abstract interface provides operations for creating
> -/// and unwrapping containers for serialized ASTs (precompiled headers
> -/// and clang modules).
> -class PCHContainerOperations {
> -public:
> -  virtual ~PCHContainerOperations();
> -  /// \brief Return an ASTConsumer that can be chained with a
> +  /// 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<ASTConsumer> CreatePCHContainerGenerator(
> @@ -49,16 +54,28 @@ public:
>       const LangOptions &LO, const std::string &MainFileName,
>       const std::string &OutputFileName, llvm::raw_pwrite_stream *OS,
>       std::shared_ptr<PCHBuffer> Buffer) const = 0;
> +};
> 
> -  /// \brief Initialize an llvm::BitstreamReader with the serialized AST inside
> +/// 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;
> +
> +  /// Initialize an llvm::BitstreamReader with the serialized AST inside
>   /// the PCH container Buffer.
>   virtual void ExtractPCH(llvm::MemoryBufferRef Buffer,
>                           llvm::BitstreamReader &StreamFile) const = 0;
> };
> 
> -/// \brief Implements a raw pass-through PCH container.
> -class RawPCHContainerOperations : public PCHContainerOperations {
> -  /// \brief Return an ASTConsumer that can be chained with a
> +/// 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<ASTConsumer> CreatePCHContainerGenerator(
>       DiagnosticsEngine &Diags, const HeaderSearchOptions &HSO,
> @@ -66,11 +83,42 @@ class RawPCHContainerOperations : public
>       const LangOptions &LO, const std::string &MainFileName,
>       const std::string &OutputFileName, llvm::raw_pwrite_stream *OS,
>       std::shared_ptr<PCHBuffer> Buffer) const override;
> +};
> 
> -  /// \brief Initialize an llvm::BitstreamReader with Buffer.
> +/// Implements read operations for a raw pass-through PCH container.
> +class RawPCHContainerReader : public PCHContainerReader {
> +  StringRef getFormat() const override { return "raw"; }
> +
> +  /// Initialize an llvm::BitstreamReader with Buffer.
>   void ExtractPCH(llvm::MemoryBufferRef Buffer,
>                   llvm::BitstreamReader &StreamFile) const override;
> };
> +
> +/// A registry of PCHContainerWriter and -Reader objects for different formats.
> +class PCHContainerOperations {
> +  llvm::StringMap<std::unique_ptr<PCHContainerWriter>> Writers;
> +  llvm::StringMap<std::unique_ptr<PCHContainerReader>> Readers;
> +public:
> +  /// Automatically registers a RawPCHContainerWriter and
> +  /// RawPCHContainerReader.
> +  PCHContainerOperations();
> +  void registerWriter(std::unique_ptr<PCHContainerWriter> Writer) {
> +    Writers[Writer->getFormat()] = std::move(Writer);
> +  }
> +  void registerReader(std::unique_ptr<PCHContainerReader> 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
> 
> Modified: cfe/trunk/include/clang/Frontend/Utils.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/Utils.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/Utils.h (original)
> +++ cfe/trunk/include/clang/Frontend/Utils.h Thu Jul 16 20:19:54 2015
> @@ -45,7 +45,7 @@ class HeaderSearch;
> class HeaderSearchOptions;
> class IdentifierTable;
> class LangOptions;
> -class PCHContainerOperations;
> +class PCHContainerReader;
> class Preprocessor;
> class PreprocessorOptions;
> class PreprocessorOutputOptions;
> @@ -63,7 +63,7 @@ void ApplyHeaderSearchOptions(HeaderSear
> /// InitializePreprocessor - Initialize the preprocessor getting it and the
> /// environment ready to process a single file.
> void InitializePreprocessor(Preprocessor &PP, const PreprocessorOptions &PPOpts,
> -                            const PCHContainerOperations &PCHContainerOps,
> +                            const PCHContainerReader &PCHContainerRdr,
>                             const FrontendOptions &FEOpts);
> 
> /// DoPrintPreprocessedInput - Implement -E mode.
> 
> Modified: cfe/trunk/include/clang/Lex/HeaderSearchOptions.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearchOptions.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/HeaderSearchOptions.h (original)
> +++ cfe/trunk/include/clang/Lex/HeaderSearchOptions.h Thu Jul 16 20:19:54 2015
> @@ -92,6 +92,9 @@ public:
>   /// \brief The directory used for a user build.
>   std::string ModuleUserBuildPath;
> 
> +  /// The module/pch container format.
> +  std::string ModuleFormat;
> +
>   /// \brief Whether we should disable the use of the hash string within the
>   /// module cache.
>   ///
> @@ -167,16 +170,14 @@ public:
> 
> public:
>   HeaderSearchOptions(StringRef _Sysroot = "/")
> -    : Sysroot(_Sysroot), DisableModuleHash(0), ImplicitModuleMaps(0),
> -      ModuleMapFileHomeIsCwd(0),
> -      ModuleCachePruneInterval(7*24*60*60),
> -      ModuleCachePruneAfter(31*24*60*60),
> -      BuildSessionTimestamp(0),
> -      UseBuiltinIncludes(true),
> -      UseStandardSystemIncludes(true), UseStandardCXXIncludes(true),
> -      UseLibcxx(false), Verbose(false),
> -      ModulesValidateOncePerBuildSession(false),
> -      ModulesValidateSystemHeaders(false) {}
> +      : Sysroot(_Sysroot), ModuleFormat("raw"), DisableModuleHash(0),
> +        ImplicitModuleMaps(0), ModuleMapFileHomeIsCwd(0),
> +        ModuleCachePruneInterval(7 * 24 * 60 * 60),
> +        ModuleCachePruneAfter(31 * 24 * 60 * 60), BuildSessionTimestamp(0),
> +        UseBuiltinIncludes(true), UseStandardSystemIncludes(true),
> +        UseStandardCXXIncludes(true), UseLibcxx(false), Verbose(false),
> +        ModulesValidateOncePerBuildSession(false),
> +        ModulesValidateSystemHeaders(false) {}
> 
>   /// AddPath - Add the \p Path path to the specified \p Group list.
>   void AddPath(StringRef Path, frontend::IncludeDirGroup Group,
> 
> Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTReader.h Thu Jul 16 20:19:54 2015
> @@ -362,7 +362,7 @@ private:
> 
>   SourceManager &SourceMgr;
>   FileManager &FileMgr;
> -  const PCHContainerOperations &PCHContainerOps;
> +  const PCHContainerReader &PCHContainerRdr;
>   DiagnosticsEngine &Diags;
> 
>   /// \brief The semantic analysis object that will be processing the
> @@ -1289,7 +1289,7 @@ public:
>   /// \param ReadTimer If non-null, a timer used to track the time spent
>   /// deserializing.
>   ASTReader(Preprocessor &PP, ASTContext &Context,
> -            const PCHContainerOperations &PCHContainerOps,
> +            const PCHContainerReader &PCHContainerRdr,
>             StringRef isysroot = "", bool DisableValidation = false,
>             bool AllowASTWithCompilerErrors = false,
>             bool AllowConfigurationMismatch = false,
> @@ -1458,7 +1458,7 @@ public:
>   /// the AST file, without actually loading the AST file.
>   static std::string
>   getOriginalSourceFile(const std::string &ASTFileName, FileManager &FileMgr,
> -                        const PCHContainerOperations &PCHContainerOps,
> +                        const PCHContainerReader &PCHContainerRdr,
>                         DiagnosticsEngine &Diags);
> 
>   /// \brief Read the control block for the named AST file.
> @@ -1466,13 +1466,13 @@ public:
>   /// \returns true if an error occurred, false otherwise.
>   static bool
>   readASTFileControlBlock(StringRef Filename, FileManager &FileMgr,
> -                          const PCHContainerOperations &PCHContainerOps,
> +                          const PCHContainerReader &PCHContainerRdr,
>                           ASTReaderListener &Listener);
> 
>   /// \brief Determine whether the given AST file is acceptable to load into a
>   /// translation unit with the given language and target options.
>   static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
> -                                  const PCHContainerOperations &PCHContainerOps,
> +                                  const PCHContainerReader &PCHContainerRdr,
>                                   const LangOptions &LangOpts,
>                                   const TargetOptions &TargetOpts,
>                                   const PreprocessorOptions &PPOpts,
> 
> Modified: cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h (original)
> +++ cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h Thu Jul 16 20:19:54 2015
> @@ -198,10 +198,9 @@ public:
>   /// \param Path The path to the directory containing module files, into
>   /// which the global index will be written.
>   static ErrorCode writeIndex(FileManager &FileMgr,
> -                              const PCHContainerOperations &PCHContainerOps,
> +                              const PCHContainerReader &PCHContainerRdr,
>                               StringRef Path);
> };
> -
> }
> 
> #endif
> 
> Modified: cfe/trunk/include/clang/Serialization/ModuleManager.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ModuleManager.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ModuleManager.h (original)
> +++ cfe/trunk/include/clang/Serialization/ModuleManager.h Thu Jul 16 20:19:54 2015
> @@ -24,7 +24,7 @@ namespace clang {
> 
> class GlobalModuleIndex;
> class ModuleMap;
> -class PCHContainerOperations;
> +class PCHContainerReader;
> 
> namespace serialization {
> 
> @@ -52,7 +52,7 @@ class ModuleManager {
>   FileManager &FileMgr;
> 
>   /// \brief Knows how to unwrap module containers.
> -  const PCHContainerOperations &PCHContainerOps;
> +  const PCHContainerReader &PCHContainerRdr;
> 
>   /// \brief A lookup of in-memory (virtual file) buffers
>   llvm::DenseMap<const FileEntry *, std::unique_ptr<llvm::MemoryBuffer>>
> @@ -118,9 +118,9 @@ public:
>   typedef std::pair<uint32_t, StringRef> ModuleOffset;
> 
>   explicit ModuleManager(FileManager &FileMgr,
> -                         const PCHContainerOperations &PCHContainerOps);
> +                         const PCHContainerReader &PCHContainerRdr);
>   ~ModuleManager();
> -  
> +
>   /// \brief Forward iterator to traverse all loaded modules.  This is reverse
>   /// source-order.
>   ModuleIterator begin() { return Chain.begin(); }
> 
> Modified: cfe/trunk/include/clang/Tooling/Refactoring.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Tooling/Refactoring.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Tooling/Refactoring.h (original)
> +++ cfe/trunk/include/clang/Tooling/Refactoring.h Thu Jul 16 20:19:54 2015
> @@ -40,7 +40,7 @@ public:
>   RefactoringTool(const CompilationDatabase &Compilations,
>                   ArrayRef<std::string> SourcePaths,
>                   std::shared_ptr<PCHContainerOperations> PCHContainerOps =
> -                      std::make_shared<RawPCHContainerOperations>());
> +                      std::make_shared<PCHContainerOperations>());
> 
>   /// \brief Returns the set of replacements to which replacements should
>   /// be added during the run of the tool.
> 
> Modified: cfe/trunk/include/clang/Tooling/Tooling.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Tooling/Tooling.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Tooling/Tooling.h (original)
> +++ cfe/trunk/include/clang/Tooling/Tooling.h Thu Jul 16 20:19:54 2015
> @@ -150,7 +150,7 @@ inline std::unique_ptr<FrontendActionFac
> bool runToolOnCode(clang::FrontendAction *ToolAction, const Twine &Code,
>                    const Twine &FileName = "input.cc",
>                    std::shared_ptr<PCHContainerOperations> PCHContainerOps =
> -                       std::make_shared<RawPCHContainerOperations>());
> +                       std::make_shared<PCHContainerOperations>());
> 
> /// The first part of the pair is the filename, the second part the
> /// file-content.
> @@ -171,7 +171,7 @@ bool runToolOnCodeWithArgs(
>     clang::FrontendAction *ToolAction, const Twine &Code,
>     const std::vector<std::string> &Args, const Twine &FileName = "input.cc",
>     std::shared_ptr<PCHContainerOperations> PCHContainerOps =
> -        std::make_shared<RawPCHContainerOperations>(),
> +        std::make_shared<PCHContainerOperations>(),
>     const FileContentMappings &VirtualMappedFiles = FileContentMappings());
> 
> /// \brief Builds an AST for 'Code'.
> @@ -185,7 +185,7 @@ bool runToolOnCodeWithArgs(
> std::unique_ptr<ASTUnit>
> buildASTFromCode(const Twine &Code, const Twine &FileName = "input.cc",
>                  std::shared_ptr<PCHContainerOperations> PCHContainerOps =
> -                     std::make_shared<RawPCHContainerOperations>());
> +                     std::make_shared<PCHContainerOperations>());
> 
> /// \brief Builds an AST for 'Code' with additional flags.
> ///
> @@ -200,7 +200,7 @@ std::unique_ptr<ASTUnit> buildASTFromCod
>     const Twine &Code, const std::vector<std::string> &Args,
>     const Twine &FileName = "input.cc",
>     std::shared_ptr<PCHContainerOperations> PCHContainerOps =
> -        std::make_shared<RawPCHContainerOperations>());
> +        std::make_shared<PCHContainerOperations>());
> 
> /// \brief Utility to run a FrontendAction in a single clang invocation.
> class ToolInvocation {
> @@ -219,7 +219,7 @@ public:
>   ToolInvocation(std::vector<std::string> CommandLine, FrontendAction *FAction,
>                  FileManager *Files,
>                  std::shared_ptr<PCHContainerOperations> PCHContainerOps =
> -                     std::make_shared<RawPCHContainerOperations>());
> +                     std::make_shared<PCHContainerOperations>());
> 
>   /// \brief Create a tool invocation.
>   ///
> @@ -288,7 +288,7 @@ class ClangTool {
>   ClangTool(const CompilationDatabase &Compilations,
>             ArrayRef<std::string> SourcePaths,
>             std::shared_ptr<PCHContainerOperations> PCHContainerOps =
> -                std::make_shared<RawPCHContainerOperations>());
> +                std::make_shared<PCHContainerOperations>());
> 
>   ~ClangTool();
> 
> 
> Modified: cfe/trunk/lib/ARCMigrate/ARCMT.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ARCMT.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/ARCMigrate/ARCMT.cpp (original)
> +++ cfe/trunk/lib/ARCMigrate/ARCMT.cpp Thu Jul 16 20:19:54 2015
> @@ -167,7 +167,7 @@ static bool HasARCRuntime(CompilerInvoca
> 
> static CompilerInvocation *
> createInvocationForMigration(CompilerInvocation &origCI,
> -                             const PCHContainerOperations &PCHContainerOps) {
> +                             const PCHContainerReader &PCHContainerRdr) {
>   std::unique_ptr<CompilerInvocation> CInvok;
>   CInvok.reset(new CompilerInvocation(origCI));
>   PreprocessorOptions &PPOpts = CInvok->getPreprocessorOpts();
> @@ -180,7 +180,7 @@ createInvocationForMigration(CompilerInv
>         new DiagnosticsEngine(DiagID, &origCI.getDiagnosticOpts(),
>                               new IgnoringDiagConsumer()));
>     std::string OriginalFile = ASTReader::getOriginalSourceFile(
> -        PPOpts.ImplicitPCHInclude, FileMgr, PCHContainerOps, *Diags);
> +        PPOpts.ImplicitPCHInclude, FileMgr, PCHContainerRdr, *Diags);
>     if (!OriginalFile.empty())
>       PPOpts.Includes.insert(PPOpts.Includes.begin(), OriginalFile);
>     PPOpts.ImplicitPCHInclude.clear();
> @@ -247,7 +247,8 @@ bool arcmt::checkForManualIssues(
>   assert(!transforms.empty());
> 
>   std::unique_ptr<CompilerInvocation> CInvok;
> -  CInvok.reset(createInvocationForMigration(origCI, *PCHContainerOps));
> +  CInvok.reset(
> +      createInvocationForMigration(origCI, PCHContainerOps->getRawReader()));
>   CInvok->getFrontendOpts().Inputs.clear();
>   CInvok->getFrontendOpts().Inputs.push_back(Input);
> 
> @@ -517,7 +518,8 @@ MigrationProcess::MigrationProcess(
> bool MigrationProcess::applyTransform(TransformFn trans,
>                                       RewriteListener *listener) {
>   std::unique_ptr<CompilerInvocation> CInvok;
> -  CInvok.reset(createInvocationForMigration(OrigCI, *PCHContainerOps));
> +  CInvok.reset(
> +      createInvocationForMigration(OrigCI, PCHContainerOps->getRawReader()));
>   CInvok->getDiagnosticOpts().IgnoreWarnings = true;
> 
>   Remapper.applyMappings(CInvok->getPreprocessorOpts());
> 
> Modified: cfe/trunk/lib/Basic/FileManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/FileManager.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/FileManager.cpp (original)
> +++ cfe/trunk/lib/Basic/FileManager.cpp Thu Jul 16 20:19:54 2015
> @@ -587,4 +587,6 @@ void FileManager::PrintStats() const {
>   //llvm::errs() << PagesMapped << BytesOfPagesMapped << FSLookups;
> }
> 
> -PCHContainerOperations::~PCHContainerOperations() {}
> +// Virtual destructors for abstract base classes that need live in Basic.
> +PCHContainerWriter::~PCHContainerWriter() {}
> +PCHContainerReader::~PCHContainerReader() {}
> 
> Modified: cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp (original)
> +++ cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp Thu Jul 16 20:19:54 2015
> @@ -156,7 +156,7 @@ public:
> } // namespace
> 
> std::unique_ptr<ASTConsumer>
> -ObjectFilePCHContainerOperations::CreatePCHContainerGenerator(
> +ObjectFilePCHContainerWriter::CreatePCHContainerGenerator(
>     DiagnosticsEngine &Diags, const HeaderSearchOptions &HSO,
>     const PreprocessorOptions &PPO, const TargetOptions &TO,
>     const LangOptions &LO, const std::string &MainFileName,
> @@ -166,7 +166,7 @@ ObjectFilePCHContainerOperations::Create
>       Diags, HSO, PPO, TO, LO, MainFileName, OutputFileName, OS, Buffer);
> }
> 
> -void ObjectFilePCHContainerOperations::ExtractPCH(
> +void ObjectFilePCHContainerReader::ExtractPCH(
>     llvm::MemoryBufferRef Buffer, llvm::BitstreamReader &StreamFile) const {
>   if (auto OF = llvm::object::ObjectFile::createObjectFile(Buffer)) {
>     auto *Obj = OF.get().get();
> 
> Modified: cfe/trunk/lib/Frontend/ASTMerge.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTMerge.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ASTMerge.cpp (original)
> +++ cfe/trunk/lib/Frontend/ASTMerge.cpp Thu Jul 16 20:19:54 2015
> @@ -46,7 +46,7 @@ void ASTMergeAction::ExecuteAction() {
>                                           *CI.getDiagnostics().getClient()),
>                                     /*ShouldOwnClient=*/true));
>     std::unique_ptr<ASTUnit> Unit =
> -        ASTUnit::LoadFromASTFile(ASTFiles[I], CI.getPCHContainerOperations(),
> +        ASTUnit::LoadFromASTFile(ASTFiles[I], CI.getPCHContainerReader(),
>                                  Diags, CI.getFileSystemOpts(), false);
> 
>     if (!Unit)
> 
> Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
> +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Thu Jul 16 20:19:54 2015
> @@ -650,7 +650,7 @@ void ASTUnit::ConfigureDiags(IntrusiveRe
> 
> std::unique_ptr<ASTUnit> ASTUnit::LoadFromASTFile(
>     const std::string &Filename,
> -    std::shared_ptr<PCHContainerOperations> PCHContainerOps,
> +    const PCHContainerReader &PCHContainerRdr,
>     IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
>     const FileSystemOptions &FileSystemOpts, bool OnlyLocalDecls,
>     ArrayRef<RemappedFile> RemappedFiles, bool CaptureDiagnostics,
> @@ -676,7 +676,7 @@ std::unique_ptr<ASTUnit> ASTUnit::LoadFr
>                                      AST->getFileManager(),
>                                      UserFilesAreVolatile);
>   AST->HSOpts = new HeaderSearchOptions();
> -
> +  AST->HSOpts->ModuleFormat = PCHContainerRdr.getFormat();
>   AST->HeaderInfo.reset(new HeaderSearch(AST->HSOpts,
>                                          AST->getSourceManager(),
>                                          AST->getDiagnostics(),
> @@ -708,7 +708,7 @@ std::unique_ptr<ASTUnit> ASTUnit::LoadFr
>   bool disableValid = false;
>   if (::getenv("LIBCLANG_DISABLE_PCH_VALIDATION"))
>     disableValid = true;
> -  AST->Reader = new ASTReader(PP, Context, *PCHContainerOps,
> +  AST->Reader = new ASTReader(PP, Context, PCHContainerRdr,
>                               /*isysroot=*/"",
>                               /*DisableValidation=*/disableValid,
>                               AllowPCHWithCompilerErrors);
> 
> Modified: cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp (original)
> +++ cfe/trunk/lib/Frontend/ChainedIncludesSource.cpp Thu Jul 16 20:19:54 2015
> @@ -81,7 +81,7 @@ createASTReader(CompilerInstance &CI, St
>   Preprocessor &PP = CI.getPreprocessor();
>   std::unique_ptr<ASTReader> Reader;
>   Reader.reset(new ASTReader(PP, CI.getASTContext(),
> -                             *CI.getPCHContainerOperations(),
> +                             CI.getPCHContainerReader(),
>                              /*isysroot=*/"", /*DisableValidation=*/true));
>   for (unsigned ti = 0; ti < bufNames.size(); ++ti) {
>     StringRef sr(bufNames[ti]);
> 
> Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Thu Jul 16 20:19:54 2015
> @@ -322,7 +322,7 @@ void CompilerInstance::createPreprocesso
>                           PP->getFileManager(), PPOpts);
> 
>   // Predefine macros and configure the preprocessor.
> -  InitializePreprocessor(*PP, PPOpts, *getPCHContainerOperations(),
> +  InitializePreprocessor(*PP, PPOpts, getPCHContainerReader(),
>                          getFrontendOpts());
> 
>   // Initialize the header search object.
> @@ -399,7 +399,7 @@ void CompilerInstance::createPCHExternal
>   ModuleManager = createPCHExternalASTSource(
>       Path, getHeaderSearchOpts().Sysroot, DisablePCHValidation,
>       AllowPCHWithCompilerErrors, getPreprocessor(), getASTContext(),
> -      *getPCHContainerOperations(), DeserializationListener,
> +      getPCHContainerReader(), DeserializationListener,
>       OwnDeserializationListener, Preamble,
>       getFrontendOpts().UseGlobalModuleIndex);
> }
> @@ -407,13 +407,13 @@ void CompilerInstance::createPCHExternal
> IntrusiveRefCntPtr<ASTReader> CompilerInstance::createPCHExternalASTSource(
>     StringRef Path, StringRef Sysroot, bool DisablePCHValidation,
>     bool AllowPCHWithCompilerErrors, Preprocessor &PP, ASTContext &Context,
> -    const PCHContainerOperations &PCHContainerOps,
> +    const PCHContainerReader &PCHContainerRdr,
>     void *DeserializationListener, bool OwnDeserializationListener,
>     bool Preamble, bool UseGlobalModuleIndex) {
>   HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
> 
>   IntrusiveRefCntPtr<ASTReader> Reader(new ASTReader(
> -      PP, Context, PCHContainerOps, Sysroot.empty() ? "" : Sysroot.data(),
> +      PP, Context, PCHContainerRdr, Sysroot.empty() ? "" : Sysroot.data(),
>       DisablePCHValidation, AllowPCHWithCompilerErrors,
>       /*AllowConfigurationMismatch*/ false, HSOpts.ModulesValidateSystemHeaders,
>       UseGlobalModuleIndex));
> @@ -1244,7 +1244,7 @@ void CompilerInstance::createModuleManag
>       ReadTimer = llvm::make_unique<llvm::Timer>("Reading modules",
>                                                  *FrontendTimerGroup);
>     ModuleManager = new ASTReader(
> -        getPreprocessor(), *Context, *getPCHContainerOperations(),
> +        getPreprocessor(), *Context, getPCHContainerReader(),
>         Sysroot.empty() ? "" : Sysroot.c_str(), PPOpts.DisablePCHValidation,
>         /*AllowASTWithCompilerErrors=*/false,
>         /*AllowConfigurationMismatch=*/false,
> @@ -1296,7 +1296,7 @@ bool CompilerInstance::loadModuleFile(St
>       ModuleFileStack.push_back(FileName);
>       ModuleNameStack.push_back(StringRef());
>       if (ASTReader::readASTFileControlBlock(FileName, CI.getFileManager(),
> -                                             *CI.getPCHContainerOperations(),
> +                                             CI.getPCHContainerReader(),
>                                              *this)) {
>         CI.getDiagnostics().Report(
>             SourceLocation(), CI.getFileManager().getBufferForFile(FileName)
> @@ -1667,7 +1667,7 @@ GlobalModuleIndex *CompilerInstance::loa
>     llvm::sys::fs::create_directories(
>       getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
>     GlobalModuleIndex::writeIndex(
> -        getFileManager(), *getPCHContainerOperations(),
> +        getFileManager(), getPCHContainerReader(),
>         getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
>     ModuleManager->resetForReload();
>     ModuleManager->loadGlobalIndex();
> @@ -1695,7 +1695,7 @@ GlobalModuleIndex *CompilerInstance::loa
>     }
>     if (RecreateIndex) {
>       GlobalModuleIndex::writeIndex(
> -          getFileManager(), *getPCHContainerOperations(),
> +          getFileManager(), getPCHContainerReader(),
>           getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
>       ModuleManager->resetForReload();
>       ModuleManager->loadGlobalIndex();
> 
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Jul 16 20:19:54 2015
> @@ -1112,6 +1112,8 @@ static void ParseHeaderSearchArgs(Header
>       getLastArgUInt64Value(Args, OPT_fbuild_session_timestamp, 0);
>   Opts.ModulesValidateSystemHeaders =
>       Args.hasArg(OPT_fmodules_validate_system_headers);
> +  if (const Arg *A = Args.getLastArg(OPT_fmodule_format_EQ))
> +    Opts.ModuleFormat = A->getValue();
> 
>   for (const Arg *A : Args.filtered(OPT_fmodules_ignore_macro)) {
>     StringRef MacroDef = A->getValue();
> 
> Modified: cfe/trunk/lib/Frontend/FrontendAction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendAction.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/FrontendAction.cpp (original)
> +++ cfe/trunk/lib/Frontend/FrontendAction.cpp Thu Jul 16 20:19:54 2015
> @@ -191,7 +191,7 @@ bool FrontendAction::BeginSourceFile(Com
>     IntrusiveRefCntPtr<DiagnosticsEngine> Diags(&CI.getDiagnostics());
> 
>     std::unique_ptr<ASTUnit> AST =
> -        ASTUnit::LoadFromASTFile(InputFile, CI.getPCHContainerOperations(),
> +        ASTUnit::LoadFromASTFile(InputFile, CI.getPCHContainerReader(),
>                                  Diags, CI.getFileSystemOpts());
> 
>     if (!AST)
> @@ -273,7 +273,7 @@ bool FrontendAction::BeginSourceFile(Com
>            Dir != DirEnd && !EC; Dir.increment(EC)) {
>         // Check whether this is an acceptable AST file.
>         if (ASTReader::isAcceptableASTFile(
> -                Dir->path(), FileMgr, *CI.getPCHContainerOperations(),
> +                Dir->path(), FileMgr, CI.getPCHContainerReader(),
>                 CI.getLangOpts(), CI.getTargetOpts(), CI.getPreprocessorOpts(),
>                 SpecificModuleCachePath)) {
>           PPOpts.ImplicitPCHInclude = Dir->path();
> @@ -443,7 +443,7 @@ bool FrontendAction::Execute() {
>   if (CI.shouldBuildGlobalModuleIndex() && CI.hasFileManager() &&
>       CI.hasPreprocessor()) {
>     GlobalModuleIndex::writeIndex(
> -        CI.getFileManager(), *CI.getPCHContainerOperations(),
> +        CI.getFileManager(), CI.getPCHContainerReader(),
>         CI.getPreprocessor().getHeaderSearchInfo().getModuleCachePath());
>   }
> 
> 
> Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)
> +++ cfe/trunk/lib/Frontend/FrontendActions.cpp Thu Jul 16 20:19:54 2015
> @@ -93,7 +93,7 @@ GeneratePCHAction::CreateASTConsumer(Com
>   Consumers.push_back(llvm::make_unique<PCHGenerator>(
>       CI.getPreprocessor(), OutputFile, nullptr, Sysroot, Buffer));
>   Consumers.push_back(
> -      CI.getPCHContainerOperations()->CreatePCHContainerGenerator(
> +      CI.getPCHContainerWriter().CreatePCHContainerGenerator(
>           CI.getDiagnostics(), CI.getHeaderSearchOpts(),
>           CI.getPreprocessorOpts(), CI.getTargetOpts(), CI.getLangOpts(),
>           InFile, OutputFile, OS, Buffer));
> @@ -139,7 +139,7 @@ GenerateModuleAction::CreateASTConsumer(
>   Consumers.push_back(llvm::make_unique<PCHGenerator>(
>       CI.getPreprocessor(), OutputFile, Module, Sysroot, Buffer));
>   Consumers.push_back(
> -      CI.getPCHContainerOperations()->CreatePCHContainerGenerator(
> +      CI.getPCHContainerWriter().CreatePCHContainerGenerator(
>           CI.getDiagnostics(), CI.getHeaderSearchOpts(),
>           CI.getPreprocessorOpts(), CI.getTargetOpts(), CI.getLangOpts(),
>           InFile, OutputFile, OS, Buffer));
> @@ -415,7 +415,7 @@ void VerifyPCHAction::ExecuteAction() {
>   bool Preamble = CI.getPreprocessorOpts().PrecompiledPreambleBytes.first != 0;
>   const std::string &Sysroot = CI.getHeaderSearchOpts().Sysroot;
>   std::unique_ptr<ASTReader> Reader(new ASTReader(
> -      CI.getPreprocessor(), CI.getASTContext(), *CI.getPCHContainerOperations(),
> +      CI.getPreprocessor(), CI.getASTContext(), CI.getPCHContainerReader(),
>       Sysroot.empty() ? "" : Sysroot.c_str(),
>       /*DisableValidation*/ false,
>       /*AllowPCHWithCompilerErrors*/ false,
> @@ -578,7 +578,7 @@ void DumpModuleInfoAction::ExecuteAction
>   DumpModuleInfoListener Listener(Out);
>   ASTReader::readASTFileControlBlock(
>       getCurrentFile(), getCompilerInstance().getFileManager(),
> -      *getCompilerInstance().getPCHContainerOperations(), Listener);
> +      getCompilerInstance().getPCHContainerReader(), Listener);
> }
> 
> //===----------------------------------------------------------------------===//
> 
> Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original)
> +++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Thu Jul 16 20:19:54 2015
> @@ -97,11 +97,11 @@ static void AddImplicitIncludePTH(MacroB
> /// \brief Add an implicit \#include using the original file used to generate
> /// a PCH file.
> static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP,
> -                                  const PCHContainerOperations &PCHContainerOps,
> +                                  const PCHContainerReader &PCHContainerRdr,
>                                   StringRef ImplicitIncludePCH) {
>   std::string OriginalFile =
>       ASTReader::getOriginalSourceFile(ImplicitIncludePCH, PP.getFileManager(),
> -                                       PCHContainerOps, PP.getDiagnostics());
> +                                       PCHContainerRdr, PP.getDiagnostics());
>   if (OriginalFile.empty())
>     return;
> 
> @@ -902,7 +902,7 @@ static void InitializePredefinedMacros(c
> ///
> void clang::InitializePreprocessor(
>     Preprocessor &PP, const PreprocessorOptions &InitOpts,
> -    const PCHContainerOperations &PCHContainerOps,
> +    const PCHContainerReader &PCHContainerRdr,
>     const FrontendOptions &FEOpts) {
>   const LangOptions &LangOpts = PP.getLangOpts();
>   std::string PredefineBuffer;
> @@ -962,7 +962,7 @@ void clang::InitializePreprocessor(
> 
>   // Process -include-pch/-include-pth directives.
>   if (!InitOpts.ImplicitPCHInclude.empty())
> -    AddImplicitIncludePCH(Builder, PP, PCHContainerOps,
> +    AddImplicitIncludePCH(Builder, PP, PCHContainerRdr,
>                           InitOpts.ImplicitPCHInclude);
>   if (!InitOpts.ImplicitPTHInclude.empty())
>     AddImplicitIncludePTH(Builder, PP, InitOpts.ImplicitPTHInclude);
> 
> Modified: cfe/trunk/lib/Frontend/PCHContainerOperations.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHContainerOperations.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/PCHContainerOperations.cpp (original)
> +++ cfe/trunk/lib/Frontend/PCHContainerOperations.cpp Thu Jul 16 20:19:54 2015
> @@ -21,21 +21,22 @@ using namespace clang;
> namespace {
> 
> /// \brief A PCHContainerGenerator that writes out the PCH to a flat file.
> -class PCHContainerGenerator : public ASTConsumer {
> +class RawPCHContainerGenerator : public ASTConsumer {
>   std::shared_ptr<PCHBuffer> Buffer;
>   raw_pwrite_stream *OS;
> 
> public:
> -  PCHContainerGenerator(DiagnosticsEngine &Diags,
> -                        const HeaderSearchOptions &HSO,
> -                        const PreprocessorOptions &PPO, const TargetOptions &TO,
> -                        const LangOptions &LO, const std::string &MainFileName,
> -                        const std::string &OutputFileName,
> -                        llvm::raw_pwrite_stream *OS,
> -                        std::shared_ptr<PCHBuffer> Buffer)
> +  RawPCHContainerGenerator(DiagnosticsEngine &Diags,
> +                           const HeaderSearchOptions &HSO,
> +                           const PreprocessorOptions &PPO,
> +                           const TargetOptions &TO, const LangOptions &LO,
> +                           const std::string &MainFileName,
> +                           const std::string &OutputFileName,
> +                           llvm::raw_pwrite_stream *OS,
> +                           std::shared_ptr<PCHBuffer> Buffer)
>       : Buffer(Buffer), OS(OS) {}
> 
> -  virtual ~PCHContainerGenerator() {}
> +  virtual ~RawPCHContainerGenerator() {}
> 
>   void HandleTranslationUnit(ASTContext &Ctx) override {
>     if (Buffer->IsComplete) {
> @@ -50,19 +51,23 @@ public:
> };
> }
> 
> -std::unique_ptr<ASTConsumer>
> -RawPCHContainerOperations::CreatePCHContainerGenerator(
> +std::unique_ptr<ASTConsumer> RawPCHContainerWriter::CreatePCHContainerGenerator(
>     DiagnosticsEngine &Diags, const HeaderSearchOptions &HSO,
>     const PreprocessorOptions &PPO, const TargetOptions &TO,
>     const LangOptions &LO, const std::string &MainFileName,
>     const std::string &OutputFileName, llvm::raw_pwrite_stream *OS,
>     std::shared_ptr<PCHBuffer> Buffer) const {
> -  return llvm::make_unique<PCHContainerGenerator>(
> +  return llvm::make_unique<RawPCHContainerGenerator>(
>       Diags, HSO, PPO, TO, LO, MainFileName, OutputFileName, OS, Buffer);
> }
> 
> -void RawPCHContainerOperations::ExtractPCH(
> +void RawPCHContainerReader::ExtractPCH(
>     llvm::MemoryBufferRef Buffer, llvm::BitstreamReader &StreamFile) const {
>   StreamFile.init((const unsigned char *)Buffer.getBufferStart(),
>                   (const unsigned char *)Buffer.getBufferEnd());
> }
> +
> +PCHContainerOperations::PCHContainerOperations() {
> +  registerWriter(llvm::make_unique<RawPCHContainerWriter>());
> +  registerReader(llvm::make_unique<RawPCHContainerReader>());
> +}
> 
> Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)
> +++ cfe/trunk/lib/Lex/HeaderSearch.cpp Thu Jul 16 20:19:54 2015
> @@ -14,6 +14,7 @@
> #include "clang/Lex/HeaderSearch.h"
> #include "clang/Basic/FileManager.h"
> #include "clang/Basic/IdentifierTable.h"
> +#include "clang/Frontend/PCHContainerOperations.h"
> #include "clang/Lex/ExternalPreprocessorSource.h"
> #include "clang/Lex/HeaderMap.h"
> #include "clang/Lex/HeaderSearchOptions.h"
> @@ -151,7 +152,8 @@ std::string HeaderSearch::getModuleFileN
>     auto FileName = llvm::sys::path::filename(ModuleMapPath);
> 
>     llvm::hash_code Hash =
> -        llvm::hash_combine(DirName.lower(), FileName.lower());
> +      llvm::hash_combine(DirName.lower(), FileName.lower(),
> +                         HSOpts->ModuleFormat);
> 
>     SmallString<128> HashStr;
>     llvm::APInt(64, size_t(Hash)).toStringUnsigned(HashStr, /*Radix*/36);
> 
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Thu Jul 16 20:19:54 2015
> @@ -3601,7 +3601,7 @@ ASTReader::ReadASTCore(StringRef FileNam
> 
>   ModuleFile &F = *M;
>   BitstreamCursor &Stream = F.Stream;
> -  PCHContainerOps.ExtractPCH(F.Buffer->getMemBufferRef(), F.StreamFile);
> +  PCHContainerRdr.ExtractPCH(F.Buffer->getMemBufferRef(), F.StreamFile);
>   Stream.init(&F.StreamFile);
>   F.SizeInBits = F.Buffer->getBufferSize() * 8;
> 
> @@ -3872,7 +3872,7 @@ static ASTFileSignature readASTFileSigna
> /// file.
> std::string ASTReader::getOriginalSourceFile(
>     const std::string &ASTFileName, FileManager &FileMgr,
> -    const PCHContainerOperations &PCHContainerOps, DiagnosticsEngine &Diags) {
> +    const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
>   // Open the AST file.
>   auto Buffer = FileMgr.getBufferForFile(ASTFileName);
>   if (!Buffer) {
> @@ -3883,7 +3883,7 @@ std::string ASTReader::getOriginalSource
> 
>   // Initialize the stream
>   llvm::BitstreamReader StreamFile;
> -  PCHContainerOps.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile);
> +  PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile);
>   BitstreamCursor Stream(StreamFile);
> 
>   // Sniff for the signature.
> @@ -3967,7 +3967,7 @@ namespace {
> 
> bool ASTReader::readASTFileControlBlock(
>     StringRef Filename, FileManager &FileMgr,
> -    const PCHContainerOperations &PCHContainerOps,
> +    const PCHContainerReader &PCHContainerRdr,
>     ASTReaderListener &Listener) {
>   // Open the AST file.
>   // FIXME: This allows use of the VFS; we do not allow use of the
> @@ -3979,7 +3979,7 @@ bool ASTReader::readASTFileControlBlock(
> 
>   // Initialize the stream
>   llvm::BitstreamReader StreamFile;
> -  PCHContainerOps.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile);
> +  PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile);
>   BitstreamCursor Stream(StreamFile);
> 
>   // Sniff for the signature.
> @@ -4160,12 +4160,12 @@ bool ASTReader::readASTFileControlBlock(
> 
> bool ASTReader::isAcceptableASTFile(
>     StringRef Filename, FileManager &FileMgr,
> -    const PCHContainerOperations &PCHContainerOps, const LangOptions &LangOpts,
> +    const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
>     const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts,
>     std::string ExistingModuleCachePath) {
>   SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
>                                ExistingModuleCachePath, FileMgr);
> -  return !readASTFileControlBlock(Filename, FileMgr, PCHContainerOps,
> +  return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
>                                   validator);
> }
> 
> @@ -8472,7 +8472,7 @@ void ASTReader::pushExternalDeclIntoScop
> }
> 
> ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context,
> -                     const PCHContainerOperations &PCHContainerOps,
> +                     const PCHContainerReader &PCHContainerRdr,
>                      StringRef isysroot, bool DisableValidation,
>                      bool AllowASTWithCompilerErrors,
>                      bool AllowConfigurationMismatch, bool ValidateSystemInputs,
> @@ -8480,9 +8480,9 @@ ASTReader::ASTReader(Preprocessor &PP, A
>                      std::unique_ptr<llvm::Timer> ReadTimer)
>     : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
>       OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
> -      FileMgr(PP.getFileManager()), PCHContainerOps(PCHContainerOps),
> +      FileMgr(PP.getFileManager()), PCHContainerRdr(PCHContainerRdr),
>       Diags(PP.getDiagnostics()), SemaObj(nullptr), PP(PP), Context(Context),
> -      Consumer(nullptr), ModuleMgr(PP.getFileManager(), PCHContainerOps),
> +      Consumer(nullptr), ModuleMgr(PP.getFileManager(), PCHContainerRdr),
>       ReadTimer(std::move(ReadTimer)),
>       isysroot(isysroot), DisableValidation(DisableValidation),
>       AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
> 
> Modified: cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp (original)
> +++ cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp Thu Jul 16 20:19:54 2015
> @@ -385,7 +385,7 @@ namespace {
>   /// \brief Builder that generates the global module index file.
>   class GlobalModuleIndexBuilder {
>     FileManager &FileMgr;
> -    const PCHContainerOperations &PCHContainerOps;
> +    const PCHContainerReader &PCHContainerRdr;
> 
>     /// \brief Mapping from files to module file information.
>     typedef llvm::MapVector<const FileEntry *, ModuleFileInfo> ModuleFilesMap;
> @@ -419,8 +419,8 @@ namespace {
> 
>   public:
>     explicit GlobalModuleIndexBuilder(
> -        FileManager &FileMgr, const PCHContainerOperations &PCHContainerOps)
> -        : FileMgr(FileMgr), PCHContainerOps(PCHContainerOps) {}
> +        FileManager &FileMgr, const PCHContainerReader &PCHContainerRdr)
> +        : FileMgr(FileMgr), PCHContainerRdr(PCHContainerRdr) {}
> 
>     /// \brief Load the contents of the given module file into the builder.
>     ///
> @@ -505,7 +505,7 @@ bool GlobalModuleIndexBuilder::loadModul
> 
>   // Initialize the input stream
>   llvm::BitstreamReader InStreamFile;
> -  PCHContainerOps.ExtractPCH((*Buffer)->getMemBufferRef(), InStreamFile);
> +  PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), InStreamFile);
>   llvm::BitstreamCursor InStream(InStreamFile);
> 
>   // Sniff for the signature.
> @@ -768,7 +768,7 @@ void GlobalModuleIndexBuilder::writeInde
> 
> GlobalModuleIndex::ErrorCode
> GlobalModuleIndex::writeIndex(FileManager &FileMgr,
> -                              const PCHContainerOperations &PCHContainerOps,
> +                              const PCHContainerReader &PCHContainerRdr,
>                               StringRef Path) {
>   llvm::SmallString<128> IndexPath;
>   IndexPath += Path;
> @@ -792,7 +792,7 @@ GlobalModuleIndex::writeIndex(FileManage
>   }
> 
>   // The module index builder.
> -  GlobalModuleIndexBuilder Builder(FileMgr, PCHContainerOps);
> +  GlobalModuleIndexBuilder Builder(FileMgr, PCHContainerRdr);
> 
>   // Load each of the module files.
>   std::error_code EC;
> 
> Modified: cfe/trunk/lib/Serialization/ModuleManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ModuleManager.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ModuleManager.cpp (original)
> +++ cfe/trunk/lib/Serialization/ModuleManager.cpp Thu Jul 16 20:19:54 2015
> @@ -139,7 +139,7 @@ ModuleManager::addModule(StringRef FileN
>     }
> 
>     // Initialize the stream.
> -    PCHContainerOps.ExtractPCH(New->Buffer->getMemBufferRef(), New->StreamFile);
> +    PCHContainerRdr.ExtractPCH(New->Buffer->getMemBufferRef(), New->StreamFile);
>   }
> 
>   if (ExpectedSignature) {
> @@ -290,8 +290,8 @@ void ModuleManager::moduleFileAccepted(M
> }
> 
> ModuleManager::ModuleManager(FileManager &FileMgr,
> -                             const PCHContainerOperations &PCHContainerOps)
> -    : FileMgr(FileMgr), PCHContainerOps(PCHContainerOps), GlobalIndex(),
> +                             const PCHContainerReader &PCHContainerRdr)
> +    : FileMgr(FileMgr), PCHContainerRdr(PCHContainerRdr), GlobalIndex(),
>       FirstVisitState(nullptr) {}
> 
> ModuleManager::~ModuleManager() {
> 
> Modified: cfe/trunk/test/Modules/pch_container.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pch_container.m?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/test/Modules/pch_container.m (original)
> +++ cfe/trunk/test/Modules/pch_container.m Thu Jul 16 20:19:54 2015
> @@ -1,9 +1,11 @@
> @import DependsOnModule;
> // REQUIRES: x86-registered-target
> -// RUN: rm -rf %t-MachO %t-ELF %t-ELF_SPLIT %t-COFF
> -// RUN: %clang_cc1 -triple=x86_64-apple-darwin -fmodules -fimplicit-module-maps -fdisable-module-hash -fmodules-cache-path=%t-MachO -F %S/Inputs %s
> -// RUN: %clang_cc1 -triple=x86_64-linux-elf -fmodules -fimplicit-module-maps -fdisable-module-hash -fmodules-cache-path=%t-ELF -F %S/Inputs %s
> -// RUN: %clang_cc1 -triple=x86_64-windows-coff -fmodules -fimplicit-module-maps -fdisable-module-hash -fmodules-cache-path=%t-COFF -F %S/Inputs %s
> +// RUN: rm -rf %t-MachO %t-ELF %t-ELF_SPLIT %t-COFF %t-raw
> +// RUN: %clang_cc1 -triple=x86_64-apple-darwin -fmodules -fmodule-format=obj -fimplicit-module-maps -fdisable-module-hash -fmodules-cache-path=%t-MachO -F %S/Inputs %s
> +// RUN: %clang_cc1 -triple=x86_64-linux-elf -fmodules -fmodule-format=obj -fimplicit-module-maps -fdisable-module-hash -fmodules-cache-path=%t-ELF -F %S/Inputs %s
> +// RUN: %clang_cc1 -triple=x86_64-windows-coff -fmodules -fmodule-format=obj -fimplicit-module-maps -fdisable-module-hash -fmodules-cache-path=%t-COFF -F %S/Inputs %s
> +// RUN: %clang_cc1 -triple=x86_64-apple-darwin -fmodules -fmodule-format=raw -fimplicit-module-maps -fdisable-module-hash -fmodules-cache-path=%t-raw -F %S/Inputs %s
> +
> 
> // RUN: llvm-objdump -section-headers %t-MachO/DependsOnModule.pcm %t-ELF/DependsOnModule.pcm %t-COFF/DependsOnModule.pcm | FileCheck %s
> // CHECK: file format Mach-O 64-bit x86-64
> @@ -13,5 +15,6 @@
> // CHECK: file format COFF-x86-64
> // CHECK: clangast   {{[0-9a-f]+}} {{[0-9a-f]+}}
> 
> +// RUN: not llvm-objdump -section-headers %t-raw/DependsOnModule.pcm
> 
> // RUN: %clang_cc1 -split-dwarf-file t-split.dwo -triple=x86_64-linux-elf -fmodules -fimplicit-module-maps -fdisable-module-hash -fmodules-cache-path=%t-ELF_SPLIT -F %S/Inputs %s -o %t-split.o
> 
> Modified: cfe/trunk/tools/arcmt-test/arcmt-test.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/arcmt-test/arcmt-test.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/tools/arcmt-test/arcmt-test.cpp (original)
> +++ cfe/trunk/tools/arcmt-test/arcmt-test.cpp Thu Jul 16 20:19:54 2015
> @@ -132,7 +132,7 @@ static bool checkForMigration(StringRef
>     return false;
> 
>   arcmt::checkForManualIssues(CI, CI.getFrontendOpts().Inputs[0],
> -                              std::make_shared<RawPCHContainerOperations>(),
> +                              std::make_shared<PCHContainerOperations>(),
>                               Diags->getClient());
>   return Diags->getClient()->getNumErrors() > 0;
> }
> @@ -171,8 +171,8 @@ static bool performTransformations(Strin
>   if (!origCI.getLangOpts()->ObjC1)
>     return false;
> 
> -  MigrationProcess migration(
> -      origCI, std::make_shared<RawPCHContainerOperations>(), DiagClient);
> +  MigrationProcess migration(origCI, std::make_shared<PCHContainerOperations>(),
> +                             DiagClient);
> 
>   std::vector<TransformFn>
>     transforms = arcmt::getAllTransformations(origCI.getLangOpts()->getGC(),
> 
> Modified: cfe/trunk/tools/clang-check/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-check/CMakeLists.txt?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/tools/clang-check/CMakeLists.txt (original)
> +++ cfe/trunk/tools/clang-check/CMakeLists.txt Thu Jul 16 20:19:54 2015
> @@ -11,7 +11,6 @@ add_clang_executable(clang-check
> target_link_libraries(clang-check
>   clangAST
>   clangBasic
> -  clangCodeGen
>   clangDriver
>   clangFrontend
>   clangRewriteFrontend
> 
> Modified: cfe/trunk/tools/clang-check/ClangCheck.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-check/ClangCheck.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/tools/clang-check/ClangCheck.cpp (original)
> +++ cfe/trunk/tools/clang-check/ClangCheck.cpp Thu Jul 16 20:19:54 2015
> @@ -160,8 +160,7 @@ int main(int argc, const char **argv) {
> 
>   CommonOptionsParser OptionsParser(argc, argv, ClangCheckCategory);
>   ClangTool Tool(OptionsParser.getCompilations(),
> -                 OptionsParser.getSourcePathList(),
> -                 std::make_shared<clang::ObjectFilePCHContainerOperations>());
> +                 OptionsParser.getSourcePathList());
> 
>   // Clear adjusters because -fsyntax-only is inserted by the default chain.
>   Tool.clearArgumentsAdjusters();
> 
> Modified: cfe/trunk/tools/driver/cc1_main.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/cc1_main.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/tools/driver/cc1_main.cpp (original)
> +++ cfe/trunk/tools/driver/cc1_main.cpp Thu Jul 16 20:19:54 2015
> @@ -65,10 +65,14 @@ void initializePollyPasses(llvm::PassReg
> #endif
> 
> int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
> -  std::unique_ptr<CompilerInstance> Clang(new CompilerInstance(
> -      std::make_shared<ObjectFilePCHContainerOperations>()));
> +  std::unique_ptr<CompilerInstance> Clang(new CompilerInstance());
>   IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
> 
> +  // Register the support for object-file-wrapped Clang modules.
> +  auto PCHOps = Clang->getPCHContainerOperations();
> +  PCHOps->registerWriter(llvm::make_unique<ObjectFilePCHContainerWriter>());
> +  PCHOps->registerReader(llvm::make_unique<ObjectFilePCHContainerReader>());
> +
>   // Initialize targets first, so that --version shows registered targets.
>   llvm::InitializeAllTargets();
>   llvm::InitializeAllTargetMCs();
> 
> Modified: cfe/trunk/tools/libclang/CIndex.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndex.cpp Thu Jul 16 20:19:54 2015
> @@ -2884,8 +2884,8 @@ CXIndex clang_createIndex(int excludeDec
>   llvm::InitializeAllAsmPrinters();
>   llvm::InitializeAllAsmParsers();
> 
> -  CIndexer *CIdxr =
> -      new CIndexer(std::make_shared<ObjectFilePCHContainerOperations>());
> +  CIndexer *CIdxr = new CIndexer();
> +
>   if (excludeDeclarationsFromPCH)
>     CIdxr->setOnlyLocalDecls();
>   if (displayDiagnostics)
> @@ -2954,8 +2954,8 @@ enum CXErrorCode clang_createTranslation
>   IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
>       CompilerInstance::createDiagnostics(new DiagnosticOptions());
>   std::unique_ptr<ASTUnit> AU = ASTUnit::LoadFromASTFile(
> -      ast_filename, CXXIdx->getPCHContainerOperations(), Diags, FileSystemOpts,
> -      CXXIdx->getOnlyLocalDecls(), None,
> +      ast_filename, CXXIdx->getPCHContainerOperations()->getRawReader(), Diags,
> +      FileSystemOpts, CXXIdx->getOnlyLocalDecls(), None,
>       /*CaptureDiagnostics=*/true,
>       /*AllowPCHWithCompilerErrors=*/true,
>       /*UserFilesAreVolatile=*/true);
> 
> Modified: cfe/trunk/tools/libclang/CIndexer.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexer.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndexer.h (original)
> +++ cfe/trunk/tools/libclang/CIndexer.h Thu Jul 16 20:19:54 2015
> @@ -44,7 +44,7 @@ class CIndexer {
> 
> public:
>   CIndexer(std::shared_ptr<PCHContainerOperations> PCHContainerOps =
> -               std::make_shared<RawPCHContainerOperations>())
> +               std::make_shared<PCHContainerOperations>())
>       : OnlyLocalDecls(false), DisplayDiagnostics(false),
>         Options(CXGlobalOpt_None), PCHContainerOps(PCHContainerOps) {}
> 
> 
> Modified: cfe/trunk/tools/libclang/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CMakeLists.txt?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CMakeLists.txt (original)
> +++ cfe/trunk/tools/libclang/CMakeLists.txt Thu Jul 16 20:19:54 2015
> @@ -40,7 +40,6 @@ set(SOURCES
> set(LIBS
>   clangAST
>   clangBasic
> -  clangCodeGen
>   clangFrontend
>   clangIndex
>   clangLex
> 
> Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h?rev=242499&r1=242498&r2=242499&view=diff
> ==============================================================================
> --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h (original)
> +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h Thu Jul 16 20:19:54 2015
> @@ -80,7 +80,7 @@ testing::AssertionResult matchesConditio
>   Args.push_back("-frtti");
>   Args.push_back("-fexceptions");
>   if (!runToolOnCodeWithArgs(Factory->create(), Code, Args, Filename,
> -                             std::make_shared<RawPCHContainerOperations>(),
> +                             std::make_shared<PCHContainerOperations>(),
>                              VirtualMappedFiles)) {
>     return testing::AssertionFailure() << "Parsing error in \"" << Code << "\"";
>   }
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list