use eax instead of edi to call ci->entry #5
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Linux(Linux 3.11.0-15-generic mruby#25-Ubuntu SMP, gcc 4.8.1)でビルドすると
bin/mruby benchmark/prime.rb
などがsegmentation faultしていました。
logを追いかけるとmrb->cをediに割り当てるようになってから落ちるようです。
cygwinでは動いていたので違いを見るとcall ci->entryでcygwinではeaxを使っている
のにLinux上ではediを使っていてせっかくediに割り当てた値を壊してしまっているせいのようです。
Linuxで落ちるときのvm.oの逆アセンブルコード
objdump -CSlw -M intel build/host/src/vm.o|less
if (cbase == NULL && ci->used > 0) {
prev_pc = *ppc;
e7b: 8b 2e mov ebp,DWORD PTR [esi]
/home/shigeo/Program/mruby/src/vm.c:910
/home/shigeo/Program/mruby/src/vm.c:925
"%ebx",
"%esi",
"%edi",
"memory");
cygwinで動いてるときのコード
***でediを経由しているため壊れていました。
試行錯誤したら、
の"%edx"を取り除くとcygwinと同様のコード生成をして動くようになりました。
一応この修正をしてもcygwin上でも一応動いてるようです。
インラインアセンブラはよくわからないのでこの修正でよいのか分かりませんが。