src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
changeset 49370 81bc1dc36a53
parent 49358 0dc249f5c260
child 49371 59ad6672bf78
equal deleted inserted replaced
49369:62dd99c3a6f9 49370:81bc1dc36a53
    20  * or visit www.oracle.com if you need additional information or have any
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    21  * questions.
    22  */
    22  */
    23 
    23 
    24 #include "precompiled.hpp"
    24 #include "precompiled.hpp"
    25 #include "ci/ciUtilities.hpp"
       
    26 #include "classfile/javaClasses.inline.hpp"
       
    27 #include "code/codeCache.hpp"
       
    28 #include "code/scopeDesc.hpp"
    25 #include "code/scopeDesc.hpp"
    29 #include "interpreter/linkResolver.hpp"
       
    30 #include "memory/oopFactory.hpp"
    26 #include "memory/oopFactory.hpp"
    31 #include "memory/resourceArea.hpp"
       
    32 #include "oops/cpCache.inline.hpp"
    27 #include "oops/cpCache.inline.hpp"
    33 #include "oops/generateOopMap.hpp"
    28 #include "oops/generateOopMap.hpp"
    34 #include "oops/fieldStreams.hpp"
       
    35 #include "oops/method.inline.hpp"
    29 #include "oops/method.inline.hpp"
    36 #include "oops/oop.inline.hpp"
       
    37 #include "oops/objArrayOop.inline.hpp"
    30 #include "oops/objArrayOop.inline.hpp"
    38 #include "oops/typeArrayOop.inline.hpp"
    31 #include "oops/typeArrayOop.inline.hpp"
    39 #include "runtime/fieldDescriptor.hpp"
    32 #include "compiler/compileBroker.hpp"
    40 #include "runtime/javaCalls.hpp"
    33 #include "compiler/disassembler.hpp"
       
    34 #include "jvmci/jvmciCompilerToVM.hpp"
       
    35 #include "jvmci/jvmciCodeInstaller.hpp"
       
    36 #include "jvmci/jvmciRuntime.hpp"
    41 #include "runtime/jniHandles.inline.hpp"
    37 #include "runtime/jniHandles.inline.hpp"
    42 #include "jvmci/jvmciRuntime.hpp"
       
    43 #include "compiler/abstractCompiler.hpp"
       
    44 #include "compiler/compileBroker.hpp"
       
    45 #include "compiler/compilerOracle.hpp"
       
    46 #include "compiler/disassembler.hpp"
       
    47 #include "compiler/oopMap.hpp"
       
    48 #include "jvmci/jvmciCompilerToVM.hpp"
       
    49 #include "jvmci/jvmciCompiler.hpp"
       
    50 #include "jvmci/jvmciEnv.hpp"
       
    51 #include "jvmci/jvmciJavaClasses.hpp"
       
    52 #include "jvmci/jvmciCodeInstaller.hpp"
       
    53 #include "jvmci/vmStructs_jvmci.hpp"
       
    54 #include "gc/g1/heapRegion.hpp"
       
    55 #include "gc/shared/cardTable.hpp"
       
    56 #include "runtime/javaCalls.hpp"
       
    57 #include "runtime/deoptimization.hpp"
       
    58 #include "runtime/timerTrace.hpp"
    38 #include "runtime/timerTrace.hpp"
    59 #include "runtime/vframe.hpp"
       
    60 #include "runtime/vframe_hp.hpp"
    39 #include "runtime/vframe_hp.hpp"
    61 #include "runtime/vmStructs.hpp"
       
    62 #include "utilities/resourceHash.hpp"
       
    63 
    40 
    64 
    41 
    65 void JNIHandleMark::push_jni_handle_block() {
    42 void JNIHandleMark::push_jni_handle_block() {
    66   JavaThread* thread = JavaThread::current();
    43   JavaThread* thread = JavaThread::current();
    67   if (thread != NULL) {
    44   if (thread != NULL) {
   119   }
    96   }
   120   return NULL;
    97   return NULL;
   121 }
    98 }
   122 
    99 
   123 
   100 
   124 int CompilerToVM::Data::Klass_vtable_start_offset;
   101 jobjectArray readConfiguration0(JNIEnv *env, TRAPS);
   125 int CompilerToVM::Data::Klass_vtable_length_offset;
       
   126 
       
   127 int CompilerToVM::Data::Method_extra_stack_entries;
       
   128 
       
   129 address CompilerToVM::Data::SharedRuntime_ic_miss_stub;
       
   130 address CompilerToVM::Data::SharedRuntime_handle_wrong_method_stub;
       
   131 address CompilerToVM::Data::SharedRuntime_deopt_blob_unpack;
       
   132 address CompilerToVM::Data::SharedRuntime_deopt_blob_uncommon_trap;
       
   133 
       
   134 size_t CompilerToVM::Data::ThreadLocalAllocBuffer_alignment_reserve;
       
   135 
       
   136 CollectedHeap* CompilerToVM::Data::Universe_collectedHeap;
       
   137 int CompilerToVM::Data::Universe_base_vtable_size;
       
   138 address CompilerToVM::Data::Universe_narrow_oop_base;
       
   139 int CompilerToVM::Data::Universe_narrow_oop_shift;
       
   140 address CompilerToVM::Data::Universe_narrow_klass_base;
       
   141 int CompilerToVM::Data::Universe_narrow_klass_shift;
       
   142 void* CompilerToVM::Data::Universe_non_oop_bits;
       
   143 uintptr_t CompilerToVM::Data::Universe_verify_oop_mask;
       
   144 uintptr_t CompilerToVM::Data::Universe_verify_oop_bits;
       
   145 
       
   146 bool       CompilerToVM::Data::_supports_inline_contig_alloc;
       
   147 HeapWord** CompilerToVM::Data::_heap_end_addr;
       
   148 HeapWord* volatile* CompilerToVM::Data::_heap_top_addr;
       
   149 int CompilerToVM::Data::_max_oop_map_stack_offset;
       
   150 
       
   151 jbyte* CompilerToVM::Data::cardtable_start_address;
       
   152 int CompilerToVM::Data::cardtable_shift;
       
   153 
       
   154 int CompilerToVM::Data::vm_page_size;
       
   155 
       
   156 int CompilerToVM::Data::sizeof_vtableEntry = sizeof(vtableEntry);
       
   157 int CompilerToVM::Data::sizeof_ExceptionTableElement = sizeof(ExceptionTableElement);
       
   158 int CompilerToVM::Data::sizeof_LocalVariableTableElement = sizeof(LocalVariableTableElement);
       
   159 int CompilerToVM::Data::sizeof_ConstantPool = sizeof(ConstantPool);
       
   160 int CompilerToVM::Data::sizeof_SymbolPointer = sizeof(Symbol*);
       
   161 int CompilerToVM::Data::sizeof_narrowKlass = sizeof(narrowKlass);
       
   162 int CompilerToVM::Data::sizeof_arrayOopDesc = sizeof(arrayOopDesc);
       
   163 int CompilerToVM::Data::sizeof_BasicLock = sizeof(BasicLock);
       
   164 
       
   165 address CompilerToVM::Data::dsin;
       
   166 address CompilerToVM::Data::dcos;
       
   167 address CompilerToVM::Data::dtan;
       
   168 address CompilerToVM::Data::dexp;
       
   169 address CompilerToVM::Data::dlog;
       
   170 address CompilerToVM::Data::dlog10;
       
   171 address CompilerToVM::Data::dpow;
       
   172 
       
   173 address CompilerToVM::Data::symbol_init;
       
   174 address CompilerToVM::Data::symbol_clinit;
       
   175 
       
   176 void CompilerToVM::Data::initialize(TRAPS) {
       
   177   Klass_vtable_start_offset = in_bytes(Klass::vtable_start_offset());
       
   178   Klass_vtable_length_offset = in_bytes(Klass::vtable_length_offset());
       
   179 
       
   180   Method_extra_stack_entries = Method::extra_stack_entries();
       
   181 
       
   182   SharedRuntime_ic_miss_stub = SharedRuntime::get_ic_miss_stub();
       
   183   SharedRuntime_handle_wrong_method_stub = SharedRuntime::get_handle_wrong_method_stub();
       
   184   SharedRuntime_deopt_blob_unpack = SharedRuntime::deopt_blob()->unpack();
       
   185   SharedRuntime_deopt_blob_uncommon_trap = SharedRuntime::deopt_blob()->uncommon_trap();
       
   186 
       
   187   ThreadLocalAllocBuffer_alignment_reserve = ThreadLocalAllocBuffer::alignment_reserve();
       
   188 
       
   189   Universe_collectedHeap = Universe::heap();
       
   190   Universe_base_vtable_size = Universe::base_vtable_size();
       
   191   Universe_narrow_oop_base = Universe::narrow_oop_base();
       
   192   Universe_narrow_oop_shift = Universe::narrow_oop_shift();
       
   193   Universe_narrow_klass_base = Universe::narrow_klass_base();
       
   194   Universe_narrow_klass_shift = Universe::narrow_klass_shift();
       
   195   Universe_non_oop_bits = Universe::non_oop_word();
       
   196   Universe_verify_oop_mask = Universe::verify_oop_mask();
       
   197   Universe_verify_oop_bits = Universe::verify_oop_bits();
       
   198 
       
   199   _supports_inline_contig_alloc = Universe::heap()->supports_inline_contig_alloc();
       
   200   _heap_end_addr = _supports_inline_contig_alloc ? Universe::heap()->end_addr() : (HeapWord**) -1;
       
   201   _heap_top_addr = _supports_inline_contig_alloc ? Universe::heap()->top_addr() : (HeapWord* volatile*) -1;
       
   202 
       
   203   _max_oop_map_stack_offset = (OopMapValue::register_mask - VMRegImpl::stack2reg(0)->value()) * VMRegImpl::stack_slot_size;
       
   204   int max_oop_map_stack_index = _max_oop_map_stack_offset / VMRegImpl::stack_slot_size;
       
   205   assert(OopMapValue::legal_vm_reg_name(VMRegImpl::stack2reg(max_oop_map_stack_index)), "should be valid");
       
   206   assert(!OopMapValue::legal_vm_reg_name(VMRegImpl::stack2reg(max_oop_map_stack_index + 1)), "should be invalid");
       
   207 
       
   208   symbol_init = (address) vmSymbols::object_initializer_name();
       
   209   symbol_clinit = (address) vmSymbols::class_initializer_name();
       
   210 
       
   211   BarrierSet* bs = Universe::heap()->barrier_set();
       
   212   if (bs->is_a(BarrierSet::CardTableModRef)) {
       
   213     jbyte* base = ci_card_table_address();
       
   214     assert(base != NULL, "unexpected byte_map_base");
       
   215     cardtable_start_address = base;
       
   216     cardtable_shift = CardTable::card_shift;
       
   217   } else {
       
   218     // No card mark barriers
       
   219     cardtable_start_address = 0;
       
   220     cardtable_shift = 0;
       
   221   }
       
   222 
       
   223   vm_page_size = os::vm_page_size();
       
   224 
       
   225 #define SET_TRIGFUNC(name)                                      \
       
   226   if (StubRoutines::name() != NULL) {                           \
       
   227     name = StubRoutines::name();                                \
       
   228   } else {                                                      \
       
   229     name = CAST_FROM_FN_PTR(address, SharedRuntime::name);      \
       
   230   }
       
   231 
       
   232   SET_TRIGFUNC(dsin);
       
   233   SET_TRIGFUNC(dcos);
       
   234   SET_TRIGFUNC(dtan);
       
   235   SET_TRIGFUNC(dexp);
       
   236   SET_TRIGFUNC(dlog10);
       
   237   SET_TRIGFUNC(dlog);
       
   238   SET_TRIGFUNC(dpow);
       
   239 
       
   240 #undef SET_TRIGFUNC
       
   241 }
       
   242 
       
   243 objArrayHandle CompilerToVM::initialize_intrinsics(TRAPS) {
       
   244   objArrayHandle vmIntrinsics = oopFactory::new_objArray_handle(VMIntrinsicMethod::klass(), (vmIntrinsics::ID_LIMIT - 1), CHECK_(objArrayHandle()));
       
   245   int index = 0;
       
   246   // The intrinsics for a class are usually adjacent to each other.
       
   247   // When they are, the string for the class name can be reused.
       
   248   vmSymbols::SID kls_sid = vmSymbols::NO_SID;
       
   249   Handle kls_str;
       
   250 #define SID_ENUM(n) vmSymbols::VM_SYMBOL_ENUM_NAME(n)
       
   251 #define VM_SYMBOL_TO_STRING(s) \
       
   252   java_lang_String::create_from_symbol(vmSymbols::symbol_at(SID_ENUM(s)), CHECK_(objArrayHandle()))
       
   253 #define VM_INTRINSIC_INFO(id, kls, name, sig, ignore_fcode) {             \
       
   254     instanceHandle vmIntrinsicMethod = InstanceKlass::cast(VMIntrinsicMethod::klass())->allocate_instance_handle(CHECK_(objArrayHandle())); \
       
   255     if (kls_sid != SID_ENUM(kls)) {                                       \
       
   256       kls_str = VM_SYMBOL_TO_STRING(kls);                                 \
       
   257       kls_sid = SID_ENUM(kls);                                            \
       
   258     }                                                                     \
       
   259     Handle name_str = VM_SYMBOL_TO_STRING(name);                          \
       
   260     Handle sig_str = VM_SYMBOL_TO_STRING(sig);                            \
       
   261     VMIntrinsicMethod::set_declaringClass(vmIntrinsicMethod, kls_str());  \
       
   262     VMIntrinsicMethod::set_name(vmIntrinsicMethod, name_str());           \
       
   263     VMIntrinsicMethod::set_descriptor(vmIntrinsicMethod, sig_str());      \
       
   264     VMIntrinsicMethod::set_id(vmIntrinsicMethod, vmIntrinsics::id);       \
       
   265       vmIntrinsics->obj_at_put(index++, vmIntrinsicMethod());             \
       
   266   }
       
   267 
       
   268   VM_INTRINSICS_DO(VM_INTRINSIC_INFO, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE)
       
   269 #undef SID_ENUM
       
   270 #undef VM_SYMBOL_TO_STRING
       
   271 #undef VM_INTRINSIC_INFO
       
   272   assert(index == vmIntrinsics::ID_LIMIT - 1, "must be");
       
   273 
       
   274   return vmIntrinsics;
       
   275 }
       
   276 
       
   277 /**
       
   278  * The set of VM flags known to be used.
       
   279  */
       
   280 #define PREDEFINED_CONFIG_FLAGS(do_bool_flag, do_intx_flag, do_uintx_flag) \
       
   281   do_intx_flag(AllocateInstancePrefetchLines)                              \
       
   282   do_intx_flag(AllocatePrefetchDistance)                                   \
       
   283   do_intx_flag(AllocatePrefetchInstr)                                      \
       
   284   do_intx_flag(AllocatePrefetchLines)                                      \
       
   285   do_intx_flag(AllocatePrefetchStepSize)                                   \
       
   286   do_intx_flag(AllocatePrefetchStyle)                                      \
       
   287   do_intx_flag(BciProfileWidth)                                            \
       
   288   do_bool_flag(BootstrapJVMCI)                                             \
       
   289   do_bool_flag(CITime)                                                     \
       
   290   do_bool_flag(CITimeEach)                                                 \
       
   291   do_uintx_flag(CodeCacheSegmentSize)                                      \
       
   292   do_intx_flag(CodeEntryAlignment)                                         \
       
   293   do_bool_flag(CompactFields)                                              \
       
   294   NOT_PRODUCT(do_intx_flag(CompileTheWorldStartAt))                        \
       
   295   NOT_PRODUCT(do_intx_flag(CompileTheWorldStopAt))                         \
       
   296   do_intx_flag(ContendedPaddingWidth)                                      \
       
   297   do_bool_flag(DontCompileHugeMethods)                                     \
       
   298   do_bool_flag(EagerJVMCI)                                                 \
       
   299   do_bool_flag(EnableContended)                                            \
       
   300   do_intx_flag(FieldsAllocationStyle)                                      \
       
   301   do_bool_flag(FoldStableValues)                                           \
       
   302   do_bool_flag(ForceUnreachable)                                           \
       
   303   do_intx_flag(HugeMethodLimit)                                            \
       
   304   do_bool_flag(Inline)                                                     \
       
   305   do_intx_flag(JVMCICounterSize)                                           \
       
   306   do_bool_flag(JVMCIPrintProperties)                                       \
       
   307   do_bool_flag(JVMCIUseFastLocking)                                        \
       
   308   do_intx_flag(MethodProfileWidth)                                         \
       
   309   do_intx_flag(ObjectAlignmentInBytes)                                     \
       
   310   do_bool_flag(PrintInlining)                                              \
       
   311   do_bool_flag(ReduceInitialCardMarks)                                     \
       
   312   do_bool_flag(RestrictContended)                                          \
       
   313   do_intx_flag(StackReservedPages)                                         \
       
   314   do_intx_flag(StackShadowPages)                                           \
       
   315   do_bool_flag(TLABStats)                                                  \
       
   316   do_uintx_flag(TLABWasteIncrement)                                        \
       
   317   do_intx_flag(TypeProfileWidth)                                           \
       
   318   do_bool_flag(UseAESIntrinsics)                                           \
       
   319   X86_ONLY(do_intx_flag(UseAVX))                                           \
       
   320   do_bool_flag(UseBiasedLocking)                                           \
       
   321   do_bool_flag(UseCRC32Intrinsics)                                         \
       
   322   do_bool_flag(UseCompressedClassPointers)                                 \
       
   323   do_bool_flag(UseCompressedOops)                                          \
       
   324   do_bool_flag(UseConcMarkSweepGC)                                         \
       
   325   X86_ONLY(do_bool_flag(UseCountLeadingZerosInstruction))                  \
       
   326   X86_ONLY(do_bool_flag(UseCountTrailingZerosInstruction))                 \
       
   327   do_bool_flag(UseG1GC)                                                    \
       
   328   COMPILER2_PRESENT(do_bool_flag(UseMontgomeryMultiplyIntrinsic))          \
       
   329   COMPILER2_PRESENT(do_bool_flag(UseMontgomerySquareIntrinsic))            \
       
   330   COMPILER2_PRESENT(do_bool_flag(UseMulAddIntrinsic))                      \
       
   331   COMPILER2_PRESENT(do_bool_flag(UseMultiplyToLenIntrinsic))               \
       
   332   do_bool_flag(UsePopCountInstruction)                                     \
       
   333   do_bool_flag(UseSHA1Intrinsics)                                          \
       
   334   do_bool_flag(UseSHA256Intrinsics)                                        \
       
   335   do_bool_flag(UseSHA512Intrinsics)                                        \
       
   336   do_intx_flag(UseSSE)                                                     \
       
   337   COMPILER2_PRESENT(do_bool_flag(UseSquareToLenIntrinsic))                 \
       
   338   do_bool_flag(UseStackBanging)                                            \
       
   339   do_bool_flag(UseTLAB)                                                    \
       
   340   do_bool_flag(VerifyOops)                                                 \
       
   341 
       
   342 #define BOXED_BOOLEAN(name, value) oop name = ((jboolean)(value) ? boxedTrue() : boxedFalse())
       
   343 #define BOXED_DOUBLE(name, value) oop name; do { jvalue p; p.d = (jdouble) (value); name = java_lang_boxing_object::create(T_DOUBLE, &p, CHECK_NULL);} while(0)
       
   344 #define BOXED_LONG(name, value) \
       
   345   oop name; \
       
   346   do { \
       
   347     jvalue p; p.j = (jlong) (value); \
       
   348     Handle* e = longs.get(p.j); \
       
   349     if (e == NULL) { \
       
   350       oop o = java_lang_boxing_object::create(T_LONG, &p, CHECK_NULL); \
       
   351       Handle h(THREAD, o); \
       
   352       longs.put(p.j, h); \
       
   353       name = h(); \
       
   354     } else { \
       
   355       name = (*e)(); \
       
   356     } \
       
   357   } while (0)
       
   358 
       
   359 #define CSTRING_TO_JSTRING(name, value) \
       
   360   Handle name; \
       
   361   do { \
       
   362     if (value != NULL) { \
       
   363       Handle* e = strings.get(value); \
       
   364       if (e == NULL) { \
       
   365         Handle h = java_lang_String::create_from_str(value, CHECK_NULL); \
       
   366         strings.put(value, h); \
       
   367         name = h; \
       
   368       } else { \
       
   369         name = (*e); \
       
   370       } \
       
   371     } \
       
   372   } while (0)
       
   373 
   102 
   374 C2V_VMENTRY(jobjectArray, readConfiguration, (JNIEnv *env))
   103 C2V_VMENTRY(jobjectArray, readConfiguration, (JNIEnv *env))
   375   ResourceMark rm;
   104    jobjectArray config = readConfiguration0(env, CHECK_NULL);
   376   HandleMark hm;
   105    return config;
   377 
       
   378   // Used to canonicalize Long and String values.
       
   379   ResourceHashtable<jlong, Handle> longs;
       
   380   ResourceHashtable<const char*, Handle, &CompilerToVM::cstring_hash, &CompilerToVM::cstring_equals> strings;
       
   381 
       
   382   jvalue prim;
       
   383   prim.z = true;  oop boxedTrueOop =  java_lang_boxing_object::create(T_BOOLEAN, &prim, CHECK_NULL);
       
   384   Handle boxedTrue(THREAD, boxedTrueOop);
       
   385   prim.z = false; oop boxedFalseOop = java_lang_boxing_object::create(T_BOOLEAN, &prim, CHECK_NULL);
       
   386   Handle boxedFalse(THREAD, boxedFalseOop);
       
   387 
       
   388   CompilerToVM::Data::initialize(CHECK_NULL);
       
   389 
       
   390   VMField::klass()->initialize(CHECK_NULL);
       
   391   VMFlag::klass()->initialize(CHECK_NULL);
       
   392   VMIntrinsicMethod::klass()->initialize(CHECK_NULL);
       
   393 
       
   394   int len = JVMCIVMStructs::localHotSpotVMStructs_count();
       
   395   objArrayHandle vmFields = oopFactory::new_objArray_handle(VMField::klass(), len, CHECK_NULL);
       
   396   for (int i = 0; i < len ; i++) {
       
   397     VMStructEntry vmField = JVMCIVMStructs::localHotSpotVMStructs[i];
       
   398     instanceHandle vmFieldObj = InstanceKlass::cast(VMField::klass())->allocate_instance_handle(CHECK_NULL);
       
   399     size_t name_buf_len = strlen(vmField.typeName) + strlen(vmField.fieldName) + 2 /* "::" */;
       
   400     char* name_buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, name_buf_len + 1);
       
   401     sprintf(name_buf, "%s::%s", vmField.typeName, vmField.fieldName);
       
   402     CSTRING_TO_JSTRING(name, name_buf);
       
   403     CSTRING_TO_JSTRING(type, vmField.typeString);
       
   404     VMField::set_name(vmFieldObj, name());
       
   405     VMField::set_type(vmFieldObj, type());
       
   406     VMField::set_offset(vmFieldObj, vmField.offset);
       
   407     VMField::set_address(vmFieldObj, (jlong) vmField.address);
       
   408     if (vmField.isStatic && vmField.typeString != NULL) {
       
   409       if (strcmp(vmField.typeString, "bool") == 0) {
       
   410         BOXED_BOOLEAN(box, *(jbyte*) vmField.address);
       
   411         VMField::set_value(vmFieldObj, box);
       
   412       } else if (strcmp(vmField.typeString, "int") == 0 ||
       
   413                  strcmp(vmField.typeString, "jint") == 0) {
       
   414         BOXED_LONG(box, *(jint*) vmField.address);
       
   415         VMField::set_value(vmFieldObj, box);
       
   416       } else if (strcmp(vmField.typeString, "uint64_t") == 0) {
       
   417         BOXED_LONG(box, *(uint64_t*) vmField.address);
       
   418         VMField::set_value(vmFieldObj, box);
       
   419       } else if (strcmp(vmField.typeString, "address") == 0 ||
       
   420                  strcmp(vmField.typeString, "intptr_t") == 0 ||
       
   421                  strcmp(vmField.typeString, "uintptr_t") == 0 ||
       
   422                  strcmp(vmField.typeString, "OopHandle") == 0 ||
       
   423                  strcmp(vmField.typeString, "size_t") == 0 ||
       
   424                  // All foo* types are addresses.
       
   425                  vmField.typeString[strlen(vmField.typeString) - 1] == '*') {
       
   426         BOXED_LONG(box, *((address*) vmField.address));
       
   427         VMField::set_value(vmFieldObj, box);
       
   428       } else {
       
   429         JVMCI_ERROR_NULL("VM field %s has unsupported type %s", name_buf, vmField.typeString);
       
   430       }
       
   431     }
       
   432     vmFields->obj_at_put(i, vmFieldObj());
       
   433   }
       
   434 
       
   435   int ints_len = JVMCIVMStructs::localHotSpotVMIntConstants_count();
       
   436   int longs_len = JVMCIVMStructs::localHotSpotVMLongConstants_count();
       
   437   len = ints_len + longs_len;
       
   438   objArrayHandle vmConstants = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), len * 2, CHECK_NULL);
       
   439   int insert = 0;
       
   440   for (int i = 0; i < ints_len ; i++) {
       
   441     VMIntConstantEntry c = JVMCIVMStructs::localHotSpotVMIntConstants[i];
       
   442     CSTRING_TO_JSTRING(name, c.name);
       
   443     BOXED_LONG(value, c.value);
       
   444     vmConstants->obj_at_put(insert++, name());
       
   445     vmConstants->obj_at_put(insert++, value);
       
   446   }
       
   447   for (int i = 0; i < longs_len ; i++) {
       
   448     VMLongConstantEntry c = JVMCIVMStructs::localHotSpotVMLongConstants[i];
       
   449     CSTRING_TO_JSTRING(name, c.name);
       
   450     BOXED_LONG(value, c.value);
       
   451     vmConstants->obj_at_put(insert++, name());
       
   452     vmConstants->obj_at_put(insert++, value);
       
   453   }
       
   454   assert(insert == len * 2, "must be");
       
   455 
       
   456   len = JVMCIVMStructs::localHotSpotVMAddresses_count();
       
   457   objArrayHandle vmAddresses = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), len * 2, CHECK_NULL);
       
   458   for (int i = 0; i < len ; i++) {
       
   459     VMAddressEntry a = JVMCIVMStructs::localHotSpotVMAddresses[i];
       
   460     CSTRING_TO_JSTRING(name, a.name);
       
   461     BOXED_LONG(value, a.value);
       
   462     vmAddresses->obj_at_put(i * 2, name());
       
   463     vmAddresses->obj_at_put(i * 2 + 1, value);
       
   464   }
       
   465 
       
   466 #define COUNT_FLAG(ignore) +1
       
   467 #ifdef ASSERT
       
   468 #define CHECK_FLAG(type, name) { \
       
   469   Flag* flag = Flag::find_flag(#name, strlen(#name), /*allow_locked*/ true, /* return_flag */ true); \
       
   470   assert(flag != NULL, "No such flag named " #name); \
       
   471   assert(flag->is_##type(), "Flag " #name " is not of type " #type); \
       
   472 }
       
   473 #else
       
   474 #define CHECK_FLAG(type, name)
       
   475 #endif
       
   476 
       
   477 #define ADD_FLAG(type, name, convert) { \
       
   478   CHECK_FLAG(type, name) \
       
   479   instanceHandle vmFlagObj = InstanceKlass::cast(VMFlag::klass())->allocate_instance_handle(CHECK_NULL); \
       
   480   CSTRING_TO_JSTRING(fname, #name); \
       
   481   CSTRING_TO_JSTRING(ftype, #type); \
       
   482   VMFlag::set_name(vmFlagObj, fname()); \
       
   483   VMFlag::set_type(vmFlagObj, ftype()); \
       
   484   convert(value, name); \
       
   485   VMFlag::set_value(vmFlagObj, value); \
       
   486   vmFlags->obj_at_put(i++, vmFlagObj()); \
       
   487 }
       
   488 #define ADD_BOOL_FLAG(name)  ADD_FLAG(bool, name, BOXED_BOOLEAN)
       
   489 #define ADD_INTX_FLAG(name)  ADD_FLAG(intx, name, BOXED_LONG)
       
   490 #define ADD_UINTX_FLAG(name) ADD_FLAG(uintx, name, BOXED_LONG)
       
   491 
       
   492   len = 0 + PREDEFINED_CONFIG_FLAGS(COUNT_FLAG, COUNT_FLAG, COUNT_FLAG);
       
   493   objArrayHandle vmFlags = oopFactory::new_objArray_handle(VMFlag::klass(), len, CHECK_NULL);
       
   494   int i = 0;
       
   495   PREDEFINED_CONFIG_FLAGS(ADD_BOOL_FLAG, ADD_INTX_FLAG, ADD_UINTX_FLAG)
       
   496 
       
   497   objArrayHandle vmIntrinsics = CompilerToVM::initialize_intrinsics(CHECK_NULL);
       
   498 
       
   499   objArrayOop data = oopFactory::new_objArray(SystemDictionary::Object_klass(), 5, CHECK_NULL);
       
   500   data->obj_at_put(0, vmFields());
       
   501   data->obj_at_put(1, vmConstants());
       
   502   data->obj_at_put(2, vmAddresses());
       
   503   data->obj_at_put(3, vmFlags());
       
   504   data->obj_at_put(4, vmIntrinsics());
       
   505 
       
   506   return (jobjectArray) JNIHandles::make_local(THREAD, data);
       
   507 #undef COUNT_FLAG
       
   508 #undef ADD_FLAG
       
   509 #undef ADD_BOOL_FLAG
       
   510 #undef ADD_INTX_FLAG
       
   511 #undef ADD_UINTX_FLAG
       
   512 #undef CHECK_FLAG
       
   513 C2V_END
   106 C2V_END
   514 
   107 
   515 C2V_VMENTRY(jobject, getFlagValue, (JNIEnv *, jobject c2vm, jobject name_handle))
   108 C2V_VMENTRY(jobject, getFlagValue, (JNIEnv *, jobject c2vm, jobject name_handle))
   516 #define RETURN_BOXED_LONG(value) oop box; jvalue p; p.j = (jlong) (value); box = java_lang_boxing_object::create(T_LONG, &p, CHECK_NULL); return JNIHandles::make_local(THREAD, box);
   109 #define RETURN_BOXED_LONG(value) oop box; jvalue p; p.j = (jlong) (value); box = java_lang_boxing_object::create(T_LONG, &p, CHECK_NULL); return JNIHandles::make_local(THREAD, box);
   517 #define RETURN_BOXED_DOUBLE(value) oop box; jvalue p; p.d = (jdouble) (value); box = java_lang_boxing_object::create(T_DOUBLE, &p, CHECK_NULL); return JNIHandles::make_local(THREAD, box);
   110 #define RETURN_BOXED_DOUBLE(value) oop box; jvalue p; p.d = (jdouble) (value); box = java_lang_boxing_object::create(T_DOUBLE, &p, CHECK_NULL); return JNIHandles::make_local(THREAD, box);
   548   } else if (flag->is_double()) {
   141   } else if (flag->is_double()) {
   549     RETURN_BOXED_DOUBLE(flag->get_double());
   142     RETURN_BOXED_DOUBLE(flag->get_double());
   550   } else {
   143   } else {
   551     JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type);
   144     JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type);
   552   }
   145   }
   553 C2V_END
   146 #undef RETURN_BOXED_LONG
   554 
   147 #undef RETURN_BOXED_DOUBLE
   555 #undef BOXED_LONG
   148 C2V_END
   556 #undef BOXED_DOUBLE
       
   557 #undef CSTRING_TO_JSTRING
       
   558 
   149 
   559 C2V_VMENTRY(jbyteArray, getBytecode, (JNIEnv *, jobject, jobject jvmci_method))
   150 C2V_VMENTRY(jbyteArray, getBytecode, (JNIEnv *, jobject, jobject jvmci_method))
   560   methodHandle method = CompilerToVM::asMethod(jvmci_method);
   151   methodHandle method = CompilerToVM::asMethod(jvmci_method);
   561   ResourceMark rm;
   152   ResourceMark rm;
   562 
   153