diff options
author | Ben Barham <ben_barham@apple.com> | 2021-07-15 18:24:09 -0700 |
---|---|---|
committer | Volodymyr Sapsai <vsapsai@apple.com> | 2021-07-15 18:27:08 -0700 |
commit | 766a08df12c111b15ed51d0fcac06042d2f68cd6 (patch) | |
tree | 5c1992bb428f9dfc537b6323dd4d122b681779ec /llvm/unittests/Support/CommandLineTest.cpp | |
parent | 3c4023b225ace3a5c0ed23bc491b47c9dad4353c (diff) | |
download | llvm-766a08df12c111b15ed51d0fcac06042d2f68cd6.zip llvm-766a08df12c111b15ed51d0fcac06042d2f68cd6.tar.gz llvm-766a08df12c111b15ed51d0fcac06042d2f68cd6.tar.bz2 |
[Frontend] Only compile modules if not already finalized
It was possible to re-add a module to a shared in-memory module cache
when search paths are changed. This can eventually cause a crash if the
original module is referenced after this occurs.
1. Module A depends on B
2. B exists in two paths C and D
3. First run only has C on the search path, finds A and B and loads
them
4. Second run adds D to the front of the search path. A is loaded and
contains a reference to the already compiled module from C. But
searching finds the module from D instead, causing a mismatch
5. B and the modules that depend on it are considered out of date and
thus rebuilt
6. The recompiled module A is added to the in-memory cache, freeing
the previously inserted one
This can never occur from a regular clang process, but is very easy to
do through the API - whether through the use of a shared case or just
running multiple compilations from a single `CompilerInstance`. Update
the compilation to return early if a module is already finalized so that
the pre-condition in the in-memory module cache holds.
Resolves rdar://78180255
Differential Revision: https://reviews.llvm.org/D105328
Diffstat (limited to 'llvm/unittests/Support/CommandLineTest.cpp')
0 files changed, 0 insertions, 0 deletions