8252467: AOT need to process new markId DEOPT_MH_HANDLER_ENTRY in compiled code

Reviewed-by: dlong
This commit is contained in:
Vladimir Kozlov 2020-08-27 10:51:48 -07:00
parent 0504064717
commit edf36d90c3
4 changed files with 22 additions and 3 deletions
src
hotspot/share/aot
jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc

@ -40,6 +40,7 @@ private:
int _verified_entry;
int _exception_handler_offset;
int _deopt_handler_offset;
int _deopt_mh_handler_offset;
int _stubs_offset;
int _frame_size;
// location in frame (offset for sp) that deopt can store the original
@ -78,6 +79,7 @@ public:
int verified_entry_offset() const { return _verified_entry; }
int exception_handler_offset() const { return _exception_handler_offset; }
int deopt_handler_offset() const { return _deopt_handler_offset; }
int deopt_mh_handler_offset() const { return _deopt_mh_handler_offset; }
int orig_pc_offset() const { return _orig_pc_offset; }
int handler_table_size() const { return handler_table_end() - handler_table_begin(); }
@ -148,7 +150,11 @@ private:
_scopes_data_begin = (address) _meta->scopes_data_begin();
_deopt_handler_begin = (address) _code + _meta->deopt_handler_offset();
_deopt_mh_handler_begin = (address) this;
if (_meta->deopt_mh_handler_offset() != -1) {
_deopt_mh_handler_begin = (address) _code + _meta->deopt_mh_handler_offset();
} else {
_deopt_mh_handler_begin = (address) this;
}
_pc_desc_container.reset_to(scopes_pcs_begin());

@ -35,12 +35,14 @@ final class CodeOffsets {
private final int verifiedEntry;
private final int exceptionHandler;
private final int deoptHandler;
private final int deoptMHHandler;
private CodeOffsets(int entry, int verifiedEntry, int exceptionHandler, int deoptHandler) {
private CodeOffsets(int entry, int verifiedEntry, int exceptionHandler, int deoptHandler, int deoptMHHandler) {
this.entry = entry;
this.verifiedEntry = verifiedEntry;
this.exceptionHandler = exceptionHandler;
this.deoptHandler = deoptHandler;
this.deoptMHHandler = deoptMHHandler;
}
static CodeOffsets buildFrom(List<CompilationResult.CodeMark> marks) {
@ -48,6 +50,7 @@ final class CodeOffsets {
int verifiedEntry = 0;
int exceptionHandler = -1;
int deoptHandler = -1;
int deoptMHHandler = -1;
for (CompilationResult.CodeMark mark : marks) {
HotSpotMarkId markId = (HotSpotMarkId) mark.id;
@ -67,11 +70,14 @@ final class CodeOffsets {
case DEOPT_HANDLER_ENTRY:
deoptHandler = mark.pcOffset;
break;
case DEOPT_MH_HANDLER_ENTRY:
deoptMHHandler = mark.pcOffset;
break;
default:
break; // Ignore others
}
}
return new CodeOffsets(entry, verifiedEntry, exceptionHandler, deoptHandler);
return new CodeOffsets(entry, verifiedEntry, exceptionHandler, deoptHandler, deoptMHHandler);
}
int entry() {
@ -89,4 +95,8 @@ final class CodeOffsets {
int deoptHandler() {
return deoptHandler;
}
int deoptMHHandler() {
return deoptMHHandler;
}
}

@ -55,6 +55,7 @@ final class MarkProcessor {
switch (markId) {
case EXCEPTION_HANDLER_ENTRY:
case DEOPT_HANDLER_ENTRY:
case DEOPT_MH_HANDLER_ENTRY:
break;
case POLL_FAR:
case POLL_RETURN_FAR:

@ -114,6 +114,7 @@ final class MetadataBuilder {
int verifiedEntry = co.verifiedEntry();
int exceptionHandler = co.exceptionHandler();
int deoptHandler = co.deoptHandler();
int deoptMHHandler = co.deoptMHHandler();
int frameSize = methodInfo.getCompilationResult().getTotalFrameSize();
StackSlot deoptRescueSlot = methodInfo.getCompilationResult().getCustomStackArea();
int origPcOffset = deoptRescueSlot != null ? deoptRescueSlot.getOffset(frameSize) : -1;
@ -135,6 +136,7 @@ final class MetadataBuilder {
putInt(verifiedEntry).
putInt(exceptionHandler).
putInt(deoptHandler).
putInt(deoptMHHandler).
putInt(stubsOffset).
putInt(frameSize).
putInt(origPcOffset).