[COMMITTED] Use PTR_MANGLE on libgcc unwinder function pointers.
Commit Message
This makes the unwinder wrapper in libc consistent with the one in
libpthread with regard to pointer mangling. Tested x86_64-linux-gnu.
Thanks,
Roland
* sysdeps/gnu/unwind-resume.c: #include <sysdep.h>.
(init): Apply PTR_MANGLE to pointers before storing them.
(_Unwind_Resume, __gcc_personality_v0): Apply PTR_DEMANGLE to pointers
before using them.
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <unwind.h>
#include <gnu/lib-names.h>
+#include <sysdep.h>
#pragma GCC optimize ("-fexceptions", "-fasynchronous-unwind-tables")
@@ -43,7 +44,9 @@ init (void)
__libc_fatal (LIBGCC_S_SO
" must be installed for pthread_cancel to work\n");
+ PTR_MANGLE (resume);
libgcc_s_resume = resume;
+ PTR_MANGLE (personality);
libgcc_s_personality = personality;
}
@@ -52,7 +55,10 @@ _Unwind_Resume (struct _Unwind_Exception *exc)
{
if (__glibc_unlikely (libgcc_s_resume == NULL))
init ();
- (*libgcc_s_resume) (exc);
+
+ __typeof (libgcc_s_resume) resume = libgcc_s_resume;
+ PTR_DEMANGLE (resume);
+ (*resume) (exc);
}
_Unwind_Reason_Code
@@ -63,6 +69,9 @@ __gcc_personality_v0 (int version, _Unwind_Action actions,
{
if (__glibc_unlikely (libgcc_s_personality == NULL))
init ();
- return (*libgcc_s_personality) (version, actions, exception_class,
- ue_header, context);
+
+ __typeof (libgcc_s_personality) personality = libgcc_s_personality;
+ PTR_DEMANGLE (personality);
+
+ return (*personality) (version, actions, exception_class, ue_header, context);
}