nkeynes@923 | 1 | # AC_CHECK_FASTCALL([if-ok],[if-notok])
|
nkeynes@923 | 2 | # Test if the compiler recognizes __attribute__((regparm(3))) - we don't
|
nkeynes@923 | 3 | # currently check if it actually works correctly, but probably should...
|
nkeynes@923 | 4 | # -----------------------
|
nkeynes@923 | 5 | AC_DEFUN([AC_CHECK_FASTCALL], [
|
nkeynes@923 | 6 | AC_MSG_CHECKING([support for fastcall calling conventions]);
|
nkeynes@923 | 7 | AC_RUN_IFELSE([
|
nkeynes@923 | 8 | AC_LANG_SOURCE([[
|
nkeynes@923 | 9 | int __attribute__((regparm(3))) foo(int a, int b) { return a+b; }
|
nkeynes@923 | 10 |
|
nkeynes@923 | 11 | int main(int argc, char *argv[])
|
nkeynes@923 | 12 | {
|
nkeynes@923 | 13 | return foo( 1, 2 ) == 3 ? 0 : 1;
|
nkeynes@923 | 14 | }]])], [
|
nkeynes@923 | 15 | AC_MSG_RESULT([yes])
|
nkeynes@923 | 16 | $1 ], [
|
nkeynes@923 | 17 | AC_MSG_RESULT([no])
|
nkeynes@923 | 18 | $2 ])
|
nkeynes@923 | 19 | ])
|
nkeynes@923 | 20 |
|
nkeynes@927 | 21 | # AC_CHECK_FRAME_ADDRESS([if-ok],[if-notok])
|
nkeynes@927 | 22 | # Test if the compiler will let us modify the return address on the stack
|
nkeynes@927 | 23 | # via __builtin_frame_address()
|
nkeynes@927 | 24 | # -----------------------
|
nkeynes@927 | 25 | AC_DEFUN([AC_CHECK_FRAME_ADDRESS], [
|
nkeynes@927 | 26 | AC_MSG_CHECKING([if we have a working __builtin_frame_address()]);
|
nkeynes@927 | 27 | AC_RUN_IFELSE([
|
nkeynes@927 | 28 | AC_LANG_SOURCE([[
|
nkeynes@927 | 29 | void * __attribute__((noinline)) first_arg( void *x, void *y ) { return x; }
|
nkeynes@927 | 30 | int __attribute__((noinline)) foo( int arg, void *exc )
|
nkeynes@927 | 31 | {
|
nkeynes@927 | 32 | if( arg < 2 ) {
|
nkeynes@927 | 33 | *(((void **)__builtin_frame_address(0))+1) = exc;
|
nkeynes@927 | 34 | }
|
nkeynes@927 | 35 | return 0;
|
nkeynes@927 | 36 | }
|
nkeynes@927 | 37 |
|
nkeynes@927 | 38 | int main(int argc, char *argv[])
|
nkeynes@927 | 39 | {
|
nkeynes@927 | 40 | goto *first_arg(&&start, &&except);
|
nkeynes@927 | 41 |
|
nkeynes@927 | 42 | start:
|
nkeynes@927 | 43 | return foo( argc, &&except ) + 1;
|
nkeynes@927 | 44 |
|
nkeynes@927 | 45 | except:
|
nkeynes@927 | 46 | return 0;
|
nkeynes@927 | 47 | }]])], [
|
nkeynes@927 | 48 | AC_MSG_RESULT([yes])
|
nkeynes@927 | 49 | $1 ], [
|
nkeynes@927 | 50 | AC_MSG_RESULT([no])
|
nkeynes@927 | 51 | $2 ])
|
nkeynes@927 | 52 | ])
|
nkeynes@927 | 53 |
|
nkeynes@927 | 54 |
|