summaryrefslogtreecommitdiff
path: root/sysdeps/generic
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2021-03-01 15:56:36 +0100
committerFlorian Weimer <fweimer@redhat.com>2021-03-01 16:00:03 +0100
commit6b7efa3d8703cfd020281706f8110bc4a41b1525 (patch)
tree5729f22a50df964ba95c32e84279fe539133febf /sysdeps/generic
parentd14624825a3eeb7712ffbe6e794cea1c5636de4d (diff)
downloadglibc-6b7efa3d8703cfd020281706f8110bc4a41b1525.tar.gz
Implement _Unwind_Resume in libc on top of <unwind-link.h>
Temporarily move the arm _Unwind_Resume implementation to the file used by libpthread. It will be ported to <unwind-link.h> along with the rest of nptl. Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'sysdeps/generic')
-rw-r--r--sysdeps/generic/unwind-resume.c55
1 files changed, 9 insertions, 46 deletions
diff --git a/sysdeps/generic/unwind-resume.c b/sysdeps/generic/unwind-resume.c
index 09533d6992..9e63762bf1 100644
--- a/sysdeps/generic/unwind-resume.c
+++ b/sysdeps/generic/unwind-resume.c
@@ -16,68 +16,31 @@
License along with the GNU C Library; see the file COPYING.LIB. If
not, see <https://www.gnu.org/licenses/>. */
-#include <dlfcn.h>
#include <stdio.h>
-#include <unwind.h>
#include <gnu/lib-names.h>
+#include <unwind-link.h>
#include <sysdep.h>
#include <unwind-resume.h>
-
-void (*__libgcc_s_resume) (struct _Unwind_Exception *exc)
- attribute_hidden __attribute__ ((noreturn));
-
-static _Unwind_Reason_Code (*libgcc_s_personality) PERSONALITY_PROTO;
-
-void attribute_hidden __attribute__ ((cold))
-__libgcc_s_init (void)
+static struct unwind_link *
+link (void)
{
- void *resume, *personality;
- void *handle;
-
- /* See include/dlfcn.h. Use of __libc_dlopen requires RTLD_NOW. */
- handle = __libc_dlopen (LIBGCC_S_SO);
-
- if (handle == NULL
- || (resume = __libc_dlsym (handle, "_Unwind_Resume")) == NULL
- || (personality = __libc_dlsym (handle, "__gcc_personality_v0")) == NULL)
- __libc_fatal (LIBGCC_S_SO
- " must be installed for unwinding to work\n");
-
-#ifdef PTR_MANGLE
- PTR_MANGLE (resume);
-#endif
- __libgcc_s_resume = resume;
-#ifdef PTR_MANGLE
- PTR_MANGLE (personality);
-#endif
- libgcc_s_personality = personality;
+ struct unwind_link *unwind_link = __libc_unwind_link_get ();
+ if (unwind_link == NULL)
+ __libc_fatal (LIBGCC_S_SO " must be installed for unwinding to work\n");
+ return unwind_link;
}
#if !HAVE_ARCH_UNWIND_RESUME
void
_Unwind_Resume (struct _Unwind_Exception *exc)
{
- if (__glibc_unlikely (__libgcc_s_resume == NULL))
- __libgcc_s_init ();
-
- __typeof (__libgcc_s_resume) resume = __libgcc_s_resume;
-#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (resume);
-#endif
- (*resume) (exc);
+ UNWIND_LINK_PTR (link (), _Unwind_Resume) (exc);
}
#endif
_Unwind_Reason_Code
__gcc_personality_v0 PERSONALITY_PROTO
{
- if (__glibc_unlikely (libgcc_s_personality == NULL))
- __libgcc_s_init ();
-
- __typeof (libgcc_s_personality) personality = libgcc_s_personality;
-#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (personality);
-#endif
- return (*personality) PERSONALITY_ARGS;
+ return UNWIND_LINK_PTR (link (), personality) PERSONALITY_ARGS;
}