This is needed to fix the reason
0a2be46cfdb698fe (Modules: Invalidate out-of-date PCMs as they're
discovered) and rG5b44a4b07fc1 ([modules] Do not cache invalid state for
modules that we attempted to load.) were reverted.
These patches changed Clang to use isVolatile when loading modules.
This had the side effect of not using mmap when loading modules, and
thus greatly increased memory usage.
The reason it wasn't using mmap is because MemoryBuffer plays some
games with file size when you request null termination, and it has to
disable these when isVolatile is set as the size may change by the
time it's mmapped. Clang by default passes
RequiresNullTerminator = true, and shouldUseMmap ignored if
RequiresNullTerminator was even requested.
This patch adds RequiresNullTerminator to the FileManager interface
so Clang can use it when loading modules, and changes shouldUseMmap to
only take volatility into account if RequiresNullTerminator is true.
This is fine as both mmap and a read loop are vulnerable to
modifying the file while reading, but are immune to the rename Clang
does when replacing a module file.
Maybe add named arguments in comments for the last three? They're a bit inscrutable, and the whole point is to test IsVolatile.