From a82e6c354ea805114642a6e440abd0832cb1d23f Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sat, 18 Sep 2010 14:44:24 -0700 Subject: [PATCH 01/26] Add a stub iOS build script to drive autoconf --- build-iphone.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100755 build-iphone.sh diff --git a/build-iphone.sh b/build-iphone.sh new file mode 100755 index 0000000..a3593aa --- /dev/null +++ b/build-iphone.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +PLATFORM_IOS=/Developer/Platforms/iPhoneOS.platform/ +PLATFORM_IOS_SIM=/Developer/Platforms/iPhoneSimulator.platform/ +SDK_IOS_VERSION="4.1" + +mkdir -p "build-ios" +pushd "build-ios" +export CC="${PLATFORM_IOS}"/Developer/usr/bin/gcc-4.2 +export CFLAGS="-arch armv6 -isysroot ${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" +../configure --host=armv6-apple-darwin && make +popd From 69043d02936bb0579ac59b4ee1ed8dec38c38db7 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sat, 18 Sep 2010 15:32:08 -0700 Subject: [PATCH 02/26] Work-around libffi's FP ABI detection. On iOS, we must use the AAPCS floating point return value calling conventions. libffi's ARM implementation will only use these conventions if __SOFTFP__ is defined, which is not the case when GCC's -mfloat-abi defaults to 'softfp' instead of 'soft'. To work around this we manually define __SOFTFP__ for Apple platforms in the ARM-specific sysv.S. See also: http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iPhoneOSABIReference/Introduction/Introduction.html http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf --- src/arm/sysv.S | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/arm/sysv.S b/src/arm/sysv.S index 9064318..dc5fe36 100644 --- a/src/arm/sysv.S +++ b/src/arm/sysv.S @@ -34,6 +34,12 @@ #define CONCAT1(a, b) CONCAT2(a, b) #define CONCAT2(a, b) a ## b +/* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI + Function Call Guide */ +#ifdef __APPLE__ +#define __SOFTFP__ +#endif + /* Use the right prefix for global labels. */ #define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) #else From 8ddac835b6f8b54ede764d0ea977dee4c82e2d67 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sat, 18 Sep 2010 15:38:06 -0700 Subject: [PATCH 03/26] Fix placement of the __APPLE__ macro. --- src/arm/sysv.S | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/arm/sysv.S b/src/arm/sysv.S index dc5fe36..5ffb101 100644 --- a/src/arm/sysv.S +++ b/src/arm/sysv.S @@ -34,12 +34,6 @@ #define CONCAT1(a, b) CONCAT2(a, b) #define CONCAT2(a, b) a ## b -/* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI - Function Call Guide */ -#ifdef __APPLE__ -#define __SOFTFP__ -#endif - /* Use the right prefix for global labels. */ #define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) #else @@ -54,6 +48,12 @@ #define LSYM(x) x #endif +/* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI + Function Call Guide */ +#ifdef __APPLE__ +#define __SOFTFP__ +#endif + /* We need a better way of testing for this, but for now, this is all we can do. */ @ This selects the minimum architecture level required. From 6b452bafaec498df975ba8ac4c99de174e5f74f7 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sat, 18 Sep 2010 16:21:32 -0700 Subject: [PATCH 04/26] Apple assembler support; fixed most gas/ELF-isms. --- src/arm/sysv.S | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/src/arm/sysv.S b/src/arm/sysv.S index 5ffb101..2593c48 100644 --- a/src/arm/sysv.S +++ b/src/arm/sysv.S @@ -39,7 +39,11 @@ #else #define CNAME(x) x #endif +#ifdef __APPLE__ +#define ENTRY(x) .globl CNAME(x); CNAME(x): +#else #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): +#endif /* __APPLE__ */ #endif #ifdef __ELF__ @@ -111,43 +115,37 @@ .align 0 .thumb .thumb_func +#ifdef __APPLE__ + ENTRY($0) +#else ENTRY(\name) +#endif bx pc nop .arm UNWIND .fnstart /* A hook to tell gdb that we've switched to ARM mode. Also used to call directly from other local arm routines. */ -_L__\name: +#ifdef __APPLE__ +_L__$0: +#else +_L__\name: +#endif .endm #else .macro ARM_FUNC_START name .text .align 0 .arm +#ifdef __APPLE__ + ENTRY($0) +#else ENTRY(\name) +#endif UNWIND .fnstart .endm #endif -.macro RETLDM regs=, cond=, dirn=ia -#if defined (__INTERWORKING__) - .ifc "\regs","" - ldr\cond lr, [sp], #4 - .else - ldm\cond\dirn sp!, {\regs, lr} - .endif - bx\cond lr -#else - .ifc "\regs","" - ldr\cond pc, [sp], #4 - .else - ldm\cond\dirn sp!, {\regs, pc} - .endif -#endif -.endm - - @ r0: ffi_prep_args @ r1: &ecif @ r2: cif->bytes @@ -230,11 +228,18 @@ ARM_FUNC_START ffi_call_SYSV #endif LSYM(Lepilogue): - RETLDM "r0-r3,fp" +#if defined (__INTERWORKING__) + ldmia sp!, {r0-r3,fp, lr} + bx lr +#else + ldmia sp!, {r0-r3,fp, pc} +#endif .ffi_call_SYSV_end: UNWIND .fnend +#ifdef __ELF__ .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) +#endif /* unsigned int FFI_HIDDEN @@ -306,7 +311,9 @@ ARM_FUNC_START ffi_closure_SYSV .ffi_closure_SYSV_end: UNWIND .fnend +#ifdef __ELF__ .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) +#endif #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",%progbits From 70150bdf4509269965c72f2032bf74f285767afe Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sat, 18 Sep 2010 16:38:03 -0700 Subject: [PATCH 05/26] Add missing UNWIND entry; disables .pad on non-EABI targets. --- src/arm/sysv.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/arm/sysv.S b/src/arm/sysv.S index 2593c48..b0ae8f0 100644 --- a/src/arm/sysv.S +++ b/src/arm/sysv.S @@ -255,7 +255,7 @@ ARM_FUNC_START ffi_closure_SYSV stmfd sp!, {ip, lr} UNWIND .save {r0, lr} add r2, sp, #8 - .pad #16 + UNWIND .pad #16 sub sp, sp, #16 str sp, [sp, #8] add r1, sp, #8 From be72fbab29b7190c702d8e1ac3d149855e95879d Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sat, 18 Sep 2010 18:02:25 -0700 Subject: [PATCH 06/26] Use the correct host triple for arm/darwin --- build-iphone.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-iphone.sh b/build-iphone.sh index a3593aa..d9010af 100755 --- a/build-iphone.sh +++ b/build-iphone.sh @@ -8,5 +8,5 @@ mkdir -p "build-ios" pushd "build-ios" export CC="${PLATFORM_IOS}"/Developer/usr/bin/gcc-4.2 export CFLAGS="-arch armv6 -isysroot ${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" -../configure --host=armv6-apple-darwin && make +../configure --host=arm-apple-darwin10 && make popd From 1ac92cca9b02ef8d6a769f0de1adccd5c9630355 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sat, 18 Sep 2010 18:08:14 -0700 Subject: [PATCH 07/26] Add autoconf check for W^X platforms that require a trampoline table. This adds the FFI_EXEC_TRAMPOLINE_TABLE. The flag is enabled for arm-apple-darwin, where PROT_EXEC on writable (or formerly writable) pages is not permitted for sandboxed binaries. --- configure.ac | 5 +++++ fficonfig.h.in | 3 +++ 2 files changed, 8 insertions(+) diff --git a/configure.ac b/configure.ac index 50f24bc..197c319 100644 --- a/configure.ac +++ b/configure.ac @@ -316,6 +316,11 @@ if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64 fi case "$target" in + *arm*-apple-darwin*) + AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1, + [Cannot use PROT_EXEC on this target, so, we revert to + alternative means]) + ;; *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, [Cannot use malloc on this target, so, we revert to diff --git a/fficonfig.h.in b/fficonfig.h.in index e012ebb..b54b273 100644 --- a/fficonfig.h.in +++ b/fficonfig.h.in @@ -17,6 +17,9 @@ /* Define this if you want extra debugging. */ #undef FFI_DEBUG +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ +#undef FFI_EXEC_TRAMPOLINE_TABLE + /* Cannot use malloc on this target, so, we revert to alternative means */ #undef FFI_MMAP_EXEC_WRIT From 75af086be8830a8eafe9b1ebda199d788bcb0c62 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sat, 18 Sep 2010 18:12:19 -0700 Subject: [PATCH 08/26] Update autoconf files --- configure | 459 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 240 insertions(+), 219 deletions(-) diff --git a/configure b/configure index f06daab..1ddd581 100755 --- a/configure +++ b/configure @@ -1,13 +1,13 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.65 for libffi 3.0.10rc0. +# Generated by GNU Autoconf 2.67 for libffi 3.0.10rc0. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. # # # This configure script is free software; the Free Software Foundation @@ -319,7 +319,7 @@ $as_echo X"$as_dir" | test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p @@ -359,19 +359,19 @@ else fi # as_fn_arith -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. +# script with STATUS, using 1 if that was 0. as_fn_error () { - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $1" >&2 + $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -682,7 +682,7 @@ test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -1014,8 +1014,9 @@ do fi case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -1060,7 +1061,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1086,7 +1087,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1290,7 +1291,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1306,7 +1307,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1336,8 +1337,8 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information." + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) @@ -1345,7 +1346,7 @@ Try \`$0 --help' for more information." # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error "invalid variable name: \`$ac_envvar'" ;; + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1363,13 +1364,13 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error "missing argument to $ac_option" + as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1392,7 +1393,7 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -1406,8 +1407,8 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1422,9 +1423,9 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error "working directory cannot be determined" + as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error "pwd does not report name of working directory" + as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. @@ -1463,11 +1464,11 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1507,7 +1508,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages + -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1672,9 +1673,9 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF libffi configure 3.0.10rc0 -generated by GNU Autoconf 2.65 +generated by GNU Autoconf 2.67 -Copyright (C) 2009 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1778,7 +1779,7 @@ ac_fn_c_check_header_compile () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -1821,7 +1822,7 @@ $as_echo "$ac_try_echo"; } >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } >/dev/null && { + test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : @@ -1887,7 +1888,7 @@ ac_fn_c_check_func () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -1954,10 +1955,10 @@ $as_echo "$ac_res" >&6; } ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 @@ -1993,7 +1994,7 @@ if ac_fn_c_try_cpp "$LINENO"; then : else ac_header_preproc=no fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } @@ -2016,17 +2017,15 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( cat <<\_ASBOX -## ------------------------------------------- ## +( $as_echo "## ------------------------------------------- ## ## Report this to http://gcc.gnu.org/bugs.html ## -## ------------------------------------------- ## -_ASBOX +## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" @@ -2221,7 +2220,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by libffi $as_me 3.0.10rc0, which was -generated by GNU Autoconf 2.65. Invocation command line was +generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ @@ -2331,11 +2330,9 @@ trap 'exit_status=$? { echo - cat <<\_ASBOX -## ---------------- ## + $as_echo "## ---------------- ## ## Cache variables. ## -## ---------------- ## -_ASBOX +## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( @@ -2369,11 +2366,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - cat <<\_ASBOX -## ----------------- ## + $as_echo "## ----------------- ## ## Output variables. ## -## ----------------- ## -_ASBOX +## ----------------- ##" echo for ac_var in $ac_subst_vars do @@ -2386,11 +2381,9 @@ _ASBOX echo if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## + $as_echo "## ------------------- ## ## File substitutions. ## -## ------------------- ## -_ASBOX +## ------------------- ##" echo for ac_var in $ac_subst_files do @@ -2404,11 +2397,9 @@ _ASBOX fi if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## + $as_echo "## ----------- ## ## confdefs.h. ## -## ----------- ## -_ASBOX +## ----------- ##" echo cat confdefs.h echo @@ -2463,7 +2454,12 @@ _ACEOF ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -2478,7 +2474,11 @@ do { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } fi done @@ -2554,7 +2554,7 @@ if $ac_cache_corrupted; then $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## @@ -2572,16 +2572,22 @@ ac_config_headers="$ac_config_headers fficonfig.h" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - for ac_t in install-sh install.sh shtool; do - if test -f "$ac_dir/$ac_t"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/$ac_t -c" - break 2 - fi - done + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi done if test -z "$ac_aux_dir"; then - as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, @@ -2595,7 +2601,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } @@ -2606,16 +2612,16 @@ else test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && - as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; -*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' @@ -2640,7 +2646,7 @@ else ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi @@ -2648,7 +2654,7 @@ fi $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; -*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' @@ -2673,7 +2679,7 @@ else ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi @@ -2681,7 +2687,7 @@ fi $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; -*) as_fn_error "invalid value of canonical target" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' @@ -2814,11 +2820,11 @@ am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's @@ -2840,7 +2846,7 @@ if ( # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". - as_fn_error "ls -t appears to fail. Make sure there is not a broken + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi @@ -2850,7 +2856,7 @@ then # Ok. : else - as_fn_error "newly created file is older than distributed files! + as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 @@ -3088,7 +3094,7 @@ done $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -3096,7 +3102,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -3130,7 +3136,7 @@ if test "`cd $srcdir && pwd`" != "`pwd`"; then am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi @@ -3497,8 +3503,8 @@ fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "no acceptable C compiler found in \$PATH -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -3612,9 +3618,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "C compiler cannot create executables -See \`config.log' for more details." "$LINENO" 5; }; } +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } @@ -3656,8 +3661,8 @@ done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -3714,9 +3719,9 @@ $as_echo "$ac_try_echo"; } >&5 else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot run C compiled programs. +as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. -See \`config.log' for more details." "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5; } fi fi fi @@ -3767,8 +3772,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of object files: cannot compile -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi @@ -4324,7 +4329,7 @@ $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${ac_cv_prog_cc_${ac_cc}_c_o+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4523,7 +4528,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then - as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED @@ -4599,7 +4604,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP @@ -4665,7 +4670,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP @@ -4732,7 +4737,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then - as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP @@ -4848,7 +4853,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : @@ -5050,13 +5055,13 @@ if test "${lt_cv_nm_interface+set}" = set; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:5053: $ac_compile\"" >&5) + (eval echo "\"\$as_me:5058: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:5056: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:5061: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:5059: output\"" >&5) + (eval echo "\"\$as_me:5064: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -6262,7 +6267,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 6265 "configure"' > conftest.$ac_ext + echo '#line 6270 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -7051,7 +7056,7 @@ else # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. @@ -7067,11 +7072,11 @@ else ac_preproc_ok=: break fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext +rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi @@ -7110,7 +7115,7 @@ else # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. @@ -7126,18 +7131,18 @@ else ac_preproc_ok=: break fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext +rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c @@ -7266,8 +7271,7 @@ do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -7788,11 +7792,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7791: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7795: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7795: \$? = $ac_status" >&5 + echo "$as_me:7799: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -8127,11 +8131,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8130: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8134: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8134: \$? = $ac_status" >&5 + echo "$as_me:8138: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -8232,11 +8236,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8235: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8239: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:8239: \$? = $ac_status" >&5 + echo "$as_me:8243: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -8287,11 +8291,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8290: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8294: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:8294: \$? = $ac_status" >&5 + echo "$as_me:8298: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -10657,7 +10661,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10660 "configure" +#line 10664 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10753,7 +10757,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10756 "configure" +#line 10760 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11316,7 +11320,7 @@ esac if test $TARGETDIR = unknown; then - as_fn_error "\"libffi has not been ported to $host.\"" "$LINENO" 5 + as_fn_error $? "\"libffi has not been ported to $host.\"" "$LINENO" 5 fi if test x$TARGET = xMIPS; then @@ -11786,8 +11790,7 @@ if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func @@ -11865,9 +11868,8 @@ else if test "$ac_cv_type_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "cannot compute sizeof (double) -See \`config.log' for more details." "$LINENO" 5; }; } +as_fn_error 77 "cannot compute sizeof (double) +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_double=0 fi @@ -11899,9 +11901,8 @@ else if test "$ac_cv_type_long_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "cannot compute sizeof (long double) -See \`config.log' for more details." "$LINENO" 5; }; } +as_fn_error 77 "cannot compute sizeof (long double) +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_double=0 fi @@ -12153,7 +12154,7 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) - as_fn_error "unknown endianness + as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac @@ -12362,6 +12363,11 @@ $as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h fi case "$target" in + *arm*-apple-darwin*) + +$as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h + + ;; *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*) $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h @@ -12626,6 +12632,7 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= +U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' @@ -12649,136 +12656,136 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error "conditional \"AMDEP\" was never defined. + as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error "conditional \"am__fastdepCC\" was never defined. + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then - as_fn_error "conditional \"am__fastdepCCAS\" was never defined. + as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then - as_fn_error "conditional \"MAINTAINER_MODE\" was never defined. + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TESTSUBDIR_TRUE}" && test -z "${TESTSUBDIR_FALSE}"; then - as_fn_error "conditional \"TESTSUBDIR\" was never defined. + as_fn_error $? "conditional \"TESTSUBDIR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MIPS_TRUE}" && test -z "${MIPS_FALSE}"; then - as_fn_error "conditional \"MIPS\" was never defined. + as_fn_error $? "conditional \"MIPS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SPARC_TRUE}" && test -z "${SPARC_FALSE}"; then - as_fn_error "conditional \"SPARC\" was never defined. + as_fn_error $? "conditional \"SPARC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_TRUE}" && test -z "${X86_FALSE}"; then - as_fn_error "conditional \"X86\" was never defined. + as_fn_error $? "conditional \"X86\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_FREEBSD_TRUE}" && test -z "${X86_FREEBSD_FALSE}"; then - as_fn_error "conditional \"X86_FREEBSD\" was never defined. + as_fn_error $? "conditional \"X86_FREEBSD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_WIN32_TRUE}" && test -z "${X86_WIN32_FALSE}"; then - as_fn_error "conditional \"X86_WIN32\" was never defined. + as_fn_error $? "conditional \"X86_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_WIN64_TRUE}" && test -z "${X86_WIN64_FALSE}"; then - as_fn_error "conditional \"X86_WIN64\" was never defined. + as_fn_error $? "conditional \"X86_WIN64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_DARWIN_TRUE}" && test -z "${X86_DARWIN_FALSE}"; then - as_fn_error "conditional \"X86_DARWIN\" was never defined. + as_fn_error $? "conditional \"X86_DARWIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ALPHA_TRUE}" && test -z "${ALPHA_FALSE}"; then - as_fn_error "conditional \"ALPHA\" was never defined. + as_fn_error $? "conditional \"ALPHA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IA64_TRUE}" && test -z "${IA64_FALSE}"; then - as_fn_error "conditional \"IA64\" was never defined. + as_fn_error $? "conditional \"IA64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${M32R_TRUE}" && test -z "${M32R_FALSE}"; then - as_fn_error "conditional \"M32R\" was never defined. + as_fn_error $? "conditional \"M32R\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${M68K_TRUE}" && test -z "${M68K_FALSE}"; then - as_fn_error "conditional \"M68K\" was never defined. + as_fn_error $? "conditional \"M68K\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MOXIE_TRUE}" && test -z "${MOXIE_FALSE}"; then - as_fn_error "conditional \"MOXIE\" was never defined. + as_fn_error $? "conditional \"MOXIE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${POWERPC_TRUE}" && test -z "${POWERPC_FALSE}"; then - as_fn_error "conditional \"POWERPC\" was never defined. + as_fn_error $? "conditional \"POWERPC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${POWERPC_AIX_TRUE}" && test -z "${POWERPC_AIX_FALSE}"; then - as_fn_error "conditional \"POWERPC_AIX\" was never defined. + as_fn_error $? "conditional \"POWERPC_AIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${POWERPC_DARWIN_TRUE}" && test -z "${POWERPC_DARWIN_FALSE}"; then - as_fn_error "conditional \"POWERPC_DARWIN\" was never defined. + as_fn_error $? "conditional \"POWERPC_DARWIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${POWERPC_FREEBSD_TRUE}" && test -z "${POWERPC_FREEBSD_FALSE}"; then - as_fn_error "conditional \"POWERPC_FREEBSD\" was never defined. + as_fn_error $? "conditional \"POWERPC_FREEBSD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARM_TRUE}" && test -z "${ARM_FALSE}"; then - as_fn_error "conditional \"ARM\" was never defined. + as_fn_error $? "conditional \"ARM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AVR32_TRUE}" && test -z "${AVR32_FALSE}"; then - as_fn_error "conditional \"AVR32\" was never defined. + as_fn_error $? "conditional \"AVR32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBFFI_CRIS_TRUE}" && test -z "${LIBFFI_CRIS_FALSE}"; then - as_fn_error "conditional \"LIBFFI_CRIS\" was never defined. + as_fn_error $? "conditional \"LIBFFI_CRIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FRV_TRUE}" && test -z "${FRV_FALSE}"; then - as_fn_error "conditional \"FRV\" was never defined. + as_fn_error $? "conditional \"FRV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${S390_TRUE}" && test -z "${S390_FALSE}"; then - as_fn_error "conditional \"S390\" was never defined. + as_fn_error $? "conditional \"S390\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_64_TRUE}" && test -z "${X86_64_FALSE}"; then - as_fn_error "conditional \"X86_64\" was never defined. + as_fn_error $? "conditional \"X86_64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SH_TRUE}" && test -z "${SH_FALSE}"; then - as_fn_error "conditional \"SH\" was never defined. + as_fn_error $? "conditional \"SH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SH64_TRUE}" && test -z "${SH64_FALSE}"; then - as_fn_error "conditional \"SH64\" was never defined. + as_fn_error $? "conditional \"SH64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PA_LINUX_TRUE}" && test -z "${PA_LINUX_FALSE}"; then - as_fn_error "conditional \"PA_LINUX\" was never defined. + as_fn_error $? "conditional \"PA_LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PA_HPUX_TRUE}" && test -z "${PA_HPUX_FALSE}"; then - as_fn_error "conditional \"PA_HPUX\" was never defined. + as_fn_error $? "conditional \"PA_HPUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PA64_HPUX_TRUE}" && test -z "${PA64_HPUX_FALSE}"; then - as_fn_error "conditional \"PA64_HPUX\" was never defined. + as_fn_error $? "conditional \"PA64_HPUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then - as_fn_error "conditional \"FFI_DEBUG\" was never defined. + as_fn_error $? "conditional \"FFI_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi @@ -12928,19 +12935,19 @@ export LANGUAGE (unset CDPATH) >/dev/null 2>&1 && unset CDPATH -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. +# script with STATUS, using 1 if that was 0. as_fn_error () { - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $1" >&2 + $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -13136,7 +13143,7 @@ $as_echo X"$as_dir" | test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p @@ -13190,7 +13197,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # values after options handling. ac_log=" This file was extended by libffi $as_me 3.0.10rc0, which was -generated by GNU Autoconf 2.65. Invocation command line was +generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -13260,10 +13267,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ libffi config.status 3.0.10rc0 -configured by $0, generated by GNU Autoconf 2.65, +configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" -Copyright (C) 2009 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -13281,11 +13288,16 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=*) + --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; *) ac_option=$1 ac_optarg=$2 @@ -13307,6 +13319,7 @@ do $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; @@ -13319,7 +13332,7 @@ do ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error "ambiguous option: \`$1' + as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; @@ -13328,7 +13341,7 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error "unrecognized option: \`$1' + -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" @@ -13651,7 +13664,7 @@ do "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;; - *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -13690,7 +13703,7 @@ $debug || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -13707,7 +13720,7 @@ if test "x$ac_cr" = x; then fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\r' + ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi @@ -13721,18 +13734,18 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -13821,20 +13834,28 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || as_fn_error "could not setup config files machinery" "$LINENO" 5 + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// s/^[^=]*=[ ]*$// }' fi @@ -13862,7 +13883,7 @@ for ac_last_try in false false :; do if test -z "$ac_t"; then break elif $ac_last_try; then - as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -13947,7 +13968,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error "could not setup config headers machinery" "$LINENO" 5 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" @@ -13960,7 +13981,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -13988,7 +14009,7 @@ do [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" @@ -14015,7 +14036,7 @@ $as_echo "$as_me: creating $ac_file" >&6;} case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -14152,22 +14173,22 @@ s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 +which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} +which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # @@ -14178,19 +14199,19 @@ which seems to be undefined. Please make sure it is defined." >&2;} $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error "could not create -" "$LINENO" 5 + || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -14244,19 +14265,19 @@ $as_echo X"$_am_arg" | $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} if test ! -r "$ac_source"; then - as_fn_error "$ac_source: file not found" "$LINENO" 5 + as_fn_error $? "$ac_source: file not found" "$LINENO" 5 fi rm -f "$ac_file" # Try a relative symlink, then a hard link, then a copy. - case $srcdir in + case $ac_source in [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; *) ac_rel_source=$ac_top_build_prefix$ac_source ;; esac ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || ln "$ac_source" "$ac_file" 2>/dev/null || cp -p "$ac_source" "$ac_file" || - as_fn_error "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 + as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 fi ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 @@ -15011,7 +15032,7 @@ _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. @@ -15032,7 +15053,7 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit $? + $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 From 68ce0c383ece84f69945d1c8c3fed03f7f9cb5d6 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 08:38:19 -0700 Subject: [PATCH 09/26] Add a shell script that generates the ARM trampoline page. This generates a page of 340 trampolines, aligned within one page. The trampolines use pc-relative addressing to reference config data (context, jump address) from a page placed directly prior to the trampoline page. This can be used on systems -- such as iOS -- that do not support writable, executable memory by remapping the executable page containing the trampolines directly above a newly allocated writable config page. --- src/arm/gentramp.sh | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100755 src/arm/gentramp.sh diff --git a/src/arm/gentramp.sh b/src/arm/gentramp.sh new file mode 100755 index 0000000..5eb2033 --- /dev/null +++ b/src/arm/gentramp.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +PROGNAME=$0 + +# Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change, +# the entire arm trampoline implementation must be updated to match, too. + +# Size of an individual trampoline, in bytes +TRAMPOLINE_SIZE=12 + +# Page size, in bytes +PAGE_SIZE=4096 + +# Compute the size of the reachable config page; The first 16 bytes of the config page +# are unreachable due to our maximum pc-relative ldr offset. +PAGE_AVAIL=`expr $PAGE_SIZE - 16` + +# Compute the number of of available trampolines. +TRAMPOLINE_COUNT=`expr $PAGE_AVAIL / $TRAMPOLINE_SIZE` + +header () { + echo "# GENERATED CODE - DO NOT EDIT" + echo "# This file was generated by $PROGNAME" + echo "" + + # Write out the trampoline table, aligned to the page boundary + echo ".text" + echo ".align 12" + echo ".globl _ffi_closure_trampoline_table" + echo "_ffi_closure_trampoline_table:" +} + + +# WARNING - Don't modify the trampoline code size without also updating the relevent libffi code +trampoline () { + cat << END + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] +END +} + +main () { + # Write out the header + header + + # Write out the trampolines + local i=0 + while [ $i -lt ${TRAMPOLINE_COUNT} ]; do + trampoline + local i=`expr $i + 1` + done +} + +main From 9af9291b73bc5e27ecd949bec8157f20426d65b8 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 08:52:33 -0700 Subject: [PATCH 10/26] Add the trampoline table generated by gentramp.sh --- src/arm/trampoline.S | 2727 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2727 insertions(+) create mode 100644 src/arm/trampoline.S diff --git a/src/arm/trampoline.S b/src/arm/trampoline.S new file mode 100644 index 0000000..2de1b37 --- /dev/null +++ b/src/arm/trampoline.S @@ -0,0 +1,2727 @@ +# GENERATED CODE - DO NOT EDIT +# This file was generated by ./gentramp.sh + +.text +.align 12 +.globl _ffi_closure_trampoline_table +_ffi_closure_trampoline_table: + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] + stmfd sp!, {r0-r3} + // Load the context argument from the config page. + // This places the first config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + ldr r0, [pc, #-4092] + + // Load the jump address from the config page. + ldr pc, [pc, #-4092] From c71480eaf839f26bbdfcd8965f65ac4d8defddc0 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 09:02:05 -0700 Subject: [PATCH 11/26] Update automake/autoconf to conditionally build src/arm/trampoline.S if FFI_EXEC_TRAMPOLINE_TABLE is enabled. --- Makefile.am | 5 ++++- configure.ac | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index aa4a55c..ce08251 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,7 +6,7 @@ SUBDIRS = include testsuite man EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ - src/arm/ffi.c src/arm/sysv.S src/arm/ffitarget.h \ + src/arm/ffi.c src/arm/sysv.S src/arm/trampoline.S src/arm/ffitarget.h \ src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \ src/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \ src/ia64/ffi.c src/ia64/ffitarget.h src/ia64/ia64_flags.h \ @@ -142,6 +142,9 @@ nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc endif if ARM nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c +if FFI_EXEC_TRAMPOLINE_TABLE +nodist_libffi_la_SOURCES += src/arm/trampoline.S +endif endif if AVR32 nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c diff --git a/configure.ac b/configure.ac index 197c319..6089538 100644 --- a/configure.ac +++ b/configure.ac @@ -317,6 +317,7 @@ fi case "$target" in *arm*-apple-darwin*) + FFI_EXEC_TRAMPOLINE_TABLE=1 AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1, [Cannot use PROT_EXEC on this target, so, we revert to alternative means]) @@ -327,6 +328,7 @@ case "$target" in alternative means]) ;; esac +AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1) if test x$TARGET = xX86_64; then AC_CACHE_CHECK([assembler supports unwind section type], From a3d9aa85013341451ea97766485b7a11852d32b2 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 09:03:52 -0700 Subject: [PATCH 12/26] Update the autogenerated autoconf/automake files. --- Makefile.in | 71 ++++++++++++++++++++++++++++++----------------------- configure | 43 +++++++++++++++++++++----------- 2 files changed, 69 insertions(+), 45 deletions(-) diff --git a/Makefile.in b/Makefile.in index ab05aeb..ac09fec 100644 --- a/Makefile.in +++ b/Makefile.in @@ -52,21 +52,22 @@ target_triplet = @target@ @POWERPC_DARWIN_TRUE@am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S @POWERPC_FREEBSD_TRUE@am__append_15 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S @ARM_TRUE@am__append_16 = src/arm/sysv.S src/arm/ffi.c -@AVR32_TRUE@am__append_17 = src/avr32/sysv.S src/avr32/ffi.c -@LIBFFI_CRIS_TRUE@am__append_18 = src/cris/sysv.S src/cris/ffi.c -@FRV_TRUE@am__append_19 = src/frv/eabi.S src/frv/ffi.c -@MOXIE_TRUE@am__append_20 = src/moxie/eabi.S src/moxie/ffi.c -@S390_TRUE@am__append_21 = src/s390/sysv.S src/s390/ffi.c -@X86_64_TRUE@am__append_22 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S -@SH_TRUE@am__append_23 = src/sh/sysv.S src/sh/ffi.c -@SH64_TRUE@am__append_24 = src/sh64/sysv.S src/sh64/ffi.c -@PA_LINUX_TRUE@am__append_25 = src/pa/linux.S src/pa/ffi.c -@PA_HPUX_TRUE@am__append_26 = src/pa/hpux32.S src/pa/ffi.c +@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_17 = src/arm/trampoline.S +@AVR32_TRUE@am__append_18 = src/avr32/sysv.S src/avr32/ffi.c +@LIBFFI_CRIS_TRUE@am__append_19 = src/cris/sysv.S src/cris/ffi.c +@FRV_TRUE@am__append_20 = src/frv/eabi.S src/frv/ffi.c +@MOXIE_TRUE@am__append_21 = src/moxie/eabi.S src/moxie/ffi.c +@S390_TRUE@am__append_22 = src/s390/sysv.S src/s390/ffi.c +@X86_64_TRUE@am__append_23 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S +@SH_TRUE@am__append_24 = src/sh/sysv.S src/sh/ffi.c +@SH64_TRUE@am__append_25 = src/sh64/sysv.S src/sh64/ffi.c +@PA_LINUX_TRUE@am__append_26 = src/pa/linux.S src/pa/ffi.c +@PA_HPUX_TRUE@am__append_27 = src/pa/hpux32.S src/pa/ffi.c # Build debug. Define FFI_DEBUG on the commandline so that, when building with # MSVC, it can link against the debug CRT. -@FFI_DEBUG_TRUE@am__append_27 = -DFFI_DEBUG +@FFI_DEBUG_TRUE@am__append_28 = -DFFI_DEBUG # Build opt. -@FFI_DEBUG_FALSE@am__append_28 = -O2 +@FFI_DEBUG_FALSE@am__append_29 = -O2 subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \ @@ -141,17 +142,18 @@ am_libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ @POWERPC_FREEBSD_TRUE@ src/powerpc/sysv.lo \ @POWERPC_FREEBSD_TRUE@ src/powerpc/ppc_closure.lo @ARM_TRUE@am__objects_16 = src/arm/sysv.lo src/arm/ffi.lo -@AVR32_TRUE@am__objects_17 = src/avr32/sysv.lo src/avr32/ffi.lo -@LIBFFI_CRIS_TRUE@am__objects_18 = src/cris/sysv.lo src/cris/ffi.lo -@FRV_TRUE@am__objects_19 = src/frv/eabi.lo src/frv/ffi.lo -@MOXIE_TRUE@am__objects_20 = src/moxie/eabi.lo src/moxie/ffi.lo -@S390_TRUE@am__objects_21 = src/s390/sysv.lo src/s390/ffi.lo -@X86_64_TRUE@am__objects_22 = src/x86/ffi64.lo src/x86/unix64.lo \ +@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_17 = src/arm/trampoline.lo +@AVR32_TRUE@am__objects_18 = src/avr32/sysv.lo src/avr32/ffi.lo +@LIBFFI_CRIS_TRUE@am__objects_19 = src/cris/sysv.lo src/cris/ffi.lo +@FRV_TRUE@am__objects_20 = src/frv/eabi.lo src/frv/ffi.lo +@MOXIE_TRUE@am__objects_21 = src/moxie/eabi.lo src/moxie/ffi.lo +@S390_TRUE@am__objects_22 = src/s390/sysv.lo src/s390/ffi.lo +@X86_64_TRUE@am__objects_23 = src/x86/ffi64.lo src/x86/unix64.lo \ @X86_64_TRUE@ src/x86/ffi.lo src/x86/sysv.lo -@SH_TRUE@am__objects_23 = src/sh/sysv.lo src/sh/ffi.lo -@SH64_TRUE@am__objects_24 = src/sh64/sysv.lo src/sh64/ffi.lo -@PA_LINUX_TRUE@am__objects_25 = src/pa/linux.lo src/pa/ffi.lo -@PA_HPUX_TRUE@am__objects_26 = src/pa/hpux32.lo src/pa/ffi.lo +@SH_TRUE@am__objects_24 = src/sh/sysv.lo src/sh/ffi.lo +@SH64_TRUE@am__objects_25 = src/sh64/sysv.lo src/sh64/ffi.lo +@PA_LINUX_TRUE@am__objects_26 = src/pa/linux.lo src/pa/ffi.lo +@PA_HPUX_TRUE@am__objects_27 = src/pa/hpux32.lo src/pa/ffi.lo nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \ $(am__objects_6) $(am__objects_7) $(am__objects_8) \ @@ -160,17 +162,18 @@ nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ $(am__objects_15) $(am__objects_16) $(am__objects_17) \ $(am__objects_18) $(am__objects_19) $(am__objects_20) \ $(am__objects_21) $(am__objects_22) $(am__objects_23) \ - $(am__objects_24) $(am__objects_25) $(am__objects_26) + $(am__objects_24) $(am__objects_25) $(am__objects_26) \ + $(am__objects_27) libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ $(nodist_libffi_la_OBJECTS) libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ libffi_convenience_la_LIBADD = -am__objects_27 = src/debug.lo src/prep_cif.lo src/types.lo \ +am__objects_28 = src/debug.lo src/prep_cif.lo src/types.lo \ src/raw_api.lo src/java_raw_api.lo src/closures.lo -am_libffi_convenience_la_OBJECTS = $(am__objects_27) -am__objects_28 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ +am_libffi_convenience_la_OBJECTS = $(am__objects_28) +am__objects_29 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ $(am__objects_4) $(am__objects_5) $(am__objects_6) \ $(am__objects_7) $(am__objects_8) $(am__objects_9) \ $(am__objects_10) $(am__objects_11) $(am__objects_12) \ @@ -178,8 +181,8 @@ am__objects_28 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ $(am__objects_16) $(am__objects_17) $(am__objects_18) \ $(am__objects_19) $(am__objects_20) $(am__objects_21) \ $(am__objects_22) $(am__objects_23) $(am__objects_24) \ - $(am__objects_25) $(am__objects_26) -nodist_libffi_convenience_la_OBJECTS = $(am__objects_28) + $(am__objects_25) $(am__objects_26) $(am__objects_27) +nodist_libffi_convenience_la_OBJECTS = $(am__objects_29) libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ $(nodist_libffi_convenience_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ @@ -399,7 +402,7 @@ AUTOMAKE_OPTIONS = foreign subdir-objects SUBDIRS = include testsuite man EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ - src/arm/ffi.c src/arm/sysv.S src/arm/ffitarget.h \ + src/arm/ffi.c src/arm/sysv.S src/arm/trampoline.S src/arm/ffitarget.h \ src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \ src/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \ src/ia64/ffi.c src/ia64/ffitarget.h src/ia64/ia64_flags.h \ @@ -484,10 +487,11 @@ nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ $(am__append_15) $(am__append_16) $(am__append_17) \ $(am__append_18) $(am__append_19) $(am__append_20) \ $(am__append_21) $(am__append_22) $(am__append_23) \ - $(am__append_24) $(am__append_25) $(am__append_26) + $(am__append_24) $(am__append_25) $(am__append_26) \ + $(am__append_27) libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) -AM_CFLAGS = -Wall -g -fexceptions $(am__append_27) $(am__append_28) +AM_CFLAGS = -Wall -g -fexceptions $(am__append_28) $(am__append_29) libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src AM_CCASFLAGS = $(AM_CPPFLAGS) @@ -723,6 +727,8 @@ src/arm/sysv.lo: src/arm/$(am__dirstamp) \ src/arm/$(DEPDIR)/$(am__dirstamp) src/arm/ffi.lo: src/arm/$(am__dirstamp) \ src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/trampoline.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) src/avr32/$(am__dirstamp): @$(MKDIR_P) src/avr32 @: > src/avr32/$(am__dirstamp) @@ -820,6 +826,8 @@ mostlyclean-compile: -rm -f src/arm/ffi.lo -rm -f src/arm/sysv.$(OBJEXT) -rm -f src/arm/sysv.lo + -rm -f src/arm/trampoline.$(OBJEXT) + -rm -f src/arm/trampoline.lo -rm -f src/avr32/ffi.$(OBJEXT) -rm -f src/avr32/ffi.lo -rm -f src/avr32/sysv.$(OBJEXT) @@ -942,6 +950,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/sysv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@ diff --git a/configure b/configure index 1ddd581..08405bb 100755 --- a/configure +++ b/configure @@ -752,6 +752,8 @@ FFI_DEBUG_FALSE FFI_DEBUG_TRUE TARGETDIR TARGET +FFI_EXEC_TRAMPOLINE_TABLE_FALSE +FFI_EXEC_TRAMPOLINE_TABLE_TRUE HAVE_LONG_DOUBLE ALLOCA PA64_HPUX_FALSE @@ -5055,13 +5057,13 @@ if test "${lt_cv_nm_interface+set}" = set; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:5058: $ac_compile\"" >&5) + (eval echo "\"\$as_me:5060: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:5061: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:5063: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:5064: output\"" >&5) + (eval echo "\"\$as_me:5066: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -6267,7 +6269,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 6270 "configure"' > conftest.$ac_ext + echo '#line 6272 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -7792,11 +7794,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7795: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7797: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7799: \$? = $ac_status" >&5 + echo "$as_me:7801: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -8131,11 +8133,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8134: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8136: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8138: \$? = $ac_status" >&5 + echo "$as_me:8140: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -8236,11 +8238,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8239: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8241: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:8243: \$? = $ac_status" >&5 + echo "$as_me:8245: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -8291,11 +8293,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8294: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8296: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:8298: \$? = $ac_status" >&5 + echo "$as_me:8300: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -10661,7 +10663,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10664 "configure" +#line 10666 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10757,7 +10759,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10760 "configure" +#line 10762 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12364,6 +12366,7 @@ fi case "$target" in *arm*-apple-darwin*) + FFI_EXEC_TRAMPOLINE_TABLE=1 $as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h @@ -12374,6 +12377,14 @@ $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h ;; esac + if test x$FFI_EXEC_TRAMPOLINE_TABLE = x1; then + FFI_EXEC_TRAMPOLINE_TABLE_TRUE= + FFI_EXEC_TRAMPOLINE_TABLE_FALSE='#' +else + FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#' + FFI_EXEC_TRAMPOLINE_TABLE_FALSE= +fi + if test x$TARGET = xX86_64; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5 @@ -12784,6 +12795,10 @@ if test -z "${PA64_HPUX_TRUE}" && test -z "${PA64_HPUX_FALSE}"; then Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${FFI_EXEC_TRAMPOLINE_TABLE_TRUE}" && test -z "${FFI_EXEC_TRAMPOLINE_TABLE_FALSE}"; then + as_fn_error $? "conditional \"FFI_EXEC_TRAMPOLINE_TABLE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then as_fn_error $? "conditional \"FFI_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 From b764162526854686e579a48b6ac5981f4eb886a3 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 09:04:34 -0700 Subject: [PATCH 13/26] Fix the script name (build-iphone.sh -> build-ios.sh) --- build-iphone.sh => build-ios.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename build-iphone.sh => build-ios.sh (100%) diff --git a/build-iphone.sh b/build-ios.sh similarity index 100% rename from build-iphone.sh rename to build-ios.sh From 36849e7716b77aa25e4175d1f4be1b93dbf47aac Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 09:35:04 -0700 Subject: [PATCH 14/26] Whitespace/comment fixes. --- src/arm/gentramp.sh | 5 + src/arm/trampoline.S | 3060 ++++++++++++++++++++++++++++++++---------- 2 files changed, 2385 insertions(+), 680 deletions(-) diff --git a/src/arm/gentramp.sh b/src/arm/gentramp.sh index 5eb2033..7d5eca4 100755 --- a/src/arm/gentramp.sh +++ b/src/arm/gentramp.sh @@ -34,7 +34,11 @@ header () { # WARNING - Don't modify the trampoline code size without also updating the relevent libffi code trampoline () { cat << END + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. @@ -42,6 +46,7 @@ trampoline () { // Load the jump address from the config page. ldr pc, [pc, #-4092] + END } diff --git a/src/arm/trampoline.S b/src/arm/trampoline.S index 2de1b37..9f5891e 100644 --- a/src/arm/trampoline.S +++ b/src/arm/trampoline.S @@ -5,2723 +5,4423 @@ .align 12 .globl _ffi_closure_trampoline_table _ffi_closure_trampoline_table: + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + + + // trampoline + // Save to stack stmfd sp!, {r0-r3} + // Load the context argument from the config page. - // This places the first config value at _ffi_closure_trampoline_table-4080 - // This accounts for the above, 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. + // This places the first usable config value at _ffi_closure_trampoline_table-4080 + // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] + From f38364b399184e682fc3e785084bd497827bc5af Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 10:42:36 -0700 Subject: [PATCH 15/26] Fix symbol prefix for ffi_closure_SYSV_inner on Darwin. --- src/arm/sysv.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/arm/sysv.S b/src/arm/sysv.S index b0ae8f0..6e7b008 100644 --- a/src/arm/sysv.S +++ b/src/arm/sysv.S @@ -259,7 +259,7 @@ ARM_FUNC_START ffi_closure_SYSV sub sp, sp, #16 str sp, [sp, #8] add r1, sp, #8 - bl ffi_closure_SYSV_inner + bl CNAME(ffi_closure_SYSV_inner) cmp r0, #FFI_TYPE_INT beq .Lretint From 9e1196444e78aef20028c18891f44ebe39a815fd Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 10:43:06 -0700 Subject: [PATCH 16/26] Add a hard-coded FFI_EXEC_TRAMPOLINE_TABLE arm implementation. This implements support for re-mapping a shared table of executable trampolines directly in front of a writable configuration page, working around PROT_WRITE restrictions for sandboxed applications on Apple's iOS. This implementation is for testing purposes; a proper allocator is still necessary, and ARM-specific code needs to be moved out of src/closures.c. --- src/arm/ffi.c | 9 +++++- src/closures.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/src/arm/ffi.c b/src/arm/ffi.c index f6a6475..7da69c1 100644 --- a/src/arm/ffi.c +++ b/src/arm/ffi.c @@ -297,10 +297,17 @@ ffi_prep_closure_loc (ffi_closure* closure, { FFI_ASSERT (cif->abi == FFI_SYSV); +#if FFI_EXEC_TRAMPOLINE_TABLE + // XXX - hardcoded offset + void **config = (void **) (((uint8_t *) codeloc) - 4080); + config[0] = closure; + config[1] = ffi_closure_SYSV; +#else FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ &ffi_closure_SYSV, \ codeloc); - +#endif + closure->cif = cif; closure->user_data = user_data; closure->fun = fun; diff --git a/src/closures.c b/src/closures.c index 8f295dd..c214196 100644 --- a/src/closures.c +++ b/src/closures.c @@ -32,7 +32,7 @@ #include #include -#ifndef FFI_MMAP_EXEC_WRIT +#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE # if __gnu_linux__ /* This macro indicates it may be forbidden to map anonymous memory with both write and execute permission. Code compiled when this @@ -63,7 +63,89 @@ #if FFI_CLOSURES -# if FFI_MMAP_EXEC_WRIT +# if FFI_EXEC_TRAMPOLINE_TABLE + +// XXX - non-thread-safe, non-portable implementation, intended for initial testing +#include +#include +#include + +extern void *ffi_closure_trampoline_table; + +static void *tramp_table = NULL; +static void **config_table = NULL; +static int tramp_table_free = 0; + +void * +ffi_closure_alloc (size_t size, void **code) +{ + if (!code) + return NULL; + + /* Allocate our config page and remap the trampoline table */ + while (tramp_table == NULL) { + vm_address_t config_page = 0x0; + kern_return_t kt; + + /* Try to allocate two pages */ + kt = vm_allocate(mach_task_self(), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE); + if (kt != KERN_SUCCESS) { + fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + break; + } + + /* Now drop the second half of the allocation to make room for the trampoline table */ + kt = vm_deallocate(mach_task_self(), config_page+PAGE_SIZE, PAGE_SIZE); + if (kt != KERN_SUCCESS) { + fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + break; + } + + /* Remap the trampoline table to directly follow the config page */ + vm_address_t table_page = config_page+PAGE_SIZE; + vm_prot_t cur_prot; + vm_prot_t max_prot; + + kt = vm_remap(mach_task_self(), &table_page, PAGE_SIZE, 0x0, FALSE, mach_task_self(), (vm_address_t) &ffi_closure_trampoline_table, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); + + /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */ + if (kt != KERN_SUCCESS) { + /* Log unexpected failures */ + if (kt != KERN_NO_SPACE) { + fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + } + + vm_deallocate(mach_task_self(), config_page, PAGE_SIZE); + continue; + } + + tramp_table = (void *) table_page; + config_table = (void **) config_page; + config_table += 4; // XXX - there's a 16 byte offset into the config page on ARM + + fprintf(stderr, "[DEBUG] Allocated config page at %p, trampoline page at %p, configs start at %p\n", (void *) config_page, (void *) table_page, config_table); + } + + /* Check for permanent allocation failure */ + if (tramp_table == NULL) + return *code = NULL; + + *code = tramp_table + (3 * tramp_table_free); + tramp_table_free++; + + void *closure = malloc(size); + + return closure; +} + +void +ffi_closure_free (void *ptr) +{ + // TODO + //free (ptr); +} + +# elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */ #define USE_LOCKS 1 #define USE_DL_PREFIX 1 From 19afda0069c42e51c81dca7b10a5cf884b4cdce0 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 14:20:52 -0700 Subject: [PATCH 17/26] Enable AC_SUBST for FFI_EXEC_TRAMPOLINE_TABLE --- configure.ac | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac index 6089538..1654df6 100644 --- a/configure.ac +++ b/configure.ac @@ -315,6 +315,7 @@ if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64 fi fi +FFI_EXEC_TRAMPOLINE_TABLE=0 case "$target" in *arm*-apple-darwin*) FFI_EXEC_TRAMPOLINE_TABLE=1 @@ -329,6 +330,7 @@ case "$target" in ;; esac AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1) +AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE) if test x$TARGET = xX86_64; then AC_CACHE_CHECK([assembler supports unwind section type], From 01d71b7bed41844f80cb9feef20dcc5ece5ba2d0 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 14:21:14 -0700 Subject: [PATCH 18/26] Regenerated the autoconf script --- configure | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/configure b/configure index 08405bb..067c61d 100755 --- a/configure +++ b/configure @@ -752,6 +752,7 @@ FFI_DEBUG_FALSE FFI_DEBUG_TRUE TARGETDIR TARGET +FFI_EXEC_TRAMPOLINE_TABLE FFI_EXEC_TRAMPOLINE_TABLE_FALSE FFI_EXEC_TRAMPOLINE_TABLE_TRUE HAVE_LONG_DOUBLE @@ -5057,13 +5058,13 @@ if test "${lt_cv_nm_interface+set}" = set; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:5060: $ac_compile\"" >&5) + (eval echo "\"\$as_me:5061: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:5063: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:5064: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:5066: output\"" >&5) + (eval echo "\"\$as_me:5067: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -6269,7 +6270,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 6272 "configure"' > conftest.$ac_ext + echo '#line 6273 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -7794,11 +7795,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7797: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7798: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7801: \$? = $ac_status" >&5 + echo "$as_me:7802: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -8133,11 +8134,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8136: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8137: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8140: \$? = $ac_status" >&5 + echo "$as_me:8141: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -8238,11 +8239,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8241: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8242: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:8245: \$? = $ac_status" >&5 + echo "$as_me:8246: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -8293,11 +8294,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8296: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8297: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:8300: \$? = $ac_status" >&5 + echo "$as_me:8301: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -10663,7 +10664,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10666 "configure" +#line 10667 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10759,7 +10760,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10762 "configure" +#line 10763 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12364,6 +12365,7 @@ $as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h fi fi +FFI_EXEC_TRAMPOLINE_TABLE=0 case "$target" in *arm*-apple-darwin*) FFI_EXEC_TRAMPOLINE_TABLE=1 @@ -12386,6 +12388,7 @@ else fi + if test x$TARGET = xX86_64; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5 $as_echo_n "checking assembler supports unwind section type... " >&6; } From da2773e02ab26cc11a7fe87e985599f35cdf0649 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 14:21:37 -0700 Subject: [PATCH 19/26] Modify the ffi_closure structures to hold table/table entry pointers instead of a code buffer. --- include/ffi.h.in | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/include/ffi.h.in b/include/ffi.h.in index 92e38c4..501f16e 100644 --- a/include/ffi.h.in +++ b/include/ffi.h.in @@ -257,7 +257,12 @@ size_t ffi_java_raw_size (ffi_cif *cif); __declspec(align(8)) #endif typedef struct { +#if @FFI_EXEC_TRAMPOLINE_TABLE@ + void *trampoline_table; + void *trampoline_table_entry; +#else char tramp[FFI_TRAMPOLINE_SIZE]; +#endif ffi_cif *cif; void (*fun)(ffi_cif*,void*,void**,void*); void *user_data; @@ -284,7 +289,12 @@ ffi_prep_closure_loc (ffi_closure*, void*codeloc); typedef struct { +#if FFI_EXEC_TRAMPOLINE_TABLE + void *trampoline_table; + void *trampoline_table_entry; +#else char tramp[FFI_TRAMPOLINE_SIZE]; +#endif ffi_cif *cif; @@ -305,7 +315,12 @@ typedef struct { } ffi_raw_closure; typedef struct { +#if FFI_EXEC_TRAMPOLINE_TABLE + void *trampoline_table; + void *trampoline_table_entry; +#else char tramp[FFI_TRAMPOLINE_SIZE]; +#endif ffi_cif *cif; From b00ff3e98fdde622cef617030e14d5356dff988f Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 14:22:26 -0700 Subject: [PATCH 20/26] Rename the generated symbol --- src/arm/gentramp.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/arm/gentramp.sh b/src/arm/gentramp.sh index 7d5eca4..d6a6af4 100755 --- a/src/arm/gentramp.sh +++ b/src/arm/gentramp.sh @@ -26,8 +26,8 @@ header () { # Write out the trampoline table, aligned to the page boundary echo ".text" echo ".align 12" - echo ".globl _ffi_closure_trampoline_table" - echo "_ffi_closure_trampoline_table:" + echo ".globl _ffi_closure_trampoline_table_page" + echo "_ffi_closure_trampoline_table_page:" } From 83038cf24aa1a92b62b91ffee1dcc25d79243484 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 14:36:45 -0700 Subject: [PATCH 21/26] Implement FFI_EXEC_TRAMPOLINE_TABLE allocator for iOS/ARM. This provides working closure support on iOS/ARM devices where PROT_WRITE|PROT_EXEC is not permitted. The code passes basic smoke tests, but requires further review. --- src/arm/ffi.c | 218 ++++++++++++++++++++++++++++++++++++++++++- src/arm/trampoline.S | 4 +- src/closures.c | 80 +--------------- 3 files changed, 219 insertions(+), 83 deletions(-) diff --git a/src/arm/ffi.c b/src/arm/ffi.c index 7da69c1..4b8e6de 100644 --- a/src/arm/ffi.c +++ b/src/arm/ffi.c @@ -273,6 +273,220 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, /* How to make a trampoline. */ +#if FFI_EXEC_TRAMPOLINE_TABLE + +#include +#include +#include +#include + +extern void *ffi_closure_trampoline_table_page; + +typedef struct ffi_trampoline_table ffi_trampoline_table; +typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry; + +struct ffi_trampoline_table { + /* contigious writable and executable pages */ + vm_address_t config_page; + vm_address_t trampoline_page; + + /* free list tracking */ + uint16_t free_count; + ffi_trampoline_table_entry *free_list; + ffi_trampoline_table_entry *free_list_pool; + + ffi_trampoline_table *prev; + ffi_trampoline_table *next; +}; + +struct ffi_trampoline_table_entry { + void *(*trampoline)(); + ffi_trampoline_table_entry *next; +}; + +/* Override the standard architecture trampoline size */ +// XXX TODO - Fix +#undef FFI_TRAMPOLINE_SIZE +#define FFI_TRAMPOLINE_SIZE 12 + +/* The trampoline configuration is placed at 4080 bytes prior to the trampoline's entry point */ +#define FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc) ((void **) (((uint8_t *) codeloc) - 4080)); + +/* The first 16 bytes of the config page are unused, as they are unaddressable from the trampoline page. */ +#define FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET 16 + +/* Total number of trampolines that fit in one trampoline table */ +#define FFI_TRAMPOLINE_COUNT ((PAGE_SIZE - FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) / FFI_TRAMPOLINE_SIZE) + +static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER; +static ffi_trampoline_table *ffi_trampoline_tables = NULL; + +static ffi_trampoline_table * +ffi_trampoline_table_alloc () +{ + ffi_trampoline_table *table = NULL; + + /* Loop until we can allocate two contigious pages */ + while (table == NULL) { + vm_address_t config_page = 0x0; + kern_return_t kt; + + /* Try to allocate two pages */ + kt = vm_allocate (mach_task_self (), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE); + if (kt != KERN_SUCCESS) { + fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + break; + } + + /* Now drop the second half of the allocation to make room for the trampoline table */ + vm_address_t trampoline_page = config_page+PAGE_SIZE; + kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_SIZE); + if (kt != KERN_SUCCESS) { + fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + break; + } + + /* Remap the trampoline table to directly follow the config page */ + vm_prot_t cur_prot; + vm_prot_t max_prot; + + kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_SIZE, 0x0, FALSE, mach_task_self (), (vm_address_t) &ffi_closure_trampoline_table_page, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); + + /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */ + if (kt != KERN_SUCCESS) { + /* Log unexpected failures */ + if (kt != KERN_NO_SPACE) { + fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + } + + vm_deallocate (mach_task_self (), config_page, PAGE_SIZE); + continue; + } + + /* We have valid trampoline and config pages */ + table = calloc (1, sizeof(ffi_trampoline_table)); + table->free_count = FFI_TRAMPOLINE_COUNT; + table->config_page = config_page; + table->trampoline_page = trampoline_page; + + /* Create and initialize the free list */ + table->free_list_pool = calloc(FFI_TRAMPOLINE_COUNT, sizeof(ffi_trampoline_table_entry)); + + uint16_t i; + for (i = 0; i < table->free_count; i++) { + ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; + entry->trampoline = (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); + + if (i < table->free_count - 1) + entry->next = &table->free_list_pool[i+1]; + } + + table->free_list = table->free_list_pool; + } + + return table; +} + +void * +ffi_closure_alloc (size_t size, void **code) +{ + /* Create the closure */ + ffi_closure *closure = malloc(size); + if (closure == NULL) + return NULL; + + pthread_mutex_lock(&ffi_trampoline_lock); + + /* Check for an active trampoline table with available entries. */ + ffi_trampoline_table *table = ffi_trampoline_tables; + if (table == NULL || table->free_list == NULL) { + table = ffi_trampoline_table_alloc (); + if (table == NULL) { + free(closure); + return NULL; + } + + /* Insert the new table at the top of the list */ + table->next = ffi_trampoline_tables; + if (table->next != NULL) + table->next->prev = table; + + ffi_trampoline_tables = table; + } + + /* Claim the free entry */ + ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list; + ffi_trampoline_tables->free_list = entry->next; + ffi_trampoline_tables->free_count--; + entry->next = NULL; + + pthread_mutex_unlock(&ffi_trampoline_lock); + + /* Initialize the return values */ + *code = entry->trampoline; + closure->trampoline_table = table; + closure->trampoline_table_entry = entry; + + return closure; +} + +void +ffi_closure_free (void *ptr) +{ + ffi_closure *closure = ptr; + + pthread_mutex_lock(&ffi_trampoline_lock); + + /* Fetch the table and entry references */ + ffi_trampoline_table *table = closure->trampoline_table; + ffi_trampoline_table_entry *entry = closure->trampoline_table_entry; + + /* Return the entry to the free list */ + entry->next = table->free_list; + table->free_list = entry; + table->free_count++; + + /* If all trampolines within this table are free, and at least one other table exists, deallocate + * the table */ + if (table->free_count == FFI_TRAMPOLINE_COUNT && ffi_trampoline_tables != table) { + /* Remove from the list */ + if (table->prev != NULL) + table->prev->next = table->next; + + if (table->next != NULL) + table->next->prev = table->prev; + + /* Deallocate pages */ + kern_return_t kt; + kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE); + if (kt != KERN_SUCCESS) + fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + + kt = vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE); + if (kt != KERN_SUCCESS) + fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); + + /* Deallocate free list */ + free (table->free_list_pool); + free (table); + } else if (ffi_trampoline_tables != table) { + /* Otherwise, bump this table to the top of the list */ + table->prev = NULL; + table->next = ffi_trampoline_tables; + if (ffi_trampoline_tables != NULL) + ffi_trampoline_tables->prev = table; + + ffi_trampoline_tables = table; + } + + pthread_mutex_unlock (&ffi_trampoline_lock); + + /* Free the closure */ + free (closure); +} + +#else + #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ ({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ unsigned int __fun = (unsigned int)(FUN); \ @@ -285,6 +499,7 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, __clear_cache((&__tramp[0]), (&__tramp[19])); \ }) +#endif /* the cif must already be prep'ed */ @@ -298,8 +513,7 @@ ffi_prep_closure_loc (ffi_closure* closure, FFI_ASSERT (cif->abi == FFI_SYSV); #if FFI_EXEC_TRAMPOLINE_TABLE - // XXX - hardcoded offset - void **config = (void **) (((uint8_t *) codeloc) - 4080); + void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc); config[0] = closure; config[1] = ffi_closure_SYSV; #else diff --git a/src/arm/trampoline.S b/src/arm/trampoline.S index 9f5891e..83be0dc 100644 --- a/src/arm/trampoline.S +++ b/src/arm/trampoline.S @@ -3,8 +3,8 @@ .text .align 12 -.globl _ffi_closure_trampoline_table -_ffi_closure_trampoline_table: +.globl _ffi_closure_trampoline_table_page +_ffi_closure_trampoline_table_page: // trampoline // Save to stack diff --git a/src/closures.c b/src/closures.c index c214196..ac878df 100644 --- a/src/closures.c +++ b/src/closures.c @@ -65,85 +65,7 @@ # if FFI_EXEC_TRAMPOLINE_TABLE -// XXX - non-thread-safe, non-portable implementation, intended for initial testing -#include -#include -#include - -extern void *ffi_closure_trampoline_table; - -static void *tramp_table = NULL; -static void **config_table = NULL; -static int tramp_table_free = 0; - -void * -ffi_closure_alloc (size_t size, void **code) -{ - if (!code) - return NULL; - - /* Allocate our config page and remap the trampoline table */ - while (tramp_table == NULL) { - vm_address_t config_page = 0x0; - kern_return_t kt; - - /* Try to allocate two pages */ - kt = vm_allocate(mach_task_self(), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE); - if (kt != KERN_SUCCESS) { - fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); - break; - } - - /* Now drop the second half of the allocation to make room for the trampoline table */ - kt = vm_deallocate(mach_task_self(), config_page+PAGE_SIZE, PAGE_SIZE); - if (kt != KERN_SUCCESS) { - fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); - break; - } - - /* Remap the trampoline table to directly follow the config page */ - vm_address_t table_page = config_page+PAGE_SIZE; - vm_prot_t cur_prot; - vm_prot_t max_prot; - - kt = vm_remap(mach_task_self(), &table_page, PAGE_SIZE, 0x0, FALSE, mach_task_self(), (vm_address_t) &ffi_closure_trampoline_table, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); - - /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */ - if (kt != KERN_SUCCESS) { - /* Log unexpected failures */ - if (kt != KERN_NO_SPACE) { - fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); - } - - vm_deallocate(mach_task_self(), config_page, PAGE_SIZE); - continue; - } - - tramp_table = (void *) table_page; - config_table = (void **) config_page; - config_table += 4; // XXX - there's a 16 byte offset into the config page on ARM - - fprintf(stderr, "[DEBUG] Allocated config page at %p, trampoline page at %p, configs start at %p\n", (void *) config_page, (void *) table_page, config_table); - } - - /* Check for permanent allocation failure */ - if (tramp_table == NULL) - return *code = NULL; - - *code = tramp_table + (3 * tramp_table_free); - tramp_table_free++; - - void *closure = malloc(size); - - return closure; -} - -void -ffi_closure_free (void *ptr) -{ - // TODO - //free (ptr); -} +// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations. # elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */ From 8e7652ef6acab5db7a29f786686a54f05cdbdc7d Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 19:49:39 -0700 Subject: [PATCH 22/26] Add a libffi-ios-specific github README. --- README.markdown | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 README.markdown diff --git a/README.markdown b/README.markdown new file mode 100644 index 0000000..55ef6db --- /dev/null +++ b/README.markdown @@ -0,0 +1,14 @@ +libffi-ios provides an experimental port of libffi to Apple's iOS. + +The libffi closure mechanism has previously required the use of executable data pages, however, iOS sandbox restrictions prevent their use. +The OS does, however, permit remapping of executable pages, allowing one to remap a single page to multiple locations. libffi-ios modifies +ffi_closure_alloc/ffi_closure_free APIs to make use of this functionality to implement dynamically allocated and configured closure +trampoline's without requiring the use of executable data. + +The implementation works by allocating a single writable config page, and then remapping a page of pre-compiled trampolines directly +after the config page. The trampolines use PC-relative addressing to load their context from the config page, and so it is possible +to allocate as many of these trampolines tables as you have memory space. + +Note that this implementation is *experimental* and has seen very limited testing. + +A build-ios.sh script is provided to configure and build an iOS library; you may need to edit the SDK settings in the script. From 4fbcb5b5fbce11f4b168060e00639db33c85b75b Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 19:50:37 -0700 Subject: [PATCH 23/26] Minor README fix. --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 55ef6db..2217f1b 100644 --- a/README.markdown +++ b/README.markdown @@ -5,7 +5,7 @@ The OS does, however, permit remapping of executable pages, allowing one to rema ffi_closure_alloc/ffi_closure_free APIs to make use of this functionality to implement dynamically allocated and configured closure trampoline's without requiring the use of executable data. -The implementation works by allocating a single writable config page, and then remapping a page of pre-compiled trampolines directly +The implementation works by allocating a writable config page, and then remapping a page of pre-compiled trampolines directly after the config page. The trampolines use PC-relative addressing to load their context from the config page, and so it is possible to allocate as many of these trampolines tables as you have memory space. From 53f387b203413c9aa6e31f49dbb70d37d816330b Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sun, 19 Sep 2010 19:57:17 -0700 Subject: [PATCH 24/26] Minor README fix. --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 2217f1b..66144d4 100644 --- a/README.markdown +++ b/README.markdown @@ -3,7 +3,7 @@ libffi-ios provides an experimental port of libffi to Apple's iOS. The libffi closure mechanism has previously required the use of executable data pages, however, iOS sandbox restrictions prevent their use. The OS does, however, permit remapping of executable pages, allowing one to remap a single page to multiple locations. libffi-ios modifies ffi_closure_alloc/ffi_closure_free APIs to make use of this functionality to implement dynamically allocated and configured closure -trampoline's without requiring the use of executable data. +trampolines without requiring the use of executable data. The implementation works by allocating a writable config page, and then remapping a page of pre-compiled trampolines directly after the config page. The trampolines use PC-relative addressing to load their context from the config page, and so it is possible From cef619462887fa0f360e3ee702d1e04f112b5b38 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Wed, 27 Oct 2010 13:59:30 -0400 Subject: [PATCH 25/26] Add missing copyright/license header. --- src/arm/gentramp.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/arm/gentramp.sh b/src/arm/gentramp.sh index d6a6af4..671a3f6 100755 --- a/src/arm/gentramp.sh +++ b/src/arm/gentramp.sh @@ -1,5 +1,31 @@ #!/bin/sh +# ----------------------------------------------------------------------- +# gentramp.sh - Copyright (c) 2010, Plausible Labs, Inc. +# +# ARM Trampoline Page Generator +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# ``Software''), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# ----------------------------------------------------------------------- + PROGNAME=$0 # Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change, From f6ab3edc23dc8fc7c47a31c896044150c23f04b5 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Wed, 27 Oct 2010 19:34:51 -0400 Subject: [PATCH 26/26] Include the license header in the generated output. --- src/arm/gentramp.sh | 31 +++++++++++++++++++++++++++++-- src/arm/trampoline.S | 23 +++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/arm/gentramp.sh b/src/arm/gentramp.sh index 671a3f6..74f0b86 100755 --- a/src/arm/gentramp.sh +++ b/src/arm/gentramp.sh @@ -1,9 +1,9 @@ #!/bin/sh # ----------------------------------------------------------------------- -# gentramp.sh - Copyright (c) 2010, Plausible Labs, Inc. +# gentramp.sh - Copyright (c) 2010, Plausible Labs Cooperative, Inc. # -# ARM Trampoline Page Generator +# ARM Trampoline Page Generator # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -49,6 +49,33 @@ header () { echo "# This file was generated by $PROGNAME" echo "" + # Write out the license header +cat << EOF +# Copyright (c) 2010, Plausible Labs Cooperative, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# ``Software''), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# ----------------------------------------------------------------------- + +EOF + # Write out the trampoline table, aligned to the page boundary echo ".text" echo ".align 12" diff --git a/src/arm/trampoline.S b/src/arm/trampoline.S index 83be0dc..7b47429 100644 --- a/src/arm/trampoline.S +++ b/src/arm/trampoline.S @@ -1,6 +1,29 @@ # GENERATED CODE - DO NOT EDIT # This file was generated by ./gentramp.sh +# Copyright (c) 2010, Plausible Labs Cooperative, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# Software''), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED AS IS'', WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# ----------------------------------------------------------------------- + .text .align 12 .globl _ffi_closure_trampoline_table_page