glibc/sysdeps/generic/unwind-link.h
Florian Weimer 58548b9d68 Use PTR_MANGLE and PTR_DEMANGLE unconditionally in C sources
In the future, this will result in a compilation failure if the
macros are unexpectedly undefined (due to header inclusion ordering
or header inclusion missing altogether).

Assembler sources are more difficult to convert.  In many cases,
they are hand-optimized for the mangling and no-mangling variants,
which is why they are not converted.

sysdeps/s390/s390-32/__longjmp.c and sysdeps/s390/s390-64/__longjmp.c
are special: These are C sources, but most of the implementation is
in assembler, so the PTR_DEMANGLE macro has to be undefined in some
cases, to match the assembler style.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
2022-10-18 17:04:10 +02:00

103 lines
3.1 KiB
C

/* Dynamic loading of the libgcc unwinder. Generic version.
Copyright (C) 2021-2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef _UNWIND_LINK_H
#define _UNWIND_LINK_H
#include <unwind.h>
#include <unwind-arch.h>
#if !UNWIND_LINK_FRAME_ADJUSTMENT
static inline void *
unwind_arch_adjustment (void *prev, void *addr)
{
return addr;
}
#endif
#ifdef SHARED
# include <pointer_guard.h>
# include <unwind-resume.h>
# if UNWIND_LINK_FRAME_STATE_FOR
struct frame_state;
# endif
struct unwind_link
{
__typeof (_Unwind_Backtrace) *ptr__Unwind_Backtrace;
__typeof (_Unwind_ForcedUnwind) *ptr__Unwind_ForcedUnwind;
__typeof (_Unwind_GetCFA) *ptr__Unwind_GetCFA;
# if UNWIND_LINK_GETIP
__typeof (_Unwind_GetIP) *ptr__Unwind_GetIP;
# endif
__typeof (_Unwind_Resume) *ptr__Unwind_Resume;
#if UNWIND_LINK_FRAME_STATE_FOR
struct frame_state *(*ptr___frame_state_for) (void *, struct frame_state *);
#endif
_Unwind_Reason_Code (*ptr_personality) PERSONALITY_PROTO;
UNWIND_LINK_EXTRA_FIELDS
};
/* Return a pointer to the implementation, or NULL on failure. */
struct unwind_link *__libc_unwind_link_get (void);
libc_hidden_proto (__libc_unwind_link_get)
/* UNWIND_LINK_PTR returns the stored function pointer NAME from the
cached unwind link OBJ (which was previously returned by
__libc_unwind_link_get). */
# define UNWIND_LINK_PTR(obj, name, ...) \
({ \
__typeof ((obj)->ptr_##name) __unwind_fptr = (obj)->ptr_##name; \
PTR_DEMANGLE (__unwind_fptr); \
__unwind_fptr; \
})
/* Called from fork, in the new subprocess. */
void __libc_unwind_link_after_fork (void);
/* Called from __libc_freeres. */
void __libc_unwind_link_freeres (void) attribute_hidden;
#else /* !SHARED */
/* Dummy implementation so that the code can be shared with the SHARED
version. */
struct unwind_link;
static inline struct unwind_link *
__libc_unwind_link_get (void)
{
/* Return something that is not a null pointer, so that error checks
succeed. */
return (struct unwind_link *) 1;
}
/* Directly call the static implementation. */
# define UNWIND_LINK_PTR(obj, name, ...) \
((void) (obj), &name)
static inline void
__libc_unwind_link_after_fork (void)
{
/* No need to clean up if the unwinder is statically linked. */
}
#endif /* !SHARED */
#endif /* _UNWIND_LINK_H */