1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-12-25 04:23:42 +01:00

Include <assert.h>.

(_longjmp): Ensure that we have at least 4 exception-handling args.  (This code
	will need updating to make it work on x86, where only 2 exception handling
	args are available).
(longjmp): If we are compiling with GCC, use an alias-attribute to alias it with
	_longjmp().  This is more efficient and works around a gcc-3.2/ia64 bug
	which causes bad unwind info when a noreturn function is a last call.


(Logical change 1.59)
This commit is contained in:
mostang.com!davidm 2003-03-06 06:14:36 +00:00
parent eeffb605f7
commit 00c5dee16b

View file

@ -25,6 +25,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#define UNW_LOCAL_ONLY #define UNW_LOCAL_ONLY
#include <assert.h>
#include <libunwind.h> #include <libunwind.h>
#include <setjmp.h> #include <setjmp.h>
#include <signal.h> #include <signal.h>
@ -71,14 +72,17 @@ _longjmp (jmp_buf env, int val)
} }
#endif #endif
/* found the right frame: */ /* found the right frame: */
if (sigprocmask (SIG_BLOCK, NULL, &current_mask) < 0) if (sigprocmask (SIG_BLOCK, NULL, &current_mask) < 0)
abort (); abort ();
if (unw_set_reg (&c, UNW_REG_EH_ARG0, wp[1]) < 0 assert (UNW_NUM_EH_REGS >= 4);
|| unw_set_reg (&c, UNW_REG_EH_ARG1, val) < 0
|| unw_set_reg (&c, UNW_REG_EH_ARG2, if (unw_set_reg (&c, UNW_REG_EH + 0, wp[1]) < 0
|| unw_set_reg (&c, UNW_REG_EH + 1, val) < 0
|| unw_set_reg (&c, UNW_REG_EH + 2,
((unw_word_t *) &current_mask)[0]) < 0 ((unw_word_t *) &current_mask)[0]) < 0
|| unw_set_reg (&c, UNW_REG_IP, || unw_set_reg (&c, UNW_REG_IP,
(unw_word_t) &_UI_siglongjmp_cont)) (unw_word_t) &_UI_siglongjmp_cont))
@ -88,7 +92,7 @@ _longjmp (jmp_buf env, int val)
{ {
if (_NSIG > 16 * sizeof (unw_word_t)) if (_NSIG > 16 * sizeof (unw_word_t))
abort (); abort ();
if (unw_set_reg (&c, UNW_REG_EH_ARG3, if (unw_set_reg (&c, UNW_REG_EH + 3,
((unw_word_t *) &current_mask)[1]) < 0) ((unw_word_t *) &current_mask)[1]) < 0)
abort (); abort ();
} }
@ -102,8 +106,14 @@ _longjmp (jmp_buf env, int val)
abort (); abort ();
} }
#ifdef __GNUC__
void longjmp (jmp_buf env, int val) __attribute__ ((alias ("_longjmp")));
#else
void void
longjmp (jmp_buf env, int val) longjmp (jmp_buf env, int val)
{ {
_longjmp (env, val); _longjmp (env, val);
} }
#endif