Skip to content

Commit c28d6c2

Browse files
authored
[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.
1 parent c27e10f commit c28d6c2

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

clang/lib/Basic/Targets/RISCV.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,25 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
241241

242242
if (Opts.CFProtectionReturn && ISAInfo->hasExtension("zicfiss"))
243243
Builder.defineMacro("__riscv_shadow_stack");
244+
245+
if (Opts.CFProtectionBranch) {
246+
auto Scheme = Opts.getCFBranchLabelScheme();
247+
if (Scheme == CFBranchLabelSchemeKind::Default)
248+
Scheme = getDefaultCFBranchLabelScheme();
249+
250+
Builder.defineMacro("__riscv_landing_pad");
251+
switch (Scheme) {
252+
case CFBranchLabelSchemeKind::Unlabeled:
253+
Builder.defineMacro("__riscv_landing_pad_unlabeled");
254+
break;
255+
case CFBranchLabelSchemeKind::FuncSig:
256+
// TODO: Define macros after the func-sig scheme is implemented
257+
break;
258+
case CFBranchLabelSchemeKind::Default:
259+
llvm_unreachable("default cf-branch-label scheme should already be "
260+
"transformed to other scheme");
261+
}
262+
}
244263
}
245264

246265
static constexpr int NumRVVBuiltins =
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
2+
// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \
3+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
4+
// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
5+
6+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
7+
// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=full \
8+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
9+
// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
10+
11+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
12+
// RUN: -march=rv32i_zicfilp1p0 -E -dM %s -o - 2>&1 | \
13+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
14+
15+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
16+
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
17+
// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
18+
19+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
20+
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
21+
// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
22+
23+
// RUN: %clang --target=riscv32 -fcf-protection=branch \
24+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM -emit-llvm %s -o - | \
25+
// RUN: FileCheck --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
26+
27+
// RUN: %clang --target=riscv32 -fcf-protection=full \
28+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM -emit-llvm %s -o - | \
29+
// RUN: FileCheck --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
30+
31+
// RUN: %clang --target=riscv32 -E -dM %s -o - 2>&1 | \
32+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
33+
34+
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -E -dM %s \
35+
// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
36+
37+
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -E -dM %s \
38+
// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
39+
40+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
41+
// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
42+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
43+
// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
44+
45+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
46+
// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=full \
47+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
48+
// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
49+
50+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
51+
// RUN: -march=rv64i_zicfilp1p0 -E -dM %s -o - 2>&1 | \
52+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
53+
54+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
55+
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
56+
// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
57+
58+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
59+
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
60+
// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
61+
62+
// RUN: %clang --target=riscv64 -fcf-protection=branch \
63+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
64+
// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
65+
66+
// RUN: %clang --target=riscv64 -fcf-protection=full \
67+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
68+
// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
69+
70+
// RUN: %clang --target=riscv64 -E -dM %s -o - 2>&1 | \
71+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
72+
73+
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -E -dM %s \
74+
// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
75+
76+
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -E -dM %s \
77+
// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s
78+
79+
// LPAD-MACRO: __riscv_landing_pad 1{{$}}
80+
// UNLABELED-MACRO: __riscv_landing_pad_unlabeled 1{{$}}
81+
// NO-MACRO-NOT: __riscv_landing_pad
82+
// NO-MACRO-NOT: __riscv_landing_pad_unlabeled
83+
// NO-MACRO-NOT: __riscv_landing_pad_func_sig

0 commit comments

Comments
 (0)