Skip to content

Commit 724c9a1

Browse files
committed
[CHERIoT] Update __CHERI_CAP_PERMISSION_* macros to match CHERIoT permissions.
1 parent f27b7bb commit 724c9a1

File tree

2 files changed

+88
-15
lines changed

2 files changed

+88
-15
lines changed

clang/lib/Basic/Targets/RISCV.cpp

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -245,21 +245,64 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
245245
}
246246

247247
// Macros for use with the set and get permissions builtins.
248-
Builder.defineMacro("__CHERI_CAP_PERMISSION_GLOBAL__", Twine(1<<0));
249-
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_EXECUTE__",
250-
Twine(1<<1));
251-
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD__", Twine(1<<2));
252-
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE__", Twine(1<<3));
253-
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD_CAPABILITY__",
254-
Twine(1<<4));
255-
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_CAPABILITY__",
256-
Twine(1<<5));
257-
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__",
258-
Twine(1<<6));
259-
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_SEAL__", Twine(1<<7));
260-
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_INVOKE__", Twine(1<<8));
261-
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_UNSEAL__", Twine(1<<9));
262-
Builder.defineMacro("__CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__", Twine(1<<10));
248+
if (getTriple().getSubArch() == llvm::Triple::RISCV32SubArch_cheriot_v1) {
249+
// Expose CHERI-compatible macros for permissions that overlap with other
250+
// CHERI implementations.
251+
Builder.defineMacro("__CHERI_CAP_PERMISSION_GLOBAL__", Twine(1 << 0));
252+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE__",
253+
Twine(1 << 2));
254+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__",
255+
Twine(1 << 4));
256+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD__",
257+
Twine(1 << 5));
258+
Builder.defineMacro("__CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__",
259+
Twine(1 << 7));
260+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_EXECUTE__",
261+
Twine(1 << 8));
262+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_UNSEAL__",
263+
Twine(1 << 9));
264+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_SEAL__",
265+
Twine(1 << 10));
266+
267+
// Expose the full set of permissions in the __CHERIOT prefix with
268+
// concise names.
269+
Builder.defineMacro("__CHERIOT_PERMISSION_GLOBAL__", Twine(1 << 0));
270+
Builder.defineMacro("__CHERIOT_PERMISSION_LOAD_GLOBAL__", Twine(1 << 1));
271+
Builder.defineMacro("__CHERIOT_PERMISSION_STORE__", Twine(1 << 2));
272+
Builder.defineMacro("__CHERIOT_PERMISSION_LOAD_MUTABLE__", Twine(1 << 3));
273+
Builder.defineMacro("__CHERIOT_PERMISSION_STORE_LOCAL__", Twine(1 << 4));
274+
Builder.defineMacro("__CHERIOT_PERMISSION_LOAD__", Twine(1 << 5));
275+
Builder.defineMacro("__CHERIOT_PERMISSION_LOAD_STORE_CAPABILITY__",
276+
Twine(1 << 6));
277+
Builder.defineMacro("__CHERIOT_PERMISSION_ACCESS_SYSTEM_REGISTERS__",
278+
Twine(1 << 7));
279+
Builder.defineMacro("__CHERIOT_PERMISSION_EXECUTE__", Twine(1 << 8));
280+
Builder.defineMacro("__CHERIOT_PERMISSION_UNSEAL__", Twine(1 << 9));
281+
Builder.defineMacro("__CHERIOT_PERMISSION_SEAL__", Twine(1 << 10));
282+
Builder.defineMacro("__CHERIOT_PERMISSION_USER_PERM0", Twine(1 << 11));
283+
} else {
284+
Builder.defineMacro("__CHERI_CAP_PERMISSION_GLOBAL__", Twine(1 << 0));
285+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_EXECUTE__",
286+
Twine(1 << 1));
287+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD__",
288+
Twine(1 << 2));
289+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE__",
290+
Twine(1 << 3));
291+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD_CAPABILITY__",
292+
Twine(1 << 4));
293+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_CAPABILITY__",
294+
Twine(1 << 5));
295+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__",
296+
Twine(1 << 6));
297+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_SEAL__",
298+
Twine(1 << 7));
299+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_INVOKE__",
300+
Twine(1 << 8));
301+
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_UNSEAL__",
302+
Twine(1 << 9));
303+
Builder.defineMacro("__CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__",
304+
Twine(1 << 10));
305+
}
263306

264307
// Macros for CHERIoT in the default and bare-metal ABIs.
265308
if (ABI == "cheriot" || ABI == "cheriot-baremetal")
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// RUN: %clang_cc1 -E -dM -ffreestanding -triple riscv32cheriot-unknown-cheriotrtos < /dev/null | FileCheck %s
2+
3+
// CHECK: #define __CHERIOT_PERMISSION_ACCESS_SYSTEM_REGISTERS__ 128
4+
// CHECK: #define __CHERIOT_PERMISSION_EXECUTE__ 256
5+
// CHECK: #define __CHERIOT_PERMISSION_GLOBAL__ 1
6+
// CHECK: #define __CHERIOT_PERMISSION_LOAD_GLOBAL__ 2
7+
// CHECK: #define __CHERIOT_PERMISSION_LOAD_MUTABLE__ 8
8+
// CHECK: #define __CHERIOT_PERMISSION_LOAD_STORE_CAPABILITY__ 64
9+
// CHECK: #define __CHERIOT_PERMISSION_LOAD__ 32
10+
// CHECK: #define __CHERIOT_PERMISSION_SEAL__ 1024
11+
// CHECK: #define __CHERIOT_PERMISSION_STORE_LOCAL__ 16
12+
// CHECK: #define __CHERIOT_PERMISSION_STORE__ 4
13+
// CHECK: #define __CHERIOT_PERMISSION_UNSEAL__ 512
14+
// CHECK: #define __CHERIOT_PERMISSION_USER_PERM0 2048
15+
16+
// CHECK: #define __CHERI_ADDRESS_BITS__ 32
17+
// CHECK: #define __CHERI_CAPABILITY_WIDTH__ 64
18+
19+
// CHECK: #define __CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__ 128
20+
// CHECK: #define __CHERI_CAP_PERMISSION_GLOBAL__ 1
21+
// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_EXECUTE__ 256
22+
// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_LOAD__ 32
23+
// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_SEAL__ 1024
24+
// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__ 16
25+
// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_STORE__ 4
26+
// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_UNSEAL__ 512
27+
28+
// CHECK: #define __CHERI__ 1
29+
// CHECK: #define __SIZEOF_CHERI_CAPABILITY__ 8
30+

0 commit comments

Comments
 (0)