[llvm-branch-commits] [clang] [UBsan] add -fsanitize-handler-preserve-all-regs flag (PR #168644)
Florian Mayer via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Nov 20 15:45:57 PST 2025
https://github.com/fmayer updated https://github.com/llvm/llvm-project/pull/168644
>From d2231031d7ecfffc97709d6bf2236ead4147aab8 Mon Sep 17 00:00:00 2001
From: Florian Mayer <fmayer at google.com>
Date: Wed, 19 Nov 2025 18:01:59 -0800
Subject: [PATCH 1/3] rename
Created using spr 1.3.7
---
clang/include/clang/Basic/CodeGenOptions.def | 2 +-
clang/include/clang/Driver/SanitizerArgs.h | 2 +-
clang/include/clang/Options/Options.td | 6 +++---
clang/lib/Driver/SanitizerArgs.cpp | 11 ++++++-----
clang/test/Driver/fsanitize.c | 4 ++--
5 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def
index 3c9cdf5545c1f..76a6463881c6f 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -270,7 +270,7 @@ CODEGENOPT(SanitizeMemoryUseAfterDtor, 1, 0, Benign) ///< Enable use-after-delet
CODEGENOPT(SanitizeCfiCrossDso, 1, 0, Benign) ///< Enable cross-dso support in CFI.
CODEGENOPT(SanitizeMinimalRuntime, 1, 0, Benign) ///< Use "_minimal" sanitizer runtime for
///< diagnostics.
-CODEGENOPT(SanitizePreserveRuntime, 1, 0, Benign) ///< Use "_preserve" sanitizer runtime for
+CODEGENOPT(SanitizeHandlerPreserveAllRegs, 1, 0, Benign) ///< Use "_preserve" sanitizer runtime for
///< diagnostics.
CODEGENOPT(SanitizeCfiICallGeneralizePointers, 1, 0, Benign) ///< Generalize pointer types in
///< CFI icall function signatures
diff --git a/clang/include/clang/Driver/SanitizerArgs.h b/clang/include/clang/Driver/SanitizerArgs.h
index eef482cb577a9..6fd059263fb4d 100644
--- a/clang/include/clang/Driver/SanitizerArgs.h
+++ b/clang/include/clang/Driver/SanitizerArgs.h
@@ -67,7 +67,7 @@ class SanitizerArgs {
bool TsanFuncEntryExit = true;
bool TsanAtomics = true;
bool MinimalRuntime = false;
- bool PreserveRuntime = false;
+ bool HandlerPreserveAllRegs = false;
// True if cross-dso CFI support if provided by the system (i.e. Android).
bool ImplicitCfiRuntime = false;
bool NeedsMemProfRt = false;
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index a3e0566d9763d..2c9876c305ffe 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -2656,9 +2656,9 @@ defm sanitize_minimal_runtime : BoolOption<"f", "sanitize-minimal-runtime",
PosFlag<SetTrue>,
NegFlag<SetFalse>>,
Group<f_clang_Group>;
-defm sanitize_preserve_runtime
- : BoolOption<"f", "sanitize-preserve-runtime",
- CodeGenOpts<"SanitizePreserveRuntime">, DefaultFalse,
+defm sanitize_handler_preserve_all_regs_experimental
+ : BoolOption<"f", "sanitize-handler-preserve-all-regs-experimental",
+ CodeGenOpts<"SanitizeHandlerPreserveAllRegs">, DefaultFalse,
PosFlag<SetTrue>, NegFlag<SetFalse>>,
Group<f_clang_Group>;
def fsanitize_link_runtime : Flag<["-"], "fsanitize-link-runtime">,
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index c5ef3018b2455..42d3f52e2de9f 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -423,9 +423,10 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
MinimalRuntime =
Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
- PreserveRuntime =
- Args.hasFlag(options::OPT_fsanitize_preserve_runtime,
- options::OPT_fno_sanitize_preserve_runtime, PreserveRuntime);
+ HandlerPreserveAllRegs = Args.hasFlag(
+ options::OPT_fsanitize_handler_preserve_all_regs_experimental,
+ options::OPT_fno_sanitize_handler_preserve_all_regs_experimental,
+ HandlerPreserveAllRegs);
// The object size sanitizer should not be enabled at -O0.
Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
@@ -1472,8 +1473,8 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
if (MinimalRuntime)
CmdArgs.push_back("-fsanitize-minimal-runtime");
- if (PreserveRuntime)
- CmdArgs.push_back("-fsanitize-preserve-runtime");
+ if (HandlerPreserveAllRegs)
+ CmdArgs.push_back("-fsanitize-handler-preserve-all-regs-experimental");
if (AsanFieldPadding)
CmdArgs.push_back(Args.MakeArgString("-fsanitize-address-field-padding=" +
diff --git a/clang/test/Driver/fsanitize.c b/clang/test/Driver/fsanitize.c
index 03241c2fcf91a..18f2b74b7b580 100644
--- a/clang/test/Driver/fsanitize.c
+++ b/clang/test/Driver/fsanitize.c
@@ -984,10 +984,10 @@
// CHECK-UBSAN-MINIMAL: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|pointer-overflow|float-cast-overflow|array-bounds|enum|bool|builtin|returns-nonnull-attribute|nonnull-attribute|function),?){18}"}}
// CHECK-UBSAN-MINIMAL: "-fsanitize-minimal-runtime"
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-minimal-runtime -fsanitize-preserve-runtime %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UBSAN-MINIMAL-PRESERVE
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-minimal-runtime -fsanitize-handler-preserve-all-regs-experimental %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UBSAN-MINIMAL-PRESERVE
// CHECK-UBSAN-MINIMAL-PRESERVE: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|pointer-overflow|float-cast-overflow|array-bounds|enum|bool|builtin|returns-nonnull-attribute|nonnull-attribute|function),?){18}"}}
// CHECK-UBSAN-MINIMAL-PRESERVE: "-fsanitize-minimal-runtime"
-// CHECK-UBSAN-MINIMAL-PRESERVE: "-fsanitize-preserve-runtime"
+// CHECK-UBSAN-MINIMAL-PRESERVE: "-fsanitize-handler-preserve-all-regs-experimental"
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=integer -fsanitize-trap=integer %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-INTSAN-TRAP
// CHECK-INTSAN-TRAP: "-fsanitize-trap=integer-divide-by-zero,shift-base,shift-exponent,signed-integer-overflow,unsigned-integer-overflow,unsigned-shift-base,implicit-unsigned-integer-truncation,implicit-signed-integer-truncation,implicit-integer-sign-change"
>From 5a7c143d885af5aa333ddf3473242f857204684a Mon Sep 17 00:00:00 2001
From: Florian Mayer <fmayer at google.com>
Date: Wed, 19 Nov 2025 18:18:30 -0800
Subject: [PATCH 2/3] rename
Created using spr 1.3.7
---
clang/include/clang/Options/Options.td | 4 ++--
clang/lib/Driver/SanitizerArgs.cpp | 10 +++++-----
clang/test/Driver/fsanitize.c | 4 ++--
3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 2c9876c305ffe..9650e99754cd7 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -2656,8 +2656,8 @@ defm sanitize_minimal_runtime : BoolOption<"f", "sanitize-minimal-runtime",
PosFlag<SetTrue>,
NegFlag<SetFalse>>,
Group<f_clang_Group>;
-defm sanitize_handler_preserve_all_regs_experimental
- : BoolOption<"f", "sanitize-handler-preserve-all-regs-experimental",
+defm sanitize_handler_preserve_all_regs
+ : BoolOption<"f", "sanitize-handler-preserve-all-regs",
CodeGenOpts<"SanitizeHandlerPreserveAllRegs">, DefaultFalse,
PosFlag<SetTrue>, NegFlag<SetFalse>>,
Group<f_clang_Group>;
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 42d3f52e2de9f..10f85b6bd1651 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -423,10 +423,10 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
MinimalRuntime =
Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
- HandlerPreserveAllRegs = Args.hasFlag(
- options::OPT_fsanitize_handler_preserve_all_regs_experimental,
- options::OPT_fno_sanitize_handler_preserve_all_regs_experimental,
- HandlerPreserveAllRegs);
+ HandlerPreserveAllRegs =
+ Args.hasFlag(options::OPT_fsanitize_handler_preserve_all_regs,
+ options::OPT_fno_sanitize_handler_preserve_all_regs,
+ HandlerPreserveAllRegs);
// The object size sanitizer should not be enabled at -O0.
Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
@@ -1474,7 +1474,7 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
CmdArgs.push_back("-fsanitize-minimal-runtime");
if (HandlerPreserveAllRegs)
- CmdArgs.push_back("-fsanitize-handler-preserve-all-regs-experimental");
+ CmdArgs.push_back("-fsanitize-handler-preserve-all-regs");
if (AsanFieldPadding)
CmdArgs.push_back(Args.MakeArgString("-fsanitize-address-field-padding=" +
diff --git a/clang/test/Driver/fsanitize.c b/clang/test/Driver/fsanitize.c
index 18f2b74b7b580..f2a4d8c50ec23 100644
--- a/clang/test/Driver/fsanitize.c
+++ b/clang/test/Driver/fsanitize.c
@@ -984,10 +984,10 @@
// CHECK-UBSAN-MINIMAL: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|pointer-overflow|float-cast-overflow|array-bounds|enum|bool|builtin|returns-nonnull-attribute|nonnull-attribute|function),?){18}"}}
// CHECK-UBSAN-MINIMAL: "-fsanitize-minimal-runtime"
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-minimal-runtime -fsanitize-handler-preserve-all-regs-experimental %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UBSAN-MINIMAL-PRESERVE
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-minimal-runtime -fsanitize-handler-preserve-all-regs %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UBSAN-MINIMAL-PRESERVE
// CHECK-UBSAN-MINIMAL-PRESERVE: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|pointer-overflow|float-cast-overflow|array-bounds|enum|bool|builtin|returns-nonnull-attribute|nonnull-attribute|function),?){18}"}}
// CHECK-UBSAN-MINIMAL-PRESERVE: "-fsanitize-minimal-runtime"
-// CHECK-UBSAN-MINIMAL-PRESERVE: "-fsanitize-handler-preserve-all-regs-experimental"
+// CHECK-UBSAN-MINIMAL-PRESERVE: "-fsanitize-handler-preserve-all-regs
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=integer -fsanitize-trap=integer %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-INTSAN-TRAP
// CHECK-INTSAN-TRAP: "-fsanitize-trap=integer-divide-by-zero,shift-base,shift-exponent,signed-integer-overflow,unsigned-integer-overflow,unsigned-shift-base,implicit-unsigned-integer-truncation,implicit-signed-integer-truncation,implicit-integer-sign-change"
>From 145118df1c2c641e3dbb9e3bd7859705b368ee76 Mon Sep 17 00:00:00 2001
From: Florian Mayer <fmayer at google.com>
Date: Thu, 20 Nov 2025 14:56:54 -0800
Subject: [PATCH 3/3] help
Created using spr 1.3.7
---
clang/include/clang/Options/Options.td | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 9650e99754cd7..1e713a1b06943 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -2657,9 +2657,13 @@ defm sanitize_minimal_runtime : BoolOption<"f", "sanitize-minimal-runtime",
NegFlag<SetFalse>>,
Group<f_clang_Group>;
defm sanitize_handler_preserve_all_regs
- : BoolOption<"f", "sanitize-handler-preserve-all-regs",
- CodeGenOpts<"SanitizeHandlerPreserveAllRegs">, DefaultFalse,
- PosFlag<SetTrue>, NegFlag<SetFalse>>,
+ : BoolOption<
+ "f", "sanitize-handler-preserve-all-regs",
+ CodeGenOpts<"SanitizeHandlerPreserveAllRegs">, DefaultFalse,
+ PosFlag<SetTrue, [], [],
+ "Enable handlers with preserve_all calling convention">,
+ NegFlag<SetFalse, [], [],
+ "Disable handlers with preserve_all calling convention">>,
Group<f_clang_Group>;
def fsanitize_link_runtime : Flag<["-"], "fsanitize-link-runtime">,
Group<f_clang_Group>;
More information about the llvm-branch-commits
mailing list