Skip to content

Commit 867f462

Browse files
committed
8374210: [BACKOUT] Move input validation checks to Java for java.lang.StringCoding intrinsics
Reviewed-by: thartmann Backport-of: 7e18de1
1 parent 08215ae commit 867f462

File tree

23 files changed

+106
-412
lines changed

23 files changed

+106
-412
lines changed

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6259,14 +6259,10 @@ void MacroAssembler::fill_words(Register base, Register cnt, Register value)
62596259

62606260
// Intrinsic for
62616261
//
6262-
// - sun.nio.cs.ISO_8859_1.Encoder#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
6263-
// Encodes char[] to byte[] in ISO-8859-1
6264-
//
6265-
// - java.lang.StringCoding#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
6266-
// Encodes byte[] (containing UTF-16) to byte[] in ISO-8859-1
6267-
//
6268-
// - java.lang.StringCoding#encodeAsciiArray0(char[] sa, int sp, byte[] da, int dp, int len)
6269-
// Encodes char[] to byte[] in ASCII
6262+
// - sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray
6263+
// return the number of characters copied.
6264+
// - java/lang/StringUTF16.compress
6265+
// return index of non-latin1 character if copy fails, otherwise 'len'.
62706266
//
62716267
// This version always returns the number of characters copied, and does not
62726268
// clobber the 'len' register. A successful copy will complete with the post-

src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2736,14 +2736,10 @@ void C2_MacroAssembler::char_array_compress_v(Register src, Register dst, Regist
27362736

27372737
// Intrinsic for
27382738
//
2739-
// - sun.nio.cs.ISO_8859_1.Encoder#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
2740-
// Encodes char[] to byte[] in ISO-8859-1
2741-
//
2742-
// - java.lang.StringCoding#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
2743-
// Encodes byte[] (containing UTF-16) to byte[] in ISO-8859-1
2744-
//
2745-
// - java.lang.StringCoding#encodeAsciiArray0(char[] sa, int sp, byte[] da, int dp, int len)
2746-
// Encodes char[] to byte[] in ASCII
2739+
// - sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray
2740+
// return the number of characters copied.
2741+
// - java/lang/StringUTF16.compress
2742+
// return index of non-latin1 character if copy fails, otherwise 'len'.
27472743
//
27482744
// This version always returns the number of characters copied. A successful
27492745
// copy will complete with the post-condition: 'res' == 'len', while an

src/hotspot/cpu/x86/macroAssembler_x86.cpp

Lines changed: 26 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6054,46 +6054,32 @@ void MacroAssembler::evpbroadcast(BasicType type, XMMRegister dst, Register src,
60546054
}
60556055
}
60566056

6057-
// Encode given char[]/byte[] to byte[] in ISO_8859_1 or ASCII
6058-
//
6059-
// @IntrinsicCandidate
6060-
// int sun.nio.cs.ISO_8859_1.Encoder#encodeISOArray0(
6061-
// char[] sa, int sp, byte[] da, int dp, int len) {
6062-
// int i = 0;
6063-
// for (; i < len; i++) {
6064-
// char c = sa[sp++];
6065-
// if (c > '\u00FF')
6066-
// break;
6067-
// da[dp++] = (byte) c;
6068-
// }
6069-
// return i;
6070-
// }
6071-
//
6072-
// @IntrinsicCandidate
6073-
// int java.lang.StringCoding.encodeISOArray0(
6074-
// byte[] sa, int sp, byte[] da, int dp, int len) {
6075-
// int i = 0;
6076-
// for (; i < len; i++) {
6077-
// char c = StringUTF16.getChar(sa, sp++);
6078-
// if (c > '\u00FF')
6079-
// break;
6080-
// da[dp++] = (byte) c;
6081-
// }
6082-
// return i;
6083-
// }
6084-
//
6085-
// @IntrinsicCandidate
6086-
// int java.lang.StringCoding.encodeAsciiArray0(
6087-
// char[] sa, int sp, byte[] da, int dp, int len) {
6088-
// int i = 0;
6089-
// for (; i < len; i++) {
6090-
// char c = sa[sp++];
6091-
// if (c >= '\u0080')
6092-
// break;
6093-
// da[dp++] = (byte) c;
6094-
// }
6095-
// return i;
6096-
// }
6057+
// encode char[] to byte[] in ISO_8859_1 or ASCII
6058+
//@IntrinsicCandidate
6059+
//private static int implEncodeISOArray(byte[] sa, int sp,
6060+
//byte[] da, int dp, int len) {
6061+
// int i = 0;
6062+
// for (; i < len; i++) {
6063+
// char c = StringUTF16.getChar(sa, sp++);
6064+
// if (c > '\u00FF')
6065+
// break;
6066+
// da[dp++] = (byte)c;
6067+
// }
6068+
// return i;
6069+
//}
6070+
//
6071+
//@IntrinsicCandidate
6072+
//private static int implEncodeAsciiArray(char[] sa, int sp,
6073+
// byte[] da, int dp, int len) {
6074+
// int i = 0;
6075+
// for (; i < len; i++) {
6076+
// char c = sa[sp++];
6077+
// if (c >= '\u0080')
6078+
// break;
6079+
// da[dp++] = (byte)c;
6080+
// }
6081+
// return i;
6082+
//}
60976083
void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
60986084
XMMRegister tmp1Reg, XMMRegister tmp2Reg,
60996085
XMMRegister tmp3Reg, XMMRegister tmp4Reg,

