Add arm64 support
This patch adds `--config=arm64` and `--cpu=arm64` flags for users to
compile for the 64-bit version of the Raspberry Pi.
The existing 32-bit ARM build should still work. This patch only adds
additional 64-bit capabilities. Future patches can remove 32-bit
support.
Eigen needed some tweaks because we have `LDBL_MANT_DIG` of 113 on
arm64. None of the code paths that used the parameters `U` and `V`
actually gets compiled in. Adding `[[maybe_unused]]` fixed the error.
Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: Ibf919b2964fe971769449a1c556c13e3bf1d48e9
diff --git a/tools/BUILD b/tools/BUILD
index 2e470fa..a7d165d 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -47,11 +47,14 @@
config_setting(
name = "cpu_armhf",
- constraint_values = ["@//tools/platforms/hardware:raspberry_pi"],
+ constraint_values = [
+ "@platforms//cpu:armv7",
+ "//tools/platforms/hardware:raspberry_pi",
+ ],
)
config_setting(
- name = "cpu_aarch64",
+ name = "cpu_arm64",
constraint_values = ["@platforms//cpu:arm64"],
)
diff --git a/tools/build_rules/select.bzl b/tools/build_rules/select.bzl
index cdeeb25..5d78a2b 100644
--- a/tools/build_rules/select.bzl
+++ b/tools/build_rules/select.bzl
@@ -7,6 +7,7 @@
"amd64",
"roborio",
"armhf",
+ "arm64",
"cortex-m",
"cortex-m0plus",
]
@@ -30,10 +31,23 @@
if cpu != "arm":
new_values[cpu] = values[cpu]
new_values["armhf"] = values["arm"]
+ new_values["arm64"] = values["arm"]
new_values["roborio"] = values["arm"]
new_values["cortex-m"] = values["arm"]
new_values["cortex-m0plus"] = values["arm"]
values = new_values
+ elif "arm32" in values:
+ if "arm64" not in values:
+ fail("Need to handle 'arm64' CPU if handling 'arm32' CPU.")
+ new_values = {}
+ for cpu in values:
+ if cpu != "arm32":
+ new_values[cpu] = values[cpu]
+ new_values["armhf"] = values["arm32"]
+ new_values["roborio"] = values["arm32"]
+ new_values["cortex-m"] = values["arm32"]
+ new_values["cortex-m0plus"] = values["arm32"]
+ values = new_values
for cpu in all_cpus:
if cpu not in values:
if "else" in values:
@@ -47,6 +61,7 @@
"@//tools:cpu_k8": values["amd64"],
"@//tools:cpu_roborio": values["roborio"],
"@//tools:cpu_armhf": values["armhf"],
+ "@//tools:cpu_arm64": values["arm64"],
"@//tools:cpu_cortex_m4f": values["cortex-m"],
"@//tools:cpu_cortex_m0plus": values["cortex-m0plus"],
# TODO(phil): Support this properly.
@@ -67,6 +82,7 @@
fail("Need to handle 64 bit addresses!", "values")
return select({
"@//tools:cpu_k8": values["64"],
+ "@//tools:cpu_arm64": values["64"],
"@//tools:cpu_roborio": values["32"],
"@//tools:cpu_armhf": values["32"],
"@//tools:cpu_cortex_m4f": values["32"],
diff --git a/tools/ci/buildkite.yaml b/tools/ci/buildkite.yaml
index b2ee1e3..c4af4a4 100644
--- a/tools/ci/buildkite.yaml
+++ b/tools/ci/buildkite.yaml
@@ -29,6 +29,11 @@
- tools/ci/clean-disk.sh
- tools/bazel ${STARTUP} --output_base=../armv7_output_base build ${COMMON} --config=armv7 ${TARGETS}
+ - label: "arm64"
+ commands:
+ - tools/ci/clean-disk.sh
+ - tools/bazel ${STARTUP} --output_base=../arm64_output_base build ${COMMON} --config=arm64 ${TARGETS}
+
- label: "cortex-m4f"
commands:
- tools/ci/clean-disk.sh
diff --git a/tools/cpp/BUILD b/tools/cpp/BUILD
index 6ff661a..bac0c0b 100644
--- a/tools/cpp/BUILD
+++ b/tools/cpp/BUILD
@@ -7,6 +7,7 @@
toolchains = {
"k8": "@llvm_toolchain//:cc-clang-x86_64-linux",
"armv7": "@llvm_toolchain//:cc-clang-armv7-linux",
+ "arm64": "@llvm_toolchain//:cc-clang-aarch64-linux",
"roborio": ":cc-compiler-roborio",
"cortex-m4f": ":cc-compiler-cortex-m4f",
"rp2040": ":cc-compiler-rp2040",
diff --git a/tools/platforms/BUILD b/tools/platforms/BUILD
index d6a63c7..4127883 100644
--- a/tools/platforms/BUILD
+++ b/tools/platforms/BUILD
@@ -26,6 +26,7 @@
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:arm64",
+ "//tools/platforms/hardware:raspberry_pi",
"//tools/platforms/go:lacks_support",
"//tools/platforms/rust:has_support",
],