Skip to content

Commit 4036d71

Browse files
authored
Merge branch 'openjdk:master' into backport-sendaoYan-7e068cc8-master
2 parents 48818bc + f597463 commit 4036d71

File tree

26 files changed

+329
-68
lines changed

26 files changed

+329
-68
lines changed

src/hotspot/cpu/riscv/interp_masm_riscv.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1937,6 +1937,15 @@ void InterpreterMacroAssembler::load_method_entry(Register cache, Register index
19371937
}
19381938

19391939
#ifdef ASSERT
1940+
void InterpreterMacroAssembler::verify_field_offset(Register reg) {
1941+
// Verify the field offset is not in the header, implicitly checks for 0
1942+
Label L;
1943+
mv(t0, oopDesc::base_offset_in_bytes());
1944+
bge(reg, t0, L);
1945+
stop("bad field offset");
1946+
bind(L);
1947+
}
1948+
19401949
void InterpreterMacroAssembler::verify_access_flags(Register access_flags, uint32_t flag,
19411950
const char* msg, bool stop_by_hit) {
19421951
Label L;

src/hotspot/cpu/riscv/interp_masm_riscv.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
300300
void load_field_entry(Register cache, Register index, int bcp_offset = 1);
301301
void load_method_entry(Register cache, Register index, int bcp_offset = 1);
302302

303+
void verify_field_offset(Register reg) NOT_DEBUG_RETURN;
304+
303305
#ifdef ASSERT
304306
void verify_access_flags(Register access_flags, uint32_t flag,
305307
const char* msg, bool stop_by_hit = true);

src/hotspot/cpu/riscv/templateTable_riscv.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ Address TemplateTable::at_bcp(int offset) {
133133
void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
134134
Register temp_reg, bool load_bc_into_bc_reg /*=true*/,
135135
int byte_no) {
136+
assert_different_registers(bc_reg, temp_reg);
136137
if (!RewriteBytecodes) { return; }
137138
Label L_patch_done;
138139

@@ -196,7 +197,11 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
196197
__ bind(L_okay);
197198
#endif
198199

199-
// patch bytecode
200+
// Patch bytecode with release store to coordinate with ResolvedFieldEntry loads
201+
// in fast bytecode codelets. load_field_entry has a memory barrier that gains
202+
// the needed ordering, together with control dependency on entering the fast codelet
203+
// itself.
204+
__ membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore);
200205
__ sb(bc_reg, at_bcp(0));
201206
__ bind(L_patch_done);
202207
}
@@ -3017,6 +3022,7 @@ void TemplateTable::fast_storefield(TosState state) {
30173022

30183023
// X11: field offset, X12: field holder, X13: flags
30193024
load_resolved_field_entry(x12, x12, noreg, x11, x13);
3025+
__ verify_field_offset(x11);
30203026

30213027
{
30223028
Label notVolatile;
@@ -3104,6 +3110,8 @@ void TemplateTable::fast_accessfield(TosState state) {
31043110
__ load_field_entry(x12, x11);
31053111

31063112
__ load_sized_value(x11, Address(x12, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
3113+
__ verify_field_offset(x11);
3114+
31073115
__ load_unsigned_byte(x13, Address(x12, in_bytes(ResolvedFieldEntry::flags_offset())));
31083116

31093117
// x10: object
@@ -3159,7 +3167,9 @@ void TemplateTable::fast_xaccess(TosState state) {
31593167
__ ld(x10, aaddress(0));
31603168
// access constant pool cache
31613169
__ load_field_entry(x12, x13, 2);
3170+
31623171
__ load_sized_value(x11, Address(x12, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
3172+
__ verify_field_offset(x11);
31633173

31643174
// make sure exception is reported in correct bcp range (getfield is
31653175
// next instruction)

src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -465,13 +465,19 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M
465465
__ call_VM_leaf0(CAST_FROM_FN_PTR(address, SharedRuntime::dtan));
466466
}
467467
} else if (kind == Interpreter::java_lang_math_tanh) {
468-
assert(StubRoutines::dtanh() != nullptr, "not initialized");
468+
if (StubRoutines::dtanh() != nullptr) {
469469
__ movdbl(xmm0, Address(rsp, wordSize));
470470
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dtanh())));
471+
} else {
472+
return nullptr; // Fallback to default implementation
473+
}
471474
} else if (kind == Interpreter::java_lang_math_cbrt) {
472-
assert(StubRoutines::dcbrt() != nullptr, "not initialized");
473-
__ movdbl(xmm0, Address(rsp, wordSize));
474-
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dcbrt())));
475+
if (StubRoutines::dcbrt() != nullptr) {
476+
__ movdbl(xmm0, Address(rsp, wordSize));
477+
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dcbrt())));
478+
} else {
479+
return nullptr; // Fallback to default implementation
480+
}
475481
} else if (kind == Interpreter::java_lang_math_abs) {
476482
assert(StubRoutines::x86::double_sign_mask() != nullptr, "not initialized");
477483
__ movdbl(xmm0, Address(rsp, wordSize));

src/hotspot/share/classfile/stackMapTable.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,16 @@ bool StackMapTable::match_stackmap(
132132
}
133133

134134
void StackMapTable::check_jump_target(
135-
StackMapFrame* frame, int32_t target, TRAPS) const {
135+
StackMapFrame* frame, int bci, int offset, TRAPS) const {
136136
ErrorContext ctx;
137+
// Jump targets must be within the method and the method size is limited. See JVMS 4.11
138+
int min_offset = -1 * max_method_code_size;
139+
if (offset < min_offset || offset > max_method_code_size) {
140+
frame->verifier()->verify_error(ErrorContext::bad_stackmap(bci, frame),
141+
"Illegal target of jump or branch (bci %d + offset %d)", bci, offset);
142+
return;
143+
}
144+
int target = bci + offset;
137145
bool match = match_stackmap(
138146
frame, target, true, false, &ctx, CHECK_VERIFY(frame->verifier()));
139147
if (!match || (target < 0 || target >= _code_length)) {

src/hotspot/share/classfile/stackMapTable.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class StackMapTable : public StackObj {
6767

6868
// Check jump instructions. Make sure there are no uninitialized
6969
// instances on backward branch.
70-
void check_jump_target(StackMapFrame* frame, int32_t target, TRAPS) const;
70+
void check_jump_target(StackMapFrame* frame, int bci, int offset, TRAPS) const;
7171

7272
// The following methods are only used inside this class.
7373

src/hotspot/share/classfile/verifier.cpp

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,6 @@ void ClassVerifier::verify_method(const methodHandle& m, TRAPS) {
781781

782782
// Merge with the next instruction
783783
{
784-
int target;
785784
VerificationType type, type2;
786785
VerificationType atype;
787786

@@ -1606,9 +1605,8 @@ void ClassVerifier::verify_method(const methodHandle& m, TRAPS) {
16061605
case Bytecodes::_ifle:
16071606
current_frame.pop_stack(
16081607
VerificationType::integer_type(), CHECK_VERIFY(this));
1609-
target = bcs.dest();
16101608
stackmap_table.check_jump_target(
1611-
&current_frame, target, CHECK_VERIFY(this));
1609+
&current_frame, bcs.bci(), bcs.get_offset_s2(), CHECK_VERIFY(this));
16121610
no_control_flow = false; break;
16131611
case Bytecodes::_if_acmpeq :
16141612
case Bytecodes::_if_acmpne :
@@ -1619,19 +1617,16 @@ void ClassVerifier::verify_method(const methodHandle& m, TRAPS) {
16191617
case Bytecodes::_ifnonnull :
16201618
current_frame.pop_stack(
16211619
VerificationType::reference_check(), CHECK_VERIFY(this));
1622-
target = bcs.dest();
16231620
stackmap_table.check_jump_target
1624-
(&current_frame, target, CHECK_VERIFY(this));
1621+
(&current_frame, bcs.bci(), bcs.get_offset_s2(), CHECK_VERIFY(this));
16251622
no_control_flow = false; break;
16261623
case Bytecodes::_goto :
1627-
target = bcs.dest();
16281624
stackmap_table.check_jump_target(
1629-
&current_frame, target, CHECK_VERIFY(this));
1625+
&current_frame, bcs.bci(), bcs.get_offset_s2(), CHECK_VERIFY(this));
16301626
no_control_flow = true; break;
16311627
case Bytecodes::_goto_w :
1632-
target = bcs.dest_w();
16331628
stackmap_table.check_jump_target(
1634-
&current_frame, target, CHECK_VERIFY(this));
1629+
&current_frame, bcs.bci(), bcs.get_offset_s4(), CHECK_VERIFY(this));
16351630
no_control_flow = true; break;
16361631
case Bytecodes::_tableswitch :
16371632
case Bytecodes::_lookupswitch :
@@ -2280,15 +2275,14 @@ void ClassVerifier::verify_switch(
22802275
}
22812276
}
22822277
}
2283-
int target = bci + default_offset;
2284-
stackmap_table->check_jump_target(current_frame, target, CHECK_VERIFY(this));
2278+
stackmap_table->check_jump_target(current_frame, bci, default_offset, CHECK_VERIFY(this));
22852279
for (int i = 0; i < keys; i++) {
22862280
// Because check_jump_target() may safepoint, the bytecode could have
22872281
// moved, which means 'aligned_bcp' is no good and needs to be recalculated.
22882282
aligned_bcp = align_up(bcs->bcp() + 1, jintSize);
2289-
target = bci + (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize);
2283+
int offset = (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize);
22902284
stackmap_table->check_jump_target(
2291-
current_frame, target, CHECK_VERIFY(this));
2285+
current_frame, bci, offset, CHECK_VERIFY(this));
22922286
}
22932287
NOT_PRODUCT(aligned_bcp = nullptr); // no longer valid at this point
22942288
}
@@ -2549,7 +2543,12 @@ bool ClassVerifier::ends_in_athrow(u4 start_bc_offset) {
25492543

25502544
case Bytecodes::_goto:
25512545
case Bytecodes::_goto_w: {
2552-
int target = (opcode == Bytecodes::_goto ? bcs.dest() : bcs.dest_w());
2546+
int offset = (opcode == Bytecodes::_goto ? bcs.get_offset_s2() : bcs.get_offset_s4());
2547+
int min_offset = -1 * max_method_code_size;
2548+
// Check offset for overflow
2549+
if (offset < min_offset || offset > max_method_code_size) return false;
2550+
2551+
int target = bci + offset;
25532552
if (visited_branches->contains(bci)) {
25542553
if (bci_stack->is_empty()) {
25552554
if (handler_stack->is_empty()) {
@@ -2607,7 +2606,10 @@ bool ClassVerifier::ends_in_athrow(u4 start_bc_offset) {
26072606

26082607
// Push the switch alternatives onto the stack.
26092608
for (int i = 0; i < keys; i++) {
2610-
int target = bci + (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize);
2609+
int min_offset = -1 * max_method_code_size;
2610+
int offset = (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize);
2611+
if (offset < min_offset || offset > max_method_code_size) return false;
2612+
int target = bci + offset;
26112613
if (target > code_length) return false;
26122614
bci_stack->push(target);
26132615
}

src/hotspot/share/classfile/vmIntrinsics.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,6 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) {
289289
case vmIntrinsics::_dsin:
290290
case vmIntrinsics::_dcos:
291291
case vmIntrinsics::_dtan:
292-
case vmIntrinsics::_dtanh:
293-
case vmIntrinsics::_dcbrt:
294292
case vmIntrinsics::_dlog:
295293
case vmIntrinsics::_dexp:
296294
case vmIntrinsics::_dpow:
@@ -316,6 +314,13 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) {
316314
case vmIntrinsics::_fmaF:
317315
if (!InlineMathNatives || !UseFMA) return true;
318316
break;
317+
case vmIntrinsics::_dtanh:
318+
case vmIntrinsics::_dcbrt:
319+
if (!InlineMathNatives || !InlineIntrinsics) return true;
320+
#if defined(AMD64) && (defined(COMPILER1) || defined(COMPILER2))
321+
if (!UseLibmIntrinsic) return true;
322+
#endif
323+
break;
319324
case vmIntrinsics::_floatToFloat16:
320325
case vmIntrinsics::_float16ToFloat:
321326
if (!InlineIntrinsics) return true;

src/hotspot/share/interpreter/bytecodeStream.hpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,23 @@ class BaseBytecodeStream: StackObj {
100100
void set_next_bci(int bci) { assert(0 <= bci && bci <= method()->code_size(), "illegal bci"); _next_bci = bci; }
101101

102102
// Bytecode-specific attributes
103-
int dest() const { return bci() + bytecode().get_offset_s2(raw_code()); }
104-
int dest_w() const { return bci() + bytecode().get_offset_s4(raw_code()); }
103+
int get_offset_s2() const { return bytecode().get_offset_s2(raw_code()); }
104+
int get_offset_s4() const { return bytecode().get_offset_s4(raw_code()); }
105+
106+
// These methods are not safe to use before or during verification as they may
107+
// have large offsets and cause overflows
108+
int dest() const {
109+
int min_offset = -1 * max_method_code_size;
110+
int offset = bytecode().get_offset_s2(raw_code());
111+
guarantee(offset >= min_offset && offset <= max_method_code_size, "must be");
112+
return bci() + offset;
113+
}
114+
int dest_w() const {
115+
int min_offset = -1 * max_method_code_size;
116+
int offset = bytecode().get_offset_s4(raw_code());
117+
guarantee(offset >= min_offset && offset <= max_method_code_size, "must be");
118+
return bci() + offset;
119+
}
105120

106121
// One-byte indices.
107122
u1 get_index_u1() const { assert_raw_index_size(1); return *(jubyte*)(bcp()+1); }

src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,13 @@ JVMFlag::Error NUMAInterleaveGranularityConstraintFunc(size_t value, bool verbos
147147

148148
return JVMFlag::SUCCESS;
149149
}
150+
151+
JVMFlag::Error LargePageSizeInBytesConstraintFunc(size_t value, bool verbose) {
152+
if (!is_power_of_2(value)) {
153+
JVMFlag::printError(verbose, "LargePageSizeInBytes ( %zu ) must be "
154+
"a power of 2\n",
155+
value);
156+
return JVMFlag::VIOLATES_CONSTRAINT;
157+
}
158+
return JVMFlag::SUCCESS;
159+
}

0 commit comments

Comments
 (0)