mozilla / sccache

Sccache is a ccache-like tool. It is used as a compiler wrapper and avoids compilation when possible. Sccache has the capability to utilize caching in remote storage environments, including various cloud storage options, or alternatively, in local storage.
Apache License 2.0
5.85k stars 552 forks source link

Fix cache collision with object file and precompiled headers #2268

Closed jimis closed 1 month ago

jimis commented 1 month ago

When compiling with PCH enabled, it happens that some times object files end up with PCH content, or that .gch files end up with object code.

Simplest way to reproduce the problem:

$ touch empty.c $ gcc -c -o out1 empty.c $ gcc -x c-header -c -o out2 empty.c $ file out1 out2 out1: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped out2: GCC precompiled header (version 014) for C

The two files are different. But if we feed these compilations to sccache, they lead to the same result:

$ sccache gcc -c -o out3 empty.c $ sccache gcc -x c-header -c -o out4 empty.c $ file out3 out4 out3: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped out4: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

Same thing is reproducible with c++ compiler and -x c++-header argument.

The reason is that the hash string that identifies each command line is the same.

With this patch, compilation of C files is always differentiated from compilations of same C-Header files. And compilation of C++ files is always differentiated from compilations of same C++-Header files.

Fixes #1851.

jimis commented 1 month ago

This is ready for review.

The weirdest thing happened while I was running the integration tests on my fork: The "clang" integration test failed (the last --stats invocation showed 0 cache hits). Then I click "rerun failed tests" without changing anything and it passed (it then showed 2 cache hits). Are the integration tests known to be flaky?

sylvestre commented 1 month ago

Are the integration tests known to be flaky?

yes, the cache might be full at time

codecov-commenter commented 1 month ago

Codecov Report

Attention: Patch coverage is 50.00000% with 8 lines in your changes missing coverage. Please review.

Project coverage is 40.61%. Comparing base (0cc0c62) to head (b881869). Report is 80 commits behind head on main.

Files with missing lines Patch % Lines
src/compiler/c.rs 33.33% 2 Missing and 6 partials :warning:
Additional details and impacted files ```diff @@ Coverage Diff @@ ## main #2268 +/- ## ========================================== + Coverage 30.91% 40.61% +9.70% ========================================== Files 53 54 +1 Lines 20112 20746 +634 Branches 9755 9641 -114 ========================================== + Hits 6217 8427 +2210 - Misses 7922 8150 +228 + Partials 5973 4169 -1804 ```

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

sylvestre commented 1 month ago

nice easy fix, well done :)