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

Richard Smith richard at metafoo.co.uk
Fri Jul 17 13:09:09 PDT 2015


Approved.

On Fri, Jul 17, 2015 at 9:11 AM, Adrian Prantl <aprantl at apple.com> wrote:

> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150717/0b5bceac/attachment.html>


More information about the cfe-commits mailing list