diff --git a/lld/Common/CommonLinkerContext.cpp b/lld/Common/CommonLinkerContext.cpp --- a/lld/Common/CommonLinkerContext.cpp +++ b/lld/Common/CommonLinkerContext.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "lld/Common/CommonLinkerContext.h" +#include "lld/Common/Driver.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/Memory.h" @@ -43,3 +44,11 @@ return; delete lctx; } + +// Temporary API that forces global state cleanup between explicit calls to +// drivers. See discussion in https://reviews.llvm.org/D119049. +void lld::cleanup() { + // Delete the global context and clear the global context pointer, so that it + // cannot be accessed anymore. + CommonLinkerContext::destroy(); +} diff --git a/lld/include/lld/Common/Driver.h b/lld/include/lld/Common/Driver.h --- a/lld/include/lld/Common/Driver.h +++ b/lld/include/lld/Common/Driver.h @@ -52,6 +52,11 @@ bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); } -} + +// Temporary API that forces global state cleanup between explicit calls to +// drivers above. DO NOT USE - this will be replaced by safeLldMain(). See +// discussion in https://reviews.llvm.org/D119049. +void cleanup(); +} // namespace lld #endif diff --git a/mlir/lib/Dialect/GPU/Transforms/SerializeToHsaco.cpp b/mlir/lib/Dialect/GPU/Transforms/SerializeToHsaco.cpp --- a/mlir/lib/Dialect/GPU/Transforms/SerializeToHsaco.cpp +++ b/mlir/lib/Dialect/GPU/Transforms/SerializeToHsaco.cpp @@ -438,10 +438,13 @@ static std::mutex mutex; const std::lock_guard lock(mutex); // Invoke lld. Expect a true return value from lld. - if (!lld::elf::link({"ld.lld", "-shared", tempIsaBinaryFilename.c_str(), - "-o", tempHsacoFilename.c_str()}, - llvm::outs(), llvm::errs(), /*exitEarly=*/true, - /*disableOutput=*/false)) { + bool r = lld::elf::link({"ld.lld", "-shared", tempIsaBinaryFilename.c_str(), + "-o", tempHsacoFilename.c_str()}, + llvm::outs(), llvm::errs(), /*exitEarly=*/false, + /*disableOutput=*/false); + // Allow for calling the driver again in the same process. + lld::cleanup(); + if (!r) { emitError(loc, "lld invocation error"); return {}; }