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