From 5e60e022a8e99fecb3a0d4a572a6794a14574780 Mon Sep 17 00:00:00 2001 From: David Spickett Date: Fri, 17 Oct 2025 08:09:28 +0000 Subject: [PATCH 1/2] [lld] Reject --read-workers when lld is built without thread support 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 --- lld/MachO/Driver.cpp | 11 +++++++++-- lld/test/CMakeLists.txt | 1 + lld/test/MachO/read-workers-no-thread-support.s | 10 ++++++++++ lld/test/MachO/read-workers.s | 2 +- lld/test/lit.cfg.py | 3 +++ lld/test/lit.site.cfg.py.in | 1 + 6 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 lld/test/MachO/read-workers-no-thread-support.s diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp index bfd35aef72b58..9b67db9fa55cf 100644 --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -291,6 +291,7 @@ struct DeferredFile { }; using DeferredFiles = std::vector; +#if LLVM_ENABLE_THREADS class SerialBackgroundQueue { std::deque> 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 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 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 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()); diff --git a/lld/test/CMakeLists.txt b/lld/test/CMakeLists.txt index abc8ea75da180..1bd3ad7e1765b 100644 --- a/lld/test/CMakeLists.txt +++ b/lld/test/CMakeLists.txt @@ -1,5 +1,6 @@ llvm_canonicalize_cmake_booleans( ENABLE_BACKTRACES + LLVM_ENABLE_THREADS LLVM_ENABLE_ZLIB LLVM_ENABLE_ZSTD LLVM_ENABLE_LIBXML2 diff --git a/lld/test/MachO/read-workers-no-thread-support.s b/lld/test/MachO/read-workers-no-thread-support.s new file mode 100644 index 0000000000000..16256be42af73 --- /dev/null +++ b/lld/test/MachO/read-workers-no-thread-support.s @@ -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 diff --git a/lld/test/MachO/read-workers.s b/lld/test/MachO/read-workers.s index 6f0ea4d894408..4d2f88c2a757c 100644 --- a/lld/test/MachO/read-workers.s +++ b/lld/test/MachO/read-workers.s @@ -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. diff --git a/lld/test/lit.cfg.py b/lld/test/lit.cfg.py index 336945729954e..906afc52a0d09 100644 --- a/lld/test/lit.cfg.py +++ b/lld/test/lit.cfg.py @@ -182,3 +182,6 @@ # 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") \ No newline at end of file diff --git a/lld/test/lit.site.cfg.py.in b/lld/test/lit.site.cfg.py.in index bb99976005543..703d3b1fd5337 100644 --- a/lld/test/lit.site.cfg.py.in +++ b/lld/test/lit.site.cfg.py.in @@ -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) From 01356050c73b24333f62115c8752ec1bf2db563a Mon Sep 17 00:00:00 2001 From: David Spickett Date: Fri, 17 Oct 2025 08:26:57 +0000 Subject: [PATCH 2/2] newline --- lld/test/lit.cfg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lld/test/lit.cfg.py b/lld/test/lit.cfg.py index 906afc52a0d09..39c3d0aa36bfb 100644 --- a/lld/test/lit.cfg.py +++ b/lld/test/lit.cfg.py @@ -184,4 +184,4 @@ config.excludes.append("ELF") if config.enable_threads: - config.available_features.add("thread_support") \ No newline at end of file + config.available_features.add("thread_support")