[lld] Reject --read-workers when lld is built without thread support (#163925)
Also expand the #ifdef to remove unused code in this configuration. As suggested in https://github.com/llvm/llvm-project/pull/147134#issuecomment-3328612158. I have also: * Expanded the error message to explain why it's not allowed. * Added a test for the error. * Marked the original test as unsupported when threads are disabled. Fixes issues we have had on Armv8 with threading disabled where this test would crash every so often. This change will hopefully be superseded by #157917, but that has been in review a long time and I want to make the bot stable again. I could just disable the test, but I'd like lld to function properly in general in the meantime too. Co-authored-by: John Holdsworth <github@johnholdsworth.com>
This commit is contained in:
parent
89eef941c4
commit
f5885de2cd
@ -291,6 +291,7 @@ struct DeferredFile {
|
||||
};
|
||||
using DeferredFiles = std::vector<DeferredFile>;
|
||||
|
||||
#if LLVM_ENABLE_THREADS
|
||||
class SerialBackgroundQueue {
|
||||
std::deque<std::function<void()>> queue;
|
||||
std::thread *running;
|
||||
@ -359,7 +360,6 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
|
||||
(void)t;
|
||||
}
|
||||
};
|
||||
#if LLVM_ENABLE_THREADS
|
||||
{ // Create scope for waiting for the taskGroup
|
||||
std::atomic_size_t index = 0;
|
||||
llvm::parallel::TaskGroup taskGroup;
|
||||
@ -373,7 +373,6 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
|
||||
}
|
||||
});
|
||||
}
|
||||
#endif
|
||||
#ifndef NDEBUG
|
||||
auto dt = high_resolution_clock::now() - t0;
|
||||
if (Process::GetEnv("LLD_MULTI_THREAD_PAGE"))
|
||||
@ -390,6 +389,7 @@ static void multiThreadedPageIn(const DeferredFiles &deferred) {
|
||||
multiThreadedPageInBackground(files);
|
||||
});
|
||||
}
|
||||
#endif
|
||||
|
||||
static InputFile *processFile(std::optional<MemoryBufferRef> buffer,
|
||||
DeferredFiles *archiveContents, StringRef path,
|
||||
@ -1430,6 +1430,7 @@ static void createFiles(const InputArgList &args) {
|
||||
}
|
||||
}
|
||||
|
||||
#if LLVM_ENABLE_THREADS
|
||||
if (config->readWorkers) {
|
||||
multiThreadedPageIn(deferredFiles);
|
||||
|
||||
@ -1447,6 +1448,7 @@ static void createFiles(const InputArgList &args) {
|
||||
for (auto *archive : archives)
|
||||
archive->addLazySymbols();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void gatherInputSections() {
|
||||
@ -1834,6 +1836,7 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
|
||||
}
|
||||
|
||||
if (auto *arg = args.getLastArg(OPT_read_workers)) {
|
||||
#if LLVM_ENABLE_THREADS
|
||||
StringRef v(arg->getValue());
|
||||
unsigned workers = 0;
|
||||
if (!llvm::to_integer(v, workers, 0))
|
||||
@ -1841,6 +1844,10 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
|
||||
": expected a non-negative integer, but got '" + arg->getValue() +
|
||||
"'");
|
||||
config->readWorkers = workers;
|
||||
#else
|
||||
error(arg->getSpelling() +
|
||||
": option unavailable because lld was not built with thread support");
|
||||
#endif
|
||||
}
|
||||
if (auto *arg = args.getLastArg(OPT_threads_eq)) {
|
||||
StringRef v(arg->getValue());
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
llvm_canonicalize_cmake_booleans(
|
||||
ENABLE_BACKTRACES
|
||||
LLVM_ENABLE_THREADS
|
||||
LLVM_ENABLE_ZLIB
|
||||
LLVM_ENABLE_ZSTD
|
||||
LLVM_ENABLE_LIBXML2
|
||||
|
||||
10
lld/test/MachO/read-workers-no-thread-support.s
Normal file
10
lld/test/MachO/read-workers-no-thread-support.s
Normal file
@ -0,0 +1,10 @@
|
||||
# REQUIRES: x86 && !thread_support
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
|
||||
|
||||
# RUN: not %lld --read-workers=1 %t.o -o /dev/null
|
||||
|
||||
# CHECK: error: --read-workers=: option unavailable because lld was built without thread support
|
||||
|
||||
.globl _main
|
||||
_main:
|
||||
ret
|
||||
@ -1,4 +1,4 @@
|
||||
# REQUIRES: x86
|
||||
# REQUIRES: x86 && thread_support
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
|
||||
|
||||
## A non-negative integer is allowed.
|
||||
|
||||
@ -182,3 +182,6 @@ if tar_executable:
|
||||
# ELF tests expect the default target for ld.lld to be ELF.
|
||||
if config.ld_lld_default_mingw:
|
||||
config.excludes.append("ELF")
|
||||
|
||||
if config.enable_threads:
|
||||
config.available_features.add("thread_support")
|
||||
|
||||
@ -26,6 +26,7 @@ config.ld_lld_default_mingw = @LLD_DEFAULT_LD_LLD_IS_MINGW@
|
||||
config.build_examples = @LLVM_BUILD_EXAMPLES@
|
||||
config.has_plugins = @LLVM_ENABLE_PLUGINS@
|
||||
config.linked_bye_extension = @LLVM_BYE_LINK_INTO_TOOLS@
|
||||
config.enable_threads = @LLVM_ENABLE_THREADS@
|
||||
|
||||
import lit.llvm
|
||||
lit.llvm.initialize(lit_config, config)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user