1 /* 2 * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> 3 * 4 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. 5 */ 6 7 #include <setjmp.h> 8 9 /* Test if longjmp to JMPBUF would unwind the frame 10 containing a local variable at ADDRESS. */ 11 #define _JMPBUF_UNWINDS(jmpbuf, address) \ 12 ((void *) (address) < (void *) (jmpbuf)[0].__sp) 13 14 #ifdef __UCLIBC_HAS_THREADS_NATIVE__ 15 #include <stdint.h> 16 #include <unwind.h> 17 18 /* Test if longjmp to JMPBUF would unwind the frame 19 containing a local variable at ADDRESS. */ 20 #undef _JMPBUF_UNWINDS 21 #define _JMPBUF_UNWINDS(jmpbuf, address) \ 22 ((void *) (address) < (void *) (jmpbuf)[0].__sp) 23 24 #define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \ 25 _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj) 26 27 static inline uintptr_t __attribute__ ((unused)) _jmpbuf_sp(__jmp_buf regs)28_jmpbuf_sp (__jmp_buf regs) 29 { 30 void *sp = (void *) regs[0].__sp; 31 return (uintptr_t) sp; 32 } 33 34 #define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ 35 ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj)) 36 37 #endif 38