Date: Tue, 18 May 99 15:51:07 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:25385] analysis of JIT compiled code (Re: strange behavior on JDK1.2) To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199905180649.PAA27795@cafe.muraoka.info.waseda.ac.jp> 首藤です。 NECの中村さん wrote: > > (pt.x - (sz - 1) / 2 - 1) > >の値が、JDK1.1.6では正しく、JDK1.2では不正な値となります。 > > sz == 16 の時に (sz - 1) / 2 が 9586167 になっていますね。 > JDK1.1.8では 23 になりました。 > JDK1.2もJDK1.1.8もJITをOFFにすると正しく動くようです。 > こんなことが起こるとJITを使えませんね。 JDK 1.2 for Win32 でおかしなことが起こる、ということは Symantec 社の JIT コンパイラですね。 こういったおかしなことが起これば、当然、JIT コンパイラが そこで何をしているのかを調べたくなります。 しかし、ソースが公開されていないので、 Symantec や Sun の JIT の挙動を調べることはなかなか困難です。 JIT なので、生成されたコードはファイルに格納されませんし... ただ、調べる方法は皆無ではありません。 ネイティブメソッドを使って、 JIT が生成したネイティブコードを得ることはできそうです。 JDK の include/oobj.h (JDK 1.1) や include-old/oobj.h (JDK 1.2) に struct methodblock という構造体があり、 そこに char *CompiledCode というメンバがあります。 JIT コンパイラが生成したネイティブコードのアドレスを 格納するためのメンバです。 Symantec や Sun の JIT がこれを使っているという保証はないですが、 十中八九、使っていると予想しています。 ここまでわかっても、ネイティブコードを得るためには、 JNI の前の、JDK 1.0 のネイティブメソッドインタフェースの使い方、 および、それと JNI の関係など、 ネイティブメソッドについてのそれなりの知識が要るでしょう。 また、ネイティブコードの長さは、各種 JIT が独自の方法で保持していて、 得にくいです。ネイティブコード自体を頭から眺めていって、どこまでが 有効なコードなのかを判断する必要があるかもしれません。 ディスアセンブラは、GDB のコードをひっぱってくるとよさげです。 時間があれば作ってみたいと思っています。 メーカ (IBM とか富士通とか) で JIT を作っている方は、 実はすでにやっているのかもしれません。 JIT 自体を、例えばディスアセンブルなどして解析するのは Symantec や Sun の権利を侵していることになりそうですが、 JIT が生成したネイティブコードを解析するのは、権利的にどうなんでしょうね? SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp