Skip to content

Commit 9addd94

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 60a6830 commit 9addd94

File tree

2 files changed

+95
-32
lines changed

2 files changed

+95
-32
lines changed

clang/lib/Basic/Targets/RISCV.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,34 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
225225
else
226226
Builder.defineMacro("__riscv_32e");
227227
}
228+
229+
if (Opts.CFProtectionBranch) {
230+
if (checkCFProtectionBranchSupported()) {
231+
auto Scheme = Opts.getCFBranchLabelScheme();
232+
if (checkCFBranchLabelSchemeSupported(Scheme)) {
233+
if (Scheme == CFBranchLabelSchemeKind::Default)
234+
Scheme = getDefaultCFBranchLabelScheme();
235+
236+
Builder.defineMacro("__riscv_landing_pad", "1");
237+
switch (Scheme) {
238+
case CFBranchLabelSchemeKind::Unlabeled:
239+
Builder.defineMacro("__riscv_landing_pad_unlabeled", "1");
240+
break;
241+
case CFBranchLabelSchemeKind::FuncSig:
242+
Builder.defineMacro("__riscv_landing_pad_func_sig", "1");
243+
break;
244+
case CFBranchLabelSchemeKind::Default:
245+
llvm_unreachable("default cf-branch-label scheme should already be "
246+
"transformed to other scheme");
247+
}
248+
} else
249+
Diags.Report(diag::err_opt_not_valid_on_target)
250+
<< (Twine("-mcf-branch-label-scheme=") +
251+
getCFBranchLabelSchemeFlagVal(Scheme))
252+
.str();
253+
} else
254+
Diags.Report(diag::err_opt_not_valid_on_target) << "cf-protection=branch";
255+
}
228256
}
229257

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

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

Lines changed: 67 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,90 @@
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 \
12-
// RUN: -mcf-branch-label-scheme=unlabeled -c %s -o /dev/null 2>&1 \
13-
// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
30+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - 2>&1 | FileCheck \
31+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-BRANCH-PROT-INVALID %s
1432

1533
// RUN: not %clang --target=riscv32 -fcf-protection=branch \
16-
// RUN: -mcf-branch-label-scheme=func-sig -c %s -o /dev/null 2>&1 \
17-
// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
34+
// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - 2>&1 | FileCheck \
35+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-BRANCH-PROT-INVALID %s
36+
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
1840

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
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 \
38-
// RUN: -mcf-branch-label-scheme=unlabeled -c %s -o /dev/null 2>&1 \
39-
// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
66+
// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - 2>&1 | FileCheck \
67+
// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-BRANCH-PROT-INVALID %s
4068

4169
// RUN: not %clang --target=riscv64 -fcf-protection=branch \
42-
// RUN: -mcf-branch-label-scheme=func-sig -c %s -o /dev/null 2>&1 \
43-
// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
70+
// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - 2>&1 | FileCheck \
71+
// RUN: --check-prefixes=CHECK-NO-MACRO,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)