[build] Fix arm and arm64 gcc builds.

TEST=./tools/build.py --no-goma --no-clang --arch=arm,arm64 runtime
Bug: https://github.com/dart-lang/sdk/issues/47330
Change-Id: I32cea56e3ad64200a7057cc6a381bc6d9656ec7b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/215984
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni
index fd178e1..939c8fc 100644
--- a/build/config/compiler/compiler.gni
+++ b/build/config/compiler/compiler.gni
@@ -10,4 +10,5 @@
   build_with_chromium = false
   use_libfuzzer = false
   is_apple = is_ios || is_mac
+  use_thin_lto = false
 }
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index ac65f6d..6d300fb 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -83,12 +83,11 @@
 // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/sys_icache_invalidate.3.html
 #if defined(DART_HOST_OS_IOS)
   sys_icache_invalidate(reinterpret_cast<void*>(start), size);
-#elif defined(__linux__) && !defined(ANDROID)
-  extern void __clear_cache(char*, char*);
+#elif defined(DART_HOST_OS_LINUX)
   char* beg = reinterpret_cast<char*>(start);
   char* end = reinterpret_cast<char*>(start + size);
-  ::__clear_cache(beg, end);
-#elif defined(ANDROID)
+  __builtin___clear_cache(beg, end);
+#elif defined(DART_HOST_OS_ANDROID)
   cacheflush(start, start + size, 0);
 #else
 #error FlushICache only tested/supported on Linux, Android and iOS
diff --git a/runtime/vm/cpu_arm64.cc b/runtime/vm/cpu_arm64.cc
index d193d23..23e9fee 100644
--- a/runtime/vm/cpu_arm64.cc
+++ b/runtime/vm/cpu_arm64.cc
@@ -45,10 +45,9 @@
 #if defined(DART_HOST_OS_MACOS) || defined(DART_HOST_OS_IOS)
   sys_icache_invalidate(reinterpret_cast<void*>(start), size);
 #elif defined(DART_HOST_OS_ANDROID) || defined(DART_HOST_OS_LINUX)
-  extern void __clear_cache(char*, char*);
   char* beg = reinterpret_cast<char*>(start);
   char* end = reinterpret_cast<char*>(start + size);
-  ::__clear_cache(beg, end);
+  __builtin___clear_cache(beg, end);
 #elif defined(DART_HOST_OS_FUCHSIA)
   zx_status_t result = zx_cache_flush(reinterpret_cast<const void*>(start),
                                       size, ZX_CACHE_FLUSH_INSN);
diff --git a/tools/gn.py b/tools/gn.py
index cecd030..3090333 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -212,6 +212,7 @@
 
     # Use tcmalloc only when targeting Linux and when not using ASAN.
     gn_args['dart_use_tcmalloc'] = ((gn_args['target_os'] == 'linux') and
+                                    (gn_args['target_cpu'] != 'arm') and
                                     sanitizer == 'none')
 
     if gn_args['target_os'] == 'linux':