[lld] r362930 - [LLD][COFF] Fix missing MergeChunk::Instances cleanup in COFF::link()

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 10 05:16:41 PDT 2019


Author: ruiu
Date: Mon Jun 10 05:16:41 2019
New Revision: 362930

URL: http://llvm.org/viewvc/llvm-project?rev=362930&view=rev
Log:
[LLD][COFF] Fix missing MergeChunk::Instances cleanup in COFF::link()

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

Modified:
    lld/trunk/COFF/Driver.cpp

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=362930&r1=362929&r2=362930&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Mon Jun 10 05:16:41 2019
@@ -81,6 +81,7 @@ bool link(ArrayRef<const char *> Args, b
   ObjFile::Instances.clear();
   ImportFile::Instances.clear();
   BitcodeFile::Instances.clear();
+  memset(MergeChunk::Instances, 0, sizeof(MergeChunk::Instances));
   return !errorCount();
 }
 




More information about the llvm-commits mailing list