Custom toolcahin config to support semi hosting and softfloats
Bypass-Presubmit-Reason: No presubmit configured
Change-Id: Id7af89c3c7e1ebc83de3a4955d454cfbcb5147ab
diff --git a/.bazelrc b/.bazelrc
new file mode 100644
index 0000000..d34c052
--- /dev/null
+++ b/.bazelrc
@@ -0,0 +1,3 @@
+# Use our custom-configured c++ toolchain, using --crosstol_top or --cpu as a differentiator.
+build:kelvin_rvv_rv32_toolchain_config --crosstool_top=//toolchain:kelvin_rvv
+build:kelvin_rvv_rv32_toolchain_config --cpu=kelvin_rvv_rv32
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f31c400
--- /dev/null
+++ b/README.md
@@ -0,0 +1,27 @@
+# Bazel Kelcin Toolchain
+Repo containing RISC-V toochain configuration for Kelvin.
+
+## Usage {: #usage}
+
+This is work in progress bazel repo: please reach out to me for additional questions and suggestions.
+
+## Build and try it yoursself
+
+1. If you have not already done so, [download and install Bazel 6.2.1](https://bazel.build/install) or later.
+
+2. TBD for toolchain download instrcutions
+
+3. Run the build with the following command:
+
+ ```bash
+ bazel-6.2.1 run -s --config=kelvin_rvv_rv32_toolchain_config //examples:hello-world-add-floats
+ ```
+ You can also build rvv_add_intrinsic.
+
+4. The above command builds hell-world-add-floats target with custom toolchain defined under toolcahins.
+ Note: TBD add instrcutions to build the toochain from sracth
+
+5. Execute binary with mpact_sim
+ ```bash
+ {$PATH_TO_MPACT_SIM}/bazel-bin/riscv/rv32gv_sim --semihost_arm=true bazel-bin/hello-world-add-floats
+ ```
\ No newline at end of file
diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel
new file mode 100644
index 0000000..18c7661
--- /dev/null
+++ b/WORKSPACE.bazel
@@ -0,0 +1,2 @@
+load("//toolchain:repo.bzl", "crt_repos")
+crt_repos()
\ No newline at end of file
diff --git a/examples/BUILD b/examples/BUILD
new file mode 100644
index 0000000..5721335
--- /dev/null
+++ b/examples/BUILD
@@ -0,0 +1,9 @@
+cc_binary(
+ name = "hello-world-add-floats",
+ srcs = ["hello-world-add-floats.cc"],
+)
+
+cc_binary(
+ name = "rvv_add_intrinsic",
+ srcs = ["rvv_add_intrinsic.cc"],
+)
diff --git a/examples/hello-world-add-floats.cc b/examples/hello-world-add-floats.cc
new file mode 100644
index 0000000..b11cb21
--- /dev/null
+++ b/examples/hello-world-add-floats.cc
@@ -0,0 +1,17 @@
+#include <stdio.h>
+#include <string.h>
+
+int main() {
+ float input1[8] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};
+ float input2[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
+ float output[8];
+
+ printf(" Added input1 and input 2 results are follwing\n ");
+ for (int i = 0; i < 8; i++) {
+ output[i] = input1[i] + input2[i];
+ printf(" %d ", static_cast<int>(output[i]));
+ }
+ // flush
+ printf("\n");
+ return 0;
+}
diff --git a/examples/rvv_add_intrinsic.cc b/examples/rvv_add_intrinsic.cc
new file mode 100644
index 0000000..e1b52a5
--- /dev/null
+++ b/examples/rvv_add_intrinsic.cc
@@ -0,0 +1,30 @@
+#include <riscv_vector.h>
+#include <stdio.h>
+#include <string.h>
+
+int8_t input_1[1024];
+int8_t input_2[1024];
+int16_t output[1024];
+
+int main() {
+ unsigned vlen = __riscv_vlenb();
+ memset(input_1, 1, 1024);
+ memset(input_2, 6, 1024);
+ const int8_t* input1_ptr = &input_1[0];
+ const int8_t* input2_ptr = &input_2[0];
+ int16_t* output_ptr = &output[0];
+
+ for (int idx = 0; (idx + 31) < 1024; idx += 32) {
+ vint8m4_t input_v2 = __riscv_vle8_v_i8m4(input2_ptr + idx, 32);
+ vint8m4_t input_v1 = __riscv_vle8_v_i8m4(input1_ptr + idx, 32);
+
+ vint16m8_t temp_sum = __riscv_vwadd_vv_i16m8(input_v1, input_v2, 32);
+ __riscv_vse16_v_i16m8(output_ptr + idx, temp_sum, 32);
+ }
+
+ printf("printing 1st 10 values of output");
+ for (int i = 0; i < 10; i++) {
+ printf(" %d ", output[i]);
+ }
+ return 0;
+}
diff --git a/toolchain/BUILD b/toolchain/BUILD
new file mode 100644
index 0000000..307e27c
--- /dev/null
+++ b/toolchain/BUILD
@@ -0,0 +1,35 @@
+package(default_visibility = ["//visibility:public"])
+
+load(":cc_toolchain_config.bzl", "cc_kelvin_rvv_rv32_toolchain_config")
+
+filegroup(
+ name="all_files_toolchain",
+ srcs = glob(["out/*/**"])
+)
+
+cc_kelvin_rvv_rv32_toolchain_config(
+ name = "kelvin_rvv_rv32_toolchain_config",
+)
+
+cc_toolchain_suite(
+ name="kelvin_rvv",
+ toolchains = {
+ "kelvin_rvv_rv32": ":kelvin_rvv_rv32_toolchain",
+ }
+
+)
+
+cc_toolchain(
+ name = "kelvin_rvv_rv32_toolchain",
+ toolchain_identifier = "kelvin_rvv_rv32-toolchain",
+ toolchain_config = ":kelvin_rvv_rv32_toolchain_config",
+ all_files = ":all_files_toolchain",
+ as_files = ":all_files_toolchain",
+ ar_files = ":all_files_toolchain",
+ compiler_files = ":all_files_toolchain",
+ dwp_files = ":all_files_toolchain",
+ linker_files = ":all_files_toolchain",
+ objcopy_files = ":all_files_toolchain",
+ strip_files = ":all_files_toolchain",
+ supports_param_files = 0,
+)
\ No newline at end of file
diff --git a/toolchain/cc_toolchain_config.bzl b/toolchain/cc_toolchain_config.bzl
new file mode 100644
index 0000000..7a2d1c1
--- /dev/null
+++ b/toolchain/cc_toolchain_config.bzl
@@ -0,0 +1,143 @@
+load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
+load(
+ "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
+ "tool_path",
+ "feature",
+ "feature_set",
+ "flag_group",
+ "flag_set",
+ )
+
+load(
+ "@crt//config:features.bzl",
+ "CPP_ALL_COMPILE_ACTIONS",
+ "C_ALL_COMPILE_ACTIONS",
+ "LD_ALL_ACTIONS",
+)
+
+
+def _impl(ctx):
+ tool_paths = [ # NEW
+ tool_path(
+ name = "gcc",
+ path = "out/bin/riscv32-unknown-elf-g++",
+ ),
+ tool_path(
+ name = "ld",
+ path = "out/bin/riscv32-unknown-elf-ld",
+ ),
+ tool_path(
+ name = "ar",
+ path = "out/bin/riscv32-unknown-elf-gcc-ar",
+ ),
+ tool_path(
+ name = "cpp",
+ path = "out/bin/riscv32-unknown-elf-c++",
+ ),
+ tool_path(
+ name = "gcov",
+ path = "/bin/false",
+ ),
+ tool_path(
+ name = "nm",
+ path = "/bin/false",
+ ),
+ tool_path(
+ name = "objdump",
+ path = "/bin/false",
+ ),
+ tool_path(
+ name = "strip",
+ path = "/bin/false",
+ ),
+ ]
+ includes_feature = feature(
+ name = "includes",
+ enabled = True,
+ flag_sets = [
+ flag_set(
+ actions = [
+ ACTION_NAMES.assemble,
+ ACTION_NAMES.preprocess_assemble,
+ ACTION_NAMES.linkstamp_compile,
+ ACTION_NAMES.c_compile,
+ ACTION_NAMES.cpp_compile,
+ ACTION_NAMES.cpp_header_parsing,
+ ACTION_NAMES.cpp_module_compile,
+ ACTION_NAMES.cpp_module_codegen,
+ ACTION_NAMES.lto_backend,
+ ACTION_NAMES.clif_match
+ ],
+ flag_groups = [
+ flag_group(
+ flags = [
+ "-nostdinc",
+ "-u", "_printf_float",
+ "-lsemihosting",
+ "-isystem", "toolchain/out/riscv32-unknown-elf/include",
+ "-isystem", "toolchain/out/lib/gcc/riscv32-unknown-elf/15.0.1/include"
+ ],
+ ),
+ ],
+ ),
+ ],
+
+ )
+
+ sys_feature = feature(
+ name = "sys_spec",
+ enabled = True,
+ flag_sets = [
+ flag_set(
+ actions = CPP_ALL_COMPILE_ACTIONS,
+ flag_groups = [
+ flag_group(
+ flags = [
+ "-march=rv32im_zve32x_zicsr",
+ "-mabi=ilp32",
+ "-mcmodel=medany",
+ ],
+ ),
+ ],
+ ),
+ flag_set(
+ actions = LD_ALL_ACTIONS,
+ flag_groups = [
+ flag_group(
+ flags = [
+ "--specs=semihost.specs",
+ "-lsemihost",
+ "-lm",
+ "-lc",
+ "-lgcc",
+ ],
+ ),
+ ],
+ ),
+ ],
+ )
+
+ return cc_common.create_cc_toolchain_config_info(
+ ctx= ctx,
+ toolchain_identifier = "kelvin_rvv_rv32-toolchain",
+ host_system_name = "kelvin_v2",
+ target_system_name = "kelvin_rvv_rv32",
+ target_cpu = "kelvin_rvv_rv32",
+ target_libc = "newlib",
+ compiler = "clang",
+ abi_version = "ilp32 ",
+ abi_libc_version="ilp32",
+ features = [
+ includes_feature,
+ sys_feature,
+ ],
+ tool_paths = tool_paths,
+ )
+
+cc_kelvin_rvv_rv32_toolchain_config = rule(
+ implementation = _impl,
+ attrs = {},
+ provides = [CcToolchainConfigInfo],
+)
+
+
diff --git a/toolchain/repo.bzl b/toolchain/repo.bzl
new file mode 100644
index 0000000..0d2b537
--- /dev/null
+++ b/toolchain/repo.bzl
@@ -0,0 +1,17 @@
+load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+def crt_repos(local = None):
+ if local:
+ native.local_repository(
+ name = "crt",
+ path = local,
+ )
+ else:
+ maybe(
+ http_archive,
+ name = "crt",
+ url = "https://github.com/lowRISC/crt/archive/refs/tags/v0.3.4.tar.gz",
+ sha256 = "01a66778d1a0d5bbfb4ba30e72bd6876d0c20766d0b1921ab36ca3350cb48c60",
+ strip_prefix = "crt-0.3.4",
+ )
\ No newline at end of file