8172020: Internal Error (cpu/arm/vm/frame_arm.cpp:571): assert(obj == __null || Universe::heap()->is_in(obj)) failed: sanity check #
Do check_and_handle_earlyret() on method return Reviewed-by: sspitsyn, aph, adinn, simonis
This commit is contained in:
parent
0a19790e65
commit
3b086bdbbb
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -54,9 +54,6 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
int number_of_arguments,
|
int number_of_arguments,
|
||||||
bool check_exceptions);
|
bool check_exceptions);
|
||||||
|
|
||||||
virtual void check_and_handle_popframe(Register java_thread);
|
|
||||||
virtual void check_and_handle_earlyret(Register java_thread);
|
|
||||||
|
|
||||||
// base routine for all dispatches
|
// base routine for all dispatches
|
||||||
void dispatch_base(TosState state, address* table, bool verifyoop = true);
|
void dispatch_base(TosState state, address* table, bool verifyoop = true);
|
||||||
|
|
||||||
@ -67,6 +64,9 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
|
|
||||||
void jump_to_entry(address entry);
|
void jump_to_entry(address entry);
|
||||||
|
|
||||||
|
virtual void check_and_handle_popframe(Register java_thread);
|
||||||
|
virtual void check_and_handle_earlyret(Register java_thread);
|
||||||
|
|
||||||
// Interpreter-specific registers
|
// Interpreter-specific registers
|
||||||
void save_bcp() {
|
void save_bcp() {
|
||||||
str(rbcp, Address(rfp, frame::interpreter_frame_bcp_offset * wordSize));
|
str(rbcp, Address(rfp, frame::interpreter_frame_bcp_offset * wordSize));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -77,12 +77,6 @@ class MacroAssembler: public Assembler {
|
|||||||
bool check_exceptions // whether to check for pending exceptions after return
|
bool check_exceptions // whether to check for pending exceptions after return
|
||||||
);
|
);
|
||||||
|
|
||||||
// These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
|
||||||
// The implementation is only non-empty for the InterpreterMacroAssembler,
|
|
||||||
// as only the interpreter handles PopFrame and ForceEarlyReturn requests.
|
|
||||||
virtual void check_and_handle_popframe(Register java_thread);
|
|
||||||
virtual void check_and_handle_earlyret(Register java_thread);
|
|
||||||
|
|
||||||
void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions = true);
|
void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions = true);
|
||||||
|
|
||||||
// Maximum size of class area in Metaspace when compressed
|
// Maximum size of class area in Metaspace when compressed
|
||||||
@ -97,6 +91,12 @@ class MacroAssembler: public Assembler {
|
|||||||
> (1u << log2_intptr(CompressedClassSpaceSize))));
|
> (1u << log2_intptr(CompressedClassSpaceSize))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
||||||
|
// The implementation is only non-empty for the InterpreterMacroAssembler,
|
||||||
|
// as only the interpreter handles PopFrame and ForceEarlyReturn requests.
|
||||||
|
virtual void check_and_handle_popframe(Register java_thread);
|
||||||
|
virtual void check_and_handle_earlyret(Register java_thread);
|
||||||
|
|
||||||
// Biased locking support
|
// Biased locking support
|
||||||
// lock_reg and obj_reg must be loaded up with the appropriate values.
|
// lock_reg and obj_reg must be loaded up with the appropriate values.
|
||||||
// swap_reg is killed.
|
// swap_reg is killed.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -436,6 +436,10 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
|
|||||||
__ notify(Assembler::method_reentry);
|
__ notify(Assembler::method_reentry);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
__ check_and_handle_popframe(rthread);
|
||||||
|
__ check_and_handle_earlyret(rthread);
|
||||||
|
|
||||||
__ get_dispatch();
|
__ get_dispatch();
|
||||||
__ dispatch_next(state, step);
|
__ dispatch_next(state, step);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -53,9 +53,6 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
// Template interpreter specific version of call_VM_helper
|
// Template interpreter specific version of call_VM_helper
|
||||||
virtual void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions);
|
virtual void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions);
|
||||||
|
|
||||||
virtual void check_and_handle_popframe();
|
|
||||||
virtual void check_and_handle_earlyret();
|
|
||||||
|
|
||||||
// base routine for all dispatches
|
// base routine for all dispatches
|
||||||
typedef enum { DispatchDefault, DispatchNormal } DispatchTableMode;
|
typedef enum { DispatchDefault, DispatchNormal } DispatchTableMode;
|
||||||
void dispatch_base(TosState state, DispatchTableMode table_mode, bool verifyoop = true);
|
void dispatch_base(TosState state, DispatchTableMode table_mode, bool verifyoop = true);
|
||||||
@ -63,6 +60,9 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
public:
|
public:
|
||||||
InterpreterMacroAssembler(CodeBuffer* code);
|
InterpreterMacroAssembler(CodeBuffer* code);
|
||||||
|
|
||||||
|
virtual void check_and_handle_popframe();
|
||||||
|
virtual void check_and_handle_earlyret();
|
||||||
|
|
||||||
// Interpreter-specific registers
|
// Interpreter-specific registers
|
||||||
#if defined(AARCH64) && defined(ASSERT)
|
#if defined(AARCH64) && defined(ASSERT)
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -206,6 +206,9 @@ protected:
|
|||||||
// may customize this version by overriding it for its purposes (e.g., to save/restore
|
// may customize this version by overriding it for its purposes (e.g., to save/restore
|
||||||
// additional registers when doing a VM call).
|
// additional registers when doing a VM call).
|
||||||
virtual void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions);
|
virtual void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions);
|
||||||
|
public:
|
||||||
|
|
||||||
|
MacroAssembler(CodeBuffer* code) : Assembler(code) {}
|
||||||
|
|
||||||
// These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
// These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
||||||
// The implementation is only non-empty for the InterpreterMacroAssembler,
|
// The implementation is only non-empty for the InterpreterMacroAssembler,
|
||||||
@ -213,10 +216,6 @@ protected:
|
|||||||
virtual void check_and_handle_popframe() {}
|
virtual void check_and_handle_popframe() {}
|
||||||
virtual void check_and_handle_earlyret() {}
|
virtual void check_and_handle_earlyret() {}
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
MacroAssembler(CodeBuffer* code) : Assembler(code) {}
|
|
||||||
|
|
||||||
// By default, we do not need relocation information for non
|
// By default, we do not need relocation information for non
|
||||||
// patchable absolute addresses. However, when needed by some
|
// patchable absolute addresses. However, when needed by some
|
||||||
// extensions, ignore_non_patchable_relocations can be modified,
|
// extensions, ignore_non_patchable_relocations can be modified,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -304,6 +304,9 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
|
|||||||
__ convert_retval_to_tos(state);
|
__ convert_retval_to_tos(state);
|
||||||
#endif // !AARCH64
|
#endif // !AARCH64
|
||||||
|
|
||||||
|
__ check_and_handle_popframe();
|
||||||
|
__ check_and_handle_earlyret();
|
||||||
|
|
||||||
__ dispatch_next(state, step);
|
__ dispatch_next(state, step);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
|
@ -45,8 +45,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
#define thread_(field_name) in_bytes(JavaThread::field_name ## _offset()), R16_thread
|
#define thread_(field_name) in_bytes(JavaThread::field_name ## _offset()), R16_thread
|
||||||
#define method_(field_name) in_bytes(Method::field_name ## _offset()), R19_method
|
#define method_(field_name) in_bytes(Method::field_name ## _offset()), R19_method
|
||||||
|
|
||||||
virtual void check_and_handle_popframe(Register java_thread);
|
virtual void check_and_handle_popframe(Register scratch_reg);
|
||||||
virtual void check_and_handle_earlyret(Register java_thread);
|
virtual void check_and_handle_earlyret(Register scratch_reg);
|
||||||
|
|
||||||
// Base routine for all dispatches.
|
// Base routine for all dispatches.
|
||||||
void dispatch_base(TosState state, address* table);
|
void dispatch_base(TosState state, address* table);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2015, 2016 SAP SE. All rights reserved.
|
* Copyright (c) 2015, 2016 SAP SE. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -689,6 +689,10 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
|
|||||||
#endif
|
#endif
|
||||||
__ sldi(size, size, Interpreter::logStackElementSize);
|
__ sldi(size, size, Interpreter::logStackElementSize);
|
||||||
__ add(R15_esp, R15_esp, size);
|
__ add(R15_esp, R15_esp, size);
|
||||||
|
|
||||||
|
__ check_and_handle_popframe(R11_scratch1);
|
||||||
|
__ check_and_handle_earlyret(R11_scratch1);
|
||||||
|
|
||||||
__ dispatch_next(state, step);
|
__ dispatch_next(state, step);
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2016 SAP SE. All rights reserved.
|
* Copyright (c) 2016 SAP SE. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -48,9 +48,6 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
bool allow_relocation,
|
bool allow_relocation,
|
||||||
bool check_exceptions);
|
bool check_exceptions);
|
||||||
|
|
||||||
virtual void check_and_handle_popframe(Register java_thread);
|
|
||||||
virtual void check_and_handle_earlyret(Register java_thread);
|
|
||||||
|
|
||||||
// Base routine for all dispatches.
|
// Base routine for all dispatches.
|
||||||
void dispatch_base(TosState state, address* table);
|
void dispatch_base(TosState state, address* table);
|
||||||
|
|
||||||
@ -58,6 +55,9 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
InterpreterMacroAssembler(CodeBuffer* c)
|
InterpreterMacroAssembler(CodeBuffer* c)
|
||||||
: MacroAssembler(c) {}
|
: MacroAssembler(c) {}
|
||||||
|
|
||||||
|
virtual void check_and_handle_popframe(Register java_thread);
|
||||||
|
virtual void check_and_handle_earlyret(Register java_thread);
|
||||||
|
|
||||||
void jump_to_entry(address entry, Register Rscratch);
|
void jump_to_entry(address entry, Register Rscratch);
|
||||||
|
|
||||||
virtual void load_earlyret_value(TosState state);
|
virtual void load_earlyret_value(TosState state);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2016 SAP SE. All rights reserved.
|
* Copyright (c) 2016 SAP SE. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -676,6 +676,10 @@ address TemplateInterpreterGenerator::generate_return_entry_for (TosState state,
|
|||||||
__ z_llgc(size, Address(cache, offset, flags_offset+(sizeof(size_t)-1)));
|
__ z_llgc(size, Address(cache, offset, flags_offset+(sizeof(size_t)-1)));
|
||||||
__ z_sllg(size, size, Interpreter::logStackElementSize); // Each argument size in bytes.
|
__ z_sllg(size, size, Interpreter::logStackElementSize); // Each argument size in bytes.
|
||||||
__ z_agr(Z_esp, size); // Pop arguments.
|
__ z_agr(Z_esp, size); // Pop arguments.
|
||||||
|
|
||||||
|
__ check_and_handle_popframe(Z_thread);
|
||||||
|
__ check_and_handle_earlyret(Z_thread);
|
||||||
|
|
||||||
__ dispatch_next(state, step);
|
__ dispatch_next(state, step);
|
||||||
|
|
||||||
BLOCK_COMMENT("} return_entry");
|
BLOCK_COMMENT("} return_entry");
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -70,9 +70,6 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
bool check_exception=true
|
bool check_exception=true
|
||||||
);
|
);
|
||||||
|
|
||||||
virtual void check_and_handle_popframe(Register java_thread);
|
|
||||||
virtual void check_and_handle_earlyret(Register java_thread);
|
|
||||||
|
|
||||||
// base routine for all dispatches
|
// base routine for all dispatches
|
||||||
void dispatch_base(TosState state, address* table);
|
void dispatch_base(TosState state, address* table);
|
||||||
|
|
||||||
@ -80,6 +77,9 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
InterpreterMacroAssembler(CodeBuffer* c)
|
InterpreterMacroAssembler(CodeBuffer* c)
|
||||||
: MacroAssembler(c) {}
|
: MacroAssembler(c) {}
|
||||||
|
|
||||||
|
virtual void check_and_handle_popframe(Register scratch_reg);
|
||||||
|
virtual void check_and_handle_earlyret(Register scratch_reg);
|
||||||
|
|
||||||
void jump_to_entry(address entry);
|
void jump_to_entry(address entry);
|
||||||
|
|
||||||
virtual void load_earlyret_value(TosState state);
|
virtual void load_earlyret_value(TosState state);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -604,15 +604,15 @@ class MacroAssembler : public Assembler {
|
|||||||
bool check_exception=true // flag which indicates if exception should be checked
|
bool check_exception=true // flag which indicates if exception should be checked
|
||||||
);
|
);
|
||||||
|
|
||||||
|
public:
|
||||||
|
MacroAssembler(CodeBuffer* code) : Assembler(code) {}
|
||||||
|
|
||||||
// This routine should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
// This routine should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
||||||
// The implementation is only non-empty for the InterpreterMacroAssembler,
|
// The implementation is only non-empty for the InterpreterMacroAssembler,
|
||||||
// as only the interpreter handles and ForceEarlyReturn PopFrame requests.
|
// as only the interpreter handles and ForceEarlyReturn PopFrame requests.
|
||||||
virtual void check_and_handle_popframe(Register scratch_reg);
|
virtual void check_and_handle_popframe(Register scratch_reg);
|
||||||
virtual void check_and_handle_earlyret(Register scratch_reg);
|
virtual void check_and_handle_earlyret(Register scratch_reg);
|
||||||
|
|
||||||
public:
|
|
||||||
MacroAssembler(CodeBuffer* code) : Assembler(code) {}
|
|
||||||
|
|
||||||
// Support for NULL-checks
|
// Support for NULL-checks
|
||||||
//
|
//
|
||||||
// Generates code that causes a NULL OS exception if the content of reg is NULL.
|
// Generates code that causes a NULL OS exception if the content of reg is NULL.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -374,6 +374,10 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
|
|||||||
__ and3(flags, ConstantPoolCacheEntry::parameter_size_mask, parameter_size); // argument size in words
|
__ and3(flags, ConstantPoolCacheEntry::parameter_size_mask, parameter_size); // argument size in words
|
||||||
__ sll(parameter_size, Interpreter::logStackElementSize, parameter_size); // each argument size in bytes
|
__ sll(parameter_size, Interpreter::logStackElementSize, parameter_size); // each argument size in bytes
|
||||||
__ add(Lesp, parameter_size, Lesp); // pop arguments
|
__ add(Lesp, parameter_size, Lesp); // pop arguments
|
||||||
|
|
||||||
|
__ check_and_handle_popframe(Gtemp);
|
||||||
|
__ check_and_handle_earlyret(Gtemp);
|
||||||
|
|
||||||
__ dispatch_next(state, step);
|
__ dispatch_next(state, step);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -48,9 +48,6 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
int number_of_arguments,
|
int number_of_arguments,
|
||||||
bool check_exceptions);
|
bool check_exceptions);
|
||||||
|
|
||||||
virtual void check_and_handle_popframe(Register java_thread);
|
|
||||||
virtual void check_and_handle_earlyret(Register java_thread);
|
|
||||||
|
|
||||||
// base routine for all dispatches
|
// base routine for all dispatches
|
||||||
void dispatch_base(TosState state, address* table, bool verifyoop = true);
|
void dispatch_base(TosState state, address* table, bool verifyoop = true);
|
||||||
|
|
||||||
@ -61,6 +58,9 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
|
|
||||||
void jump_to_entry(address entry);
|
void jump_to_entry(address entry);
|
||||||
|
|
||||||
|
virtual void check_and_handle_popframe(Register java_thread);
|
||||||
|
virtual void check_and_handle_earlyret(Register java_thread);
|
||||||
|
|
||||||
void load_earlyret_value(TosState state);
|
void load_earlyret_value(TosState state);
|
||||||
|
|
||||||
// Interpreter-specific registers
|
// Interpreter-specific registers
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -71,12 +71,6 @@ class MacroAssembler: public Assembler {
|
|||||||
bool check_exceptions // whether to check for pending exceptions after return
|
bool check_exceptions // whether to check for pending exceptions after return
|
||||||
);
|
);
|
||||||
|
|
||||||
// These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
|
||||||
// The implementation is only non-empty for the InterpreterMacroAssembler,
|
|
||||||
// as only the interpreter handles PopFrame and ForceEarlyReturn requests.
|
|
||||||
virtual void check_and_handle_popframe(Register java_thread);
|
|
||||||
virtual void check_and_handle_earlyret(Register java_thread);
|
|
||||||
|
|
||||||
void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions = true);
|
void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions = true);
|
||||||
|
|
||||||
// helpers for FPU flag access
|
// helpers for FPU flag access
|
||||||
@ -87,6 +81,12 @@ class MacroAssembler: public Assembler {
|
|||||||
public:
|
public:
|
||||||
MacroAssembler(CodeBuffer* code) : Assembler(code) {}
|
MacroAssembler(CodeBuffer* code) : Assembler(code) {}
|
||||||
|
|
||||||
|
// These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
||||||
|
// The implementation is only non-empty for the InterpreterMacroAssembler,
|
||||||
|
// as only the interpreter handles PopFrame and ForceEarlyReturn requests.
|
||||||
|
virtual void check_and_handle_popframe(Register java_thread);
|
||||||
|
virtual void check_and_handle_earlyret(Register java_thread);
|
||||||
|
|
||||||
// Support for NULL-checks
|
// Support for NULL-checks
|
||||||
//
|
//
|
||||||
// Generates code that causes a NULL OS exception if the content of reg is NULL.
|
// Generates code that causes a NULL OS exception if the content of reg is NULL.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -220,6 +220,17 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
|
|||||||
__ movl(flags, Address(cache, index, Address::times_ptr, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()));
|
__ movl(flags, Address(cache, index, Address::times_ptr, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()));
|
||||||
__ andl(flags, ConstantPoolCacheEntry::parameter_size_mask);
|
__ andl(flags, ConstantPoolCacheEntry::parameter_size_mask);
|
||||||
__ lea(rsp, Address(rsp, flags, Interpreter::stackElementScale()));
|
__ lea(rsp, Address(rsp, flags, Interpreter::stackElementScale()));
|
||||||
|
|
||||||
|
const Register java_thread = NOT_LP64(rcx) LP64_ONLY(r15_thread);
|
||||||
|
if (JvmtiExport::can_pop_frame()) {
|
||||||
|
NOT_LP64(__ get_thread(java_thread));
|
||||||
|
__ check_and_handle_popframe(java_thread);
|
||||||
|
}
|
||||||
|
if (JvmtiExport::can_force_early_return()) {
|
||||||
|
NOT_LP64(__ get_thread(java_thread));
|
||||||
|
__ check_and_handle_earlyret(java_thread);
|
||||||
|
}
|
||||||
|
|
||||||
__ dispatch_next(state, step);
|
__ dispatch_next(state, step);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user