# HG changeset patch # User Tom Rodriguez # Date 1414442352 25200 # Node ID cf09e921458fdf51bb9b3f778d15dfdeb67963b6 # Parent 933b3de3c5b02230ce8247b458dbf0c561c77193# Parent 26d381457145adc64e4218c6e7f89696bd2b1372 Merge diff -r 933b3de3c5b0 -r cf09e921458f src/share/vm/compiler/compileBroker.cpp --- 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; diff -r 933b3de3c5b0 -r cf09e921458f src/share/vm/graal/graalCodeInstaller.cpp --- 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* 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* locals = new GrowableArray (); - GrowableArray* expressions = new GrowableArray (); - GrowableArray* monitors = new GrowableArray (); + GrowableArray* locals = local_count > 0 ? new GrowableArray (local_count) : NULL; + GrowableArray* expressions = expression_count > 0 ? new GrowableArray (expression_count) : NULL; + GrowableArray* monitors = monitor_count > 0 ? new GrowableArray (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"); } } diff -r 933b3de3c5b0 -r cf09e921458f src/share/vm/graal/graalCodeInstaller.hpp --- 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); diff -r 933b3de3c5b0 -r cf09e921458f src/share/vm/graal/graalCompiler.cpp --- 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; diff -r 933b3de3c5b0 -r cf09e921458f src/share/vm/graal/graalCompiler.hpp --- 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 diff -r 933b3de3c5b0 -r cf09e921458f src/share/vm/graal/graalCompilerToVM.cpp --- 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); diff -r 933b3de3c5b0 -r cf09e921458f src/share/vm/graal/graalJavaAccess.cpp --- 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) diff -r 933b3de3c5b0 -r cf09e921458f src/share/vm/graal/graalJavaAccess.hpp --- 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);