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


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to