Merge "Update to v6.1 kernel headers."
diff --git a/libc/SECCOMP_ALLOWLIST_COMMON.TXT b/libc/SECCOMP_ALLOWLIST_COMMON.TXT
index d366bad..efbf28b 100644
--- a/libc/SECCOMP_ALLOWLIST_COMMON.TXT
+++ b/libc/SECCOMP_ALLOWLIST_COMMON.TXT
@@ -30,6 +30,12 @@
 # Needed for a CTS test of seccomp (b/34763393).
 int	seccomp(unsigned, unsigned, void*)	all
 
+# TODO: remove these now we've updated the toolchain (http://b/229989971).
+int open(const char*, int, ...)  arm,x86,x86_64
+int stat64(const char*, stat64*)  arm,x86
+ssize_t readlink(const char*, char*, size_t)  arm,x86,x86_64
+int stat(const char*, stat*)  arm,x86,x86_64
+
 #
 # (Potentially) useful new syscalls which we don't yet use in bionic.
 #
diff --git a/libc/libc.map.txt b/libc/libc.map.txt
index 5695dc6..4a4e607 100644
--- a/libc/libc.map.txt
+++ b/libc/libc.map.txt
@@ -1518,34 +1518,34 @@
     tss_set;
 
     # Unwinder implementation
