changeset 18175:cf09e921458f

Merge
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Mon, 27 Oct 2014 13:39:12 -0700
parents 933b3de3c5b0 (current diff) 26d381457145 (diff)
children c2270ad35f57
files
diffstat 8 files changed, 112 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/compiler/compileBroker.cpp	Mon Oct 27 16:13:50 2014 +0100
+++ b/src/share/vm/compiler/compileBroker.cpp	Mon Oct 27 13:39:12 2014 -0700
@@ -2436,6 +2436,11 @@
   total_compile_count = osr_compile_count + standard_compile_count;
   total_compilation.add(osr_compilation);
   total_compilation.add(standard_compilation);
+
+#ifndef COMPILERGRAAL
+  // In hosted mode, print the Graal compiler specific counters manually.
+  GraalCompiler::print_compilation_timers();
+#endif
 #else
   elapsedTimer standard_compilation = CompileBroker::_t_standard_compilation;
   elapsedTimer osr_compilation = CompileBroker::_t_osr_compilation;
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Mon Oct 27 16:13:50 2014 +0100
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Mon Oct 27 13:39:12 2014 -0700
@@ -52,6 +52,18 @@
 # include "vmreg_ppc.inline.hpp"
 #endif
 
+
+// frequently used constants
+// Allocate them with new so they are never destroyed (otherwise, a
+// forced exit could destroy these objects while they are still in
+// use).
+ConstantOopWriteValue* CodeInstaller::_oop_null_scope_value = new (ResourceObj::C_HEAP, mtCompiler) ConstantOopWriteValue(NULL);
+ConstantIntValue*      CodeInstaller::_int_m1_scope_value = new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(-1);
+ConstantIntValue*      CodeInstaller::_int_0_scope_value =  new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(0);
+ConstantIntValue*      CodeInstaller::_int_1_scope_value =  new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(1);
+ConstantIntValue*      CodeInstaller::_int_2_scope_value =  new (ResourceObj::C_HEAP, mtCompiler) ConstantIntValue(2);
+LocationValue*         CodeInstaller::_illegal_value = new (ResourceObj::C_HEAP, mtCompiler) LocationValue(Location());
+
 Method* getMethodFromHotSpotMethod(oop hotspot_method) {
   assert(hotspot_method != NULL && hotspot_method->is_a(HotSpotResolvedJavaMethod::klass()), "sanity");
   return asMethod(HotSpotResolvedJavaMethod::metaspaceMethod(hotspot_method));
@@ -59,24 +71,23 @@
 
 const int MapWordBits = 64;
 
-static bool is_bit_set(oop bitset, int i) {
+static bool is_bit_set(typeArrayOop words, int i) {
   jint words_idx = i / MapWordBits;
-  arrayOop words = (arrayOop) BitSet::words(bitset);
   assert(words_idx >= 0 && words_idx < words->length(), "unexpected index");
-  jlong word = ((jlong*) words->base(T_LONG))[words_idx];
+  jlong word = words->long_at(words_idx);
   return (word & (1LL << (i % MapWordBits))) != 0;
 }
 
 static int bitset_size(oop bitset) {
-  arrayOop arr = (arrayOop) BitSet::words(bitset);
+  typeArrayOop arr = BitSet::words(bitset);
   return arr->length() * MapWordBits;
 }
 
-static void set_vmreg_oops(OopMap* map, VMReg reg, oop bitset, int idx) {
-  bool is_oop = is_bit_set(bitset, 3 * idx);
+static void set_vmreg_oops(OopMap* map, VMReg reg, typeArrayOop words, int idx) {
+  bool is_oop = is_bit_set(words, 3 * idx);
   if (is_oop) {
-    bool narrow1 = is_bit_set(bitset, 3 * idx + 1);
-    bool narrow2 = is_bit_set(bitset, 3 * idx + 2);
+    bool narrow1 = is_bit_set(words, 3 * idx + 1);
+    bool narrow2 = is_bit_set(words, 3 * idx + 2);
     if (narrow1 || narrow2) {
       if (narrow1) {
         map->set_narrowoop(reg);
@@ -101,15 +112,16 @@
   oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info);
 
   if (register_map != NULL) {
+    typeArrayOop words = BitSet::words(register_map);
     for (jint i = 0; i < RegisterImpl::number_of_registers; i++) {
-      set_vmreg_oops(map, as_Register(i)->as_VMReg(), register_map, i);
+      set_vmreg_oops(map, as_Register(i)->as_VMReg(), words, i);
     }
 #ifdef TARGET_ARCH_x86
     for (jint i = 0; i < XMMRegisterImpl::number_of_registers; i++) {
       VMReg reg = as_XMMRegister(i)->as_VMReg();
       int idx = RegisterImpl::number_of_registers + 4 * i;
       for (jint j = 0; j < 4; j++) {
-        set_vmreg_oops(map, reg->next(2 * j), register_map, idx + j);
+        set_vmreg_oops(map, reg->next(2 * j), words, idx + j);
       }
     }
 #endif
@@ -117,26 +129,28 @@
     for (jint i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
       VMReg reg = as_FloatRegister(i)->as_VMReg();
       int idx = RegisterImpl::number_of_registers + i;
-      set_vmreg_oops(map, reg, register_map, idx);
+      set_vmreg_oops(map, reg, words, idx);
     }
 #endif
   }
 
-  for (jint i = 0; i < bitset_size(frame_map) / 3; i++) {
+  typeArrayOop words = BitSet::words(frame_map);
+  int size = bitset_size(frame_map) / 3;
+  for (jint i = 0; i < size; i++) {
     // HotSpot stack slots are 4 bytes
     VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word);
-    set_vmreg_oops(map, reg, frame_map, i);
+    set_vmreg_oops(map, reg, words, i);
   }
 
   if (callee_save_info != NULL) {
-    objArrayOop registers = (objArrayOop) RegisterSaveLayout::registers(callee_save_info);
-    arrayOop slots = (arrayOop) RegisterSaveLayout::slots(callee_save_info);
+    objArrayOop registers = RegisterSaveLayout::registers(callee_save_info);
+    typeArrayOop slots = RegisterSaveLayout::slots(callee_save_info);
     for (jint i = 0; i < slots->length(); i++) {
       oop graal_reg = registers->obj_at(i);
       jint graal_reg_number = code_Register::number(graal_reg);
       VMReg hotspot_reg = CodeInstaller::get_hotspot_reg(graal_reg_number);
       // HotSpot stack slots are 4 bytes
-      jint graal_slot = ((jint*) slots->base(T_INT))[i];
+      jint graal_slot = slots->int_at(i);
       jint hotspot_slot = graal_slot * VMRegImpl::slots_per_word;
       VMReg hotspot_slot_as_reg = VMRegImpl::stack2reg(hotspot_slot);
       map->set_callee_saved(hotspot_slot_as_reg, hotspot_reg);
@@ -192,7 +206,7 @@
 ScopeValue* CodeInstaller::get_scope_value(oop value, int total_frame_size, GrowableArray<ScopeValue*>* objects, ScopeValue* &second, OopRecorder* oop_recorder) {
   second = NULL;
   if (value == Value::ILLEGAL()) {
-    return new LocationValue(Location::new_stk_loc(Location::invalid, 0));
+    return _illegal_value;
   }
 
   oop lirKind = AbstractValue::lirKind(value);
@@ -283,17 +297,23 @@
         return new ConstantLongValue(prim);
       } else if (type == T_INT || type == T_FLOAT) {
         jint prim = (jint)PrimitiveConstant::primitive(value);
-        return new ConstantIntValue(prim);
+        switch (prim) {
+          case -1: return _int_m1_scope_value;
+          case  0: return _int_0_scope_value;
+          case  1: return _int_1_scope_value;
+          case  2: return _int_2_scope_value;
+          default: return new ConstantIntValue(prim);
+        }
       } else {
         assert(type == T_LONG || type == T_DOUBLE, "unexpected primitive constant type");
         jlong prim = PrimitiveConstant::primitive(value);
-        second = new ConstantIntValue(0);
+        second = _int_1_scope_value;
         return new ConstantLongValue(prim);
       }
     } else {
         assert(reference, "unexpected object constant type");
       if (value->is_a(NullConstant::klass()) || value->is_a(HotSpotCompressedNullConstant::klass())) {
-        return new ConstantOopWriteValue(NULL);
+        return _oop_null_scope_value;
       } else {
         assert(value->is_a(HotSpotObjectConstant::klass()), "unexpected constant type");
         oop obj = HotSpotObjectConstant::object(value);
@@ -318,20 +338,20 @@
     ObjectValue* sv = new ObjectValue(id, new ConstantOopWriteValue(JNIHandles::make_local(Thread::current(), javaMirror)));
     objects->append(sv);
 
-    arrayOop values = (arrayOop) VirtualObject::values(value);
+    objArrayOop values = VirtualObject::values(value);
     for (jint i = 0; i < values->length(); i++) {
       ScopeValue* cur_second = NULL;
-      oop object = ((objArrayOop) (values))->obj_at(i);
+      oop object = values->obj_at(i);
       ScopeValue* value = get_scope_value(object, total_frame_size, objects, cur_second, oop_recorder);
 
       if (isLongArray && cur_second == NULL) {
         // we're trying to put ints into a long array... this isn't really valid, but it's used for some optimizations.
         // add an int 0 constant
 #ifdef VM_LITTLE_ENDIAN
-        cur_second = new ConstantIntValue(0);
+        cur_second = _int_0_scope_value;
 #else
         cur_second = value;
-        value = new ConstantIntValue(0);
+        value = _int_0_scope_value;
 #endif
       }
 
@@ -374,7 +394,7 @@
   _dependencies = new Dependencies(&_arena, _oop_recorder);
   Handle assumptions_handle = CompilationResult::assumptions(HotSpotCompiledCode::comp(compiled_code));
   if (!assumptions_handle.is_null()) {
-    objArrayHandle assumptions(Thread::current(), (objArrayOop)Assumptions::list(assumptions_handle()));
+    objArrayHandle assumptions(Thread::current(), Assumptions::list(assumptions_handle()));
     int length = assumptions->length();
     for (int i = 0; i < length; ++i) {
       Handle assumption = assumptions->obj_at(i);
@@ -479,14 +499,14 @@
   // Pre-calculate the constants section size.  This is required for PC-relative addressing.
   _data_section_handle = JNIHandles::make_local(HotSpotCompiledCode::dataSection(compiled_code));
   guarantee(DataSection::sectionAlignment(data_section()) <= _constants->alignment(), "Alignment inside constants section is restricted by alignment of section begin");
-  arrayHandle data = (arrayOop) DataSection::data(data_section());
+  typeArrayHandle data = DataSection::data(data_section());
   _constants_size = data->length();
   if (_constants_size > 0) {
     _constants_size = align_size_up(_constants_size, _constants->alignment());
   }
 
 #ifndef PRODUCT
-  _comments_handle = JNIHandles::make_local((arrayOop) HotSpotCompiledCode::comments(compiled_code));
+  _comments_handle = JNIHandles::make_local(HotSpotCompiledCode::comments(compiled_code));
 #endif
 
   _next_call_type = INVOKE_INVALID;
@@ -541,12 +561,12 @@
 
   // copy the constant data into the newly created CodeBuffer
   address end_data = _constants->start() + _constants_size;
-  typeArrayHandle data((typeArrayOop) DataSection::data(data_section()));
+  typeArrayHandle data(DataSection::data(data_section()));
   memcpy(_constants->start(), data->base(T_BYTE), data->length());
   _constants->set_end(end_data);
 
   
-  objArrayHandle patches = (objArrayOop) DataSection::patches(data_section());
+  objArrayHandle patches = DataSection::patches(data_section());
   for (int i = 0; i < patches->length(); i++) {
     Handle patch = patches->obj_at(i);
     Handle data = CompilationResult_DataPatch::data(patch);
@@ -743,13 +763,13 @@
     jint local_count = BytecodeFrame::numLocals(frame);
     jint expression_count = BytecodeFrame::numStack(frame);
     jint monitor_count = BytecodeFrame::numLocks(frame);
-    arrayOop values = (arrayOop) BytecodeFrame::values(frame);
+    objArrayOop values = BytecodeFrame::values(frame);
 
     assert(local_count + expression_count + monitor_count == values->length(), "unexpected values length");
 
-    GrowableArray<ScopeValue*>* locals = new GrowableArray<ScopeValue*> ();
-    GrowableArray<ScopeValue*>* expressions = new GrowableArray<ScopeValue*> ();
-    GrowableArray<MonitorValue*>* monitors = new GrowableArray<MonitorValue*> ();
+    GrowableArray<ScopeValue*>* locals = local_count > 0 ? new GrowableArray<ScopeValue*> (local_count) : NULL;
+    GrowableArray<ScopeValue*>* expressions = expression_count > 0 ? new GrowableArray<ScopeValue*> (expression_count) : NULL;
+    GrowableArray<MonitorValue*>* monitors = monitor_count > 0 ? new GrowableArray<MonitorValue*> (monitor_count) : NULL;
 
     if (TraceGraal >= 2) {
       tty->print_cr("Scope at bci %d with %d values", bci, values->length());
@@ -758,7 +778,7 @@
 
     for (jint i = 0; i < values->length(); i++) {
       ScopeValue* second = NULL;
-      oop value=((objArrayOop) (values))->obj_at(i);
+      oop value= values->obj_at(i);
       if (i < local_count) {
         ScopeValue* first = get_scope_value(value, _total_frame_size, objects, second, _oop_recorder);
         if (second != NULL) {
@@ -777,7 +797,7 @@
       if (second != NULL) {
         i++;
         assert(i < values->length(), "double-slot value not followed by Value.ILLEGAL");
-        assert(((objArrayOop) (values))->obj_at(i) == Value::ILLEGAL(), "double-slot value not followed by Value.ILLEGAL");
+        assert(values->obj_at(i) == Value::ILLEGAL(), "double-slot value not followed by Value.ILLEGAL");
       }
     }
 
--- a/src/share/vm/graal/graalCodeInstaller.hpp	Mon Oct 27 16:13:50 2014 +0100
+++ b/src/share/vm/graal/graalCodeInstaller.hpp	Mon Oct 27 13:39:12 2014 -0700
@@ -78,6 +78,13 @@
   Dependencies*             _dependencies;
   ExceptionHandlerTable     _exception_handler_table;
 
+  static ConstantOopWriteValue* _oop_null_scope_value;
+  static ConstantIntValue*    _int_m1_scope_value;
+  static ConstantIntValue*    _int_0_scope_value;
+  static ConstantIntValue*    _int_1_scope_value;
+  static ConstantIntValue*    _int_2_scope_value;
+  static LocationValue*       _illegal_value;
+
   jint pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method);
   void pd_patch_OopData(int pc_offset, oop data);
   void pd_patch_DataSectionReference(int pc_offset, oop data);
--- a/src/share/vm/graal/graalCompiler.cpp	Mon Oct 27 16:13:50 2014 +0100
+++ b/src/share/vm/graal/graalCompiler.cpp	Mon Oct 27 13:39:12 2014 -0700
@@ -136,12 +136,17 @@
 
 // Print compilation timers and statistics
 void GraalCompiler::print_timers() {
+  print_compilation_timers();
+}
+
+#endif // COMPILERGRAAL
+
+// Print compilation timers and statistics
+void GraalCompiler::print_compilation_timers() {
   TRACE_graal_1("GraalCompiler::print_timers");
   tty->print_cr("       Graal code install time:        %6.3f s",    _codeInstallTimer.seconds());
 }
 
-#endif // COMPILERGRAAL
-
 #ifndef PRODUCT
 void GraalCompiler::compile_the_world() {
   HandleMark hm;
--- a/src/share/vm/graal/graalCompiler.hpp	Mon Oct 27 16:13:50 2014 +0100
+++ b/src/share/vm/graal/graalCompiler.hpp	Mon Oct 27 13:39:12 2014 -0700
@@ -81,6 +81,9 @@
   void reset_compilation_stats();
 #endif // COMPILERGRAAL
 
+  // Print compilation timers and statistics
+  static void print_compilation_timers();
+
   static elapsedTimer* codeInstallTimer() { return &_codeInstallTimer; }
 
 #ifndef PRODUCT
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Mon Oct 27 16:13:50 2014 +0100
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Mon Oct 27 13:39:12 2014 -0700
@@ -989,7 +989,7 @@
     HotSpotStackFrameReference::set_localIsVirtual(hs_frame, NULL);
 
     // update the locals array
-    objArrayHandle array = (objArrayOop) HotSpotStackFrameReference::locals(hs_frame);
+    objArrayHandle array = HotSpotStackFrameReference::locals(hs_frame);
     StackValueCollection* locals = virtualFrames->at(last_frame_number)->locals();
     for (int i = 0; i < locals->size(); i++) {
       StackValue* var = locals->at(i);
--- a/src/share/vm/graal/graalJavaAccess.cpp	Mon Oct 27 16:13:50 2014 +0100
+++ b/src/share/vm/graal/graalJavaAccess.cpp	Mon Oct 27 13:39:12 2014 -0700
@@ -66,7 +66,7 @@
 
 
 void graal_compute_offsets() {
-  COMPILER_CLASSES_DO(START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, BOOLEAN_FIELD, LONG_FIELD, FLOAT_FIELD, OOP_FIELD, STATIC_OOP_FIELD, STATIC_INT_FIELD)
+  COMPILER_CLASSES_DO(START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, BOOLEAN_FIELD, LONG_FIELD, FLOAT_FIELD, OOP_FIELD, OOP_FIELD, OOP_FIELD, STATIC_OOP_FIELD, STATIC_INT_FIELD)
   guarantee(InstalledCode::_address_offset == sizeof(oopDesc), "codeBlob must be first field!");
 }
 
@@ -76,7 +76,7 @@
 #define FIELD2(klass, name) int klass::_##name##_offset = 0;
 #define FIELD3(klass, name, sig) FIELD2(klass, name)
 
-COMPILER_CLASSES_DO(EMPTY1, EMPTY0, FIELD2, FIELD2, FIELD2, FIELD2, FIELD2, FIELD3, FIELD3, FIELD2)
+COMPILER_CLASSES_DO(EMPTY1, EMPTY0, FIELD2, FIELD2, FIELD2, FIELD2, FIELD2, FIELD3, FIELD3, FIELD3, FIELD3, FIELD2)
 
 
 
--- a/src/share/vm/graal/graalJavaAccess.hpp	Mon Oct 27 16:13:50 2014 +0100
+++ b/src/share/vm/graal/graalJavaAccess.hpp	Mon Oct 27 13:39:12 2014 -0700
@@ -47,7 +47,7 @@
  *
  */
 
-#define COMPILER_CLASSES_DO(start_class, end_class, char_field, int_field, boolean_field, long_field, float_field, oop_field, static_oop_field, static_int_field) \
+#define COMPILER_CLASSES_DO(start_class, end_class, char_field, int_field, boolean_field, long_field, float_field, oop_field, typeArrayOop_field, objArrayOop_field, static_oop_field, static_int_field) \
   start_class(HotSpotResolvedObjectType)                                                                                                                       \
     oop_field(HotSpotResolvedObjectType, javaClass, "Ljava/lang/Class;")                                                                                       \
   end_class                                                                                                                                                    \
@@ -70,9 +70,9 @@
   end_class                                                                                                                                                    \
   start_class(HotSpotCompiledCode)                                                                                                                             \
     oop_field(HotSpotCompiledCode, comp, "Lcom/oracle/graal/api/code/CompilationResult;")                                                                      \
-    oop_field(HotSpotCompiledCode, sites, "[Lcom/oracle/graal/api/code/CompilationResult$Site;")                                                               \
-    oop_field(HotSpotCompiledCode, exceptionHandlers, "[Lcom/oracle/graal/api/code/CompilationResult$ExceptionHandler;")                                       \
-    oop_field(HotSpotCompiledCode, comments, "[Lcom/oracle/graal/hotspot/HotSpotCompiledCode$Comment;")                                                        \
+    objArrayOop_field(HotSpotCompiledCode, sites, "[Lcom/oracle/graal/api/code/CompilationResult$Site;")                                                       \
+    objArrayOop_field(HotSpotCompiledCode, exceptionHandlers, "[Lcom/oracle/graal/api/code/CompilationResult$ExceptionHandler;")                               \
+    objArrayOop_field(HotSpotCompiledCode, comments, "[Lcom/oracle/graal/hotspot/HotSpotCompiledCode$Comment;")                                                \
     oop_field(HotSpotCompiledCode, dataSection, "Lcom/oracle/graal/hotspot/data/DataSection;")                                                                 \
   end_class                                                                                                                                                    \
   start_class(HotSpotCompiledCode_Comment)                                                                                                                     \
@@ -93,8 +93,8 @@
   end_class                                                                                                                                                    \
   start_class(DataSection)                                                                                                                                     \
     int_field(DataSection, sectionAlignment)                                                                                                                   \
-    oop_field(DataSection, data, "[B")                                                                                                                         \
-    oop_field(DataSection, patches, "[Lcom/oracle/graal/api/code/CompilationResult$DataPatch;")                                                                \
+    typeArrayOop_field(DataSection, data, "[B")                                                                                                                \
+    objArrayOop_field(DataSection, patches, "[Lcom/oracle/graal/api/code/CompilationResult$DataPatch;")                                                        \
   end_class                                                                                                                                                    \
   start_class(DataSectionReference)                                                                                                                            \
     int_field(DataSectionReference, offset)                                                                                                                    \
@@ -114,12 +114,12 @@
   start_class(CompilationResult)                                                                                                                               \
     int_field(CompilationResult, totalFrameSize)                                                                                                               \
     int_field(CompilationResult, customStackAreaOffset)                                                                                                        \
-    oop_field(CompilationResult, targetCode, "[B")                                                                                                             \
+    typeArrayOop_field(CompilationResult, targetCode, "[B")                                                                                                    \
     oop_field(CompilationResult, assumptions, "Lcom/oracle/graal/api/code/Assumptions;")                                                                       \
     int_field(CompilationResult, targetCodeSize)                                                                                                               \
   end_class                                                                                                                                                    \
   start_class(Assumptions)                                                                                                                                     \
-    oop_field(Assumptions, list, "[Lcom/oracle/graal/api/code/Assumptions$Assumption;")                                                                        \
+    objArrayOop_field(Assumptions, list, "[Lcom/oracle/graal/api/code/Assumptions$Assumption;")                                                                \
   end_class                                                                                                                                                    \
   start_class(Assumptions_MethodContents)                                                                                                                      \
     oop_field(Assumptions_MethodContents, method, "Lcom/oracle/graal/api/meta/ResolvedJavaMethod;")                                                            \
@@ -179,14 +179,14 @@
     oop_field(HotSpotReferenceMap, frameRefMap, "Ljava/util/BitSet;")                                                                                          \
   end_class                                                                                                                                                    \
   start_class(RegisterSaveLayout)                                                                                                                              \
-    oop_field(RegisterSaveLayout, registers, "[Lcom/oracle/graal/api/code/Register;")                                                                          \
-    oop_field(RegisterSaveLayout, slots, "[I")                                                                                                                 \
+    objArrayOop_field(RegisterSaveLayout, registers, "[Lcom/oracle/graal/api/code/Register;")                                                                  \
+    typeArrayOop_field(RegisterSaveLayout, slots, "[I")                                                                                                        \
   end_class                                                                                                                                                    \
   start_class(BitSet)                                                                                                                                          \
-    oop_field(BitSet, words, "[J")                                                                                                                             \
+    typeArrayOop_field(BitSet, words, "[J")                                                                                                                    \
   end_class                                                                                                                                                    \
   start_class(BytecodeFrame)                                                                                                                                   \
-    oop_field(BytecodeFrame, values, "[Lcom/oracle/graal/api/meta/Value;")                                                                                     \
+    objArrayOop_field(BytecodeFrame, values, "[Lcom/oracle/graal/api/meta/Value;")                                                                             \
     int_field(BytecodeFrame, numLocals)                                                                                                                        \
     int_field(BytecodeFrame, numStack)                                                                                                                         \
     int_field(BytecodeFrame, numLocks)                                                                                                                         \
@@ -259,7 +259,7 @@
   start_class(VirtualObject)                                                                                                                                   \
     int_field(VirtualObject, id)                                                                                                                               \
     oop_field(VirtualObject, type, "Lcom/oracle/graal/api/meta/ResolvedJavaType;")                                                                             \
-    oop_field(VirtualObject, values, "[Lcom/oracle/graal/api/meta/Value;")                                                                                     \
+    objArrayOop_field(VirtualObject, values, "[Lcom/oracle/graal/api/meta/Value;")                                                                             \
   end_class                                                                                                                                                    \
   start_class(HotSpotMonitorValue)                                                                                                                             \
     oop_field(HotSpotMonitorValue, owner, "Lcom/oracle/graal/api/meta/Value;")                                                                                 \
@@ -275,8 +275,8 @@
     int_field(HotSpotStackFrameReference, frameNumber)                                                                                                         \
     int_field(HotSpotStackFrameReference, bci)                                                                                                                 \
     long_field(HotSpotStackFrameReference, metaspaceMethod)                                                                                                    \
-    oop_field(HotSpotStackFrameReference, locals, "[Ljava/lang/Object;")                                                                                       \
-    oop_field(HotSpotStackFrameReference, localIsVirtual, "[Z")                                                                                                \
+    objArrayOop_field(HotSpotStackFrameReference, locals, "[Ljava/lang/Object;")                                                                               \
+    typeArrayOop_field(HotSpotStackFrameReference, localIsVirtual, "[Z")                                                                                       \
   end_class                                                                                                                                                    \
   /* end*/
 
@@ -294,21 +294,24 @@
 
 #define END_CLASS };
 
-#define FIELD(name, type, accessor)                                                                                                                            \
+#define FIELD(name, type, accessor, cast)                                                                                                                      \
     static int _##name##_offset;                                                                                                                               \
-    static type name(oop obj)                   { check(obj); return obj->accessor(_##name##_offset); }                                                        \
-    static type name(Handle& obj)                { check(obj()); return obj->accessor(_##name##_offset); }                                                     \
-    static type name(jobject obj)               { check(JNIHandles::resolve(obj)); return JNIHandles::resolve(obj)->accessor(_##name##_offset); }              \
+    static type name(oop obj)                   { check(obj); return cast obj->accessor(_##name##_offset); } \
+    static type name(Handle& obj)                { check(obj()); return cast obj->accessor(_##name##_offset); } \
+    static type name(jobject obj)               { check(JNIHandles::resolve(obj)); return cast JNIHandles::resolve(obj)->accessor(_##name##_offset); }              \
     static void set_##name(oop obj, type x)     { check(obj); obj->accessor##_put(_##name##_offset, x); }                                                      \
     static void set_##name(Handle& obj, type x)  { check(obj()); obj->accessor##_put(_##name##_offset, x); }                                                   \
     static void set_##name(jobject obj, type x) { check(JNIHandles::resolve(obj)); JNIHandles::resolve(obj)->accessor##_put(_##name##_offset, x); }
 
-#define CHAR_FIELD(klass, name) FIELD(name, jchar, char_field)
-#define INT_FIELD(klass, name) FIELD(name, jint, int_field)
-#define BOOLEAN_FIELD(klass, name) FIELD(name, jboolean, bool_field)
-#define LONG_FIELD(klass, name) FIELD(name, jlong, long_field)
-#define FLOAT_FIELD(klass, name) FIELD(name, jfloat, float_field)
-#define OOP_FIELD(klass, name, signature) FIELD(name, oop, obj_field)
+#define EMPTY_CAST 
+#define CHAR_FIELD(klass, name) FIELD(name, jchar, char_field, EMPTY_CAST)
+#define INT_FIELD(klass, name) FIELD(name, jint, int_field, EMPTY_CAST)
+#define BOOLEAN_FIELD(klass, name) FIELD(name, jboolean, bool_field, EMPTY_CAST)
+#define LONG_FIELD(klass, name) FIELD(name, jlong, long_field, EMPTY_CAST)
+#define FLOAT_FIELD(klass, name) FIELD(name, jfloat, float_field, EMPTY_CAST)
+#define OOP_FIELD(klass, name, signature) FIELD(name, oop, obj_field, EMPTY_CAST)
+#define OBJARRAYOOP_FIELD(klass, name, signature) FIELD(name, objArrayOop, obj_field, (objArrayOop))
+#define TYPEARRAYOOP_FIELD(klass, name, signature) FIELD(name, typeArrayOop, obj_field, (typeArrayOop))
 #define STATIC_OOP_FIELD(klassName, name, signature)                                                                                                           \
     static int _##name##_offset;                                                                                                                               \
     static oop name() {                                                                                                                                        \
@@ -341,7 +344,7 @@
       address addr = ik->static_field_addr(_##name##_offset - InstanceMirrorKlass::offset_of_static_fields());                                                 \
       *((jint *)addr) = x;                                                                                                                                     \
     }
-COMPILER_CLASSES_DO(START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, BOOLEAN_FIELD, LONG_FIELD, FLOAT_FIELD, OOP_FIELD, STATIC_OOP_FIELD, STATIC_INT_FIELD)
+COMPILER_CLASSES_DO(START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, BOOLEAN_FIELD, LONG_FIELD, FLOAT_FIELD, OOP_FIELD, TYPEARRAYOOP_FIELD, OBJARRAYOOP_FIELD, STATIC_OOP_FIELD, STATIC_INT_FIELD)
 #undef START_CLASS
 #undef END_CLASS
 #undef FIELD
@@ -351,8 +354,11 @@
 #undef LONG_FIELD
 #undef FLOAT_FIELD
 #undef OOP_FIELD
+#undef TYPEARRAYOOP_FIELD
+#undef OBJARRAYOOP_FIELD
 #undef STATIC_OOP_FIELD
 #undef STATIC_INT_FIELD
+#undef EMPTY_CAST
 
 void compute_offset(int &dest_offset, Klass* klass, const char* name, const char* signature, bool static_field);