Author: Vitaly Buka Date: 2025-04-25T00:55:05-07:00 New Revision: 7aa8ece256e937d266bb66936cbe99d379c0f77f
URL: https://github.com/llvm/llvm-project/commit/7aa8ece256e937d266bb66936cbe99d379c0f77f DIFF: https://github.com/llvm/llvm-project/commit/7aa8ece256e937d266bb66936cbe99d379c0f77f.diff LOG: [Driver][CFI] Allow CFI with minimal runtime (#137103) It was introduced with original "minimal runtime" patch without explanation: https://reviews.llvm.org/D36810#:~:text=if%20(-,NonTrappingCfi,-) Note, the same commit contains `cfi_check_fail` handler, which can not be reached with `-fsanitize-trap=cfi`. This patch makes CFI min runtime behavior consistent with UBSAN: `-fsanitize-trap=` ignores `-fsanitize-minimal-runtime`, `-fno-sanitize-trap=` with `-fsanitize-minimal-runtime` compiles and link minimal runtime. Added: Modified: clang/lib/Driver/SanitizerArgs.cpp clang/test/Driver/fsanitize.c clang/test/Driver/sanitizer-ld.c Removed: ################################################################################ diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index 94a036172d0b6..2edb200688418 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -849,12 +849,6 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, D.Diag(clang::diag::err_drv_argument_not_allowed_with) << "-fsanitize-minimal-runtime" << lastArgumentForMask(D, Args, IncompatibleMask); - - SanitizerMask NonTrappingCfi = Kinds & SanitizerKind::CFI & ~TrappingKinds; - if (NonTrappingCfi && DiagnoseErrors) - D.Diag(clang::diag::err_drv_argument_only_allowed_with) - << "-fsanitize-minimal-runtime" - << "-fsanitize-trap=cfi"; } for (const auto *Arg : Args.filtered( diff --git a/clang/test/Driver/fsanitize.c b/clang/test/Driver/fsanitize.c index 10aedb4241a06..eb72140fb1315 100644 --- a/clang/test/Driver/fsanitize.c +++ b/clang/test/Driver/fsanitize.c @@ -961,19 +961,18 @@ // CHECK-CFI-ABORT-MINIMAL: "-fsanitize-trap=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall" // CHECK-CFI-ABORT-MINIMAL: "-fsanitize-minimal-runtime" -// RUN: not %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=hidden -fsanitize-minimal-runtime -fno-sanitize-trap=cfi -fsanitize-recover=cfi -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-RECOVER-MINIMAL -- -// CHECK-CFI-NOTRAP-RECOVER-MINIMAL: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi' +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=hidden -fsanitize-minimal-runtime -fno-sanitize-trap=cfi -fsanitize-recover=cfi -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-RECOVER-MINIMAL -- // CHECK-CFI-NOTRAP-RECOVER-MINIMAL: "-fsanitize=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall" // CHECK-CFI-NOTRAP-RECOVER-MINIMAL: "-fsanitize-recover=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall" // CHECK-CFI-NOTRAP-RECOVER-MINIMAL: "-fsanitize-minimal-runtime" -// RUN: not %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=hidden -fsanitize-minimal-runtime -fno-sanitize-trap=cfi -fno-sanitize-recover=cfi -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-ABORT-MINIMAL -// CHECK-CFI-NOTRAP-ABORT-MINIMAL: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi' +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=hidden -fsanitize-minimal-runtime -fno-sanitize-trap=cfi -fno-sanitize-recover=cfi -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-ABORT-MINIMAL // CHECK-CFI-NOTRAP-ABORT-MINIMAL: "-fsanitize=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall" // CHECK-CFI-NOTRAP-ABORT-MINIMAL: "-fsanitize-minimal-runtime" -// RUN: not %clang --target=x86_64-linux-gnu -fsanitize=cfi -fno-sanitize-trap=cfi-icall -flto -fvisibility=hidden -fsanitize-minimal-runtime -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-MINIMAL -// CHECK-CFI-NOTRAP-MINIMAL: error: invalid argument '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi' +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -fno-sanitize-trap=cfi-icall -flto -fvisibility=hidden -fsanitize-minimal-runtime -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-MINIMAL +// CHECK-CFI-NOTRAP-MINIMAL: "-fsanitize=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall" +// CHECK-CFI-NOTRAP-MINIMAL: "-fsanitize-trap=cfi-derived-cast,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall" // RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -fno-sanitize-trap=cfi-icall -fno-sanitize=cfi-icall -flto -fvisibility=hidden -fsanitize-minimal-runtime -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOICALL-MINIMAL // CHECK-CFI-NOICALL-MINIMAL: "-fsanitize=cfi-derived-cast,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall" diff --git a/clang/test/Driver/sanitizer-ld.c b/clang/test/Driver/sanitizer-ld.c index a5a4fc2320bd2..befd322d027c9 100644 --- a/clang/test/Driver/sanitizer-ld.c +++ b/clang/test/Driver/sanitizer-ld.c @@ -920,7 +920,7 @@ // CHECK-CFI-MINRT-LINUX: "{{.*}}ld{{(.exe)?}}" // CFI with diagnostics links the UBSan runtime. -// RUN: not %clang -fsanitize=cfi -fno-sanitize-trap=cfi -fsanitize-recover=cfi \ +// RUN: %clang -fsanitize=cfi -fno-sanitize-trap=cfi -fsanitize-recover=cfi \ // RUN: -flto -fvisibility=hidden \ // RUN: -fsanitize-minimal-runtime \ // RUN: --target=x86_64-unknown-linux -fuse-ld=ld \ @@ -928,7 +928,6 @@ // RUN: --sysroot=%S/Inputs/basic_linux_tree \ // RUN: -### %s 2>&1 \ // RUN: | %{filecheck} --check-prefix=CHECK-CFI-MINRT-DIAG-LINUX -// CHECK-CFI-MINRT-DIAG-LINUX: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi' // CHECK-CFI-MINRT-DIAG-LINUX: "{{.*}}ld{{(.exe)?}}" // CHECK-CFI-MINRT-DIAG-LINUX: "--whole-archive" "{{[^"]*}}libclang_rt.ubsan_minimal.a" "--no-whole-archive" @@ -946,7 +945,7 @@ // CHECK-CFI-MINRT-CROSS-DSO-LINUX: -export-dynamic // Cross-DSO CFI with diagnostics links just the CFI runtime. -// RUN: not %clang -fsanitize=cfi -fsanitize-cfi-cross-dso \ +// RUN: %clang -fsanitize=cfi -fsanitize-cfi-cross-dso \ // RUN: -flto -fvisibility=hidden \ // RUN: -fsanitize-minimal-runtime \ // RUN: -fno-sanitize-trap=cfi -fsanitize-recover=cfi \ @@ -955,7 +954,6 @@ // RUN: --sysroot=%S/Inputs/basic_linux_tree \ // RUN: -### %s 2>&1 \ // RUN: | %{filecheck} --check-prefix=CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX -// CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi' // CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX: "{{.*}}ld{{(.exe)?}}" // CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX: "--whole-archive" "{{[^"]*}}libclang_rt.cfi_diag.a" "--no-whole-archive" // CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX: -export-dynamic @@ -972,7 +970,7 @@ // CHECK-CFI-MINRT-CROSS-DSO-ANDROID: "{{.*}}ld{{(.exe)?}}" // Cross-DSO CFI with diagnostics on Android links just the UBSAN runtime. -// RUN: not %clang -fsanitize=cfi -fsanitize-cfi-cross-dso \ +// RUN: %clang -fsanitize=cfi -fsanitize-cfi-cross-dso \ // RUN: -flto -fvisibility=hidden \ // RUN: -fsanitize-minimal-runtime \ // RUN: -fno-sanitize-trap=cfi -fsanitize-recover=cfi \ @@ -981,7 +979,6 @@ // RUN: --sysroot=%S/Inputs/basic_android_tree \ // RUN: -### %s 2>&1 \ // RUN: | %{filecheck} --check-prefix=CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID -// CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi' // CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID: "{{.*}}ld{{(.exe)?}}" // CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID: "{{[^"]*}}libclang_rt.ubsan_minimal.so" // CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID: "--export-dynamic-symbol=__cfi_check" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits