From e9c6e52f5b8aa42cb4a8d67d5a98ee8daf74e997 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 25 Aug 2021 16:37:01 +0900 Subject: value.h: reconstruct `mrb_ro_data_p()`. * use predefined `mrb_ro_data_p()` for user-mode Linux and macOS * define `MRB_LINK_TIME_RO_DATA_P` if predefined one is used * configure macro `MRB_USE_LINK_TIME_RO_DATA_P` is no longer used * contributions for new platforms are welcome --- doc/guides/mrbconf.md | 8 -------- include/mrbconf.h | 6 +----- include/mruby/value.h | 11 +++-------- src/load.c | 3 ++- 4 files changed, 6 insertions(+), 22 deletions(-) diff --git a/doc/guides/mrbconf.md b/doc/guides/mrbconf.md index b5bc8c85c..c24213743 100644 --- a/doc/guides/mrbconf.md +++ b/doc/guides/mrbconf.md @@ -151,14 +151,6 @@ largest value of required alignment. ## Reduce heap memory configuration -`MRB_USE_LINK_TIME_RO_DATA_P` - -* Only available on ELF platforms. -* If you specify the address of a read-only section when creating a symbol or string, that string will be used as it is. -* Heap memory can be saved. -* Uses `__ehdr_start` and `__init_array_start`. -* It must be `__ehdr_start < data_addr < __init_array_start`. - `MRB_USE_CUSTOM_RO_DATA_P` * Takes precedence over `MRB_USE_LINK_TIME_RO_DATA_P`. diff --git a/include/mrbconf.h b/include/mrbconf.h index 7b29cb0ba..eda158d5e 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -113,11 +113,7 @@ /* number of object per heap page */ //#define MRB_HEAP_PAGE_SIZE 1024 -/* if __ehdr_start is available, mruby can reduce memory used by symbols */ -//#define MRB_USE_LINK_TIME_RO_DATA_P - -/* if MRB_USE_LINK_TIME_RO_DATA_P does not work, - you can try mrb_ro_data_p() that you have implemented yourself in any file; +/* you can provide and use mrb_ro_data_p() for your platform. prototype is `mrb_bool mrb_ro_data_p(const char *ptr)` */ //#define MRB_USE_CUSTOM_RO_DATA_P diff --git a/include/mruby/value.h b/include/mruby/value.h index d139413a9..22a826385 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -408,17 +408,11 @@ mrb_undef_value(void) return v; } -#if defined(MRB_USE_ETEXT_EDATA) && !defined(MRB_USE_LINK_TIME_RO_DATA_P) -# ifdef __GNUC__ -# warning MRB_USE_ETEXT_EDATA is deprecated. Define MRB_USE_LINK_TIME_RO_DATA_P instead. -# endif -# define MRB_USE_LINK_TIME_RO_DATA_P -#endif - #if defined(MRB_USE_CUSTOM_RO_DATA_P) /* If you define `MRB_USE_CUSTOM_RO_DATA_P`, you must implement `mrb_ro_data_p()`. */ mrb_bool mrb_ro_data_p(const char *p); -#elif defined(MRB_USE_LINK_TIME_RO_DATA_P) || defined(__linux__) +#elif (defined(__linux__) && !defined(__KERNEL__)) +#define MRB_LINK_TIME_RO_DATA_P extern char __ehdr_start[]; extern char __init_array_start[]; @@ -428,6 +422,7 @@ mrb_ro_data_p(const char *p) return __ehdr_start < p && p < __init_array_start; } #elif defined(__APPLE__) +#define MRB_LINK_TIME_RO_DATA_P #include static inline mrb_bool mrb_ro_data_p(const char *p) diff --git a/src/load.c b/src/load.c index b5b069fcf..15efa3c5b 100644 --- a/src/load.c +++ b/src/load.c @@ -606,7 +606,8 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags) static struct RProc* mrb_proc_read_irep(mrb_state *mrb, const uint8_t *bin) { -#if defined(MRB_USE_LINK_TIME_RO_DATA_P) || defined(MRB_USE_CUSTOM_RO_DATA_P) + /* MRB_LINK_TIME_RO_DATA_P is defined when predefined mrb_ro_data_p() is used */ +#if defined(MRB_LINK_TIME_RO_DATA_P) || defined(MRB_USE_CUSTOM_RO_DATA_P) uint8_t flags = mrb_ro_data_p((char*)bin) ? FLAG_SRC_STATIC : FLAG_SRC_MALLOC; #else uint8_t flags = FLAG_SRC_STATIC; -- cgit v1.2.3