[lld] [lld][MachO] Fix --read-workers argument parsing (PR #156608)
Frederik Harwath via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 3 00:20:35 PDT 2025
https://github.com/frederik-h created https://github.com/llvm/llvm-project/pull/156608
The parsing of the --read-workers argument v is implemented like this:
unsigned threads = 0
if (!llvm::to_integer(v, threads, 0) || threads < 0) {
...
As reported by a compiler warning, the value of the "threads < 0" expession is never going to be true. It could only evaluate to true if v represents a negative number, but in this case llvm::to_integer returns false since threads is unsigned and hence the second operand of the || operator will not be evaluated.
This patch removes the useless || operand to silence compiler warnings. Since I had to first find out if --read-workers=0 is valid or not (it seems to be), I also added a test to document the valid values for the option and I adjusted the error message on invalid values to clearly state that 0 is valid.
>From 9ad92da8f9d589a519dbeab0e327a87b13285e40 Mon Sep 17 00:00:00 2001
From: Frederik Harwath <fharwath at amd.com>
Date: Tue, 2 Sep 2025 12:05:57 -0400
Subject: [PATCH] [lld][MachO] Fix --read-workers argument parsing
The parsing of the --read-workers argument v is implemented like this:
unsigned threads = 0
if (!llvm::to_integer(v, threads, 0) || threads < 0) {
...
As reported by a compiler warning, the value of the "threads < 0"
expession is never going to be true. It could only evaluate to true if
v represents a negative number, but in this case llvm::to_integer
returns false since threads is unsigned and hence the second operand
of the || operator will not be evaluated.
This patch removes the useless || operand to silence compiler
warnings. Since I had to first find out if --read-workers=0 is valid
or not (it seems to be), I also added a test to document the valid
values for the option and I adjusted the error message on invalid
values to clearly state that 0 is valid.
---
lld/MachO/Driver.cpp | 7 ++++---
lld/test/MachO/read-workers.s | 16 ++++++++++++++++
2 files changed, 20 insertions(+), 3 deletions(-)
create mode 100644 lld/test/MachO/read-workers.s
diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index bcba759b2bbee..6deed6b6bb9fe 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -1834,9 +1834,10 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
if (auto *arg = args.getLastArg(OPT_read_workers)) {
StringRef v(arg->getValue());
unsigned threads = 0;
- if (!llvm::to_integer(v, threads, 0) || threads < 0)
- error(arg->getSpelling() + ": expected a positive integer, but got '" +
- arg->getValue() + "'");
+ if (!llvm::to_integer(v, threads, 0))
+ error(arg->getSpelling() +
+ ": expected a non-negative integer, but got '" + arg->getValue() +
+ "'");
config->readWorkers = threads;
}
if (auto *arg = args.getLastArg(OPT_threads_eq)) {
diff --git a/lld/test/MachO/read-workers.s b/lld/test/MachO/read-workers.s
new file mode 100644
index 0000000000000..6f0ea4d894408
--- /dev/null
+++ b/lld/test/MachO/read-workers.s
@@ -0,0 +1,16 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
+
+## A non-negative integer is allowed.
+# RUN: %lld --read-workers=0 %t.o -o /dev/null
+# RUN: %lld --read-workers=1 %t.o -o /dev/null
+# RUN: %lld --read-workers=2 %t.o -o /dev/null
+
+# RUN: not %lld --read-workers=all %t.o -o /dev/null 2>&1 | FileCheck %s -DN=all
+# RUN: not %lld --read-workers=-1 %t.o -o /dev/null 2>&1 | FileCheck %s -DN=-1
+
+# CHECK: error: --read-workers=: expected a non-negative integer, but got '[[N]]'
+
+.globl _main
+_main:
+ ret
More information about the llvm-commits
mailing list