Add CHERIoT-LLVM toolchain support. This adds the CHERIoT RISC-V 32b platform as cheri/riscv32:cheriot (aliased so you can use --config=cheriot). The toolchain is expected to be found in the build environment. Change-Id: I721060576697283a00ca67a01a93b530d2fc861e
diff --git a/.bazelrc b/.bazelrc index a4341dc..bf3b43b 100644 --- a/.bazelrc +++ b/.bazelrc
@@ -27,6 +27,7 @@ build:riscv32 --platforms=@crt//platforms/riscv32:opentitan build:kelvin --platforms=//platforms/riscv32:kelvin build:sparrow --platforms=@matcha//platforms/riscv32:sparrow +build:cheriot --platforms=@matcha//platforms/cheri/riscv32:cheriot # Support airgapped build environment build:airgapped_env --//rules:build_env='airgapped'
diff --git a/WORKSPACE b/WORKSPACE index b85e10f..756c1f7 100644 --- a/WORKSPACE +++ b/WORKSPACE
@@ -38,6 +38,12 @@ path = "../../out/kelvin/sw/bazel_out", ) +new_local_repository( + name = "cheriot-llvm", + build_file = "third_party/cheriot-llvm/BUILD", + path = "../../cache/cheriot-tools", +) + # Used by airgapped environment new_local_repository( name = "kelvin_core", @@ -89,6 +95,9 @@ kelvin_register_toolchain() +load("//platforms:registration.bzl", "cheriot_register_toolchain") +cheriot_register_toolchain() + # Tools for release automation load("@lowrisc_opentitan//third_party/github:repos.bzl", "github_tools_repos")
diff --git a/constraints/BUILD.bazel b/constraints/BUILD.bazel new file mode 100644 index 0000000..f29bca3 --- /dev/null +++ b/constraints/BUILD.bazel
@@ -0,0 +1,5 @@ +# Copyright lowRISC contributors. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +package(default_visibility = ["//visibility:public"])
diff --git a/constraints/extension/BUILD.bazel b/constraints/extension/BUILD.bazel new file mode 100644 index 0000000..f92a5c9 --- /dev/null +++ b/constraints/extension/BUILD.bazel
@@ -0,0 +1,8 @@ +package(default_visibility = ["//visibility:public"]) + +constraint_setting(name = "extension") + +constraint_value( + name = "cheri", + constraint_setting = ":extension", +)
diff --git a/platforms/cheri/BUILD.bazel b/platforms/cheri/BUILD.bazel new file mode 100644 index 0000000..ffd0fb0 --- /dev/null +++ b/platforms/cheri/BUILD.bazel
@@ -0,0 +1 @@ +package(default_visibility = ["//visibility:public"])
diff --git a/platforms/cheri/riscv32/BUILD.bazel b/platforms/cheri/riscv32/BUILD.bazel new file mode 100644 index 0000000..0a72252 --- /dev/null +++ b/platforms/cheri/riscv32/BUILD.bazel
@@ -0,0 +1,9 @@ +package(default_visibility = ["//visibility:public"]) + +platform( + name = "cheriot", + constraint_values = [ + "@platforms//cpu:riscv32", + "//constraints/extension:cheri", + ], +)
diff --git a/platforms/cheri/riscv32/devices.bzl b/platforms/cheri/riscv32/devices.bzl new file mode 100644 index 0000000..a0670c2 --- /dev/null +++ b/platforms/cheri/riscv32/devices.bzl
@@ -0,0 +1,28 @@ +load("@crt//config:device.bzl", "device_config") +load("@crt//config:compiler.bzl", "listify_flags") + +DEVICES = [ + device_config( + name = "cheriot", + architecture = "rv32imcxcheri", + feature_set = "//platforms/cheri/riscv32/features:rv32imcxcheri", + constraints = [ + "@platforms//cpu:riscv32", + "//constraints/extension:cheri", + ], + substitutions = { + "ARCHITECTURE": "rv32imcxcheri", + "ABI": "cheriot", + "CMODEL": "medany", + "ENDIAN": "little", + "TARGET": "riscv32-unknown-elf", + "[STACK_PROTECTOR]": "", + "[SYSTEM_LIBRARY_PATHS]": listify_flags( + "-L{}", + [ + "external/cheriot-llvm/baremetal/baremetal-riscv32-purecap/riscv32-unknown-elf/lib/", + ], + ), + }, + ), +]
diff --git a/platforms/cheri/riscv32/features/BUILD.bazel b/platforms/cheri/riscv32/features/BUILD.bazel new file mode 100644 index 0000000..534d35a --- /dev/null +++ b/platforms/cheri/riscv32/features/BUILD.bazel
@@ -0,0 +1,88 @@ +load( + "@crt//config:features.bzl", + "CPP_ALL_COMPILE_ACTIONS", + "C_ALL_COMPILE_ACTIONS", + "LD_ALL_ACTIONS", + "feature", + "feature_set", + "flag_group", + "flag_set", +) + +package(default_visibility = ["//visibility:public"]) + +feature( + name = "architecture", + enabled = True, + flag_sets = [ + flag_set( + actions = CPP_ALL_COMPILE_ACTIONS + C_ALL_COMPILE_ACTIONS + LD_ALL_ACTIONS, + flag_groups = [ + flag_group( + flags = [ + "-march=ARCHITECTURE", + "-mcpu=cheriot", + "-mabi=ABI", + "-mcmodel=CMODEL", + "-mENDIAN-endian", + "--target=TARGET", + "-mxcheri-rvc", + "-mrelax", + ], + ), + ], + ), + ], +) + +feature( + name = "fastbuild", + enabled = False, + flag_sets = [ + flag_set( + actions = CPP_ALL_COMPILE_ACTIONS + C_ALL_COMPILE_ACTIONS, + flag_groups = [ + flag_group( + flags = [ + "-Os", + "-g", + ], + ), + ], + ), + ], + provides = ["compilation_mode"], +) + +feature( + name = "library_search_directories", + enabled = True, + flag_sets = [ + flag_set( + actions = LD_ALL_ACTIONS, + flag_groups = [ + flag_group( + flags = ["[SYSTEM_LIBRARY_PATHS]"], + ), + flag_group( + expand_if_available = "library_search_directories", + flags = ["-L%{library_search_directories}"], + iterate_over = "library_search_directories", + ), + ], + ), + ], +) + +feature_set( + name = "rv32imcxcheri", + base = [ + "@crt//features/common", + "@crt//features/embedded", + ], + feature = [ + ":architecture", + ":fastbuild", + ":library_search_directories", + ], +)
diff --git a/platforms/registration.bzl b/platforms/registration.bzl index c2d55b4..1d3e878 100644 --- a/platforms/registration.bzl +++ b/platforms/registration.bzl
@@ -1,3 +1,7 @@ def kelvin_register_toolchain(name = "kelvin"): native.register_execution_platforms("//platforms/riscv32:kelvin") native.register_toolchains("//toolchains/kelvin:all") + +def cheriot_register_toolchain(name = "cheriot"): + native.register_execution_platforms("//platforms/cheri/riscv32:all") + native.register_toolchains("//toolchains/cheri_llvm:all")
diff --git a/third_party/cheriot-llvm/BUILD b/third_party/cheriot-llvm/BUILD new file mode 100755 index 0000000..502216a --- /dev/null +++ b/third_party/cheriot-llvm/BUILD
@@ -0,0 +1,8 @@ +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "all", + srcs = glob(["**"], exclude=["**/*.html","**/*.pdf"]), +) + +exports_files(["bin/**"])
diff --git a/toolchains/cheri_llvm/BUILD.bazel b/toolchains/cheri_llvm/BUILD.bazel new file mode 100644 index 0000000..45d5c69 --- /dev/null +++ b/toolchains/cheri_llvm/BUILD.bazel
@@ -0,0 +1,41 @@ +load("@crt//config:compiler.bzl", "setup") +load("//platforms/cheri/riscv32:devices.bzl", "DEVICES") + +package(default_visibility = ["//visibility:public"]) + +SYSTEM_INCLUDE_PATHS = [ + "external/cheriot-llvm/lib/clang/13.0.0/include", + "external/cheriot-llvm/riscv32-unknown-elf/include", +] + +filegroup( + name = "compiler_components", + srcs = [ + "//toolchains/cheri_llvm/wrappers:all", + "@cheriot-llvm//:all", + ], +) + +[setup( + name = device.name, + architecture = device.architecture, + artifact_naming = device.artifact_naming, + compiler_components = ":compiler_components", + constraints = device.constraints, + feature_set = device.feature_set, + include_directories = SYSTEM_INCLUDE_PATHS, + params = { + "compiler": "clang", + }, + substitutions = device.substitutions, + tools = { + "ar": "wrappers/ar", + "cpp": "wrappers/cpp", + "gcc": "wrappers/clang", + "ld": "wrappers/ld", + "nm": "wrappers/nm", + "objcopy": "wrappers/objcopy", + "objdump": "wrappers/objdump", + "strip": "wrappers/strip", + }, +) for device in DEVICES]
diff --git a/toolchains/cheri_llvm/wrappers/BUILD b/toolchains/cheri_llvm/wrappers/BUILD new file mode 100644 index 0000000..b44d8ec --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/BUILD
@@ -0,0 +1,17 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*"])) + +filegroup( + name = "all", + srcs = [ + "ar", + "clang", + "cpp", + "ld", + "nm", + "objcopy", + "objdump", + "strip", + ], +)
diff --git a/toolchains/cheri_llvm/wrappers/ar b/toolchains/cheri_llvm/wrappers/ar new file mode 100755 index 0000000..0bf921d --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/ar
@@ -0,0 +1,12 @@ +#!/bin/bash --norc + +TOOLCHAIN="cheriot-llvm" +VERSION="13.0.0" + +ARGS=() +POSTARGS=() + +exec "external/${TOOLCHAIN}/bin/llvm-ar" \ + "${ARGS[@]}" \ + "$@"\ + "${POSTARGS[@]}"
diff --git a/toolchains/cheri_llvm/wrappers/clang b/toolchains/cheri_llvm/wrappers/clang new file mode 120000 index 0000000..da2bdd9 --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/clang
@@ -0,0 +1 @@ +driver.sh \ No newline at end of file
diff --git a/toolchains/cheri_llvm/wrappers/cpp b/toolchains/cheri_llvm/wrappers/cpp new file mode 120000 index 0000000..da2bdd9 --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/cpp
@@ -0,0 +1 @@ +driver.sh \ No newline at end of file
diff --git a/toolchains/cheri_llvm/wrappers/driver.sh b/toolchains/cheri_llvm/wrappers/driver.sh new file mode 100755 index 0000000..077cdff --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/driver.sh
@@ -0,0 +1,13 @@ +#!/bin/bash --norc + +PROG=${0##*/} +TOOLCHAIN="cheriot-llvm" +VERSION="13.0.0" + +ARGS=() +POSTARGS=() + +exec "external/${TOOLCHAIN}/bin/${PROG}" \ + "${ARGS[@]}" \ + "$@"\ + "${POSTARGS[@]}"
diff --git a/toolchains/cheri_llvm/wrappers/ld b/toolchains/cheri_llvm/wrappers/ld new file mode 120000 index 0000000..da2bdd9 --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/ld
@@ -0,0 +1 @@ +driver.sh \ No newline at end of file
diff --git a/toolchains/cheri_llvm/wrappers/nm b/toolchains/cheri_llvm/wrappers/nm new file mode 120000 index 0000000..da2bdd9 --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/nm
@@ -0,0 +1 @@ +driver.sh \ No newline at end of file
diff --git a/toolchains/cheri_llvm/wrappers/objcopy b/toolchains/cheri_llvm/wrappers/objcopy new file mode 120000 index 0000000..da2bdd9 --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/objcopy
@@ -0,0 +1 @@ +driver.sh \ No newline at end of file
diff --git a/toolchains/cheri_llvm/wrappers/objdump b/toolchains/cheri_llvm/wrappers/objdump new file mode 120000 index 0000000..da2bdd9 --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/objdump
@@ -0,0 +1 @@ +driver.sh \ No newline at end of file
diff --git a/toolchains/cheri_llvm/wrappers/strip b/toolchains/cheri_llvm/wrappers/strip new file mode 120000 index 0000000..da2bdd9 --- /dev/null +++ b/toolchains/cheri_llvm/wrappers/strip
@@ -0,0 +1 @@ +driver.sh \ No newline at end of file