[clang] c28d6c2 - [Clang][RISCV] Add Zicfilp CFI unlabeled scheme preprocessor macros (#109600)
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 19 03:39:34 PDT 2025
Author: Ming-Yi Lai
Date: 2025-05-19T18:39:31+08:00
New Revision: c28d6c2f5fefa13e7c7efd245ace2698e47a494c
URL: https://github.com/llvm/llvm-project/commit/c28d6c2f5fefa13e7c7efd245ace2698e47a494c
DIFF: https://github.com/llvm/llvm-project/commit/c28d6c2f5fefa13e7c7efd245ace2698e47a494c.diff
LOG: [Clang][RISCV] Add Zicfilp CFI unlabeled scheme preprocessor macros (#109600)
This patch adds preprocessor macros when Zicfilp CFI is enabled. To be
specific:
+ `#define __riscv_landing_pad 1` when `-fcf-protection=[full|branch]`
+ `#define __riscv_landing_pad_unlabeled 1` when
`-fcf-protection=[full|branch] -mcf-branch-label-scheme=unlabeled`
The macros are proposed in riscv-non-isa/riscv-c-api-doc#76 , and the
CLI flags are from riscv-non-isa/riscv-toolchain-conventions#54.
Added:
clang/test/Preprocessor/riscv-cf-protection-branch.c
Modified:
clang/lib/Basic/Targets/RISCV.cpp
Removed:
################################################################################
diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp
index a1a2437f288a0..6c83bf4576bf8 100644
--- a/clang/lib/Basic/Targets/RISCV.cpp
+++ b/clang/lib/Basic/Targets/RISCV.cpp
@@ -241,6 +241,25 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
if (Opts.CFProtectionReturn && ISAInfo->hasExtension("zicfiss"))
Builder.defineMacro("__riscv_shadow_stack");
+
+ if (Opts.CFProtectionBranch) {
+ auto Scheme = Opts.getCFBranchLabelScheme();
+ if (Scheme == CFBranchLabelSchemeKind::Default)
+ Scheme = getDefaultCFBranchLabelScheme();
+
+ Builder.defineMacro("__riscv_landing_pad");
+ switch (Scheme) {
+ case CFBranchLabelSchemeKind::Unlabeled:
+ Builder.defineMacro("__riscv_landing_pad_unlabeled");
+ break;
+ case CFBranchLabelSchemeKind::FuncSig:
+ // TODO: Define macros after the func-sig scheme is implemented
+ break;
+ case CFBranchLabelSchemeKind::Default:
+ llvm_unreachable("default cf-branch-label scheme should already be "
+ "transformed to other scheme");
+ }
+ }
}
static constexpr int NumRVVBuiltins =
diff --git a/clang/test/Preprocessor/riscv-cf-protection-branch.c b/clang/test/Preprocessor/riscv-cf-protection-branch.c
new file mode 100644
index 0000000000000..f658e0a8c6c0f
--- /dev/null
+++ b/clang/test/Preprocessor/riscv-cf-protection-branch.c
@@ -0,0 +1,83 @@
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
+// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
+
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=full \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
+// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
+
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -E -dM %s -o - 2>&1 | \
+// RUN: FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv32 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM -emit-llvm %s -o - | \
+// RUN: FileCheck --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
+
+// RUN: %clang --target=riscv32 -fcf-protection=full \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM -emit-llvm %s -o - | \
+// RUN: FileCheck --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
+
+// RUN: %clang --target=riscv32 -E -dM %s -o - 2>&1 | \
+// RUN: FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
+// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
+
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=full \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
+// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
+
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -E -dM %s -o - 2>&1 | \
+// RUN: FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv64 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
+// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
+
+// RUN: %clang --target=riscv64 -fcf-protection=full \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
+// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
+
+// RUN: %clang --target=riscv64 -E -dM %s -o - 2>&1 | \
+// RUN: FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
+
+// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
+
+// LPAD-MACRO: __riscv_landing_pad 1{{$}}
+// UNLABELED-MACRO: __riscv_landing_pad_unlabeled 1{{$}}
+// NO-MACRO-NOT: __riscv_landing_pad
+// NO-MACRO-NOT: __riscv_landing_pad_unlabeled
+// NO-MACRO-NOT: __riscv_landing_pad_func_sig
More information about the cfe-commits
mailing list