Clang exposes an interface for extending the PCM/PCH file format: ModuleFileExtension.
Clang itself has only a single implementation of the interface: TestModuleFileExtension that can be instantiated via the -ftest-module-file_extension= command line argument (and is stored in FrontendOptions::ModuleFileExtensions).
Clients of the Clang library can extend the PCM/PCH file format by pushing an instance of their extension class to the FrontendOptions::ModuleFileExtensions vector.
When generating the -ftest-module-file_extension= command line argument from FrontendOptions, a downcast is used to distinguish between the Clang's testing extension and other (client) extensions.
This functionality is enabled by LLVM-style RTTI. However, this style of RTTI is hard to extend, as it requires patching Clang (adding new case to the ModuleFileExtensionKind enum).
This patch switches to the LLVM RTTI for open class hierarchies, which allows libClang users (e.g. Swift) to create implementations of ModuleFileExtension without patching Clang. (Documentation of the feature: https://llvm.org/docs/HowToSetUpLLVMStyleRTTI.html#rtti-for-open-class-hierarchies)