[libcxx-commits] [PATCH] D124522: [libunwind][AArch64] Fix _Unwind_ForcedUnwind via sigreturn.

Daniel Kiss via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Thu Apr 28 09:42:09 PDT 2022


This revision was automatically updated to reflect the committed changes.
Closed by commit rGf326df34bc17: [libunwind][AArch64] Fix _Unwind_ForcedUnwind via sigreturn. (authored by danielkiss).
Herald added projects: libc++abi, libunwind.
Herald added a subscriber: libcxx-commits.
Herald added a reviewer: libc++abi.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D124522/new/

https://reviews.llvm.org/D124522

Files:
  libcxxabi/test/forced_unwind4.pass.cpp
  libunwind/src/UnwindCursor.hpp


Index: libunwind/src/UnwindCursor.hpp
===================================================================
--- libunwind/src/UnwindCursor.hpp
+++ libunwind/src/UnwindCursor.hpp
@@ -2606,6 +2606,8 @@
   if (_addressSpace.get32(pc) == 0xd2801168 &&
       _addressSpace.get32(pc + 4) == 0xd4000001) {
     _info = {};
+    _info.start_ip = pc;
+    _info.end_ip = pc + 4;
     _isSigReturn = true;
     return true;
   }
Index: libcxxabi/test/forced_unwind4.pass.cpp
===================================================================
--- /dev/null
+++ libcxxabi/test/forced_unwind4.pass.cpp
@@ -0,0 +1,50 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: linux && target={{aarch64-.+}}
+
+// pthread_cancel in case of glibc calls _Unwind_ForcedUnwind from a signal on
+// the child_thread. This test ensures sigretrun is handled correctly (see:
+// UnwindCursor<A, R>::setInfoForSigReturn).
+
+#include <chrono>
+#include <condition_variable>
+#include <pthread.h>
+#include <unistd.h>
+
+using namespace std::chrono_literals;
+
+std::condition_variable cv;
+std::mutex cv_m;
+bool thread_ready = false;
+
+static void* test(void* arg) {
+  (void)arg;
+  thread_ready = true;
+  cv.notify_all();
+
+  // This must be a pthread cancellation point.
+  while (1)
+    sleep(100);
+
+  return (void*)1;
+}
+
+int main() {
+  pthread_t child_thread;
+  std::unique_lock<std::mutex> lk(cv_m);
+  pthread_create(&child_thread, 0, test, (void*)0);
+
+  if (!cv.wait_for(lk, 100ms, [] { return thread_ready; }))
+    return -1;
+
+  pthread_cancel(child_thread);
+  pthread_join(child_thread, NULL);
+  return 0;
+}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124522.425817.patch
Type: text/x-patch
Size: 1966 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20220428/2d027d18/attachment.bin>


More information about the libcxx-commits mailing list