Skip to content

Commit 2fdb26d

Browse files
authored
[clang][RISCV] Introduce preprocessor macro when Zicfiss-based shadow stack is enabled (#127592)
The `-fcf-protection=[full|return]` flag enables shadow stack implementation based on RISC-V Zicfiss extension. This patch adds the `__riscv_shadow_stack` predefined macro to preprocessing when such a shadow stack implementation is enabled.
1 parent 61ab476 commit 2fdb26d

File tree

4 files changed

+54
-1
lines changed

4 files changed

+54
-1
lines changed

clang/include/clang/Basic/LangOptions.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ LANGOPT(ObjCDisableDirectMethodsForTesting, 1, 0,
365365
LANGOPT(CFProtectionBranch , 1, 0, "Control-Flow Branch Protection enabled")
366366
ENUM_LANGOPT(CFBranchLabelScheme, CFBranchLabelSchemeKind, 2, CFBranchLabelSchemeKind::Default,
367367
"Control-Flow Branch Protection Label Scheme")
368+
LANGOPT(CFProtectionReturn, 1, 0, "Control-Flow Return Protection enabled")
368369
LANGOPT(FakeAddressSpaceMap , 1, 0, "OpenCL fake address space map")
369370
ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2, ASMM_Target, "OpenCL address space map mangling mode")
370371
LANGOPT(IncludeDefaultHeader, 1, 0, "Include default header file for OpenCL")

clang/lib/Basic/Targets/RISCV.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
238238
else
239239
Builder.defineMacro("__riscv_32e");
240240
}
241+
242+
if (Opts.CFProtectionReturn && ISAInfo->hasExtension("zicfiss"))
243+
Builder.defineMacro("__riscv_shadow_stack");
241244
}
242245

243246
static constexpr int NumRVVBuiltins =

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4048,8 +4048,13 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
40484048

40494049
if (const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
40504050
StringRef Name = A->getValue();
4051-
if (Name == "full" || Name == "branch") {
4051+
if (Name == "full") {
4052+
Opts.CFProtectionBranch = 1;
4053+
Opts.CFProtectionReturn = 1;
4054+
} else if (Name == "branch") {
40524055
Opts.CFProtectionBranch = 1;
4056+
} else if (Name == "return") {
4057+
Opts.CFProtectionReturn = 1;
40534058
}
40544059
}
40554060

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// RUN: %clang --target=riscv32 -E -dM %s -o - | \
2+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
3+
4+
// RUN: %clang --target=riscv32 -fcf-protection=return -E -dM %s -o - | \
5+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
6+
7+
// RUN: %clang --target=riscv32 -fcf-protection=full -E -dM %s -o - | \
8+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
9+
10+
// RUN: %clang --target=riscv32 -march=rv32i_zicfiss1p0 \
11+
// RUN: -menable-experimental-extensions -E -dM %s -o - | \
12+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
13+
14+
// RUN: %clang --target=riscv32 -march=rv32i_zicfiss1p0 \
15+
// RUN: -menable-experimental-extensions -fcf-protection=return -E -dM %s \
16+
// RUN: -o - | FileCheck --check-prefixes=SHSTK-MACRO %s
17+
18+
// RUN: %clang --target=riscv32 -march=rv32i_zicfiss1p0 \
19+
// RUN: -menable-experimental-extensions -fcf-protection=full -E -dM %s -o - \
20+
// RUN: | FileCheck --check-prefixes=SHSTK-MACRO %s
21+
22+
// RUN: %clang --target=riscv64 -E -dM %s -o - | \
23+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
24+
25+
// RUN: %clang --target=riscv64 -fcf-protection=return -E -dM %s -o - | \
26+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
27+
28+
// RUN: %clang --target=riscv64 -fcf-protection=full -E -dM %s -o - | \
29+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
30+
31+
// RUN: %clang --target=riscv64 -march=rv64i_zicfiss1p0 \
32+
// RUN: -menable-experimental-extensions -E -dM %s -o - | \
33+
// RUN: FileCheck --check-prefixes=NO-MACRO %s
34+
35+
// RUN: %clang --target=riscv64 -march=rv64i_zicfiss1p0 \
36+
// RUN: -menable-experimental-extensions -fcf-protection=return -E -dM %s \
37+
// RUN: -o - | FileCheck --check-prefixes=SHSTK-MACRO %s
38+
39+
// RUN: %clang --target=riscv64 -march=rv64i_zicfiss1p0 \
40+
// RUN: -menable-experimental-extensions -fcf-protection=full -E -dM %s -o - \
41+
// RUN: | FileCheck --check-prefixes=SHSTK-MACRO %s
42+
43+
// SHSTK-MACRO: __riscv_shadow_stack 1{{$}}
44+
// NO-MACRO-NOT: __riscv_shadow_stack

0 commit comments

Comments
 (0)