-    __aeabi_unwind_cpp_pr0; # apex llndk arm
-    __aeabi_unwind_cpp_pr1; # apex llndk arm
-    __aeabi_unwind_cpp_pr2; # apex llndk arm
-    __deregister_frame; # apex llndk arm64 x86 x86_64
-    __gnu_unwind_frame; # apex llndk arm
-    __register_frame; # apex llndk arm64 x86 x86_64
-    _Unwind_Backtrace; # apex llndk
-    _Unwind_Complete; # apex llndk arm
-    _Unwind_DeleteException; # apex llndk
-    _Unwind_Find_FDE; # apex llndk
-    _Unwind_FindEnclosingFunction; # apex llndk
-    _Unwind_ForcedUnwind; # apex llndk arm64 x86 x86_64
-    _Unwind_GetCFA; # apex llndk
-    _Unwind_GetDataRelBase; # apex llndk
-    _Unwind_GetGR; # apex llndk
-    _Unwind_GetIP; # apex llndk
-    _Unwind_GetIPInfo; # apex llndk
-    _Unwind_GetLanguageSpecificData; # apex llndk
-    _Unwind_GetRegionStart; # apex llndk
-    _Unwind_GetTextRelBase; # apex llndk
-    _Unwind_RaiseException; # apex llndk
-    _Unwind_Resume; # apex llndk
-    _Unwind_Resume_or_Rethrow; # apex llndk
-    _Unwind_SetGR; # apex llndk
-    _Unwind_SetIP; # apex llndk
-    _Unwind_VRS_Get; # apex llndk arm
-    _Unwind_VRS_Pop; # apex llndk arm
-    _Unwind_VRS_Set; # apex llndk arm
+    __aeabi_unwind_cpp_pr0; # arm
+    __aeabi_unwind_cpp_pr1; # arm
+    __aeabi_unwind_cpp_pr2; # arm
+    __deregister_frame; # arm64 x86 x86_64
+    __gnu_unwind_frame; # arm
+    __register_frame; # arm64 x86 x86_64
+    _Unwind_Backtrace;
+    _Unwind_Complete; # arm
+    _Unwind_DeleteException;
+    _Unwind_Find_FDE;
+    _Unwind_FindEnclosingFunction;
+    _Unwind_ForcedUnwind; # arm64 x86 x86_64
+    _Unwind_GetCFA;
+    _Unwind_GetDataRelBase;
+    _Unwind_GetGR;
+    _Unwind_GetIP;
+    _Unwind_GetIPInfo;
+    _Unwind_GetLanguageSpecificData;
+    _Unwind_GetRegionStart;
+    _Unwind_GetTextRelBase;
+    _Unwind_RaiseException;
+    _Unwind_Resume;
+    _Unwind_Resume_or_Rethrow;
+    _Unwind_SetGR;
+    _Unwind_SetIP;
+    _Unwind_VRS_Get; # arm
+    _Unwind_VRS_Pop; # arm
+    _Unwind_VRS_Set; # arm
 } LIBC_Q;
 
 LIBC_S { # introduced=S
diff --git a/libc/malloc_debug/PointerData.cpp b/libc/malloc_debug/PointerData.cpp
index 5ab2232..e3a35a6 100644
--- a/libc/malloc_debug/PointerData.cpp
+++ b/libc/malloc_debug/PointerData.cpp
@@ -26,6 +26,7 @@
  * SUCH DAMAGE.
  */
 
+#include <cxxabi.h>
 #include <errno.h>
 #include <inttypes.h>
 #include <signal.h>
@@ -54,8 +55,6 @@
 #include "malloc_debug.h"
 #include "UnwindBacktrace.h"
 
-extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
-
 std::atomic_uint8_t PointerData::backtrace_enabled_;
 std::atomic_bool PointerData::backtrace_dump_;
 
@@ -617,8 +616,8 @@
         if (frame.function_name.empty()) {
           dprintf(fd, " \"\" 0}");
         } else {
-          char* demangled_name = __cxa_demangle(frame.function_name.c_str(), nullptr, nullptr,
-                                                nullptr);
+          char* demangled_name =
+              abi::__cxa_demangle(frame.function_name.c_str(), nullptr, nullptr, nullptr);
           const char* name;
           if (demangled_name != nullptr) {
             name = demangled_name;
diff --git a/libc/malloc_debug/UnwindBacktrace.cpp b/libc/malloc_debug/UnwindBacktrace.cpp
index c892a39..8a6ff7b 100644
--- a/libc/malloc_debug/UnwindBacktrace.cpp
+++ b/libc/malloc_debug/UnwindBacktrace.cpp
@@ -26,6 +26,7 @@
  * SUCH DAMAGE.
  */
 
+#include <cxxabi.h>
 #include <inttypes.h>
 #include <pthread.h>
 #include <stdint.h>
@@ -48,8 +49,6 @@
 #define PAD_PTR "08" PRIx64
 #endif
 
-extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
-
 bool Unwind(std::vector<uintptr_t>* frames, std::vector<unwindstack::FrameData>* frame_info,
             size_t max_frames) {
   [[clang::no_destroy]] static unwindstack::AndroidLocalUnwinder unwinder(
@@ -89,7 +88,8 @@
 
     if (!info->function_name.empty()) {
       line += " (";
-      char* demangled_name = __cxa_demangle(info->function_name.c_str(), nullptr, nullptr, nullptr);
+      char* demangled_name =
+          abi::__cxa_demangle(info->function_name.c_str(), nullptr, nullptr, nullptr);
       if (demangled_name != nullptr) {
         line += demangled_name;
         free(demangled_name);
diff --git a/libc/malloc_debug/backtrace.cpp b/libc/malloc_debug/backtrace.cpp
index 0649571..ecb3a80 100644
--- a/libc/malloc_debug/backtrace.cpp
+++ b/libc/malloc_debug/backtrace.cpp
@@ -26,6 +26,7 @@
  * SUCH DAMAGE.
  */
 
+#include <cxxabi.h>
 #include <dlfcn.h>
 #include <errno.h>
 #include <inttypes.h>
@@ -48,8 +49,6 @@
 
 typedef struct _Unwind_Context __unwind_context;
 
-extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
-
 static MapData g_map_data;
 static const MapEntry* g_current_code_map = nullptr;
 
@@ -145,7 +144,7 @@
 
     char buf[1024];
     if (symbol != nullptr) {
-      char* demangled_name = __cxa_demangle(symbol, nullptr, nullptr, nullptr);
+      char* demangled_name = abi::__cxa_demangle(symbol, nullptr, nullptr, nullptr);
       const char* name;
       if (demangled_name != nullptr) {
         name = demangled_name;
diff --git a/libfdtrack/fdtrack.cpp b/libfdtrack/fdtrack.cpp
index 2d114f2..b064401 100644
--- a/libfdtrack/fdtrack.cpp
+++ b/libfdtrack/fdtrack.cpp
@@ -71,7 +71,11 @@
 static constexpr size_t kStackDepth = 32;
 
 // Skip any initial frames from libfdtrack.so.
-static std::vector<std::string> kSkipFdtrackLib [[clang::no_destroy]] = {"libfdtrack.so"};
+// Also ignore frames from ART (http://b/236197847) because we'd rather spend
+// our precious few frames on the actual Java calling code rather than the
+// implementation of JNI!
+static std::vector<std::string> kSkipFdtrackLib
+    [[clang::no_destroy]] = {"libfdtrack.so", "libart.so"};
 
 static bool installed = false;
 static std::array<FdEntry, kFdTableSize> stack_traces [[clang::no_destroy]];
diff --git a/tests/__cxa_atexit_test.cpp b/tests/__cxa_atexit_test.cpp
index 6a122d1..9f73261 100644
--- a/tests/__cxa_atexit_test.cpp
+++ b/tests/__cxa_atexit_test.cpp
@@ -26,19 +26,30 @@
  * SUCH DAMAGE.
  */
 
-#include <cxxabi.h>
 #include <gtest/gtest.h>
 
+extern "C" {
+int __cxa_atexit(void (*func)(void*), void* arg, void* dso);
+
+// TODO(b/175635923). __cxa_finalize's return type should actually be "void",
+// but it is declared "int" here instead to be compatible with the declaration
+// in an old version of cxxabi.h, which is included indirectly. The declarations
+// of __cxa_atexit and __cxa_finalize are removed from newer versions of
+// cxxabi.h, so once libc++ is updated, this return type should be changed to
+// "void".
+int __cxa_finalize(void* dso);
+}
+
 TEST(__cxa_atexit, simple) {
   int counter = 0;
 
-  __cxxabiv1::__cxa_atexit([](void* arg) { ++*static_cast<int*>(arg); }, &counter, &counter);
+  __cxa_atexit([](void* arg) { ++*static_cast<int*>(arg); }, &counter, &counter);
 
-  __cxxabiv1::__cxa_finalize(&counter);
+  __cxa_finalize(&counter);
   ASSERT_EQ(counter, 1);
 
   // The handler won't be called twice.
-  __cxxabiv1::__cxa_finalize(&counter);
+  __cxa_finalize(&counter);
   ASSERT_EQ(counter, 1);
 }
 
@@ -54,16 +65,16 @@
   };
 
   for (int i = 0; i < 500; ++i) {
-    __cxxabiv1::__cxa_atexit(append_to_actual, new int{i}, &handles[i % 2]);
+    __cxa_atexit(append_to_actual, new int{i}, &handles[i % 2]);
   }
 
-  __cxxabiv1::__cxa_finalize(&handles[0]);
+  __cxa_finalize(&handles[0]);
 
   for (int i = 500; i < 750; ++i) {
-    __cxxabiv1::__cxa_atexit(append_to_actual, new int{i}, &handles[1]);
+    __cxa_atexit(append_to_actual, new int{i}, &handles[1]);
   }
 
-  __cxxabiv1::__cxa_finalize(&handles[1]);
+  __cxa_finalize(&handles[1]);
 
   std::vector<int> expected;
   for (int i = 498; i >= 0; i -= 2) expected.push_back(i);
diff --git a/tests/__cxa_demangle_test.cpp b/tests/__cxa_demangle_test.cpp
index 4628a61..d400619 100644
--- a/tests/__cxa_demangle_test.cpp
+++ b/tests/__cxa_demangle_test.cpp
@@ -29,11 +29,9 @@
 #include <cxxabi.h>
 #include <gtest/gtest.h>
 
-extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
-
 TEST(__cxa_demangle, cxa_demangle_fuzz_152588929) {
 #if defined(__aarch64__)
-  char* p = __cxa_demangle("1\006ILeeeEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", 0, 0, 0);
+  char* p = abi::__cxa_demangle("1\006ILeeeEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", 0, 0, 0);
   ASSERT_STREQ("\x6<-0x1.cecececececececececececececep+11983", p);
   free(p);
 #endif
@@ -41,7 +39,7 @@
 
 TEST(__cxa_demangle, DISABLED_cxa_demangle_fuzz_167977068) {
 #if defined(__aarch64__)
-  char* p = __cxa_demangle("DTLeeeeeeeeeeeeeeeeeeeeeeeeeEEEEeeEEEE", 0, 0, 0);
+  char* p = abi::__cxa_demangle("DTLeeeeeeeeeeeeeeeeeeeeeeeeeEEEEeeEEEE", 0, 0, 0);
   ASSERT_EQ(nullptr, p) << p;
   free(p);
 #endif