[clang] [clang] Handle f(no-)strict-overflow, f(no-)wrapv, f(no-)wrapv-pointer like gcc (PR #126524)
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 10 07:03:53 PST 2025
https://github.com/nico updated https://github.com/llvm/llvm-project/pull/126524
>From 5050dbd75fc7446985f4bebe5c7c0ab13e3ccbbb Mon Sep 17 00:00:00 2001
From: Nico Weber <thakis at chromium.org>
Date: Mon, 10 Feb 2025 09:34:38 -0500
Subject: [PATCH 1/2] [clang] Handle f(no-)strict-overflow, f(no-)wrapv,
f(no-)wrapv-pointer like gcc
We now process all 6 options left-to-right and pick whatever is active
at the end.
Fixes #124868.
---
clang/lib/Driver/ToolChains/CommonArgs.cpp | 48 +++++++++++++++-------
clang/test/Driver/clang_wrapv_opts.c | 24 +++++------
2 files changed, 45 insertions(+), 27 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 61917db4d780d5..9a4d3f55c911ce 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -3096,21 +3096,39 @@ bool tools::shouldRecordCommandLine(const ToolChain &TC,
void tools::renderCommonIntegerOverflowOptions(const ArgList &Args,
ArgStringList &CmdArgs) {
- // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
- // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
- bool StrictOverflow = Args.hasFlag(options::OPT_fstrict_overflow,
- options::OPT_fno_strict_overflow, true);
- if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
- if (A->getOption().matches(options::OPT_fwrapv))
- CmdArgs.push_back("-fwrapv");
- } else if (!StrictOverflow) {
- CmdArgs.push_back("-fwrapv");
+ bool use_fwrapv = false;
+ bool use_fwrapv_pointer = false;
+ for (const Arg *A : Args.filtered(
+ options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
+ options::OPT_fwrapv, options::OPT_fno_wrapv,
+ options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
+ A->claim();
+ switch (A->getOption().getID()) {
+ case options::OPT_fstrict_overflow:
+ use_fwrapv = false;
+ use_fwrapv_pointer = false;
+ break;
+ case options::OPT_fno_strict_overflow:
+ use_fwrapv = true;
+ use_fwrapv_pointer = true;
+ break;
+ case options::OPT_fwrapv:
+ use_fwrapv = true;
+ break;
+ case options::OPT_fno_wrapv:
+ use_fwrapv = false;
+ break;
+ case options::OPT_fwrapv_pointer:
+ use_fwrapv_pointer = true;
+ break;
+ case options::OPT_fno_wrapv_pointer:
+ use_fwrapv_pointer = false;
+ break;
+ }
}
- if (Arg *A = Args.getLastArg(options::OPT_fwrapv_pointer,
- options::OPT_fno_wrapv_pointer)) {
- if (A->getOption().matches(options::OPT_fwrapv_pointer))
- CmdArgs.push_back("-fwrapv-pointer");
- } else if (!StrictOverflow) {
+
+ if (use_fwrapv)
+ CmdArgs.push_back("-fwrapv");
+ if (use_fwrapv_pointer)
CmdArgs.push_back("-fwrapv-pointer");
- }
}
diff --git a/clang/test/Driver/clang_wrapv_opts.c b/clang/test/Driver/clang_wrapv_opts.c
index 9f3a884324dcdd..3de928d9a419a4 100644
--- a/clang/test/Driver/clang_wrapv_opts.c
+++ b/clang/test/Driver/clang_wrapv_opts.c
@@ -1,20 +1,20 @@
// RUN: %clang -### -S -fwrapv -fno-wrapv -fwrapv -Werror %s 2>&1 | FileCheck -check-prefix=CHECK1 %s
// CHECK1: "-fwrapv"
-//
+
// RUN: %clang -### -S -fwrapv-pointer -fno-wrapv-pointer -fwrapv-pointer -Werror %s 2>&1 | FileCheck -check-prefix=CHECK1-POINTER %s
// CHECK1-POINTER: "-fwrapv-pointer"
-//
+
// RUN: %clang -### -S -fstrict-overflow -fno-strict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK2 %s
// CHECK2: "-fwrapv"{{.*}}"-fwrapv-pointer"
-//
+
// RUN: %clang -### -S -fwrapv -fstrict-overflow -Werror -Werror %s 2>&1 | FileCheck -check-prefix=CHECK3 %s --implicit-check-not="-fwrapv-pointer"
-// CHECK3: "-fwrapv"
-//
+// CHECK3-NOT: "-fwrapv"
+
// RUN: %clang -### -S -fwrapv-pointer -fstrict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK3-POINTER %s --implicit-check-not="-fwrapv"
-// CHECK3-POINTER: "-fwrapv-pointer"
-//
-// RUN: %clang -### -S -fno-wrapv -fno-strict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4 %s --implicit-check-not="-fwrapv"
-// CHECK4: "-fwrapv-pointer"
-//
-// RUN: %clang -### -S -fno-wrapv-pointer -fno-strict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4-POINTER %s --implicit-check-not="-fwrapv-pointer"
-// CHECK4-POINTER: "-fwrapv"
+// CHECK3-POINTER-NOT: "-fwrapv-pointer"
+
+// RUN: %clang -### -S -fno-wrapv -fno-strict-overflow -fno-wrapv-pointer -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4 %s --implicit-check-not="-fwrapv"
+// CHECK4: "-fwrapv"
+
+// RUN: %clang -### -S -fno-wrapv-pointer -fno-strict-overflow -fno-wrapv -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4-POINTER %s --implicit-check-not="-fwrapv-pointer"
+// CHECK4-POINTER: "-fwrapv-pointer"
>From c055e02b20837d87223f8181734a0d91a96269cc Mon Sep 17 00:00:00 2001
From: Nico Weber <thakis at chromium.org>
Date: Mon, 10 Feb 2025 10:03:42 -0500
Subject: [PATCH 2/2] tweak test
---
clang/test/Driver/clang_wrapv_opts.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/test/Driver/clang_wrapv_opts.c b/clang/test/Driver/clang_wrapv_opts.c
index 3de928d9a419a4..295d8deb0d99d4 100644
--- a/clang/test/Driver/clang_wrapv_opts.c
+++ b/clang/test/Driver/clang_wrapv_opts.c
@@ -13,8 +13,8 @@
// RUN: %clang -### -S -fwrapv-pointer -fstrict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK3-POINTER %s --implicit-check-not="-fwrapv"
// CHECK3-POINTER-NOT: "-fwrapv-pointer"
-// RUN: %clang -### -S -fno-wrapv -fno-strict-overflow -fno-wrapv-pointer -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4 %s --implicit-check-not="-fwrapv"
+// RUN: %clang -### -S -fno-wrapv -fno-strict-overflow -fno-wrapv-pointer -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4 %s --implicit-check-not="-fwrapv-pointer"
// CHECK4: "-fwrapv"
-// RUN: %clang -### -S -fno-wrapv-pointer -fno-strict-overflow -fno-wrapv -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4-POINTER %s --implicit-check-not="-fwrapv-pointer"
+// RUN: %clang -### -S -fno-wrapv-pointer -fno-strict-overflow -fno-wrapv -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4-POINTER %s --implicit-check-not="-fwrapv"
// CHECK4-POINTER: "-fwrapv-pointer"
More information about the cfe-commits
mailing list