Skip to content

Commit 35532cf

Browse files
committed
[clang][RISCV] Add Zicfilp CFI scheme preprocessor macros
These macros allow assembly files to know which CFI label to use when the target has Zicfilp enabled.
1 parent 9f33eb8 commit 35532cf

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

clang/lib/Basic/Targets/RISCV.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,25 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
224224
else
225225
Builder.defineMacro("__riscv_32e");
226226
}
227+
228+
if (Opts.CFProtectionBranch) {
229+
auto Scheme = Opts.getCFBranchLabelScheme();
230+
if (Scheme == CFBranchLabelSchemeKind::Default)
231+
Scheme = getDefaultCFBranchLabelScheme();
232+
233+
Builder.defineMacro("__riscv_landing_pad", "1");
234+
switch (Scheme) {
235+
case CFBranchLabelSchemeKind::Unlabeled:
236+
Builder.defineMacro("__riscv_landing_pad_unlabeled", "1");
237+
break;
238+
case CFBranchLabelSchemeKind::FuncSig:
239+
Builder.defineMacro("__riscv_landing_pad_func_sig", "1");
240+
break;
241+
case CFBranchLabelSchemeKind::Default:
242+
llvm_unreachable("default cf-branch-label scheme should already be "
243+
"transformed to other scheme");
244+
}
245+
}
227246
}
228247

