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",
     ],