diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp index df4fc50fd5ff4..a4068a44f3d03 100644 --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -245,21 +245,64 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, } // Macros for use with the set and get permissions builtins. - Builder.defineMacro("__CHERI_CAP_PERMISSION_GLOBAL__", Twine(1<<0)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_EXECUTE__", - Twine(1<<1)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD__", Twine(1<<2)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE__", Twine(1<<3)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD_CAPABILITY__", - Twine(1<<4)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_CAPABILITY__", - Twine(1<<5)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__", - Twine(1<<6)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_SEAL__", Twine(1<<7)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_INVOKE__", Twine(1<<8)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_UNSEAL__", Twine(1<<9)); - Builder.defineMacro("__CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__", Twine(1<<10)); + if (getTriple().getSubArch() == llvm::Triple::RISCV32SubArch_cheriot_v1) { + // Expose CHERI-compatible macros for permissions that overlap with other + // CHERI implementations. + Builder.defineMacro("__CHERI_CAP_PERMISSION_GLOBAL__", Twine(1 << 0)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE__", + Twine(1 << 2)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__", + Twine(1 << 4)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD__", + Twine(1 << 5)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__", + Twine(1 << 7)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_EXECUTE__", + Twine(1 << 8)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_UNSEAL__", + Twine(1 << 9)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_SEAL__", + Twine(1 << 10)); + + // Expose the full set of permissions in the __CHERIOT prefix with + // concise names. + Builder.defineMacro("__CHERIOT_PERMISSION_GLOBAL__", Twine(1 << 0)); + Builder.defineMacro("__CHERIOT_PERMISSION_LOAD_GLOBAL__", Twine(1 << 1)); + Builder.defineMacro("__CHERIOT_PERMISSION_STORE__", Twine(1 << 2)); + Builder.defineMacro("__CHERIOT_PERMISSION_LOAD_MUTABLE__", Twine(1 << 3)); + Builder.defineMacro("__CHERIOT_PERMISSION_STORE_LOCAL__", Twine(1 << 4)); + Builder.defineMacro("__CHERIOT_PERMISSION_LOAD__", Twine(1 << 5)); + Builder.defineMacro("__CHERIOT_PERMISSION_LOAD_STORE_CAPABILITY__", + Twine(1 << 6)); + Builder.defineMacro("__CHERIOT_PERMISSION_ACCESS_SYSTEM_REGISTERS__", + Twine(1 << 7)); + Builder.defineMacro("__CHERIOT_PERMISSION_EXECUTE__", Twine(1 << 8)); + Builder.defineMacro("__CHERIOT_PERMISSION_UNSEAL__", Twine(1 << 9)); + Builder.defineMacro("__CHERIOT_PERMISSION_SEAL__", Twine(1 << 10)); + Builder.defineMacro("__CHERIOT_PERMISSION_USER_PERM0", Twine(1 << 11)); + } else { + Builder.defineMacro("__CHERI_CAP_PERMISSION_GLOBAL__", Twine(1 << 0)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_EXECUTE__", + Twine(1 << 1)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD__", + Twine(1 << 2)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE__", + Twine(1 << 3)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD_CAPABILITY__", + Twine(1 << 4)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_CAPABILITY__", + Twine(1 << 5)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__", + Twine(1 << 6)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_SEAL__", + Twine(1 << 7)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_INVOKE__", + Twine(1 << 8)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_UNSEAL__", + Twine(1 << 9)); + Builder.defineMacro("__CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__", + Twine(1 << 10)); + } // Macros for CHERIoT in the default and bare-metal ABIs. if (ABI == "cheriot" || ABI == "cheriot-baremetal") diff --git a/clang/test/Preprocessor/cheriot-feature-flags.c b/clang/test/Preprocessor/cheriot-feature-flags.c new file mode 100644 index 0000000000000..b20215a8998f9 --- /dev/null +++ b/clang/test/Preprocessor/cheriot-feature-flags.c @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 -E -dM -ffreestanding -triple riscv32cheriot-unknown-cheriotrtos < /dev/null | FileCheck %s + +// CHECK: #define __CHERIOT_PERMISSION_ACCESS_SYSTEM_REGISTERS__ 128 +// CHECK: #define __CHERIOT_PERMISSION_EXECUTE__ 256 +// CHECK: #define __CHERIOT_PERMISSION_GLOBAL__ 1 +// CHECK: #define __CHERIOT_PERMISSION_LOAD_GLOBAL__ 2 +// CHECK: #define __CHERIOT_PERMISSION_LOAD_MUTABLE__ 8 +// CHECK: #define __CHERIOT_PERMISSION_LOAD_STORE_CAPABILITY__ 64 +// CHECK: #define __CHERIOT_PERMISSION_LOAD__ 32 +// CHECK: #define __CHERIOT_PERMISSION_SEAL__ 1024 +// CHECK: #define __CHERIOT_PERMISSION_STORE_LOCAL__ 16 +// CHECK: #define __CHERIOT_PERMISSION_STORE__ 4 +// CHECK: #define __CHERIOT_PERMISSION_UNSEAL__ 512 +// CHECK: #define __CHERIOT_PERMISSION_USER_PERM0 2048 + +// CHECK: #define __CHERI_ADDRESS_BITS__ 32 +// CHECK: #define __CHERI_CAPABILITY_WIDTH__ 64 + +// CHECK: #define __CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__ 128 +// CHECK: #define __CHERI_CAP_PERMISSION_GLOBAL__ 1 +// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_EXECUTE__ 256 +// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_LOAD__ 32 +// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_SEAL__ 1024 +// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__ 16 +// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_STORE__ 4 +// CHECK: #define __CHERI_CAP_PERMISSION_PERMIT_UNSEAL__ 512 + +// CHECK: #define __CHERI__ 1 +// CHECK: #define __SIZEOF_CHERI_CAPABILITY__ 8 +