Skip to content

Commit

Permalink
[LLD][COFF] Fix missing MergeChunk::Instances cleanup in COFF::link()
Browse files Browse the repository at this point in the history
Patch by Erik McClure with a modification to rebase to HEAD.

When calling `COFF::link()` with `CanExitEarly` set to `false`, the
function needs to clean up several global variable caches to ensure that
the next invocation of the function starts from a clean slate. The
`MergeChunk::Instances` cache is missing from this cleanup code, and as
a result will create nondeterministic memory access errors and sometimes
infinite loops due to invalid memory being referenced on the next call
to `COFF::link()`.

This fix simply clears `MergeChunk::Instances` before exiting the function.

An additional review of the COFF library was made to try and find any
other missing global caches, but I was unable to find any other than
`MergeChunk`. Someone more familiar with the global variables might want
to do their own check.

This fix was made to support inNative
<https://github.com/innative-sdk/innative>'s `.wast` script compiler,
which must build multiple incremental builds. It relies on statically
linking LLD because the entire compiler must be a single statically
embeddable library, thus preventing it from being able to call LLD as a
new process.

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

llvm-svn: 362930
  • Loading branch information
rui314 committed Jun 10, 2019
1 parent 379aa18 commit 1f73bbb
Showing 1 changed file with 1 addition and 0 deletions.
1 change: 1 addition & 0 deletions lld/COFF/Driver.cpp
Expand Up @@ -81,6 +81,7 @@ bool link(ArrayRef<const char *> Args, bool CanExitEarly, raw_ostream &Diag) {
ObjFile::Instances.clear();
ImportFile::Instances.clear();
BitcodeFile::Instances.clear();
memset(MergeChunk::Instances, 0, sizeof(MergeChunk::Instances));
return !errorCount();
}

Expand Down

0 comments on commit 1f73bbb

Please sign in to comment.