Commit graph

118 commits

Author SHA1 Message Date
Nobuyoshi Nakada
364526cd70
[win32] suppress false warning by MSVC 2020-03-04 21:02:24 +09:00
Takashi Kokubun
83705c42ce
Add missing free on cc_entries
Looks like an oversight in b9007b6c54 and
7ec2359374.
2020-02-26 00:37:37 -08:00
Takashi Kokubun
69f377a3d6
Internalize rb_mjit_unit definition again
Fixed a TODO in b9007b6c54
2020-02-26 00:27:29 -08:00
Takashi Kokubun
daf7c48d88
Explain the situation of inner cc_entries [ci skip]
Add a little more details in 7ec2359374
2020-02-25 23:55:54 -08:00
Takashi Kokubun
55923ba883
Note a situation around xmalloc vs free in MJIT [ci skip]
shared by ko1
2020-02-25 23:48:49 -08:00
Koichi Sasada
84d1a99a3f should be initialize jit_unit->cc_entries.
GC can invoke just after allocation of jit_unit->cc_entries so
it should be zero-cleared.
2020-02-25 13:37:52 +09:00
Koichi Sasada
7ec2359374 prevent GC from mjit worker.
ALLOC_N() can causes GC. Sometimes `mjit_copy_job_handler()`
can be called by mjit_worker thread which is not a Ruby thread,
so we need to prevent GC in this function. This patch has some
issues, but I introduce it to pass the tests.
2020-02-25 12:57:10 +09:00
Koichi Sasada
b9007b6c54 Introduce disposable call-cache.
This patch contains several ideas:

(1) Disposable inline method cache (IMC) for race-free inline method cache
    * Making call-cache (CC) as a RVALUE (GC target object) and allocate new
      CC on cache miss.
    * This technique allows race-free access from parallel processing
      elements like RCU.
(2) Introduce per-Class method cache (pCMC)
    * Instead of fixed-size global method cache (GMC), pCMC allows flexible
      cache size.
    * Caching CCs reduces CC allocation and allow sharing CC's fast-path
      between same call-info (CI) call-sites.
(3) Invalidate an inline method cache by invalidating corresponding method
    entries (MEs)
    * Instead of using class serials, we set "invalidated" flag for method
      entry itself to represent cache invalidation.
    * Compare with using class serials, the impact of method modification
      (add/overwrite/delete) is small.
    * Updating class serials invalidate all method caches of the class and
      sub-classes.
    * Proposed approach only invalidate the method cache of only one ME.

