Merge
This commit is contained in:
commit
26c0fbda93
src/hotspot
@ -2040,17 +2040,6 @@ void MacroAssembler::clinit_barrier(Register klass, Register thread, Label* L_fa
|
||||
bind(L_fallthrough);
|
||||
}
|
||||
|
||||
void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg,
|
||||
Register temp_reg,
|
||||
Label& wrong_method_type) {
|
||||
assert_different_registers(mtype_reg, mh_reg, temp_reg);
|
||||
// Compare method type against that of the receiver.
|
||||
load_heap_oop(temp_reg, delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg), mh_reg,
|
||||
noreg, noreg, false, IS_NOT_NULL);
|
||||
cmpd(CCR0, temp_reg, mtype_reg);
|
||||
bne(CCR0, wrong_method_type);
|
||||
}
|
||||
|
||||
RegisterOrConstant MacroAssembler::argument_offset(RegisterOrConstant arg_slot,
|
||||
Register temp_reg,
|
||||
int extra_slot_offset) {
|
||||
|
@ -565,8 +565,6 @@ class MacroAssembler: public Assembler {
|
||||
Label* L_slow_path = NULL);
|
||||
|
||||
// Method handle support (JSR 292).
|
||||
void check_method_handle_type(Register mtype_reg, Register mh_reg, Register temp_reg, Label& wrong_method_type);
|
||||
|
||||
RegisterOrConstant argument_offset(RegisterOrConstant arg_slot, Register temp_reg, int extra_slot_offset = 0);
|
||||
|
||||
// Biased locking support
|
||||
|
@ -218,85 +218,6 @@ void Label::patch_instructions(MacroAssembler* masm) {
|
||||
}
|
||||
}
|
||||
|
||||
struct DelayedConstant {
|
||||
typedef void (*value_fn_t)();
|
||||
BasicType type;
|
||||
intptr_t value;
|
||||
value_fn_t value_fn;
|
||||
// This limit of 20 is generous for initial uses.
|
||||
// The limit needs to be large enough to store the field offsets
|
||||
// into classes which do not have statically fixed layouts.
|
||||
// (Initial use is for method handle object offsets.)
|
||||
// Look for uses of "delayed_value" in the source code
|
||||
// and make sure this number is generous enough to handle all of them.
|
||||
enum { DC_LIMIT = 20 };
|
||||
static DelayedConstant delayed_constants[DC_LIMIT];
|
||||
static DelayedConstant* add(BasicType type, value_fn_t value_fn);
|
||||
bool match(BasicType t, value_fn_t cfn) {
|
||||
return type == t && value_fn == cfn;
|
||||
}
|
||||
static void update_all();
|
||||
};
|
||||
|
||||
DelayedConstant DelayedConstant::delayed_constants[DC_LIMIT];
|
||||
// Default C structure initialization rules have the following effect here:
|
||||
// = { { (BasicType)0, (intptr_t)NULL }, ... };
|
||||
|
||||
DelayedConstant* DelayedConstant::add(BasicType type,
|
||||
DelayedConstant::value_fn_t cfn) {
|
||||
for (int i = 0; i < DC_LIMIT; i++) {
|
||||
DelayedConstant* dcon = &delayed_constants[i];
|
||||
if (dcon->match(type, cfn))
|
||||
return dcon;
|
||||
if (dcon->value_fn == NULL) {
|
||||
dcon->value_fn = cfn;
|
||||
dcon->type = type;
|
||||
return dcon;
|
||||
}
|
||||
}
|
||||
// If this assert is hit (in pre-integration testing!) then re-evaluate
|
||||
// the comment on the definition of DC_LIMIT.
|
||||
guarantee(false, "too many delayed constants");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void DelayedConstant::update_all() {
|
||||
for (int i = 0; i < DC_LIMIT; i++) {
|
||||
DelayedConstant* dcon = &delayed_constants[i];
|
||||
if (dcon->value_fn != NULL && dcon->value == 0) {
|
||||
typedef int (*int_fn_t)();
|
||||
typedef address (*address_fn_t)();
|
||||
switch (dcon->type) {
|
||||
case T_INT: dcon->value = (intptr_t) ((int_fn_t) dcon->value_fn)(); break;
|
||||
case T_ADDRESS: dcon->value = (intptr_t) ((address_fn_t)dcon->value_fn)(); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RegisterOrConstant AbstractAssembler::delayed_value(int(*value_fn)(), Register tmp, int offset) {
|
||||
intptr_t val = (intptr_t) (*value_fn)();
|
||||
if (val != 0) return val + offset;
|
||||
return delayed_value_impl(delayed_value_addr(value_fn), tmp, offset);
|
||||
}
|
||||
RegisterOrConstant AbstractAssembler::delayed_value(address(*value_fn)(), Register tmp, int offset) {
|
||||
intptr_t val = (intptr_t) (*value_fn)();
|
||||
if (val != 0) return val + offset;
|
||||
return delayed_value_impl(delayed_value_addr(value_fn), tmp, offset);
|
||||
}
|
||||
intptr_t* AbstractAssembler::delayed_value_addr(int(*value_fn)()) {
|
||||
DelayedConstant* dcon = DelayedConstant::add(T_INT, (DelayedConstant::value_fn_t) value_fn);
|
||||
return &dcon->value;
|
||||
}
|
||||
intptr_t* AbstractAssembler::delayed_value_addr(address(*value_fn)()) {
|
||||
DelayedConstant* dcon = DelayedConstant::add(T_ADDRESS, (DelayedConstant::value_fn_t) value_fn);
|
||||
return &dcon->value;
|
||||
}
|
||||
void AbstractAssembler::update_delayed_values() {
|
||||
DelayedConstant::update_all();
|
||||
}
|
||||
|
||||
void AbstractAssembler::block_comment(const char* comment) {
|
||||
if (sect() == CodeBuffer::SECT_INSTS) {
|
||||
code_section()->outer()->block_comment(offset(), comment);
|
||||
|
@ -4547,9 +4547,6 @@ void JavaClasses::compute_offsets() {
|
||||
// BASIC_JAVA_CLASSES_DO_PART1 classes (java_lang_String and java_lang_Class)
|
||||
// earlier inside SystemDictionary::resolve_well_known_classes()
|
||||
BASIC_JAVA_CLASSES_DO_PART2(DO_COMPUTE_OFFSETS);
|
||||
|
||||
// generated interpreter code wants to know about the offsets we just computed:
|
||||
AbstractAssembler::update_delayed_values();
|
||||
}
|
||||
|
||||
#if INCLUDE_CDS
|
||||
|
Loading…
x
Reference in New Issue
Block a user