nkeynes@923: # AC_CHECK_FASTCALL([if-ok],[if-notok]) nkeynes@923: # Test if the compiler recognizes __attribute__((regparm(3))) - we don't nkeynes@923: # currently check if it actually works correctly, but probably should... nkeynes@923: # ----------------------- nkeynes@923: AC_DEFUN([AC_CHECK_FASTCALL], [ nkeynes@923: AC_MSG_CHECKING([support for fastcall calling conventions]); nkeynes@923: AC_RUN_IFELSE([ nkeynes@923: AC_LANG_SOURCE([[ nkeynes@923: int __attribute__((regparm(3))) foo(int a, int b) { return a+b; } nkeynes@923: nkeynes@923: int main(int argc, char *argv[]) nkeynes@923: { nkeynes@923: return foo( 1, 2 ) == 3 ? 0 : 1; nkeynes@923: }]])], [ nkeynes@923: AC_MSG_RESULT([yes]) nkeynes@923: $1 ], [ nkeynes@923: AC_MSG_RESULT([no]) nkeynes@923: $2 ]) nkeynes@923: ]) nkeynes@923: nkeynes@927: # AC_CHECK_FRAME_ADDRESS([if-ok],[if-notok]) nkeynes@927: # Test if the compiler will let us modify the return address on the stack nkeynes@927: # via __builtin_frame_address() nkeynes@927: # ----------------------- nkeynes@927: AC_DEFUN([AC_CHECK_FRAME_ADDRESS], [ nkeynes@927: AC_MSG_CHECKING([if we have a working __builtin_frame_address()]); nkeynes@927: AC_RUN_IFELSE([ nkeynes@927: AC_LANG_SOURCE([[ nkeynes@927: void * __attribute__((noinline)) first_arg( void *x, void *y ) { return x; } nkeynes@927: int __attribute__((noinline)) foo( int arg, void *exc ) nkeynes@927: { nkeynes@927: if( arg < 2 ) { nkeynes@927: *(((void **)__builtin_frame_address(0))+1) = exc; nkeynes@927: } nkeynes@927: return 0; nkeynes@927: } nkeynes@927: nkeynes@927: int main(int argc, char *argv[]) nkeynes@927: { nkeynes@927: goto *first_arg(&&start, &&except); nkeynes@927: nkeynes@927: start: nkeynes@927: return foo( argc, &&except ) + 1; nkeynes@927: nkeynes@927: except: nkeynes@927: return 0; nkeynes@927: }]])], [ nkeynes@927: AC_MSG_RESULT([yes]) nkeynes@927: $1 ], [ nkeynes@927: AC_MSG_RESULT([no]) nkeynes@927: $2 ]) nkeynes@927: ]) nkeynes@927: nkeynes@927: