#include <fficonfig.h>
#include <ffi.h>
#include <ffi_common.h>
+#include <tramp.h>
#ifdef __NetBSD__
#include <sys/param.h>
munmap(dataseg, rounded_size);
munmap(codeseg, rounded_size);
}
+
+int
+ffi_tramp_is_present (__attribute__((unused)) void *ptr)
+{
+ return 0;
+}
#else /* !NetBSD with PROT_MPROTECT */
#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
&& flags == (MAP_PRIVATE | MAP_ANONYMOUS)
&& fd == -1 && offset == 0);
+ if (execfd == -1 && ffi_tramp_is_supported ())
+ {
+ ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
+ return ptr;
+ }
+
if (execfd == -1 && is_emutramp_enabled ())
{
ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
void *
ffi_closure_alloc (size_t size, void **code)
{
- void *ptr;
+ void *ptr, *ftramp;
if (!code)
return NULL;
msegmentptr seg = segment_holding (gm, ptr);
*code = add_segment_exec_offset (ptr, seg);
+ if (!ffi_tramp_is_supported ())
+ return ptr;
+
+ ftramp = ffi_tramp_alloc (0);
+ if (ftramp == NULL)
+ {
+ dlfree (FFI_RESTORE_PTR (ptr));
+ return NULL;
+ }
+ *code = ffi_tramp_get_addr (ftramp);
+ ((ffi_closure *) ptr)->ftramp = ftramp;
}
return ptr;
burden of managing this memory themselves, in which case this
we'll just return data. */
if (seg)
- return add_segment_exec_offset (data, seg);
+ {
+ if (!ffi_tramp_is_supported ())
+ return add_segment_exec_offset (data, seg);
+ return ffi_tramp_get_addr (((ffi_closure *) data)->ftramp);
+ }
else
return data;
}
if (seg)
ptr = sub_segment_exec_offset (ptr, seg);
#endif
+ if (ffi_tramp_is_supported ())
+ ffi_tramp_free (((ffi_closure *) ptr)->ftramp);
dlfree (FFI_RESTORE_PTR (ptr));
}
+int
+ffi_tramp_is_present (void *ptr)
+{
+ msegmentptr seg = segment_holding (gm, ptr);
+ return seg != NULL && ffi_tramp_is_supported();
+}
+
# else /* ! FFI_MMAP_EXEC_WRIT */
/* On many systems, memory returned by malloc is writable and
return data;
}
+int
+ffi_tramp_is_present (__attribute__((unused)) void *ptr)
+{
+ return 0;
+}
+
# endif /* ! FFI_MMAP_EXEC_WRIT */
#endif /* FFI_CLOSURES */