unix/alloc: Add option to use uPy's alloc-exec implementation even for libffi.

When built for Linux, libffi includes very bloated and workaround exec-alloc
implementation required to work around SELinux and other "sekuritee" features
which real people don't use. MicroPython has own alloc-exec implementation,
used to alloc memory for @micropython.native code. With this option enabled,
uPy's implementation will override libffi's. This saves 11K on x86_64 (and
that accounts for more than half of the libffi code size).

TODO: Possibly, we want to refactor this option to allow either use uPy's
implementation even for libffi, or allow to use libffi's implementation even
for uPy.
This commit is contained in:
Paul Sokolovsky 2016-06-18 00:18:01 +03:00
parent 9b43a7d1be
commit c9598604c6
2 changed files with 19 additions and 2 deletions

View File

@ -33,7 +33,7 @@
#include "py/mpstate.h" #include "py/mpstate.h"
#include "py/gc.h" #include "py/gc.h"
#if MICROPY_EMIT_NATIVE #if MICROPY_EMIT_NATIVE || (MICROPY_PY_FFI && MICROPY_FORCE_PLAT_ALLOC_EXEC)
#if defined(__OpenBSD__) || defined(__MACH__) #if defined(__OpenBSD__) || defined(__MACH__)
#define MAP_ANONYMOUS MAP_ANON #define MAP_ANONYMOUS MAP_ANON
@ -85,4 +85,16 @@ void mp_unix_mark_exec(void) {
} }
} }
#endif // MICROPY_EMIT_NATIVE #if MICROPY_FORCE_PLAT_ALLOC_EXEC
void *ffi_closure_alloc(size_t size, void **code) {
mp_uint_t dummy;
mp_unix_alloc_exec(size, code, &dummy);
return *code;
}
void ffi_closure_free(void *ptr) {
// TODO
}
#endif
#endif // MICROPY_EMIT_NATIVE || (MICROPY_PY_FFI && MICROPY_FORCE_PLAT_ALLOC_EXEC)

View File

@ -234,6 +234,11 @@ void mp_unix_free_exec(void *ptr, mp_uint_t size);
void mp_unix_mark_exec(void); void mp_unix_mark_exec(void);
#define MP_PLAT_ALLOC_EXEC(min_size, ptr, size) mp_unix_alloc_exec(min_size, ptr, size) #define MP_PLAT_ALLOC_EXEC(min_size, ptr, size) mp_unix_alloc_exec(min_size, ptr, size)
#define MP_PLAT_FREE_EXEC(ptr, size) mp_unix_free_exec(ptr, size) #define MP_PLAT_FREE_EXEC(ptr, size) mp_unix_free_exec(ptr, size)
#ifndef MICROPY_FORCE_PLAT_ALLOC_EXEC
// Use MP_PLAT_ALLOC_EXEC for any executable memory allocation, including for FFI
// (overriding libffi own implementation)
#define MICROPY_FORCE_PLAT_ALLOC_EXEC (1)
#endif
#if MICROPY_PY_OS_DUPTERM #if MICROPY_PY_OS_DUPTERM
#define MP_PLAT_PRINT_STRN(str, len) mp_hal_stdout_tx_strn_cooked(str, len) #define MP_PLAT_PRINT_STRN(str, len) mp_hal_stdout_tx_strn_cooked(str, len)