mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-27 11:55:49 +00:00
[MLIR] Temporary workaround for calling the LLD ELF driver as-a-lib
This fixes the situation described in https://github.com/llvm/llvm-project/issues/53475 with a repro exposed by https://github.com/ROCmSoftwarePlatform/D108850-lld-bug-reproduction This is purposely just a workaround to unblock users. This could be transplanted to the release/14.x branch if need be. A proper fix will later be provided in https://reviews.llvm.org/D119049. Differential Revision: https://reviews.llvm.org/D119277
This commit is contained in:
parent
9b81d2fae8
commit
1e661e583d
@ -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 @@ void CommonLinkerContext::destroy() {
|
||||
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();
|
||||
}
|
||||
|
@ -52,6 +52,11 @@ namespace wasm {
|
||||
bool link(llvm::ArrayRef<const char *> 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
|
||||
|
@ -438,10 +438,13 @@ SerializeToHsacoPass::createHsaco(const SmallVectorImpl<char> &isaBinary) {
|
||||
static std::mutex mutex;
|
||||
const std::lock_guard<std::mutex> 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 {};
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user