[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
llvm-ci wrote: LLVM Buildbot has detected a new failure on builder `openmp-offload-libc-amdgpu-runtime` running on `omp-vega20-1` while building `clang` at step 7 "Add check check-offload". Full details are available at: https://lab.llvm.org/buildbot/#/builders/73/builds/12566 Here is the relevant piece of the build log for the reference ``` Step 7 (Add check check-offload) failure: test (failure) TEST 'libomptarget :: amdgcn-amd-amdhsa :: mapping/declare_mapper_nested_mappers.cpp' FAILED Exit Code: 2 Command Output (stdout): -- # RUN: at line 1 /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./bin/clang++ -fopenmp-I /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.src/offload/test -I /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/openmp/runtime/src -L /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/offload -L /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./lib -L /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/openmp/runtime/src -nogpulib -Wl,-rpath,/home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/offload -Wl,-rpath,/home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/openmp/runtime/src -Wl,-rpath,/home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./lib -fopenmp-targets=amdgcn-amd-amdhsa /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.src/offload/test/mapping/declare_mapper_nested_mappers.cpp -o /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/offload/test/amdgcn-amd-amdhsa/mapping/Output/declare_mapper_nested_mappers.cpp.tmp -Xoffload-linker -lc -Xoffload-linker -lm /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./lib/libomptarget.devicertl.a && /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/offload/test/amdgcn-amd-amdhsa/mapping/Output/declare_mapper_nested_mappers.cpp.tmp | /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./bin/FileCheck /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.src/offload/test/mapping/declare_mapper_nested_mappers.cpp # executed command: /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./bin/clang++ -fopenmp -I /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.src/offload/test -I /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/openmp/runtime/src -L /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/offload -L /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./lib -L /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/openmp/runtime/src -nogpulib -Wl,-rpath,/home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/offload -Wl,-rpath,/home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/openmp/runtime/src -Wl,-rpath,/home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./lib -fopenmp-targets=amdgcn-amd-amdhsa /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.src/offload/test/mapping/declare_mapper_nested_mappers.cpp -o /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/offload/test/amdgcn-amd-amdhsa/mapping/Output/declare_mapper_nested_mappers.cpp.tmp -Xoffload-linker -lc -Xoffload-linker -lm /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./lib/libomptarget.devicertl.a # executed command: /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/runtimes/runtimes-bins/offload/test/amdgcn-amd-amdhsa/mapping/Output/declare_mapper_nested_mappers.cpp.tmp # note: command had no output on stdout or stderr # error: command failed with exit status: -11 # executed command: /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./bin/FileCheck /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.src/offload/test/mapping/declare_mapper_nested_mappers.cpp # .---command stderr # | FileCheck error: '' is empty. # | FileCheck command line: /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.build/./bin/FileCheck /home/ompworker/bbot/openmp-offload-libc-amdgpu-runtime/llvm.src/offload/test/mapping/declare_mapper_nested_mappers.cpp # `- # error: command failed with exit status: 2 -- ``` https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic closed https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/AaronBallman approved this pull request. LGTM! https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/122486 >From 925f74cad21eb6c46514d1ae543ac202073baf27 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Jan 2025 17:01:07 +0100 Subject: [PATCH 1/5] [Clang] Add -fwrapv-pointer flag GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). --- clang/docs/ReleaseNotes.rst | 15 ++- clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/CodeGen/CGExpr.cpp | 27 +-- clang/lib/CodeGen/CGExprScalar.cpp| 12 - clang/lib/Driver/SanitizerArgs.cpp| 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp| 15 --- clang/lib/Frontend/CompilerInvocation.cpp | 4 +++ clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/CodeGen/integer-overflow.c | 13 ++--- clang/test/CodeGen/pointer-overflow.c | 12 + clang/test/Driver/clang_wrapv_opts.c | 15 ++- .../Sema/tautological-pointer-comparison.c| 2 +- 14 files changed, 88 insertions(+), 40 deletions(-) create mode 100644 clang/test/CodeGen/pointer-overflow.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index cad17c1b3957b6..12b2893b1eb824 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -79,7 +79,15 @@ code bases. Undefined behavior due to pointer addition overflow can be reliably detected using ``-fsanitize=pointer-overflow``. It is also possible to use ``-fno-strict-overflow`` to opt-in to a language dialect where signed integer - and pointer overflow are well-defined. + and pointer overflow are well-defined. Since Clang 20, it is also possible + to use ``-fwrapv-pointer`` to only make pointer overflow well-defined, while + not affecting the behavior of signed integer overflow. + +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, + without affecting pointer overflow, which is controlled by a new + ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies + both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning. + The new behavior matches GCC. C/C++ Language Potentially Breaking Changes --- @@ -500,6 +508,11 @@ New Compiler Flags - clang-cl and clang-dxc now support ``-fdiagnostics-color=[auto|never|always]`` in addition to ``-f[no-]color-diagnostics``. +- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer + overflow is well-defined. The ``-fwrapv`` flag previously implied + ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow`` + implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC. + Deprecated Compiler Flags - diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index a980be853d53e6..1bcec212fd332e 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, "signed integer overflow handling") +LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") BENIGN_LANGOPT(ArrowDepth, 32, 256, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 852051e772fc1c..820ed088029f8c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4299,6 +4299,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group, HelpText<"Treat signed integer overflow as two's complement">; def fno_wrapv : Flag<["-"], "fno-wrapv">, Group, Visibility<[ClangOption, CLOption, FlangOption]>; +def fwrapv_pointer : Flag<["-"], "fwrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, CC1Option, FlangOption, FC1Option]>, + HelpText<"Treat p
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
@@ -1,11 +1,20 @@
// RUN: %clang -### -S -fwrapv -fno-wrapv -fwrapv %s 2>&1 | FileCheck
-check-prefix=CHECK1 %s
// CHECK1: -fwrapv
//
+// RUN: %clang -### -S -fwrapv-pointer -fno-wrapv-pointer -fwrapv-pointer %s
2>&1 | FileCheck -check-prefix=CHECK1-POINTER %s
+// CHECK1-POINTER: -fwrapv-pointer
+//
// RUN: %clang -### -S -fstrict-overflow -fno-strict-overflow %s 2>&1 |
FileCheck -check-prefix=CHECK2 %s
-// CHECK2: -fwrapv
+// CHECK2: -fwrapv{{.*}}-fwrapv-pointer
//
-// RUN: %clang -### -S -fwrapv -fstrict-overflow %s 2>&1 | FileCheck
-check-prefix=CHECK3 %s
+// RUN: %clang -### -S -fwrapv -fstrict-overflow %s 2>&1 | FileCheck
-check-prefix=CHECK3 %s --implicit-check-not="-fwrapv-pointer"
// CHECK3: -fwrapv
//
-// RUN: %clang -### -S -fno-wrapv -fno-strict-overflow %s 2>&1 | FileCheck
-check-prefix=CHECK4 %s
-// CHECK4-NOT: -fwrapv
+// RUN: %clang -### -S -fwrapv-pointer -fstrict-overflow %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 %s 2>&1 | FileCheck
-check-prefix=CHECK4 %s --implicit-check-not="-fwrapv"
+// CHECK4: -fwrapv-pointer
+//
+// RUN: %clang -### -S -fno-wrapv-pointer -fno-strict-overflow %s 2>&1 |
FileCheck -check-prefix=CHECK4-POINTER %s --implicit-check-not="-fwrapv-pointer"
+// CHECK4-POINTER: -fwrapv
MaskRay wrote:
You might need `"-fwrapv"`. Otherwise, IIUC even if the output is
`-fwrap-pointer`, the check will pass. Because `-fwrapv` matches, and the
remaining string will pass the --implicit-check-not check.
https://github.com/llvm/llvm-project/pull/122486
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
@@ -1,11 +1,20 @@
// RUN: %clang -### -S -fwrapv -fno-wrapv -fwrapv %s 2>&1 | FileCheck
-check-prefix=CHECK1 %s
// CHECK1: -fwrapv
//
+// RUN: %clang -### -S -fwrapv-pointer -fno-wrapv-pointer -fwrapv-pointer %s
2>&1 | FileCheck -check-prefix=CHECK1-POINTER %s
+// CHECK1-POINTER: -fwrapv-pointer
+//
// RUN: %clang -### -S -fstrict-overflow -fno-strict-overflow %s 2>&1 |
FileCheck -check-prefix=CHECK2 %s
-// CHECK2: -fwrapv
+// CHECK2: -fwrapv{{.*}}-fwrapv-pointer
//
-// RUN: %clang -### -S -fwrapv -fstrict-overflow %s 2>&1 | FileCheck
-check-prefix=CHECK3 %s
+// RUN: %clang -### -S -fwrapv -fstrict-overflow %s 2>&1 | FileCheck
-check-prefix=CHECK3 %s --implicit-check-not="-fwrapv-pointer"
MaskRay wrote:
When testing both -fno-strict-overflow and -fwrapv{-pointer}, perhaps add
-Werror to ensure that we don't emit a unused option warning (which would
happen if the Driver code forgot to claim an option).
https://github.com/llvm/llvm-project/pull/122486
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/MaskRay edited https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/MaskRay approved this pull request. Will be used by chromium and other users. There is some gap in sanitizer that is not so important. LGTM, but other reviewers need to stamp as well. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
@@ -4311,14 +4311,14 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const
ArraySubscriptExpr *E,
// GEP indexes are signed, and scaling an index isn't permitted to
// signed-overflow, so we use the same semantics for our explicit
// multiply. We suppress this if overflow is not undefined behavior.
-if (getLangOpts().isSignedOverflowDefined()) {
+if (getLangOpts().PointerOverflowDefined) {
Idx = Builder.CreateMul(Idx, numElements);
efriedma-quic wrote:
Opened #124358 .
https://github.com/llvm/llvm-project/pull/122486
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
@@ -4311,14 +4311,14 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const
ArraySubscriptExpr *E,
// GEP indexes are signed, and scaling an index isn't permitted to
// signed-overflow, so we use the same semantics for our explicit
// multiply. We suppress this if overflow is not undefined behavior.
-if (getLangOpts().isSignedOverflowDefined()) {
+if (getLangOpts().PointerOverflowDefined) {
Idx = Builder.CreateMul(Idx, numElements);
efriedma-quic wrote:
This looks like a gap in the pointer-overflow sanitizer: we should trigger the
sanitizer if the multiply overflows. Same issue pops up in a few other places.
But you don't need to fix this in this patch, I guess.
https://github.com/llvm/llvm-project/pull/122486
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/efriedma-quic edited https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/efriedma-quic commented: CC @llvm/clang-vendors : this changes the behavior of -fwrapv. Internally, I expect it's going to be a bit painful to communicate to all our internal teams that they need to change their -fwrapv usage to -fno-strict-overflow, but if we think it's important to align with gcc in that respect, we can do it, I guess? - The implementation looks correct. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
@@ -1,11 +1,24 @@
// RUN: %clang -### -S -fwrapv -fno-wrapv -fwrapv %s 2>&1 | FileCheck
-check-prefix=CHECK1 %s
// CHECK1: -fwrapv
//
+// RUN: %clang -### -S -fwrapv-pointer -fno-wrapv-pointer -fwrapv-pointer %s
2>&1 | FileCheck -check-prefix=CHECK1-POINTER %s
+// CHECK1-POINTER: -fwrapv-pointer
+//
// RUN: %clang -### -S -fstrict-overflow -fno-strict-overflow %s 2>&1 |
FileCheck -check-prefix=CHECK2 %s
-// CHECK2: -fwrapv
+// CHECK2: -fwrapv{{.*}}-fwrapv-pointer
//
// RUN: %clang -### -S -fwrapv -fstrict-overflow %s 2>&1 | FileCheck
-check-prefix=CHECK3 %s
// CHECK3: -fwrapv
//
+// RUN: %clang -### -S -fwrapv-pointer -fstrict-overflow %s 2>&1 | FileCheck
-check-prefix=CHECK3-POINTER %s
+// CHECK3-POINTER: -fwrapv-pointer
nikic wrote:
Good idea, I've switched the last four tests to use `--implicit-check-not`.
https://github.com/llvm/llvm-project/pull/122486
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/122486 >From 925f74cad21eb6c46514d1ae543ac202073baf27 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Jan 2025 17:01:07 +0100 Subject: [PATCH 1/3] [Clang] Add -fwrapv-pointer flag GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). --- clang/docs/ReleaseNotes.rst | 15 ++- clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/CodeGen/CGExpr.cpp | 27 +-- clang/lib/CodeGen/CGExprScalar.cpp| 12 - clang/lib/Driver/SanitizerArgs.cpp| 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp| 15 --- clang/lib/Frontend/CompilerInvocation.cpp | 4 +++ clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/CodeGen/integer-overflow.c | 13 ++--- clang/test/CodeGen/pointer-overflow.c | 12 + clang/test/Driver/clang_wrapv_opts.c | 15 ++- .../Sema/tautological-pointer-comparison.c| 2 +- 14 files changed, 88 insertions(+), 40 deletions(-) create mode 100644 clang/test/CodeGen/pointer-overflow.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index cad17c1b3957b6..12b2893b1eb824 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -79,7 +79,15 @@ code bases. Undefined behavior due to pointer addition overflow can be reliably detected using ``-fsanitize=pointer-overflow``. It is also possible to use ``-fno-strict-overflow`` to opt-in to a language dialect where signed integer - and pointer overflow are well-defined. + and pointer overflow are well-defined. Since Clang 20, it is also possible + to use ``-fwrapv-pointer`` to only make pointer overflow well-defined, while + not affecting the behavior of signed integer overflow. + +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, + without affecting pointer overflow, which is controlled by a new + ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies + both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning. + The new behavior matches GCC. C/C++ Language Potentially Breaking Changes --- @@ -500,6 +508,11 @@ New Compiler Flags - clang-cl and clang-dxc now support ``-fdiagnostics-color=[auto|never|always]`` in addition to ``-f[no-]color-diagnostics``. +- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer + overflow is well-defined. The ``-fwrapv`` flag previously implied + ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow`` + implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC. + Deprecated Compiler Flags - diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index a980be853d53e6..1bcec212fd332e 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, "signed integer overflow handling") +LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") BENIGN_LANGOPT(ArrowDepth, 32, 256, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 852051e772fc1c..820ed088029f8c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4299,6 +4299,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group, HelpText<"Treat signed integer overflow as two's complement">; def fno_wrapv : Flag<["-"], "fno-wrapv">, Group, Visibility<[ClangOption, CLOption, FlangOption]>; +def fwrapv_pointer : Flag<["-"], "fwrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, CC1Option, FlangOption, FC1Option]>, + HelpText<"Treat p
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
@@ -1,11 +1,24 @@
// RUN: %clang -### -S -fwrapv -fno-wrapv -fwrapv %s 2>&1 | FileCheck
-check-prefix=CHECK1 %s
// CHECK1: -fwrapv
//
+// RUN: %clang -### -S -fwrapv-pointer -fno-wrapv-pointer -fwrapv-pointer %s
2>&1 | FileCheck -check-prefix=CHECK1-POINTER %s
+// CHECK1-POINTER: -fwrapv-pointer
+//
// RUN: %clang -### -S -fstrict-overflow -fno-strict-overflow %s 2>&1 |
FileCheck -check-prefix=CHECK2 %s
-// CHECK2: -fwrapv
+// CHECK2: -fwrapv{{.*}}-fwrapv-pointer
//
// RUN: %clang -### -S -fwrapv -fstrict-overflow %s 2>&1 | FileCheck
-check-prefix=CHECK3 %s
// CHECK3: -fwrapv
//
+// RUN: %clang -### -S -fwrapv-pointer -fstrict-overflow %s 2>&1 | FileCheck
-check-prefix=CHECK3-POINTER %s
+// CHECK3-POINTER: -fwrapv-pointer
MaskRay wrote:
Needs a NOT pattern for -fwrapv.
Perhaps use --implicit-check-not=-fwrap so that we don't need a NOT before and
a NOT after the positive pattern.
https://github.com/llvm/llvm-project/pull/122486
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
@@ -57,15 +57,6 @@ void test1(void) {
// TRAPV_HANDLER: foo(
--a;
- // -fwrapv should turn off inbounds for GEP's, PR9256
- extern int* P;
- ++P;
- // DEFAULT: getelementptr inbounds nuw i32, ptr
- // WRAPV: getelementptr i32, ptr
- // TRAPV: getelementptr inbounds nuw i32, ptr
- // CATCH_UB_POINTER: getelementptr inbounds nuw i32, ptr
- // NOCATCH_UB_POINTER: getelementptr i32, ptr
nikic wrote:
I've restored the test. The intent here was to split off the pointer case into
pointer-overflow.c, but there's no reason we can't have both...
https://github.com/llvm/llvm-project/pull/122486
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/122486 >From 925f74cad21eb6c46514d1ae543ac202073baf27 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Jan 2025 17:01:07 +0100 Subject: [PATCH 1/2] [Clang] Add -fwrapv-pointer flag GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). --- clang/docs/ReleaseNotes.rst | 15 ++- clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/CodeGen/CGExpr.cpp | 27 +-- clang/lib/CodeGen/CGExprScalar.cpp| 12 - clang/lib/Driver/SanitizerArgs.cpp| 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp| 15 --- clang/lib/Frontend/CompilerInvocation.cpp | 4 +++ clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/CodeGen/integer-overflow.c | 13 ++--- clang/test/CodeGen/pointer-overflow.c | 12 + clang/test/Driver/clang_wrapv_opts.c | 15 ++- .../Sema/tautological-pointer-comparison.c| 2 +- 14 files changed, 88 insertions(+), 40 deletions(-) create mode 100644 clang/test/CodeGen/pointer-overflow.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index cad17c1b3957b6..12b2893b1eb824 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -79,7 +79,15 @@ code bases. Undefined behavior due to pointer addition overflow can be reliably detected using ``-fsanitize=pointer-overflow``. It is also possible to use ``-fno-strict-overflow`` to opt-in to a language dialect where signed integer - and pointer overflow are well-defined. + and pointer overflow are well-defined. Since Clang 20, it is also possible + to use ``-fwrapv-pointer`` to only make pointer overflow well-defined, while + not affecting the behavior of signed integer overflow. + +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, + without affecting pointer overflow, which is controlled by a new + ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies + both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning. + The new behavior matches GCC. C/C++ Language Potentially Breaking Changes --- @@ -500,6 +508,11 @@ New Compiler Flags - clang-cl and clang-dxc now support ``-fdiagnostics-color=[auto|never|always]`` in addition to ``-f[no-]color-diagnostics``. +- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer + overflow is well-defined. The ``-fwrapv`` flag previously implied + ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow`` + implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC. + Deprecated Compiler Flags - diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index a980be853d53e6..1bcec212fd332e 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, "signed integer overflow handling") +LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") BENIGN_LANGOPT(ArrowDepth, 32, 256, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 852051e772fc1c..820ed088029f8c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4299,6 +4299,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group, HelpText<"Treat signed integer overflow as two's complement">; def fno_wrapv : Flag<["-"], "fno-wrapv">, Group, Visibility<[ClangOption, CLOption, FlangOption]>; +def fwrapv_pointer : Flag<["-"], "fwrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, CC1Option, FlangOption, FC1Option]>, + HelpText<"Treat p
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/122486 >From 925f74cad21eb6c46514d1ae543ac202073baf27 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Jan 2025 17:01:07 +0100 Subject: [PATCH 1/2] [Clang] Add -fwrapv-pointer flag GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). --- clang/docs/ReleaseNotes.rst | 15 ++- clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/CodeGen/CGExpr.cpp | 27 +-- clang/lib/CodeGen/CGExprScalar.cpp| 12 - clang/lib/Driver/SanitizerArgs.cpp| 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp| 15 --- clang/lib/Frontend/CompilerInvocation.cpp | 4 +++ clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/CodeGen/integer-overflow.c | 13 ++--- clang/test/CodeGen/pointer-overflow.c | 12 + clang/test/Driver/clang_wrapv_opts.c | 15 ++- .../Sema/tautological-pointer-comparison.c| 2 +- 14 files changed, 88 insertions(+), 40 deletions(-) create mode 100644 clang/test/CodeGen/pointer-overflow.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index cad17c1b3957b6..12b2893b1eb824 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -79,7 +79,15 @@ code bases. Undefined behavior due to pointer addition overflow can be reliably detected using ``-fsanitize=pointer-overflow``. It is also possible to use ``-fno-strict-overflow`` to opt-in to a language dialect where signed integer - and pointer overflow are well-defined. + and pointer overflow are well-defined. Since Clang 20, it is also possible + to use ``-fwrapv-pointer`` to only make pointer overflow well-defined, while + not affecting the behavior of signed integer overflow. + +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, + without affecting pointer overflow, which is controlled by a new + ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies + both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning. + The new behavior matches GCC. C/C++ Language Potentially Breaking Changes --- @@ -500,6 +508,11 @@ New Compiler Flags - clang-cl and clang-dxc now support ``-fdiagnostics-color=[auto|never|always]`` in addition to ``-f[no-]color-diagnostics``. +- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer + overflow is well-defined. The ``-fwrapv`` flag previously implied + ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow`` + implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC. + Deprecated Compiler Flags - diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index a980be853d53e6..1bcec212fd332e 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, "signed integer overflow handling") +LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") BENIGN_LANGOPT(ArrowDepth, 32, 256, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 852051e772fc1c..820ed088029f8c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4299,6 +4299,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group, HelpText<"Treat signed integer overflow as two's complement">; def fno_wrapv : Flag<["-"], "fno-wrapv">, Group, Visibility<[ClangOption, CLOption, FlangOption]>; +def fwrapv_pointer : Flag<["-"], "fwrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, CC1Option, FlangOption, FC1Option]>, + HelpText<"Treat p
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
@@ -79,7 +79,15 @@ code bases. Undefined behavior due to pointer addition overflow can be reliably detected using ``-fsanitize=pointer-overflow``. It is also possible to use ``-fno-strict-overflow`` to opt-in to a language dialect where signed integer - and pointer overflow are well-defined. + and pointer overflow are well-defined. Since Clang 20, it is also possible + to use ``-fwrapv-pointer`` to only make pointer overflow well-defined, while + not affecting the behavior of signed integer overflow. + +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, AaronBallman wrote: Curiously enough, we only ever documented the signed integer overflow behavior, not the pointer overflow: https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fwrapv https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
@@ -57,15 +57,6 @@ void test1(void) {
// TRAPV_HANDLER: foo(
--a;
- // -fwrapv should turn off inbounds for GEP's, PR9256
- extern int* P;
- ++P;
- // DEFAULT: getelementptr inbounds nuw i32, ptr
- // WRAPV: getelementptr i32, ptr
- // TRAPV: getelementptr inbounds nuw i32, ptr
- // CATCH_UB_POINTER: getelementptr inbounds nuw i32, ptr
- // NOCATCH_UB_POINTER: getelementptr i32, ptr
AaronBallman wrote:
Should we keep the test but update the comment + expected results?
https://github.com/llvm/llvm-project/pull/122486
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/AaronBallman edited https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/AaronBallman commented: The changes look correct to me, but I'd love to hear from the codegen and sanitizer experts as to whether they agree with the changes and the timeline to land it for 20. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
AaronBallman wrote: I am a bit concerned about the behavioral change, but given the more aggressive optimizations in LLVM 20, I think it makes sense to get this into Clang 20 to see what the fallout is during early RCs. If there's negative impact, we can consider cherry-picking a revert from the branch. Matching GCC's behavior for the options seems like a defensible approach. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
nikic wrote: If we want to make this change, I think doing it for Clang 20 would be ideal, because it is related to the pointer overflow optimization changes in that release. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/shafik commented: I feel like matching gcc's behavior makes sense for users but I am not sure about the timing for clang-20. This seems like the change in behavior could be impactful. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
carlocab wrote: > Matching gcc's behavior for -f flags both compilers have also makes sense, > IMHO. Agree with this, FWIW. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/122486 >From 925f74cad21eb6c46514d1ae543ac202073baf27 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Jan 2025 17:01:07 +0100 Subject: [PATCH] [Clang] Add -fwrapv-pointer flag GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). --- clang/docs/ReleaseNotes.rst | 15 ++- clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/CodeGen/CGExpr.cpp | 27 +-- clang/lib/CodeGen/CGExprScalar.cpp| 12 - clang/lib/Driver/SanitizerArgs.cpp| 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp| 15 --- clang/lib/Frontend/CompilerInvocation.cpp | 4 +++ clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/CodeGen/integer-overflow.c | 13 ++--- clang/test/CodeGen/pointer-overflow.c | 12 + clang/test/Driver/clang_wrapv_opts.c | 15 ++- .../Sema/tautological-pointer-comparison.c| 2 +- 14 files changed, 88 insertions(+), 40 deletions(-) create mode 100644 clang/test/CodeGen/pointer-overflow.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index cad17c1b3957b6..12b2893b1eb824 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -79,7 +79,15 @@ code bases. Undefined behavior due to pointer addition overflow can be reliably detected using ``-fsanitize=pointer-overflow``. It is also possible to use ``-fno-strict-overflow`` to opt-in to a language dialect where signed integer - and pointer overflow are well-defined. + and pointer overflow are well-defined. Since Clang 20, it is also possible + to use ``-fwrapv-pointer`` to only make pointer overflow well-defined, while + not affecting the behavior of signed integer overflow. + +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, + without affecting pointer overflow, which is controlled by a new + ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies + both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning. + The new behavior matches GCC. C/C++ Language Potentially Breaking Changes --- @@ -500,6 +508,11 @@ New Compiler Flags - clang-cl and clang-dxc now support ``-fdiagnostics-color=[auto|never|always]`` in addition to ``-f[no-]color-diagnostics``. +- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer + overflow is well-defined. The ``-fwrapv`` flag previously implied + ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow`` + implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC. + Deprecated Compiler Flags - diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index a980be853d53e6..1bcec212fd332e 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, "signed integer overflow handling") +LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") BENIGN_LANGOPT(ArrowDepth, 32, 256, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 852051e772fc1c..820ed088029f8c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4299,6 +4299,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group, HelpText<"Treat signed integer overflow as two's complement">; def fno_wrapv : Flag<["-"], "fno-wrapv">, Group, Visibility<[ClangOption, CLOption, FlangOption]>; +def fwrapv_pointer : Flag<["-"], "fwrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, CC1Option, FlangOption, FC1Option]>, + HelpText<"Treat point
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
nico wrote: We (chromium) turned on fwrapv due to the pointer changes, and it had a bit of a perf hit. We'd probably switch to this, hoping it'd address the perf issues at least some. Matching gcc's behavior for -f flags both compilers have also makes sense, IMHO. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
nikic wrote: > I'm tempted to say we should just treat > -fwrapv/-fwrapv-pointer/-fno-strict-overflow as aliases for each other. I > don't think anyone using -fwrapv is going to be happy that we're turning on > overflow optimizations. Yeah, I'm not entirely sure this change is worthwhile either. My general thinking here was that we already have the `-fno-strict-overflow` flag, which works the same on GCC and Clang and disables all overflow optimization. If someone wants to disable pointer overflow optimization and they're using `-fwrapv` to do that, their code is already broken on GCC. So given that we already have an option that works the same for all compilers and compiler versions, it's best to go for consistency for the rest. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
efriedma-quic wrote: I'm tempted to say we should just treat -fwrapv/-fwrapv-pointer/-fno-strict-overflow as aliases for each other. I don't think anyone using -fwrapv is going to be happy that we're turning on overflow optimizations. https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/122486 >From b32e3e1eee4b359ae2f0a1563420104de8d52277 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Jan 2025 17:01:07 +0100 Subject: [PATCH] [Clang] Add -fwrapv-pointer flag GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). --- clang/docs/ReleaseNotes.rst | 11 clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/CodeGen/CGExpr.cpp | 27 +-- clang/lib/CodeGen/CGExprScalar.cpp| 12 - clang/lib/Driver/SanitizerArgs.cpp| 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp| 15 --- clang/lib/Frontend/CompilerInvocation.cpp | 4 +++ clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/CodeGen/integer-overflow.c | 13 ++--- clang/test/CodeGen/pointer-overflow.c | 12 + clang/test/Driver/clang_wrapv_opts.c | 15 ++- .../Sema/tautological-pointer-comparison.c| 2 +- 14 files changed, 85 insertions(+), 39 deletions(-) create mode 100644 clang/test/CodeGen/pointer-overflow.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 511a28c5554bbb..44d98d98411d12 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -58,6 +58,12 @@ code bases. containing strict-aliasing violations. The new default behavior can be disabled using ``-fno-pointer-tbaa``. +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, + without affecting pointer overflow, which is controlled by a new + ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies + both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning. + The new behavior matches GCC. + C/C++ Language Potentially Breaking Changes --- @@ -464,6 +470,11 @@ New Compiler Flags - clang-cl and clang-dxc now support ``-fdiagnostics-color=[auto|never|always]`` in addition to ``-f[no-]color-diagnostics``. +- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer + overflow is well-defined. The ``-fwrapv`` flag previously implied + ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow`` + implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC. + Deprecated Compiler Flags - diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 3b833240e5b68c..c4c53d7455c417 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, "signed integer overflow handling") +LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") BENIGN_LANGOPT(ArrowDepth, 32, 256, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 41a7e8c3728066..8b45aa6dd4c2df 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4291,6 +4291,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group, HelpText<"Treat signed integer overflow as two's complement">; def fno_wrapv : Flag<["-"], "fno-wrapv">, Group, Visibility<[ClangOption, CLOption, FlangOption]>; +def fwrapv_pointer : Flag<["-"], "fwrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, CC1Option, FlangOption, FC1Option]>, + HelpText<"Treat pointer overflow as two's complement">; +def fno_wrapv_pointer : Flag<["-"], "fno-wrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, FlangOption]>; def fwritable_strings : Flag<["-"], "fwritable-strings">, Group, Visibility<[ClangOption, CC1Option]>, HelpText<"Store string literals as writable data">, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/C
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/122486 >From 1f3737d2eeb7681cb57a66f7bd6c4614cd038aac Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Jan 2025 17:01:07 +0100 Subject: [PATCH] [Clang] Add -fwrapv-pointer flag GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). --- clang/docs/ReleaseNotes.rst | 11 ++ clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 + clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/CodeGen/CGExpr.cpp | 22 +-- clang/lib/CodeGen/CGExprScalar.cpp| 12 +- clang/lib/Driver/SanitizerArgs.cpp| 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp| 15 + clang/lib/Frontend/CompilerInvocation.cpp | 4 clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/CodeGen/integer-overflow.c | 13 ++- clang/test/CodeGen/pointer-overflow.c | 12 ++ clang/test/Driver/clang_wrapv_opts.c | 15 - .../Sema/tautological-pointer-comparison.c| 2 +- 14 files changed, 83 insertions(+), 36 deletions(-) create mode 100644 clang/test/CodeGen/pointer-overflow.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 511a28c5554bbb..44d98d98411d12 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -58,6 +58,12 @@ code bases. containing strict-aliasing violations. The new default behavior can be disabled using ``-fno-pointer-tbaa``. +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, + without affecting pointer overflow, which is controlled by a new + ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies + both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning. + The new behavior matches GCC. + C/C++ Language Potentially Breaking Changes --- @@ -464,6 +470,11 @@ New Compiler Flags - clang-cl and clang-dxc now support ``-fdiagnostics-color=[auto|never|always]`` in addition to ``-f[no-]color-diagnostics``. +- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer + overflow is well-defined. The ``-fwrapv`` flag previously implied + ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow`` + implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC. + Deprecated Compiler Flags - diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 3b833240e5b68c..c4c53d7455c417 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, "signed integer overflow handling") +LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") BENIGN_LANGOPT(ArrowDepth, 32, 256, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 41a7e8c3728066..8b45aa6dd4c2df 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4291,6 +4291,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group, HelpText<"Treat signed integer overflow as two's complement">; def fno_wrapv : Flag<["-"], "fno-wrapv">, Group, Visibility<[ClangOption, CLOption, FlangOption]>; +def fwrapv_pointer : Flag<["-"], "fwrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, CC1Option, FlangOption, FC1Option]>, + HelpText<"Treat pointer overflow as two's complement">; +def fno_wrapv_pointer : Flag<["-"], "fno-wrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, FlangOption]>; def fwritable_strings : Flag<["-"], "fwritable-strings">, Group, Visibility<[ClangOption, CC1Option]>, HelpText<"Store string literals as writable data">, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/122486 >From b8c7a369fffecc9d1811d286fb1536346045fb74 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Jan 2025 17:01:07 +0100 Subject: [PATCH] [Clang] Add -fwrapv-pointer flag GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). --- clang/docs/ReleaseNotes.rst | 11 ++ clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 + clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/CodeGen/CGExpr.cpp | 22 +-- clang/lib/CodeGen/CGExprScalar.cpp| 12 +- clang/lib/Driver/SanitizerArgs.cpp| 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp| 15 + clang/lib/Frontend/CompilerInvocation.cpp | 4 clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/CodeGen/integer-overflow.c | 13 ++- clang/test/CodeGen/pointer-overflow.c | 12 ++ clang/test/Driver/clang_wrapv_opts.c | 19 +--- .../Sema/tautological-pointer-comparison.c| 2 +- 14 files changed, 85 insertions(+), 38 deletions(-) create mode 100644 clang/test/CodeGen/pointer-overflow.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 511a28c5554bbb..44d98d98411d12 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -58,6 +58,12 @@ code bases. containing strict-aliasing violations. The new default behavior can be disabled using ``-fno-pointer-tbaa``. +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, + without affecting pointer overflow, which is controlled by a new + ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies + both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning. + The new behavior matches GCC. + C/C++ Language Potentially Breaking Changes --- @@ -464,6 +470,11 @@ New Compiler Flags - clang-cl and clang-dxc now support ``-fdiagnostics-color=[auto|never|always]`` in addition to ``-f[no-]color-diagnostics``. +- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer + overflow is well-defined. The ``-fwrapv`` flag previously implied + ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow`` + implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC. + Deprecated Compiler Flags - diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 3b833240e5b68c..c4c53d7455c417 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, "signed integer overflow handling") +LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") BENIGN_LANGOPT(ArrowDepth, 32, 256, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 41a7e8c3728066..8b45aa6dd4c2df 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4291,6 +4291,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group, HelpText<"Treat signed integer overflow as two's complement">; def fno_wrapv : Flag<["-"], "fno-wrapv">, Group, Visibility<[ClangOption, CLOption, FlangOption]>; +def fwrapv_pointer : Flag<["-"], "fwrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, CC1Option, FlangOption, FC1Option]>, + HelpText<"Treat pointer overflow as two's complement">; +def fno_wrapv_pointer : Flag<["-"], "fno-wrapv-pointer">, Group, + Visibility<[ClangOption, CLOption, FlangOption]>; def fwritable_strings : Flag<["-"], "fwritable-strings">, Group, Visibility<[ClangOption, CC1Option]>, HelpText<"Store string literals as writable data">, diff --git a/clang/lib/CodeGen/CGBuiltin.cp
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff c39500f88c93f668c68bdafe56bd8d16e8abbec1 32fe619505787c434f97b01da0458ba7861f9550 --extensions c,cpp -- clang/lib/CodeGen/CGBuiltin.cpp clang/lib/CodeGen/CGExpr.cpp clang/lib/CodeGen/CGExprScalar.cpp clang/lib/Driver/SanitizerArgs.cpp clang/lib/Driver/ToolChains/CommonArgs.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/lib/Sema/SemaExpr.cpp clang/test/CodeGen/integer-overflow.c clang/test/Driver/clang_wrapv_opts.c clang/test/Sema/tautological-pointer-comparison.c `` View the diff from clang-format here. ``diff diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index dc9c2afeaa..6fd9e82292 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -4413,10 +4413,9 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E, Addr = EmitPointerWithAlignment(E->getBase(), &EltBaseInfo, &EltTBAAInfo); auto *Idx = EmitIdxAfterBase(/*Promote*/true); QualType ptrType = E->getBase()->getType(); -Addr = emitArraySubscriptGEP(*this, Addr, Idx, E->getType(), - !getLangOpts().PointerOverflowDefined, - SignedIndices, E->getExprLoc(), &ptrType, - E->getBase()); +Addr = emitArraySubscriptGEP( +*this, Addr, Idx, E->getType(), !getLangOpts().PointerOverflowDefined, +SignedIndices, E->getExprLoc(), &ptrType, E->getBase()); } LValue LV = MakeAddrLValue(Addr, E->getType(), EltBaseInfo, EltTBAAInfo); `` https://github.com/llvm/llvm-project/pull/122486 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
llvmbot wrote:
@llvm/pr-subscribers-clang-driver
Author: Nikita Popov (nikic)
Changes
GCC supports three flags related to overflow behavior:
* `-fwrapv`: Makes signed integer overflow well-defined.
* `-fwrapv-pointer`: Makes pointer overflow well-defined.
* `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both
signed integer overflow and pointer overflow well-defined.
Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not
`-fwrapv-pointer`.
This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of
`-fwrapv` to match GCC.
This allows signed integer overflow and pointer overflow to be controlled
independently, while `-fno-strict-overflow` still exists to control both at the
same time (and that option is consistent across GCC and Clang).
---
Full diff: https://github.com/llvm/llvm-project/pull/122486.diff
13 Files Affected:
- (modified) clang/docs/ReleaseNotes.rst (+11)
- (modified) clang/include/clang/Basic/LangOptions.def (+1)
- (modified) clang/include/clang/Driver/Options.td (+5)
- (modified) clang/lib/CodeGen/CGBuiltin.cpp (+1-1)
- (modified) clang/lib/CodeGen/CGExpr.cpp (+11-11)
- (modified) clang/lib/CodeGen/CGExprScalar.cpp (+6-6)
- (modified) clang/lib/Driver/SanitizerArgs.cpp (+3)
- (modified) clang/lib/Driver/ToolChains/CommonArgs.cpp (+11-4)
- (modified) clang/lib/Frontend/CompilerInvocation.cpp (+4)
- (modified) clang/lib/Sema/SemaExpr.cpp (+1-1)
- (modified) clang/test/CodeGen/integer-overflow.c (+2-11)
- (modified) clang/test/Driver/clang_wrapv_opts.c (+16-3)
- (modified) clang/test/Sema/tautological-pointer-comparison.c (+1-1)
``diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 511a28c5554bbb..44d98d98411d12 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -58,6 +58,12 @@ code bases.
containing strict-aliasing violations. The new default behavior can be
disabled using ``-fno-pointer-tbaa``.
+- The ``-fwrapv`` flag now only makes signed integer overflow well-defined,
+ without affecting pointer overflow, which is controlled by a new
+ ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies
+ both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning.
+ The new behavior matches GCC.
+
C/C++ Language Potentially Breaking Changes
---
@@ -464,6 +470,11 @@ New Compiler Flags
- clang-cl and clang-dxc now support
``-fdiagnostics-color=[auto|never|always]``
in addition to ``-f[no-]color-diagnostics``.
+- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer
+ overflow is well-defined. The ``-fwrapv`` flag previously implied
+ ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow``
+ implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC.
+
Deprecated Compiler Flags
-
diff --git a/clang/include/clang/Basic/LangOptions.def
b/clang/include/clang/Basic/LangOptions.def
index 3b833240e5b68c..c4c53d7455c417 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0,
"stop trivial automatic variable initialization if var size
exceeds the specified size (in bytes). Must be greater than 0.")
ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2,
SOB_Undefined,
"signed integer overflow handling")
+LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined")
ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX,
"Thread Model")
BENIGN_LANGOPT(ArrowDepth, 32, 256,
diff --git a/clang/include/clang/Driver/Options.td
b/clang/include/clang/Driver/Options.td
index 41a7e8c3728066..8b45aa6dd4c2df 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -4291,6 +4291,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group,
HelpText<"Treat signed integer overflow as two's complement">;
def fno_wrapv : Flag<["-"], "fno-wrapv">, Group,
Visibility<[ClangOption, CLOption, FlangOption]>;
+def fwrapv_pointer : Flag<["-"], "fwrapv-pointer">, Group,
+ Visibility<[ClangOption, CLOption, CC1Option, FlangOption, FC1Option]>,
+ HelpText<"Treat pointer overflow as two's complement">;
+def fno_wrapv_pointer : Flag<["-"], "fno-wrapv-pointer">, Group,
+ Visibility<[ClangOption, CLOption, FlangOption]>;
def fwritable_strings : Flag<["-"], "fwritable-strings">, Group,
Visibility<[ClangOption, CC1Option]>,
HelpText<"Store string literals as writable data">,
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index ca03fb665d423d..b5bbfeae576029 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -22113,7 +22113,7 @@ RValue CodeGenFunction::EmitBuiltinAlignTo(const
CallExpr *E, bool AlignUp) {
// By adding the ma
[clang] [Clang] Add -fwrapv-pointer flag (PR #122486)
https://github.com/nikic created https://github.com/llvm/llvm-project/pull/122486 GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). >From 32fe619505787c434f97b01da0458ba7861f9550 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Jan 2025 17:01:07 +0100 Subject: [PATCH] [Clang] Add -fwrapv-pointer flag GCC supports three flags related to overflow behavior: * `-fwrapv`: Makes signed integer overflow well-defined. * `-fwrapv-pointer`: Makes pointer overflow well-defined. * `-fno-strict-overflow`: Implies `-fwrapv -fwrapv-pointer`, making both signed integer overflow and pointer overflow well-defined. Clang currently only supports `-fno-strict-overflow` and `-fwrapv`, but not `-fwrapv-pointer`. This PR proposes to introduce `-fwrapv-pointer` and adjust the semantics of `-fwrapv` to match GCC. This allows signed integer overflow and pointer overflow to be controlled independently, while `-fno-strict-overflow` still exists to control both at the same time (and that option is consistent across GCC and Clang). --- clang/docs/ReleaseNotes.rst | 11 ++ clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 + clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/CodeGen/CGExpr.cpp | 22 +-- clang/lib/CodeGen/CGExprScalar.cpp| 12 +- clang/lib/Driver/SanitizerArgs.cpp| 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp| 15 + clang/lib/Frontend/CompilerInvocation.cpp | 4 clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/CodeGen/integer-overflow.c | 13 ++- clang/test/Driver/clang_wrapv_opts.c | 19 +--- .../Sema/tautological-pointer-comparison.c| 2 +- 13 files changed, 73 insertions(+), 38 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 511a28c5554bbb..44d98d98411d12 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -58,6 +58,12 @@ code bases. containing strict-aliasing violations. The new default behavior can be disabled using ``-fno-pointer-tbaa``. +- The ``-fwrapv`` flag now only makes signed integer overflow well-defined, + without affecting pointer overflow, which is controlled by a new + ``-fwrapv-pointer`` flag. The ``-fno-strict-overflow`` flag now implies + both ``-fwrapv`` and ``-fwrapv-pointer`` and as such retains its old meaning. + The new behavior matches GCC. + C/C++ Language Potentially Breaking Changes --- @@ -464,6 +470,11 @@ New Compiler Flags - clang-cl and clang-dxc now support ``-fdiagnostics-color=[auto|never|always]`` in addition to ``-f[no-]color-diagnostics``. +- The new ``-fwrapv-pointer`` flag opts-in to a language dialect where pointer + overflow is well-defined. The ``-fwrapv`` flag previously implied + ``-fwrapv-pointer`` as well, but no longer does. ``-fno-strict-overflow`` + implies ``-fwrapv -fwrapv-pointer``. The flags now match GCC. + Deprecated Compiler Flags - diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 3b833240e5b68c..c4c53d7455c417 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -407,6 +407,7 @@ VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, "signed integer overflow handling") +LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") BENIGN_LANGOPT(ArrowDepth, 32, 256, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 41a7e8c3728066..8b45aa6dd4c2df 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4291,6 +4291,11 @@ def fwrapv : Flag<["-"], "fwrapv">, Group, HelpText<"Treat signed integer overflow as two's complement">; def fno_wrapv