See [Feature #16614] for more details.
2020-02-22 09:58:59 +09:00
Takashi Kokubun
a19d625e66
Allow specifying arbitrary MJIT flags by --jit-debug
This is a secret feature for me. It's only for testing and any behavior
with this flag override is unsupported.

I needed this because I sometimes want to add debug options but do not
want to disable optimizations, for using Linux perf.
2019-12-01 00:58:47 -08:00
Takashi Kokubun
6fa3492362
Eliminate the possibility to leave freed ISeq
in active_units

Hoping to fix:
http://ci.rvm.jp/results/trunk-mjit@silicon-docker/2311375
2019-10-13 19:31:18 -07:00
Takashi Kokubun
183b421509
Delay the free until we stop referring to a unit
`if (unit->iseq)` might have referred to a freed unit. Therefore this
commit delays its free.
2019-10-13 14:15:14 -07:00
Takashi Kokubun
26fae9aa9d
Remove the quick stop path after convert_unit_to_func
Now I'm not exactly sure why I needed to check `stop_worker_p` after
`mjit_copy_cache_from_main_thread` of `convert_unit_to_func`
in 4161674b2f.
If it's for avoiding deadlock under `in_gc` condition, we should keep it.

However, if it's not the case and it's just for retrying accidental
compilation failure or just to avoid `MJIT_ATOMIC_SET` and
`compact_all_jit_code`, I think this quick stop path is not mandatory.

Because this path is somewhat problematic in my upcoming fix in
mjit_worker, let me try to remove this first and see how CI goes.
2019-10-13 09:59:44 -07:00
Yusuke Endoh
4171909695 mjit_worker.c: Add -lm to the C compiler in MJIT on Android
To avoid:

    cannot locate symbol "modf" referenced by .../_ruby_mjit_XXX.so"
2019-10-10 23:22:37 +09:00
Takashi Kokubun
5d8f112505
RubyVM::MJIT.pause(wait: true) should wait
for all compilations and compaction.

Prior to this commit, the last-compiled code has not been used because
MJIT worker is stopped before setting the code, and compaction has also
been skipped.

But it was not intentional and `wait: true` pause should wait until
those two things by its feature.
2019-09-26 16:28:34 +09:00
Takashi Kokubun
b0a291f6f6
Split CC_LINKER_ARGS from CC_DLDFLAGS_ARGS
to drop MJIT_DLDFLAGS from compile_c_to_o for OpenBSD failure
20190830T110008Z.fail.html.gz.

8c7f4e8f8b did not work for i686-linux
578808112.
2019-08-30 22:33:21 +09:00
Takashi Kokubun
8c7f4e8f8b
Try dropping DLDFLAGS from compile_c_to_o
I think this did not work for some environments, but this seems to fix
OpenBSD RubyCI failure:
20190830T110008Z.fail.html.gz

Let me check RubyCI impact by this.
2019-08-30 22:03:37 +09:00
Takashi Kokubun
88a37dc620
Stop passing CC_LIBS in compile_c_to_o
To fix "gcc: -lgcc: linker input file unused because linking not done" in
20190826T200009Z.log.html.gz

Still I'm intentionally leaving CC_DLDFLAGS_ARGS because making compiler
options different might result in compile/link failure. (Of course
CC_DLDFLAGS_ARGS usually should not have compiler options, but it might
include by bad configure setup)

The same problem may exist in MJIT_LIBS used inside CC_LIBS as well, but
I just ignored that case because it impacts only MinGW / cygwin, hoping
that their users do not perform a wrong configure.
2019-08-28 00:56:15 +09:00
Takashi Kokubun
dd4f128ac5
Handle failure of opening a null device
This issue is detected by Coverity Scan.
2019-07-15 10:39:07 +09:00
Takashi Kokubun
a191009a26
Simplify start_process by exploiting C99
Having a block for mixing a declaration was confusing.
Also I moved `dev_null` and `pid` to limit their scope.
2019-07-15 10:31:01 +09:00
Takashi Kokubun
00a97d9412
Always call va_end in form_args()
This issue is detected by Coverity Scan.
2019-07-15 09:35:57 +09:00
Takashi Kokubun
7ac7685fa7
Simplify link_o_to_so arguments
by C99 compound literal for array and non-constant array initializer
2019-07-14 22:12:59 +09:00
Takashi Kokubun
d8cc41c43b
Fix a wrong buffer size to avoid stack corruption
[Bug #15986]
2019-07-14 21:48:45 +09:00
Takashi Kokubun
4402c66978
Refactor mjit_worker command line with C99
Mostly non-constatnt array initializer, and mixed declarations and code.
2019-07-14 12:53:42 +09:00
Takashi Kokubun
814eaa25e2
Do not use rb_iseq_path() while moving ISeq pointers
in GC.compact.

While `in_jit` is false, GC.compact is allowed to run and it may be
moving ISeq-related pointers. So calling rb_iseq_path() when `in_jit`
is true is illegal.
2019-05-30 04:12:11 +09:00
Takashi Kokubun
7c0639f3f8
Never make a method call from MJIT worker
by showing line number only when it's Fixnum.

When it's not Fixnum, we need to call a method to know the line number.
2019-05-29 16:48:07 +09:00
Takashi Kokubun
ce7b1132c5
Do not call FIX2INT while GC.compact may be running
because FIX2INT might crash by moving method entry pointer:
http://ci.rvm.jp/results/trunk-mjit@silicon-docker/2063412
2019-05-29 16:22:27 +09:00
Takashi Kokubun
82332c7d8b
Rename mjit_gc_finish_hook to mjit_gc_exit_hook
because @ko1 said "gc_finish" is confusing like a finish of entire GC
process
2019-05-15 23:14:07 -07:00
tenderlove
79accaf8d4 fix strict compile errors
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67625 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-20 03:00:08 +00:00
k0kubun
009a0a3870 Avoid crash on logging GC-ed ISeq
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67552 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-14 12:49:20 +00:00
k0kubun
e45c9a40a2 Do not execute MJIT copy job when ISeq is GC-ed
I assumed that ISeq is never GC-ed by `in_jit` + `mjit_mark` on copy job
ISeq, but unfortunately I found SEGV on `mjit_copy_job_handler` in which
iseq->body was somehow Qnil. And it seems to be fixed by disabling the
job when `mjit_free_iseq` is called for the ISeq.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67551 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-14 12:40:44 +00:00
k0kubun
18b5148215 Add debug counter for MJIT stale_units
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67546 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-14 07:12:44 +00:00
k0kubun
fa13bb1a6f Unify comment styles across MJIT sources
I'm writing `//` comments in newer MJIT code after C99 enablement
(because I write 1-line comments more often than multi-line comments
 and `//` requires fewer chars on 1-line) and then they are mixed
with `/* */` now.

For consistency and to avoid the conversion in future changes, let me
finish the rewrite in MJIT-related code.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67533 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-14 05:26:46 +00:00
k0kubun
9b6b4674d7 Recompile JIT-ed code without optimization
based on inline cache when JIT cancel happens by that.

This feature was in the original MJIT implementation by Vladimir, but on
merging MJIT to Ruby it was removed for simplification. This commit adds
the functionality again for the following benchmark:

52f05781f6/concurrent-map/bench.rb
(shown float is duration seconds. shorter is better)

* Before
```
$ INHERIT=0 ruby -v bench.rb
ruby 2.7.0dev (2019-04-13 trunk 67523) [x86_64-linux]
--
1.6507579649914987

$ INHERIT=0 ruby -v --jit bench.rb
ruby 2.7.0dev (2019-04-13 trunk 67523) +JIT [x86_64-linux]
--
1.5091587850474752

$ INHERIT=1 ruby -v bench.rb
ruby 2.7.0dev (2019-04-13 trunk 67523) [x86_64-linux]
--
1.6124781150138006

$ INHERIT=1 ruby --jit -v bench.rb
ruby 2.7.0dev (2019-04-13 trunk 67523) +JIT [x86_64-linux]
--
1.7495657080435194 # <-- this
```

* After
```
$ INHERIT=0 ruby -v bench.rb
ruby 2.7.0dev (2019-04-13 trunk 67523) [x86_64-linux]
last_commit=Recompile JIT-ed code without optimization
--
1.653559010999743

$ INHERIT=0 ruby --jit -v bench.rb
ruby 2.7.0dev (2019-04-13 trunk 67523) +JIT [x86_64-linux]
last_commit=Recompile JIT-ed code without optimization
--
1.4738391840364784

$ INHERIT=1 ruby -v bench.rb
ruby 2.7.0dev (2019-04-13 trunk 67523) [x86_64-linux]
last_commit=Recompile JIT-ed code without optimization
--
1.645227018976584

$ INHERIT=1 ruby --jit -v bench.rb
ruby 2.7.0dev (2019-04-13 trunk 67523) +JIT [x86_64-linux]
last_commit=Recompile JIT-ed code without optimization
--
1.523708809982054 # <-- this
```

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67530 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-14 04:52:02 +00:00
nobu
b9e52ef8b6 Adjusted styles
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67504 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-10 12:43:33 +00:00
kazu
25c1fd3b90 Reverting all commits from r67479 to r67496 because of CI failures
Because hard to specify commits related to r67479 only.
So please commit again.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67499 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-10 09:15:21 +00:00
nobu
5ae753dfa3 Adjusted styles
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67493 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-10 06:44:41 +00:00
mame
9249346c0b mjit_worker.c: explicitly ignore the unused result of RB_DEBUG_COUNTER_INC_IF
By adding `(void)`.  This makes Coverity Scan happy.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67383 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-29 23:26:31 +00:00
k0kubun
9d047fd3e5 Add mjit_compile_failures debug counter
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67382 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-29 14:44:09 +00:00
k0kubun
5ee256da68 Prevent mjit length counters from being 0
It seems that `debug_counter_show_results_at_exit` could be called
earlier than `mjit_finish` sometimes.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67380 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-29 14:08:51 +00:00
k0kubun
a75ae6faa9 Use alloca again instead of malloc and free
by changing interface of `mjit_copy_cache_from_main_thread`.

This is also fixing deadlock introduced by r67299.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67300 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-18 17:20:21 +00:00
k0kubun
4d426e28d2 Resurrect r67287 and r67288
I noticed that r67287 was illegal because memory allocated by `alloca`
was used after the stack is expired.

So I just replaced that with `malloc` and `free` for now.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-18 16:32:48 +00:00
k0kubun
78e87b7d4f Revert "Eliminate mjit_copy_job_t reference from mjit_worker"
This reverts commit ba51ae0109.

CI is failing again...

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67297 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-18 16:14:57 +00:00
k0kubun
ba51ae0109 Eliminate mjit_copy_job_t reference from mjit_worker
Take 2 of r67287.

For some reasons, passing pointer of pointer on stack to a function
and assigning an addresse to a pointer dereferenced from the pointer
seems not working on mswin.

So I achieved to return multiple values by returning struct instead of
taking pointers.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67296 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-18 14:01:52 +00:00
k0kubun
908b530112 Revert "Request inline cache values from mjit_compile"
This reverts commit 4161674b2f.

Revert "Eliminate mjit_copy_job_t reference from mjit_worker"

This reverts commit d86a1aa045.

Reverting them because of CI failures

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67291 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-18 01:52:45 +00:00
k0kubun
4161674b2f Request inline cache values from mjit_compile
rather than preparing beforehand.

By having this change, implementing inlining by calling
`mjit_copy_cache_from_main_thread` for inlined methods was made
possible.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67288 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-17 18:29:30 +00:00
k0kubun
d86a1aa045 Eliminate mjit_copy_job_t reference from mjit_worker
and make `copy_cache_from_main_thread` easier to use.

For implementing inlining later, I'll use `copy_cache_from_main_thread`
inside `mjit_compile`.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67287 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-17 18:07:06 +00:00
k0kubun
3fc26f6013 Drop rb_mjit_unit from mjit_copy_job
and guard iseq from GC by marking iseq in mjit_copy_job.

This is a refactoring for implementing inlining later and
should not be fixing or introducing any bugs.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67286 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-17 17:12:47 +00:00
kazu
cebc640790 Fix a typo [ci skip]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67285 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-17 16:35:20 +00:00
k0kubun
46549d6b11 Revert "mjit_worker.c: try to simplify CC_DLDFLAGS_ARGS"
This reverts commit 405940234e.

Not working on MinGW
21737578/job/09a2tr94vof6fstt

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66872 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-01-19 09:08:10 +00:00
k0kubun
405940234e mjit_worker.c: try to simplify CC_DLDFLAGS_ARGS
assuming that -nostartfiles is just optional for mingw, cygwin, and AIX.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66870 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-01-19 07:35:30 +00:00