src/hotspot/share/classfile/vmIntrinsics.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -415,18 +415,18 @@ class methodHandle;
415415
\
416416
do_class(java_lang_StringCoding, "java/lang/StringCoding") \
417417
do_intrinsic(_countPositives, java_lang_StringCoding, countPositives_name, countPositives_signature, F_S) \
418-
do_name( countPositives_name, "countPositives0") \
418+
do_name( countPositives_name, "countPositives") \
419419
do_signature(countPositives_signature, "([BII)I") \
420420
\
421421
do_class(sun_nio_cs_iso8859_1_Encoder, "sun/nio/cs/ISO_8859_1$Encoder") \
422422
do_intrinsic(_encodeISOArray, sun_nio_cs_iso8859_1_Encoder, encodeISOArray_name, encodeISOArray_signature, F_S) \
423-
do_name( encodeISOArray_name, "encodeISOArray0") \
423+
do_name( encodeISOArray_name, "implEncodeISOArray") \
424424
do_signature(encodeISOArray_signature, "([CI[BII)I") \
425425
\
426426
do_intrinsic(_encodeByteISOArray, java_lang_StringCoding, encodeISOArray_name, indexOfI_signature, F_S) \
427427
\
428428
do_intrinsic(_encodeAsciiArray, java_lang_StringCoding, encodeAsciiArray_name, encodeISOArray_signature, F_S) \
429-
do_name( encodeAsciiArray_name, "encodeAsciiArray0") \
429+
do_name( encodeAsciiArray_name, "implEncodeAsciiArray") \
430430
\
431431
do_class(java_math_BigInteger, "java/math/BigInteger") \
432432
do_intrinsic(_multiplyToLen, java_math_BigInteger, multiplyToLen_name, multiplyToLen_signature, F_S) \

src/hotspot/share/opto/c2_globals.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -675,9 +675,6 @@
675675
product(bool, PrintIntrinsics, false, DIAGNOSTIC, \
676676
"prints attempted and successful inlining of intrinsics") \
677677
\
678-
develop(bool, VerifyIntrinsicChecks, false, \
679-
"Verify in intrinsic that Java level checks work as expected") \
680-
\
681678
develop(bool, StressReflectiveCode, false, \
682679
"Use inexact types at allocations, etc., to test reflection") \
683680
\

src/hotspot/share/opto/library_call.cpp

Lines changed: 13 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -940,11 +940,7 @@ inline Node* LibraryCallKit::generate_limit_guard(Node* offset,
940940
}
941941

