[前][次][番号順一覧][スレッド一覧]

ruby-changes:61000

From: Takashi <ko1@a...>
Date: Mon, 4 May 2020 08:46:46 +0900 (JST)
Subject: [ruby-changes:61000] 9aa5fe1bf8 (master): Split compile and link for MinGW support

https://git.ruby-lang.org/ruby.git/commit/?id=9aa5fe1bf8

From 9aa5fe1bf89db8cd215b24d8ddfb668714681b83 Mon Sep 17 00:00:00 2001
From: Takashi Kokubun <takashikkbn@g...>
Date: Sun, 3 May 2020 16:15:45 -0700
Subject: Split compile and link for MinGW support

MinGW test_jit fails with no error message. Perhaps linker flags should
not be passed when compilation is happening.

Anyway splitting these stages doesn't matter for performance. So let me
just split it to fix the issue. Probably this helps Solaris's issue too.

diff --git a/mjit_worker.c b/mjit_worker.c
index 145ad54..49903f2 100644
--- a/mjit_worker.c
+++ b/mjit_worker.c
@@ -855,30 +855,45 @@ make_pch(void) https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L855
 }
 
 // Compile .c file to .so file. It returns true if it succeeds. (non-mswin)
+// Not compiling .c to .so directly because it fails on MinGW.
 static bool
 compile_c_to_so(const char *c_file, const char *so_file)
 {
-    const char *options[] = {
-        "-o", so_file, c_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
-        NULL
+        o_file, NULL
     };
-
-    char **args = form_args(7, CC_LDSHARED_ARGS, CC_CODEFLAG_ARGS, cc_added_args,
-            options, CC_LIBS, CC_DLDFLAGS_ARGS, CC_LINKER_ARGS);
-    if (args == NULL)
-        return false;
-
-    int exit_code = exec_process(cc_path, args);
+    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 (exit_code != 0)
-        verbose(2, "compile_c_to_so: compile error: %d", exit_code);
+    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;
 }
 
diff --git a/test/lib/jit_support.rb b/test/lib/jit_support.rb
index 6094452..4232f01 100644
--- a/test/lib/jit_support.rb
+++ b/test/lib/jit_support.rb
@@ -56,7 +56,7 @@ module JITSupport https://github.com/ruby/ruby/blob/trunk/test/lib/jit_support.rb#L56
     return @supported if defined?(@supported)
     @supported = RbConfig::CONFIG["MJIT_SUPPORT"] != 'no' && UNSUPPORTED_COMPILERS.all? do |regexp|
       !regexp.match?(RbConfig::CONFIG['MJIT_CC'])
-    end && !appveyor_pdb_corrupted? && !PENDING_RUBYCI_NICKNAMES.include?(ENV['RUBYCI_NICKNAME']) && /mingw/ !~ RUBY_PLATFORM # TODO: remove mingw exclusion after investigation
+    end && !appveyor_pdb_corrupted? && !PENDING_RUBYCI_NICKNAMES.include?(ENV['RUBYCI_NICKNAME'])
   end
 
   # AppVeyor's Visual Studio 2013 / 2015 are known to spuriously generate broken pch / pdb, like:
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]