Top

CodeBlob とそのサブクラス (CodeBlob, BufferBlob, AdapterBlob, MethodHandlesAdapterBlob, RuntimeStub, SingletonBlob, RicochetBlob, DeoptimizationBlob, UncommonTrapBlob, ExceptionBlob, SafepointBlob)

これらは, 実行時に生成されたマシン語コードを格納するためのクラス (See: here for details).

クラス一覧(class list)


CodeBlob

概要(Summary)

動的に生成されたマシン語コードを格納するメモリ領域を表すクラスの基底クラス.

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    class CodeBlob VALUE_OBJ_CLASS_SPEC {

なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. (例えば, このクラスの is_alive() 等が abstract)

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
      virtual bool is_alive() const                  = 0;

内部構造(Internal structure)

CodeBlob は以下のような構造を持つ.

("relocation" の箇所に relocInfo の配列が詰まっている模様. relocation_begin(), relocation_end() でアクセスできる).

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    // Layout:
    //   - header
    //   - relocation
    //   - content space
    //     - instruction space
    //   - data space

なお, hpp ファイルで宣言されている以下のフィールド群は, 上の Layout 中での "header" に相当する模様. そして, これらのフィールドが終わった後ろの部分(フィールドが宣言されていない部分)に, 上記の relocation 情報や content space が存在している.

(ちなみに, oopmap 情報(OopMapSet) や block_comment 情報(CodeComments) は header 部分に含まれている).

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
      const char* _name;
      int        _size;                              // total size of CodeBlob in bytes
      int        _header_size;                       // size of header (depends on subclass)
      int        _relocation_size;                   // size of relocation
      int        _content_offset;                    // offset to where content region begins (this includes consts, insts, stubs)
      int        _code_offset;                       // offset to where instructions region begins (this includes insts, stubs)
      int        _frame_complete_offset;             // instruction offsets in [0.._frame_complete_offset) have
                                                     // not finished setting up their frame. Beware of pc's in
                                                     // that range. There is a similar range(s) on returns
                                                     // which we don't detect.
      int        _data_offset;                       // offset to where data region begins
      int        _frame_size;                        // size of stack frame
      OopMapSet* _oop_maps;                          // OopMap for this CodeBlob
      CodeComments _comments;

詳細(Details)

See: here for details


BufferBlob

概要(Summary)

relocate 処理が不要なコードを格納するための CodeBlob (例えば, interpreter や stubroutine 用に生成されるコードが該当する).

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // BufferBlob: used to hold non-relocatable machine code such as the interpreter, stubroutines, etc.

    class BufferBlob: public CodeBlob {

使われ方(Usage)

インスタンスの格納場所(where its instances are stored)

具体的には, 以下のスタブがこのクラスのインスタンスとなっている.

    ((cite: hotspot/src/share/vm/interpreter/interpreterRuntime.hpp))
    class SignatureHandlerLibrary: public AllStatic {
    ...
      static BufferBlob*              _handler_blob; // the current buffer blob containing the generated handlers
    ((cite: hotspot/src/share/vm/opto/compile.hpp))
      class ConstantTable {
    ...
      BufferBlob*           _scratch_buffer_blob;   // For temporary code buffers.
    ((cite: hotspot/src/share/vm/runtime/sharedRuntime.hpp))
    class AdapterHandlerLibrary: public AllStatic {
    ...
      static BufferBlob* _buffer; // the temporary code buffer in CodeCache
    ((cite: hotspot/src/share/vm/runtime/stubRoutines.hpp))
    class StubRoutines: AllStatic {
    ...
      static BufferBlob* _code1;                               // code buffer for initial routines
      static BufferBlob* _code2;                               // code buffer for all other routines

(... その他, あちこちで使われている #TODO)

詳細(Details)

See: here for details


AdapterBlob

概要(Summary)

c2i adapters および i2c adapters のコードを格納するための CodeBlob (See: here for details).

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // AdapterBlob: used to hold C2I/I2C adapters

    class AdapterBlob: public BufferBlob {

使われ方(Usage)

生成箇所(where its instances are created)

AdapterHandlerLibrary::get_adapter() の中で生成されている.

    ((cite: hotspot/src/share/vm/runtime/sharedRuntime.cpp))
    AdapterHandlerEntry* AdapterHandlerLibrary::get_adapter(methodHandle method) {
    ...
          B = AdapterBlob::create(&buffer);

詳細(Details)

See: here for details


MethodHandlesAdapterBlob

概要(Summary)

MethodHandles adapters を格納するための CodeBlob. (#TODO)

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // MethodHandlesAdapterBlob: used to hold MethodHandles adapters

    class MethodHandlesAdapterBlob: public BufferBlob {

使われ方(Usage)

インスタンスの格納場所(where its instances are stored)

具体的には, 以下のスタブがこのクラスのインスタンスとなっている.

    ((cite: hotspot/src/share/vm/prims/methodHandles.cpp))
    MethodHandlesAdapterBlob* MethodHandles::_adapter_code = NULL;

詳細(Details)

See: here for details


RuntimeStub

概要(Summary)

JIT 生成コードから使用されるランタイムスタブ(Runtime を呼び出すためのスタブ)用のコードを格納する CodeBlob.

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // RuntimeStub: describes stubs used by compiled code to call a (static) C++ runtime routine

    class RuntimeStub: public CodeBlob {

使われ方(Usage)

インスタンスの格納場所(where its instances are stored)

具体的には, 以下のスタブがこのクラスのインスタンスとなっている.

SharedRuntime 内:
    ((cite: hotspot/src/share/vm/runtime/sharedRuntime.cpp))
    // Shared stub locations
    RuntimeStub*        SharedRuntime::_wrong_method_blob;
    RuntimeStub*        SharedRuntime::_ic_miss_blob;
    RuntimeStub*        SharedRuntime::_resolve_opt_virtual_call_blob;
    RuntimeStub*        SharedRuntime::_resolve_virtual_call_blob;
    RuntimeStub*        SharedRuntime::_resolve_static_call_blob;
OptoRuntime 内:

OptoRuntime::generate_stub() で生成される以下のスタブが該当する.

    ((cite: hotspot/src/share/vm/opto/runtime.cpp))
    void OptoRuntime::generate(ciEnv* env) {
    ...
      // Note: tls: Means fetching the return oop out of the thread-local storage
      //
      //   variable/name                       type-function-gen              , runtime method                  ,fncy_jp, tls,save_args,retpc
      // -------------------------------------------------------------------------------------------------------------------------------
      gen(env, _new_instance_Java              , new_instance_Type            , new_instance_C                  ,    0 , true , false, false);
      gen(env, _new_array_Java                 , new_array_Type               , new_array_C                     ,    0 , true , false, false);
      gen(env, _multianewarray2_Java           , multianewarray2_Type         , multianewarray2_C               ,    0 , true , false, false);
      gen(env, _multianewarray3_Java           , multianewarray3_Type         , multianewarray3_C               ,    0 , true , false, false);
      gen(env, _multianewarray4_Java           , multianewarray4_Type         , multianewarray4_C               ,    0 , true , false, false);
      gen(env, _multianewarray5_Java           , multianewarray5_Type         , multianewarray5_C               ,    0 , true , false, false);
      gen(env, _g1_wb_pre_Java                 , g1_wb_pre_Type               , SharedRuntime::g1_wb_pre        ,    0 , false, false, false);
      gen(env, _g1_wb_post_Java                , g1_wb_post_Type              , SharedRuntime::g1_wb_post       ,    0 , false, false, false);
      gen(env, _complete_monitor_locking_Java  , complete_monitor_enter_Type  , SharedRuntime::complete_monitor_locking_C      ,    0 , false, false, false);
      gen(env, _rethrow_Java                   , rethrow_Type                 , rethrow_C                       ,    2 , true , false, true );

      gen(env, _slow_arraycopy_Java            , slow_arraycopy_Type          , SharedRuntime::slow_arraycopy_C ,    0 , false, false, false);
      gen(env, _register_finalizer_Java        , register_finalizer_Type      , register_finalizer              ,    0 , false, false, false);

    # ifdef ENABLE_ZAP_DEAD_LOCALS
      gen(env, _zap_dead_Java_locals_Java      , zap_dead_locals_Type         , zap_dead_Java_locals_C          ,    0 , false, true , false );
      gen(env, _zap_dead_native_locals_Java    , zap_dead_locals_Type         , zap_dead_native_locals_C        ,    0 , false, true , false );
    # endif

とはいえ, この場合は, 作った RuntimeStub から entry point だけを取り出し, それ以外は捨ててしまっている模様. (捨ててはいない?? CodeCache には登録されている? #TODO)

StubRoutines 内:
    ((cite: hotspot/src/share/vm/runtime/stubRoutines.cpp))
    address StubRoutines::_throw_AbstractMethodError_entry          = NULL;
    address StubRoutines::_throw_IncompatibleClassChangeError_entry = NULL;
    address StubRoutines::_throw_ArithmeticException_entry          = NULL;
    address StubRoutines::_throw_NullPointerException_entry         = NULL;
    address StubRoutines::_throw_NullPointerException_at_call_entry = NULL;
    address StubRoutines::_throw_StackOverflowError_entry           = NULL;
    address StubRoutines::_throw_WrongMethodTypeException_entry     = NULL;

とはいえ, この場合は, 作った RuntimeStub から entry point だけを取り出し, それ以外は捨ててしまっている模様. (捨ててはいない?? CodeCache には登録されている? #TODO)

詳細(Details)

See: here for details


SingletonBlob

概要(Summary)

VM 内に 1つしか存在しない CodeBlob の基底クラス.

(なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラスである模様)

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // Super-class for all blobs that exist in only one instance. Implements default behaviour.

    class SingletonBlob: public CodeBlob {

具体的には以下のようなサブクラスを持つ.

詳細(Details)

See: here for details


RicochetBlob

概要(Summary)

(#Under Construction)

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // RicochetBlob
    // Holds an arbitrary argument list indefinitely while Java code executes recursively.

    class RicochetBlob: public SingletonBlob {

使われ方(Usage)

インスタンスの格納場所(where its instances are stored)

具体的には, 以下のスタブがこのクラスのインスタンスとなっている.

    ((cite: hotspot/src/share/vm/runtime/sharedRuntime.cpp))
    RicochetBlob*       SharedRuntime::_ricochet_blob;

詳細(Details)

See: here for details


DeoptimizationBlob

概要(Summary)

脱最適化処理(deopt 処理)を行うコードを格納する CodeBlob (See: here for details).

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // DeoptimizationBlob

    class DeoptimizationBlob: public SingletonBlob {

使われ方(Usage)

インスタンスの格納場所(where its instances are stored)

具体的には, 以下のスタブがこのクラスのインスタンスとなっている.

    ((cite: hotspot/src/share/vm/runtime/sharedRuntime.cpp))
    DeoptimizationBlob* SharedRuntime::_deopt_blob;

詳細(Details)

See: here for details


UncommonTrapBlob

概要(Summary)

uncommon trap 処理を行うコードを格納する CodeBlob (See: here for details).

現在は C2 でしか使われていない (というか, #ifdef COMPILER2 でなければ定義もされない)

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // UncommonTrapBlob (currently only used by Compiler 2)

    #ifdef COMPILER2

    class UncommonTrapBlob: public SingletonBlob {

使われ方(Usage)

インスタンスの格納場所(where its instances are stored)

具体的には, 以下のスタブがこのクラスのインスタンスとなっている.

    ((cite: hotspot/src/share/vm/runtime/sharedRuntime.cpp))
    #ifdef COMPILER2
    UncommonTrapBlob*   SharedRuntime::_uncommon_trap_blob;
    #endif // COMPILER2

詳細(Details)

See: here for details


ExceptionBlob

概要(Summary)

例外処理を行うコードを格納する CodeBlob (See: here for details).

現在は C2 でしか使われていない (というか, #ifdef COMPILER2 でなければ定義もされない)

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // ExceptionBlob: used for exception unwinding in compiled code (currently only used by Compiler 2)

    class ExceptionBlob: public SingletonBlob {

使われ方(Usage)

インスタンスの格納場所(where its instances are stored)

具体的には, 以下のスタブがこのクラスのインスタンスとなっている.

    ((cite: hotspot/src/share/vm/opto/runtime.cpp))
    ExceptionBlob* OptoRuntime::_exception_blob;

詳細(Details)

See: here for details


SafepointBlob

概要(Summary)

safepoint polling 処理でメモリアクセス違反が起きた際の処理(safepoint 処理)を行うコードを格納する CodeBlob (See: here for details).

    ((cite: hotspot/src/share/vm/code/codeBlob.hpp))
    //----------------------------------------------------------------------------------------------------
    // SafepointBlob: handles illegal_instruction exceptions during a safepoint

    class SafepointBlob: public SingletonBlob {

使われ方(Usage)

生成箇所(where its instances are created)

SharedRuntime::generate_handler_blob() で作成されている (See: SharedRuntime::generate_handler_blob()).

インスタンスの格納場所(where its instances are stored)

具体的には, 以下のスタブがこのクラスのインスタンスとなっている.

    ((cite: hotspot/src/share/vm/runtime/sharedRuntime.cpp))
    SafepointBlob*      SharedRuntime::_polling_page_safepoint_handler_blob;
    SafepointBlob*      SharedRuntime::_polling_page_return_handler_blob;

詳細(Details)

See: here for details



This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.