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

ruby-changes:63672

From: Takashi <ko1@a...>
Date: Sat, 21 Nov 2020 16:39:55 +0900 (JST)
Subject: [ruby-changes:63672] 27d5af59a3 (master): Unify some confusing macro usages

https://git.ruby-lang.org/ruby.git/commit/?id=27d5af59a3

From 27d5af59a359909e0d434459c30cfc0940f60a5b Mon Sep 17 00:00:00 2001
From: Takashi Kokubun <takashikkbn@g...>
Date: Fri, 20 Nov 2020 23:31:23 -0800
Subject: Unify some confusing macro usages

_MSC_VER used to be the macro to switch JIT compaction. However, since
d4381d2ceb, the correct macro to switch it was changed from _MSC_VER
to _WIN32. As I didn't properly replace all relevant _MSC_VER usages
to _WIN32, these macros have been used inconsistently.

nobu replaced _WIN32 with USE_HEADER_TRANSFORMATION in 5eb446d12f3.
Therefore we had USE_HEADER_TRANSFORMATION and _MSC_VER. This commit
makes sure such inconsistent _MSC_VER usages will be unified to the new
header, also renaming it to USE_JIT_COMPACTION to be more precise about
the requirements. The header transformation itself is not quite relevant
to places changed in this commit.

diff --git a/mjit.c b/mjit.c
index 32a31e8..3da9d95 100644
--- a/mjit.c
+++ b/mjit.c
@@ -879,7 +879,7 @@ mjit_resume(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L879
     return Qtrue;
 }
 
-// Skip calling `clean_object_files` for units which currently exist in the list.
+// 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)
 {
@@ -887,7 +887,7 @@ skip_cleaning_object_files(struct rb_mjit_unit_list *list) https://github.com/ruby/ruby/blob/trunk/mjit.c#L887
 
     // No mutex for list, assuming MJIT worker does not exist yet since it's immediately after fork.
     list_for_each_safe(&list->head, unit, next, unode) {
-#ifndef _MSC_VER // Actually mswin does not reach here since it doesn't have fork
+#ifdef USE_JIT_COMPACTION
         if (unit->c_file) unit->c_file_inherited_p = true;
 #endif
 
diff --git a/mjit_worker.c b/mjit_worker.c
index c8b761d..887a68e 100644
--- a/mjit_worker.c
+++ b/mjit_worker.c
@@ -137,6 +137,15 @@ typedef intptr_t pid_t; https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L137
 
 #define MJIT_TMP_PREFIX "_ruby_mjit_"
 
+// JIT compaction requires the header transformation because linking multiple .o files
+// doesn't work without having `static` in the same function definitions. We currently
+// don't support transforming the MJIT header on Windows.
+#ifndef _WIN32
+# define USE_JIT_COMPACTION 1
+#else
+# define USE_JIT_COMPACTION 0
+#endif
+
 // The unit structure that holds metadata of ISeq for MJIT.
 struct rb_mjit_unit {
     // Unique order number of unit.
@@ -144,7 +153,7 @@ struct rb_mjit_unit { https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L153
     // Dlopen handle of the loaded object file.
     void *handle;
     rb_iseq_t *iseq;
-#ifndef _MSC_VER
+#ifdef USE_JIT_COMPACTION
     // This value is always set for `compact_all_jit_code`. Also used for lazy deletion.
     char *c_file;
     // true if it's inherited from parent Ruby process and lazy deletion should be skipped.
@@ -392,7 +401,7 @@ remove_file(const char *filename) https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L401
 static void
 clean_temp_files(struct rb_mjit_unit *unit)
 {
-#ifndef _MSC_VER
+#ifdef USE_JIT_COMPACTION
     if (unit->c_file) {
         char *c_file = unit->c_file;
 
@@ -893,16 +902,11 @@ compile_c_to_so(const char *c_file, const char *so_file) https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L902
     }
     return exit_code == 0;
 }
+#endif // _MSC_VER
 
+#if USE_JIT_COMPACTION
 static void compile_prelude(FILE *f);
 
-# ifndef _WIN32 // This requires header transformation but we don't transform header on Windows for now
-#  define USE_HEADER_TRANSFORMATION 1
-# else
-#  define USE_HEADER_TRANSFORMATION 0
-# endif
-
-# if USE_HEADER_TRANSFORMATION
 static bool
 compile_compact_jit_code(char* c_file)
 {
@@ -925,14 +929,12 @@ compile_compact_jit_code(char* c_file) https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L929
     fclose(f);
     return true;
 }
-# endif // USE_HEADER_TRANSFORMATION
 
 // Compile all cached .c files and build a single .so file. Reload all JIT func from it.
 // This improves the code locality for better performance in terms of iTLB and iCache.
 static void
 compact_all_jit_code(void)
 {
-# if USE_HEADER_TRANSFORMATION
     struct rb_mjit_unit *unit, *cur = 0;
     static const char c_ext[] = ".c";
     static const char so_ext[] = DLEXT;
@@ -1000,10 +1002,8 @@ compact_all_jit_code(void) https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L1002
         free(unit);
         verbose(1, "JIT compaction failure (%.1fms): Failed to compact methods", end_time - start_time);
     }
-# endif // USE_HEADER_TRANSFORMATION
 }
-
-#endif // _MSC_VER
+#endif // USE_JIT_COMPACTION
 
 static void *
 load_func_from_so(const char *so_file, const char *funcname, struct rb_mjit_unit *unit)
@@ -1172,10 +1172,7 @@ convert_unit_to_func(struct rb_mjit_unit *unit) https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L1172
 
     start_time = real_ms_time();
     success = compile_c_to_so(c_file, so_file);
-#ifdef _MSC_VER
-    if (!mjit_opts.save_temps)
-        remove_file(c_file);
-#else
+#ifdef USE_JIT_COMPACTION
     if (success) {
         // Always set c_file for compaction. The value is also used for lazy deletion.
         unit->c_file = strdup(c_file);
@@ -1185,6 +1182,9 @@ convert_unit_to_func(struct rb_mjit_unit *unit) https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L1182
     }
     if (!mjit_opts.save_temps && unit->c_file == NULL)
         remove_file(c_file);
+#else
+    if (!mjit_opts.save_temps)
+        remove_file(c_file);
 #endif
     end_time = real_ms_time();
 
@@ -1311,7 +1311,7 @@ mjit_worker(void) https://github.com/ruby/ruby/blob/trunk/mjit_worker.c#L1311
             }
             CRITICAL_SECTION_FINISH(3, "in jit func replace");
 
-#ifndef _MSC_VER
+#ifdef USE_JIT_COMPACTION
             // Combine .o files to one .so and reload all jit_func to improve memory locality.
             if (compact_units.length < max_compact_size
                 && ((!mjit_opts.wait && unit_queue.length == 0 && active_units.length > 1)
-- 
cgit v0.10.2


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

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