1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Drop MinGW support of MJIT (#6012)

[Feature #18824]
This commit is contained in:
Takashi Kokubun 2022-06-13 09:28:28 -07:00 committed by GitHub
parent c3ee80ff46
commit f8502a2699
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
Notes: git 2022-06-14 01:28:54 +09:00
Merged-By: k0kubun <takashikkbn@gmail.com>
3 changed files with 11 additions and 76 deletions

View file

@ -3702,12 +3702,12 @@ AS_CASE(["$RDOCTARGET:$CAPITARGET"],[nodoc:nodoc],[INSTALLDOC=nodoc],[INSTALLDOC
AC_SUBST(INSTALLDOC)
AC_ARG_ENABLE(jit-support,
AS_HELP_STRING([--disable-jit-support], [disable JIT features]),
[MJIT_SUPPORT=$enableval],
# Enable mjit by default except for WASI
[AS_IF([test x"$target_os" != "xwasi"],
[MJIT_SUPPORT=yes],
[MJIT_SUPPORT=no ])])
AS_HELP_STRING([--disable-jit-support], [disable JIT features]),
[MJIT_SUPPORT=$enableval],
[AS_CASE(["$target_os"],
[wasi | mingw*], [MJIT_SUPPORT=no],
[MJIT_SUPPORT=yes]
)])
AS_IF([test x"$MJIT_SUPPORT" = "xyes"],
[AC_DEFINE(USE_MJIT, 1)],
@ -4413,7 +4413,7 @@ config_summary "debugflags" "$debugflags"
config_summary "warnflags" "$warnflags"
config_summary "strip command" "$STRIP"
config_summary "install doc" "$DOCTARGETS"
config_summary "JIT support" "$MJIT_SUPPORT"
config_summary "MJIT support" "$MJIT_SUPPORT"
config_summary "YJIT support" "$YJIT_SUPPORT"
config_summary "man page type" "$MANTYPE"
config_summary "search path" "$search_path"

18
mjit.c
View file

@ -879,20 +879,6 @@ mjit_resume(void)
return Qtrue;
}
// Skip calling `clean_temp_files` for units which currently exist in the list.
static void
skip_cleaning_object_files(struct rb_mjit_unit_list *list)
{
struct rb_mjit_unit *unit = NULL, *next;
// No mutex for list, assuming MJIT worker does not exist yet since it's immediately after fork.
ccan_list_for_each_safe(&list->head, unit, next, unode) {
#if defined(_WIN32) // mswin doesn't reach here either. This is for MinGW.
if (unit->so_file) unit->so_file = NULL;
#endif
}
}
// This is called after fork initiated by Ruby's method to launch MJIT worker thread
// for child Ruby process.
//
@ -914,10 +900,6 @@ mjit_child_after_fork(void)
if (!mjit_enabled)
return;
/* Let parent process delete the already-compiled object files.
This must be done before starting MJIT worker on child process. */
skip_cleaning_object_files(&active_units);
/* MJIT worker thread is not inherited on fork. Start it for this child process. */
start_worker();
}

View file

@ -242,7 +242,7 @@ static bool stop_worker_p;
// Set to true if worker is stopped.
static bool worker_stopped = true;
// Path of "/tmp", which can be changed to $TMP in MinGW.
// Path of "/tmp", which is different on Windows or macOS. See: system_default_tmpdir()
static char *tmp_dir;
// Used C compiler path.
@ -281,7 +281,7 @@ static char *libruby_pathflag;
# define MJIT_CFLAGS_PIPE 0
#endif
// Use `-nodefaultlibs -nostdlib` for GCC where possible, which does not work on mingw, cygwin, AIX, and OpenBSD.
// Use `-nodefaultlibs -nostdlib` for GCC where possible, which does not work on cygwin, AIX, and OpenBSD.
// This seems to improve MJIT performance on GCC.
#if defined __GNUC__ && !defined __clang__ && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(_AIX) && !defined(__OpenBSD__)
# define GCC_NOSTDLIB_FLAGS "-nodefaultlibs", "-nostdlib",
@ -309,13 +309,10 @@ static const char *const CC_LINKER_ARGS[] = {
static const char *const CC_LIBS[] = {
#if defined(_WIN32) || defined(__CYGWIN__)
MJIT_LIBS // mswin, mingw, cygwin
MJIT_LIBS // mswin, cygwin
#endif
#if defined __GNUC__ && !defined __clang__
# if defined(_WIN32)
"-lmsvcrt", // mingw
# endif
"-lgcc", // mingw, cygwin, and GCC platforms using `-nodefaultlibs -nostdlib`
"-lgcc", // cygwin, and GCC platforms using `-nodefaultlibs -nostdlib`
#endif
#if defined __ANDROID__
"-lm", // to avoid 'cannot locate symbol "modf" referenced by .../_ruby_mjit_XXX.so"'
@ -907,49 +904,6 @@ make_pch(void)
}
// Compile .c file to .so file. It returns true if it succeeds. (non-mswin)
// MinGW compiles it in two steps because otherwise it fails without any error output.
# ifdef _WIN32 // MinGW
static bool
compile_c_to_so(const char *c_file, const char *so_file)
{
char* o_file = alloca(strlen(c_file) + 1);
strcpy(o_file, c_file);
o_file[strlen(c_file) - 1] = 'o';
const char *o_args[] = {
"-o", o_file, c_file,
# ifdef __clang__
"-include-pch", pch_file,
# endif
"-c", NULL
};
char **args = form_args(5, cc_common_args, CC_CODEFLAG_ARGS, cc_added_args, o_args, CC_LINKER_ARGS);
if (args == NULL) return false;
int exit_code = exec_process(cc_path, args);
free(args);
if (exit_code != 0) {
verbose(2, "compile_c_to_so: failed to compile .c to .o: %d", exit_code);
return false;
}
const char *so_args[] = {
"-o", so_file,
# ifdef _WIN32
libruby_pathflag,
# endif
o_file, NULL
};
args = form_args(6, CC_LDSHARED_ARGS, CC_CODEFLAG_ARGS, so_args, CC_LIBS, CC_DLDFLAGS_ARGS, CC_LINKER_ARGS);
if (args == NULL) return false;
exit_code = exec_process(cc_path, args);
free(args);
if (!mjit_opts.save_temps) remove_file(o_file);
if (exit_code != 0) {
verbose(2, "compile_c_to_so: failed to link .o to .so: %d", exit_code);
}
return exit_code == 0;
}
# else // _WIN32
static bool
compile_c_to_so(const char *c_file, const char *so_file)
{
@ -973,7 +927,6 @@ compile_c_to_so(const char *c_file, const char *so_file)
}
return exit_code == 0;
}
# endif // _WIN32
#endif // _MSC_VER
#if USE_JIT_COMPACTION