--- a/build/toolchain/linux/BUILD.gn
+++ b/build/toolchain/linux/BUILD.gn
@@ -21,6 +21,14 @@ clang_toolchain("clang_arm64") {
   }
 }
 
+clang_toolchain("arm64") {
+  toolprefix = "aarch64-linux-gnu-"
+  toolchain_args = {
+    current_cpu = "arm64"
+    current_os = "linux"
+  }
+}
+
 gcc_toolchain("arm") {
   toolprefix = "arm-linux-gnueabihf-"
 
--- a/tools/gn/args.cc
+++ b/tools/gn/args.cc
@@ -269,6 +269,7 @@ void Args::SetSystemVarsLocked(Scope* de
   static const char kX64[] = "x64";
   static const char kArm[] = "arm";
   static const char kMips[] = "mipsel";
+  static const char kArm64[] = "arm64";
   const char* arch = nullptr;
 
   // Set the host CPU architecture based on the underlying OS, not
@@ -282,8 +283,10 @@ void Args::SetSystemVarsLocked(Scope* de
     arch = kArm;
   else if (os_arch == "mips")
     arch = kMips;
+  else if (os_arch == "aarch64")
+    arch = kArm64;
   else
-    CHECK(false) << "OS architecture not handled.";
+    CHECK(false) << "OS architecture not handled. " << os_arch;
 
   // Save the OS and architecture as build arguments that are implicitly
   // declared. This is so they can be overridden in a toolchain build args
