Skip to content

Commit ce2a105

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 3ac3d29 commit ce2a105

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

clang/lib/Basic/Targets/RISCV.cpp

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

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

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1+
// Default cf-branch-label-scheme is func-sig
2+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
3+
// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch -E -dM %s -o - \
4+
// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-FUNC-SIG %s
5+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
6+
// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch -E -dM %s -o - \
7+
// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-FUNC-SIG %s
8+
9+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
10+
// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \
11+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - \
12+
// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-UNLABELED %s
13+
14+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
15+
// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \
16+
// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - \
17+
// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-FUNC-SIG %s
18+
119
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
220
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -c %s \
321
// RUN: -o /dev/null 2>&1 \
@@ -24,6 +42,16 @@
2442
// RUN: -o /dev/null 2>&1 \
2543
// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
2644

45+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
46+
// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
47+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - \
48+
// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-UNLABELED %s
49+
50+
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
51+
// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
52+
// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - \
53+
// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-FUNC-SIG %s
54+
2755
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
2856
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -c %s \
2957
// RUN: -o /dev/null 2>&1 \
@@ -50,6 +78,10 @@
5078
// RUN: -o /dev/null 2>&1 \
5179
// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
5280

81+
// CHECK-ZICFILP-UNLABELED-DAG: __riscv_landing_pad 1{{$}}
82+
// CHECK-ZICFILP-UNLABELED-DAG: __riscv_landing_pad_unlabeled 1{{$}}
83+
// CHECK-ZICFILP-FUNC-SIG-DAG: __riscv_landing_pad 1{{$}}
84+
// CHECK-ZICFILP-FUNC-SIG-DAG: __riscv_landing_pad_func_sig 1{{$}}
5385
// CHECK-BRANCH-PROT-INVALID: error: option 'cf-protection=branch' cannot be
5486
// CHECK-BRANCH-PROT-INVALID-SAME: specified on this target
5587
// CHECK-UNLABELED-SCHEME-UNUSED: warning: argument unused during compilation:

0 commit comments

Comments
 (0)