https://github.com/pzhengqc updated https://github.com/llvm/llvm-project/pull/182350
>From e7d1ae623387355381ce5e0656e30057638988a8 Mon Sep 17 00:00:00 2001 From: Pengxuan Zheng <[email protected]> Date: Thu, 19 Feb 2026 11:30:31 -0800 Subject: [PATCH] [Multilib] Expose shadow call stack as multilib flags for RISC-V This allows multilib selection based on shadow call stack for RISC-V. --- clang/lib/Driver/ToolChain.cpp | 11 +++++++++-- clang/test/Driver/print-multi-selection-flags.c | 6 ++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 0eee7f917d2b8..cccb9b1d790e7 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -325,7 +325,8 @@ static void getARMMultilibFlags(const Driver &D, const llvm::Triple &Triple, static void getRISCVMultilibFlags(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args, - Multilib::flags_list &Result) { + Multilib::flags_list &Result, + bool hasShadowCallStack) { std::string Arch = riscv::getRISCVArch(Args, Triple); // Canonicalize arch for easier matching auto ISAInfo = llvm::RISCVISAInfo::parseArchString( @@ -334,6 +335,11 @@ static void getRISCVMultilibFlags(const Driver &D, const llvm::Triple &Triple, Result.push_back("-march=" + (*ISAInfo)->toString()); Result.push_back(("-mabi=" + riscv::getRISCVABI(Args, Triple)).str()); + + if (hasShadowCallStack) + Result.push_back("-fsanitize=shadow-call-stack"); + else + Result.push_back("-fno-sanitize=shadow-call-stack"); } Multilib::flags_list @@ -372,7 +378,8 @@ ToolChain::getMultilibFlags(const llvm::opt::ArgList &Args) const { case llvm::Triple::riscv64: case llvm::Triple::riscv32be: case llvm::Triple::riscv64be: - getRISCVMultilibFlags(D, Triple, Args, Result); + getRISCVMultilibFlags(D, Triple, Args, Result, + getSanitizerArgs(Args).hasShadowCallStack()); break; default: break; diff --git a/clang/test/Driver/print-multi-selection-flags.c b/clang/test/Driver/print-multi-selection-flags.c index b1a0a29ec4180..eba00e3278f18 100644 --- a/clang/test/Driver/print-multi-selection-flags.c +++ b/clang/test/Driver/print-multi-selection-flags.c @@ -86,6 +86,12 @@ // RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=aarch64-none-elf -mbig-endian | FileCheck --check-prefix=CHECK-BIG-ENDIAN %s // CHECK-BIG-ENDIAN: -mbig-endian +// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=riscv64-none-elf -fsanitize=shadow-call-stack | FileCheck --check-prefix=CHECK-SHADOW-CALL-STACK %s +// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=riscv64-none-elf -fno-sanitize=shadow-call-stack | FileCheck --check-prefix=CHECK-NO-SHADOW-CALL-STACK %s +// RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=riscv64-none-elf | FileCheck --check-prefix=CHECK-NO-SHADOW-CALL-STACK %s +// CHECK-SHADOW-CALL-STACK: -fsanitize=shadow-call-stack +// CHECK-NO-SHADOW-CALL-STACK: -fno-sanitize=shadow-call-stack + // RUN: %clang -multi-lib-config=%S/Inputs/multilib/empty.yaml -print-multi-flags-experimental --target=riscv32-none-elf -march=rv32g | FileCheck --check-prefix=CHECK-RV32 %s // CHECK-RV32: --target=riscv32-unknown-none-elf // CHECK-RV32: -mabi=ilp32d _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
