Skip to content

Commit bf9ed51

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 0068ec0 commit bf9ed51

File tree

2 files changed

+78
-24
lines changed

2 files changed

+78
-24
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 (ISAInfo->hasExtension("zicfilp") && 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: 59 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,30 @@
1+
// Default cf-branch-label-scheme is func-sig
12
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
2-
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -c %s \
3-
// RUN: -o /dev/null 2>&1 \
4-
// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
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
513

614
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
7-
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -c %s \
8-
// RUN: -o /dev/null 2>&1 \
9-
// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
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+
19+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
20+
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
21+
// RUN: -o - 2>&1 | FileCheck \
22+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-UNLABELED-SCHEME-UNUSED %s
23+
24+
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
25+
// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
26+
// RUN: -o - 2>&1 | FileCheck \
27+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-FUNC-SIG-SCHEME-UNUSED %s
1028

1129
// RUN: not %clang --target=riscv32 -fcf-protection=branch \
1230
// RUN: -mcf-branch-label-scheme=unlabeled -c %s -o /dev/null 2>&1 \
@@ -16,23 +34,33 @@
1634
// RUN: -mcf-branch-label-scheme=func-sig -c %s -o /dev/null 2>&1 \
1735
// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
1836

19-
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -c %s \
20-
// RUN: -o /dev/null 2>&1 \
21-
// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
37+
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -E -dM %s \
38+
// RUN: -o - 2>&1 | FileCheck \
39+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-UNLABELED-SCHEME-UNUSED %s
40+
41+
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -E -dM %s \
42+
// RUN: -o - 2>&1 | FileCheck \
43+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-FUNC-SIG-SCHEME-UNUSED %s
2244

23-
// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -c %s \
24-
// RUN: -o /dev/null 2>&1 \
25-
// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
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
2654

2755
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
28-
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -c %s \
29-
// RUN: -o /dev/null 2>&1 \
30-
// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
56+
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
57+
// RUN: -o - 2>&1 | FileCheck \
58+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-UNLABELED-SCHEME-UNUSED %s
3159

3260
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
33-
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -c %s \
34-
// RUN: -o /dev/null 2>&1 \
35-
// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
61+
// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
62+
// RUN: -o - 2>&1 | FileCheck \
63+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-FUNC-SIG-SCHEME-UNUSED %s
3664

3765
// RUN: not %clang --target=riscv64 -fcf-protection=branch \
3866
// RUN: -mcf-branch-label-scheme=unlabeled -c %s -o /dev/null 2>&1 \
@@ -42,14 +70,21 @@
4270
// RUN: -mcf-branch-label-scheme=func-sig -c %s -o /dev/null 2>&1 \
4371
// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
4472

45-
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -c %s \
46-
// RUN: -o /dev/null 2>&1 \
47-
// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
73+
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -E -dM %s \
74+
// RUN: -o - 2>&1 | FileCheck \
75+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-UNLABELED-SCHEME-UNUSED %s
4876

49-
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -c %s \
50-
// RUN: -o /dev/null 2>&1 \
51-
// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
77+
// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -E -dM %s \
78+
// RUN: -o - 2>&1 | FileCheck \
79+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-FUNC-SIG-SCHEME-UNUSED %s
5280

81+
// CHECK-ZICFILP-UNLABELED: __riscv_landing_pad 1{{$}}
82+
// CHECK-ZICFILP-UNLABELED: __riscv_landing_pad_unlabeled 1{{$}}
83+
// CHECK-ZICFILP-FUNC-SIG: __riscv_landing_pad 1{{$}}
84+
// CHECK-ZICFILP-FUNC-SIG: __riscv_landing_pad_func_sig 1{{$}}
85+
// CHECK-NO-MACRO-NOT: __riscv_landing_pad
86+
// CHECK-NO-MACRO-NOT: __riscv_landing_pad_unlabeled
87+
// CHECK-NO-MACRO-NOT: __riscv_landing_pad_func_sig
5388
// CHECK-BRANCH-PROT-INVALID: error: option 'cf-protection=branch' cannot be
5489
// CHECK-BRANCH-PROT-INVALID-SAME: specified on this target
5590
// CHECK-UNLABELED-SCHEME-UNUSED: warning: argument unused during compilation:

0 commit comments

Comments
 (0)