942942
// Emit range checks for the given String.value byte array
943-
void LibraryCallKit::generate_string_range_check(Node* array,
944-
Node* offset,
945-
Node* count,
946-
bool char_count,
947-
bool halt_on_oob) {
943+
void LibraryCallKit::generate_string_range_check(Node* array, Node* offset, Node* count, bool char_count) {
948944
if (stopped()) {
949945
return; // already stopped
950946
}
@@ -962,17 +958,10 @@ void LibraryCallKit::generate_string_range_check(Node* array,
962958
generate_limit_guard(offset, count, load_array_length(array), bailout);
963959

964960
if (bailout->req() > 1) {
965-
if (halt_on_oob) {
966-
bailout = _gvn.transform(bailout)->as_Region();
967-
Node* frame = _gvn.transform(new ParmNode(C->start(), TypeFunc::FramePtr));
968-
Node* halt = _gvn.transform(new HaltNode(bailout, frame, "unexpected guard failure in intrinsic"));
969-
C->root()->add_req(halt);
970-
} else {
971-
PreserveJVMState pjvms(this);
972-
set_control(_gvn.transform(bailout));
973-
uncommon_trap(Deoptimization::Reason_intrinsic,
974-
Deoptimization::Action_maybe_recompile);
975-
}
961+
PreserveJVMState pjvms(this);
962+
set_control(_gvn.transform(bailout));
963+
uncommon_trap(Deoptimization::Reason_intrinsic,
964+
Deoptimization::Action_maybe_recompile);
976965
}
977966
}
978967

@@ -1130,7 +1119,6 @@ bool LibraryCallKit::inline_array_equals(StrIntrinsicNode::ArgEnc ae) {
11301119

11311120

11321121
//------------------------------inline_countPositives------------------------------
1133-
// int java.lang.StringCoding#countPositives0(byte[] ba, int off, int len)
11341122
bool LibraryCallKit::inline_countPositives() {
11351123
if (too_many_traps(Deoptimization::Reason_intrinsic)) {
11361124
return false;
@@ -1142,14 +1130,13 @@ bool LibraryCallKit::inline_countPositives() {
11421130
Node* offset = argument(1);
11431131
Node* len = argument(2);
11441132

1145-
if (VerifyIntrinsicChecks) {
1146-
ba = must_be_not_null(ba, true);
1147-
generate_string_range_check(ba, offset, len, false, true);
1148-
if (stopped()) {
1149-
return true;
1150-
}
1151-
}
1133+
ba = must_be_not_null(ba, true);
11521134

1135+
// Range checks
1136+
generate_string_range_check(ba, offset, len, false);
1137+
if (stopped()) {
1138+
return true;
1139+
}
11531140
Node* ba_start = array_element_address(ba, offset, T_BYTE);
11541141
Node* result = new CountPositivesNode(control(), memory(TypeAryPtr::BYTES), ba_start, len);
11551142
set_result(_gvn.transform(result));
@@ -6180,9 +6167,6 @@ CallStaticJavaNode* LibraryCallKit::get_uncommon_trap_from_success_proj(Node* no
61806167
}
61816168

61826169
//-------------inline_encodeISOArray-----------------------------------
6183-
// int sun.nio.cs.ISO_8859_1.Encoder#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
6184-
// int java.lang.StringCoding#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
6185-
// int java.lang.StringCoding#encodeAsciiArray0(char[] sa, int sp, byte[] da, int dp, int len)
61866170
// encode char[] to byte[] in ISO_8859_1 or ASCII
61876171
bool LibraryCallKit::inline_encodeISOArray(bool ascii) {
61886172
assert(callee()->signature()->size() == 5, "encodeISOArray has 5 parameters");
@@ -6193,14 +6177,8 @@ bool LibraryCallKit::inline_encodeISOArray(bool ascii) {
61936177
Node *dst_offset = argument(3);
61946178
Node *length = argument(4);
61956179

6196-
// Cast source & target arrays to not-null
6197-
if (VerifyIntrinsicChecks) {
6198-
src = must_be_not_null(src, true);
6199-
dst = must_be_not_null(dst, true);
6200-
if (stopped()) {
6201-
return true;
6202-
}
6203-
}
6180+
src = must_be_not_null(src, true);
6181+
dst = must_be_not_null(dst, true);
62046182

62056183
const TypeAryPtr* src_type = src->Value(&_gvn)->isa_aryptr();
62066184
const TypeAryPtr* dst_type = dst->Value(&_gvn)->isa_aryptr();
@@ -6217,15 +6195,6 @@ bool LibraryCallKit::inline_encodeISOArray(bool ascii) {
62176195
return false;
62186196
}
62196197

6220-
// Check source & target bounds
6221-
if (VerifyIntrinsicChecks) {
6222-
generate_string_range_check(src, src_offset, length, src_elem == T_BYTE, true);
6223-
generate_string_range_check(dst, dst_offset, length, false, true);
6224-
if (stopped()) {
6225-
return true;
6226-
}
6227-
}
6228-
62296198
Node* src_start = array_element_address(src, src_offset, T_CHAR);
62306199
Node* dst_start = array_element_address(dst, dst_offset, dst_elem);
62316200
// 'src_start' points to src array + scaled offset

src/hotspot/share/opto/library_call.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,7 @@ class LibraryCallKit : public GraphKit {
163163
Node* array_length,
164164
RegionNode* region);
165165
void generate_string_range_check(Node* array, Node* offset,
166-
Node* length, bool char_count,
167-
bool halt_on_oob = false);
166+
Node* length, bool char_count);
168167
Node* current_thread_helper(Node* &tls_output, ByteSize handle_offset,
169168
bool is_immutable);
170169
Node* generate_current_thread(Node* &tls_output);

src/java.base/share/classes/java/lang/String.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1111,7 +1111,7 @@ private static <E extends Exception> byte[] encode8859_1(byte coder, byte[] val,
11111111
int sp = 0;
11121112
int sl = len;
11131113
while (sp < sl) {
1114-
int ret = StringCoding.encodeISOArray(val, sp, dst, dp, len);
1114+
int ret = StringCoding.implEncodeISOArray(val, sp, dst, dp, len);
11151115
sp = sp + ret;
11161116
dp = dp + ret;
11171117
if (ret != len) {

0 commit comments

Comments
 (0)