ruby-changes:51062
From: nobu <ko1@a...>
Date: Fri, 27 Apr 2018 11:02:34 +0900 (JST)
Subject: [ruby-changes:51062] nobu:r63269 (trunk): mjit.c: prefix and archdir in init
nobu 2018-04-27 11:02:29 +0900 (Fri, 27 Apr 2018) New Revision: 63269 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63269 Log: mjit.c: prefix and archdir in init * ruby.c (ruby_init_loadpath_safe): store prefix and archlibdir paths. * mjit.c (compile_c_to_so, init_header_filename): use just one library path on Windows. Modified files: trunk/mjit.c trunk/ruby.c Index: ruby.c =================================================================== --- ruby.c (revision 63268) +++ ruby.c (revision 63269) @@ -497,10 +497,27 @@ dladdr_path(const void* addr) https://github.com/ruby/ruby/blob/trunk/ruby.c#L497 #define INITIAL_LOAD_PATH_MARK rb_intern_const("@gem_prelude_index") +VALUE ruby_archlibdir_path, ruby_prefix_path; + void ruby_init_loadpath_safe(int safe_level) { - VALUE load_path; + static const char libdir[] = "/" +#ifdef LIBDIR_BASENAME + LIBDIR_BASENAME +#else + "lib" +#endif +#ifdef ENABLE_MULTIARCH + "/"RUBY_ARCH +#endif + ; + const ptrdiff_t libdir_len = (ptrdiff_t)sizeof(libdir) +#ifdef ENABLE_MULTIARCH + - rb_strlen_lit("/"RUBY_ARCH) +#endif + - 1; + VALUE load_path, archlibdir = 0; ID id_initial_load_path_mark; const char *paths = ruby_initial_load_paths; #if defined LOAD_RELATIVE @@ -561,23 +578,22 @@ ruby_init_loadpath_safe(int safe_level) https://github.com/ruby/ruby/blob/trunk/ruby.c#L578 p = strrchr(libpath, '/'); if (p) { static const char bindir[] = "/bin"; -#ifdef LIBDIR_BASENAME - static const char libdir[] = "/"LIBDIR_BASENAME; -#else - static const char libdir[] = "/lib"; -#endif const ptrdiff_t bindir_len = (ptrdiff_t)sizeof(bindir) - 1; - const ptrdiff_t libdir_len = (ptrdiff_t)sizeof(libdir) - 1; -#ifdef ENABLE_MULTIARCH const char *p2 = NULL; +#ifdef ENABLE_MULTIARCH multiarch: #endif if (p - libpath >= bindir_len && !STRNCASECMP(p - bindir_len, bindir, bindir_len)) { p -= bindir_len; + archlibdir = rb_str_subseq(sopath, 0, p - libpath); + rb_str_cat_cstr(archlibdir, libdir); + OBJ_FREEZE_RAW(archlibdir); } else if (p - libpath >= libdir_len && !strncmp(p - libdir_len, libdir, libdir_len)) { + archlibdir = rb_str_subseq(sopath, 0, (p2 ? p2 : p) - libpath); + OBJ_FREEZE_RAW(archlibdir); p -= libdir_len; } #ifdef ENABLE_MULTIARCH @@ -603,6 +619,13 @@ ruby_init_loadpath_safe(int safe_level) https://github.com/ruby/ruby/blob/trunk/ruby.c#L619 #define RUBY_RELATIVE(path, len) rubylib_path_new((path), (len)) #define PREFIX_PATH() RUBY_RELATIVE(ruby_exec_prefix, exec_prefix_len) #endif + rb_gc_register_address(&ruby_prefix_path); + ruby_prefix_path = PREFIX_PATH(); + OBJ_FREEZE_RAW(ruby_prefix_path); + if (!archlibdir) archlibdir = ruby_prefix_path; + rb_gc_register_address(&ruby_archlibdir_path); + ruby_archlibdir_path = archlibdir; + load_path = GET_VM()->load_path; if (safe_level == 0) { @@ -618,7 +641,7 @@ ruby_init_loadpath_safe(int safe_level) https://github.com/ruby/ruby/blob/trunk/ruby.c#L641 paths += len + 1; } - rb_const_set(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"), rb_obj_freeze(PREFIX_PATH())); + rb_const_set(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"), ruby_prefix_path); } Index: mjit.c =================================================================== --- mjit.c (revision 63268) +++ mjit.c (revision 63269) @@ -208,10 +208,8 @@ static VALUE valid_class_serials; https://github.com/ruby/ruby/blob/trunk/mjit.c#L208 VALUE rb_mMJIT; #ifdef _WIN32 -/* Linker option to enable libruby in the build directory. */ -static char *libruby_build; -/* Linker option to enable libruby in the directory after install. */ -static char *libruby_installed; +/* Linker option to enable libruby. */ +static char *libruby_pathflag; #endif /* Return time in milliseconds as a double. */ @@ -582,6 +580,15 @@ static const char *const CC_DLDFLAGS_ARG https://github.com/ruby/ruby/blob/trunk/mjit.c#L580 NULL }; +static const char *const CC_LIBS[] = { + MJIT_LIBS +#if defined __GNUC__ && !defined __clang__ && !defined _WIN32 + "-lmsvcrt", + "-lgcc", +#endif + NULL +}; + #define CC_CODEFLAG_ARGS (mjit_opts.debug ? CC_DEBUG_ARGS : CC_OPTIMIZE_ARGS) /* Status of the precompiled header creation. The status is shared by the workers and the pch thread. */ @@ -652,45 +659,37 @@ compile_c_to_so(const char *c_file, cons https://github.com/ruby/ruby/blob/trunk/mjit.c#L659 #ifndef _MSC_VER "-o", #endif - NULL, NULL, NULL}; - const char *libs[] = { + NULL, NULL, #ifdef _WIN32 # ifdef _MSC_VER - MJIT_LIBS "-link", - libruby_installed, - libruby_build, -# else - /* Look for ruby.dll.a in build and install directories. */ - libruby_installed, - libruby_build, - MJIT_LIBS - "-lmsvcrt", - "-lgcc", # endif + libruby_pathflag, #endif - NULL}; + NULL, + }; char **args; #ifdef _MSC_VER char *p; int solen; #endif - files[numberof(files)-2] = c_file; #ifdef _MSC_VER solen = strlen(so_file); files[0] = p = xmalloc(rb_strlen_lit("-Fe") + solen + 1); p = append_lit(p, "-Fe"); p = append_str2(p, so_file, solen); *p = '\0'; + files[1] = c_file; #else # ifdef __clang__ files[1] = pch_file; # endif - files[numberof(files)-3] = so_file; + files[numberof(files)-3] = c_file; + files[numberof(files)-4] = so_file; #endif args = form_args(5, CC_LDSHARED_ARGS, CC_CODEFLAG_ARGS, - files, libs, CC_DLDFLAGS_ARGS); + files, CC_LIBS, CC_DLDFLAGS_ARGS); if (args == NULL) return FALSE; @@ -1162,6 +1161,8 @@ mjit_get_iseq_func(struct rb_iseq_consta https://github.com/ruby/ruby/blob/trunk/mjit.c#L1161 ones to prevent changing C compiler for security reasons. */ #define CC_PATH CC_COMMON_ARGS[0] +extern VALUE ruby_archlibdir_path, ruby_prefix_path; + static void init_header_filename(void) { @@ -1176,13 +1177,6 @@ init_header_filename(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1177 const size_t header_name_len = sizeof(header_name) - 1; char *p; #ifdef _WIN32 - static const char libdirname[] = "/" -# ifdef LIBDIR_BASENAME - LIBDIR_BASENAME -# else - "lib" -# endif - ; static const char libpathflag[] = # ifdef _MSC_VER "-LIBPATH:" @@ -1193,7 +1187,7 @@ init_header_filename(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1187 const size_t libpathflag_len = sizeof(libpathflag) - 1; #endif - basedir_val = rb_const_get(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX")); + basedir_val = ruby_prefix_path; basedir = StringValuePtr(basedir_val); baselen = RSTRING_LEN(basedir_val); verlen = strlen(ruby_version); @@ -1212,15 +1206,13 @@ init_header_filename(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1206 (void)close(fd); #ifdef _WIN32 - p = libruby_build = xmalloc(libpathflag_len + baselen + 1); + basedir_val = ruby_archlibdir_path; + basedir = StringValuePtr(basedir_val); + baselen = RSTRING_LEN(basedir_val); + libruby_pathflag = p = xmalloc(libpathflag_len + baselen + 1); p = append_str(p, libpathflag); p = append_str2(p, basedir, baselen); *p = '\0'; - - libruby_installed = xmalloc(libpathflag_len + baselen + sizeof(libdirname)); - p = append_str2(libruby_installed, libruby_build, p - libruby_build); - p = append_str(p, libdirname); - *p = '\0'; #endif } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/