[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:
David Spickett 2025-10-17 09:35:23 +01:00 committed by GitHub
parent 89eef941c4
commit f5885de2cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 25 additions and 3 deletions

View File

@ -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());

View File

@ -1,5 +1,6 @@
llvm_canonicalize_cmake_booleans(
ENABLE_BACKTRACES
LLVM_ENABLE_THREADS
LLVM_ENABLE_ZLIB
LLVM_ENABLE_ZSTD
LLVM_ENABLE_LIBXML2

View 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

View File

@ -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.

View File

@ -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")

View File

@ -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)