229248
static constexpr Builtin::Info BuiltinInfo[] = {

clang/test/CodeGen/RISCV/riscv-cf-protection.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,143 @@
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+
16
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
27
// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \
38
// RUN: -mcf-branch-label-scheme=unlabeled -S -emit-llvm %s -o - | FileCheck \
49
// RUN: --check-prefixes=BRANCH-PROT-FLAG,UNLABELED-FLAG %s
510

11+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
12+
// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \
13+
// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - | FileCheck \
14+
// RUN: --check-prefixes=LPAD-MACRO,FUNC-SIG-MACRO %s
15+
616
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
717
// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \
818
// RUN: -mcf-branch-label-scheme=func-sig -S -emit-llvm %s -o - | FileCheck \
919
// RUN: --check-prefixes=BRANCH-PROT-FLAG,FUNC-SIG-FLAG %s
1020

21+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
22+
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
23+
// RUN: -o - 2>&1 | FileCheck \
24+
// RUN: --check-prefixes=NO-MACRO,UNLABELED-SCHEME-UNUSED %s
25+
1126
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
1227
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -S \
1328
// RUN: -emit-llvm %s -o - 2>&1 | FileCheck \
1429
// RUN: --check-prefixes=NO-FLAG,UNLABELED-SCHEME-UNUSED %s
1530

31+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
32+
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
33+
// RUN: -o - 2>&1 | FileCheck \
34+
// RUN: --check-prefixes=NO-MACRO,FUNC-SIG-SCHEME-UNUSED %s
35+
1636
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
1737
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -S \
1838
// RUN: -emit-llvm %s -o - 2>&1 | FileCheck \
1939
// RUN: --check-prefixes=NO-FLAG,FUNC-SIG-SCHEME-UNUSED %s
2040

41+
// RUN: %clang --target=riscv32 -fcf-protection=branch \
42+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM -emit-llvm %s -o - | \
43+
// RUN: FileCheck --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
44+
2145
// RUN: %clang --target=riscv32 -fcf-protection=branch \
2246
// RUN: -mcf-branch-label-scheme=unlabeled -S -emit-llvm %s -o - | FileCheck \
2347
// RUN: --check-prefixes=BRANCH-PROT-FLAG,UNLABELED-FLAG %s
2448

49+
// RUN: %clang --target=riscv32 -fcf-protection=branch \
50+
// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - | FileCheck \
51+
// RUN: --check-prefixes=LPAD-MACRO,FUNC-SIG-MACRO %s
52+
2553
// RUN: %clang --target=riscv32 -fcf-protection=branch \
2654
// RUN: -mcf-branch-label-scheme=func-sig -S -emit-llvm %s -o - | FileCheck \
2755
// RUN: --check-prefixes=BRANCH-PROT-FLAG,FUNC-SIG-FLAG %s
2856

57+
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -E -dM %s \
58+
// RUN: -o - 2>&1 | FileCheck \
59+
// RUN: --check-prefixes=NO-MACRO,UNLABELED-SCHEME-UNUSED %s
60+
2961
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -S \
3062
// RUN: -emit-llvm %s -o - 2>&1 | FileCheck \
3163
// RUN: --check-prefixes=NO-FLAG,UNLABELED-SCHEME-UNUSED %s
3264

65+
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -E -dM %s \
66+
// RUN: -o - 2>&1 | FileCheck \
67+
// RUN: --check-prefixes=NO-MACRO,FUNC-SIG-SCHEME-UNUSED %s
68+
3369
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -S \
3470
// RUN: -emit-llvm %s -o - 2>&1 | FileCheck \
3571
// RUN: --check-prefixes=NO-FLAG,FUNC-SIG-SCHEME-UNUSED %s
3672

73+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
74+
// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
75+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
76+
// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
77+
3778
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
3879
// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
3980
// RUN: -mcf-branch-label-scheme=unlabeled -S -emit-llvm %s -o - | FileCheck \
4081
// RUN: --check-prefixes=BRANCH-PROT-FLAG,UNLABELED-FLAG %s
4182

83+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
84+
// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
85+
// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - | FileCheck \
86+
// RUN: --check-prefixes=LPAD-MACRO,FUNC-SIG-MACRO %s
87+
4288
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
4389
// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
4490
// RUN: -mcf-branch-label-scheme=func-sig -S -emit-llvm %s -o - | FileCheck \
4591
// RUN: --check-prefixes=BRANCH-PROT-FLAG,FUNC-SIG-FLAG %s
4692

93+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
94+
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
95+
// RUN: -o - 2>&1 | FileCheck \
96+
// RUN: --check-prefixes=NO-MACRO,UNLABELED-SCHEME-UNUSED %s
97+
4798
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
4899
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -S \
49100
// RUN: -emit-llvm %s -o - 2>&1 | FileCheck \
50101
// RUN: --check-prefixes=NO-FLAG,UNLABELED-SCHEME-UNUSED %s
51102

103+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
104+
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
105+
// RUN: -o - 2>&1 | FileCheck \
106+
// RUN: --check-prefixes=NO-MACRO,FUNC-SIG-SCHEME-UNUSED %s
107+
52108
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
53109
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -S \
54110
// RUN: -emit-llvm %s -o - 2>&1 | FileCheck \
55111
// RUN: --check-prefixes=NO-FLAG,FUNC-SIG-SCHEME-UNUSED %s
56112

113+
// RUN: %clang --target=riscv64 -fcf-protection=branch \
114+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \
115+
// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s
116+
57117
// RUN: %clang --target=riscv64 -fcf-protection=branch \
58118
// RUN: -mcf-branch-label-scheme=unlabeled -S -emit-llvm %s -o - | FileCheck \
59119
// RUN: --check-prefixes=BRANCH-PROT-FLAG,UNLABELED-FLAG %s
60120

121+
// RUN: %clang --target=riscv64 -fcf-protection=branch \
122+
// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - | FileCheck \
123+
// RUN: --check-prefixes=LPAD-MACRO,FUNC-SIG-MACRO %s
124+
61125
// RUN: %clang --target=riscv64 -fcf-protection=branch \
62126
// RUN: -mcf-branch-label-scheme=func-sig -S -emit-llvm %s -o - | FileCheck \
63127
// RUN: --check-prefixes=BRANCH-PROT-FLAG,FUNC-SIG-FLAG %s
64128

129+
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -E -dM %s \
130+
// RUN: -o - 2>&1 | FileCheck \
131+
// RUN: --check-prefixes=NO-MACRO,UNLABELED-SCHEME-UNUSED %s
132+
65133
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -S \
66134
// RUN: -emit-llvm %s -o - 2>&1 | FileCheck \
67135
// RUN: --check-prefixes=NO-FLAG,UNLABELED-SCHEME-UNUSED %s
68136

137+
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -E -dM %s \
138+
// RUN: -o - 2>&1 | FileCheck \
139+
// RUN: --check-prefixes=NO-MACRO,FUNC-SIG-SCHEME-UNUSED %s
140+
69141
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -S \
70142
// RUN: -emit-llvm %s -o - 2>&1 | FileCheck \
71143
// RUN: --check-prefixes=NO-FLAG,FUNC-SIG-SCHEME-UNUSED %s
@@ -83,6 +155,13 @@
83155
// FUNC-SIG-SCHEME-UNUSED: warning: argument unused during compilation:
84156
// FUNC-SIG-SCHEME-UNUSED-SAME: '-mcf-branch-label-scheme=func-sig'
85157

158+
// LPAD-MACRO: __riscv_landing_pad 1{{$}}
159+
// UNLABELED-MACRO: __riscv_landing_pad_unlabeled 1{{$}}
160+
// FUNC-SIG-MACRO: __riscv_landing_pad_func_sig 1{{$}}
161+
// NO-MACRO-NOT: __riscv_landing_pad
162+
// NO-MACRO-NOT: __riscv_landing_pad_unlabeled
163+
// NO-MACRO-NOT: __riscv_landing_pad_func_sig
164+
86165
// BRANCH-PROT-FLAG-DAG: [[P_FLAG:![0-9]+]] = !{i32 8, !"cf-protection-branch", i32 1}
87166
// UNLABELED-FLAG-DAG: [[S_FLAG:![0-9]+]] = !{i32 1, !"cf-branch-label-scheme", !"unlabeled"}
88167
// FUNC-SIG-FLAG-DAG: [[S_FLAG:![0-9]+]] = !{i32 1, !"cf-branch-label-scheme", !"func-sig"}

0 commit comments

Comments
 (0)