]> granicus.if.org Git - clang/commit
Reapply: [Modules][PCH] Hash input files content
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 15 Oct 2019 14:23:55 +0000 (14:23 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 15 Oct 2019 14:23:55 +0000 (14:23 +0000)
commit0e042f01abf08432152709f6f4d71ee1cf39c684
treee64aaf71b9b1e128272a9ff188ec1d60e37ec7d6
parent209a097de131a724f2806e19b70a9b25edaa4881
Reapply: [Modules][PCH] Hash input files content

Summary:
When files often get touched during builds, the mtime based validation
leads to different problems in implicit modules builds, even when the
content doesn't actually change:

- Modules only: module invalidation due to out of date files. Usually causing rebuild traffic.
- Modules + PCH: build failures because clang cannot rebuild a module if it comes from building a PCH.
- PCH: build failures because clang cannot rebuild a PCH in case one of the input headers has different mtime.

This patch proposes hashing the content of input files (headers and
module maps), which is performed during serialization time. When looking
at input files for validation, clang only computes the hash in case
there's a mtime mismatch.

I've tested a couple of different hash algorithms availble in LLVM in
face of building modules+pch for `#import <Cocoa/Cocoa.h>`:
- `hash_code`: performace diff within the noise, total module cache increased by 0.07%.
- `SHA1`: 5% slowdown. Haven't done real size measurements, but it'd be BLOCK_ID+20 bytes per input file, instead of BLOCK_ID+8 bytes from `hash_code`.
- `MD5`: 3% slowdown. Like above, but BLOCK_ID+16 bytes per input file.

Given the numbers above, the patch uses `hash_code`. The patch also
improves invalidation error msgs to point out which type of problem the
user is facing: "mtime", "size" or "content".

rdar://problem/29320105

Reviewers: dexonsmith, arphaman, rsmith, aprantl

Subscribers: jkorous, cfe-commits, ributzka

Tags: #clang

Differential Revision: https://reviews.llvm.org/D67249

llvm-svn: 374841

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@374895 91177308-0d34-0410-b5e6-96231b3b80d8
12 files changed:
include/clang/Basic/DiagnosticSerializationKinds.td
include/clang/Driver/Options.td
include/clang/Lex/HeaderSearchOptions.h
include/clang/Serialization/ASTBitCodes.h
include/clang/Serialization/ASTReader.h
lib/Driver/ToolChains/Clang.cpp
lib/Frontend/CompilerInstance.cpp
lib/Frontend/CompilerInvocation.cpp
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTWriter.cpp
test/Modules/validate-file-content.m [new file with mode: 0644]
test/PCH/validate-file-content.m [new file with mode: 0644]