Skip to content

Commit ce054c9

Browse files
committed
8284760: Correct type/array element offset in LibraryCallKit::get_state_from_digest_object()
Backport-of: 2ba5cc4163ccd944e2df917e5d617a78fa4ee75b
1 parent 8d6c17d commit ce054c9

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

src/hotspot/share/opto/library_call.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6577,31 +6577,31 @@ bool LibraryCallKit::inline_digestBase_implCompress(vmIntrinsics::ID id) {
65776577
switch(id) {
65786578
case vmIntrinsics::_md5_implCompress:
65796579
assert(UseMD5Intrinsics, "need MD5 instruction support");
6580-
state = get_state_from_digest_object(digestBase_obj, "[I");
6580+
state = get_state_from_digest_object(digestBase_obj, T_INT);
65816581
stubAddr = StubRoutines::md5_implCompress();
65826582
stubName = "md5_implCompress";
65836583
break;
65846584
case vmIntrinsics::_sha_implCompress:
65856585
assert(UseSHA1Intrinsics, "need SHA1 instruction support");
6586-
state = get_state_from_digest_object(digestBase_obj, "[I");
6586+
state = get_state_from_digest_object(digestBase_obj, T_INT);
65876587
stubAddr = StubRoutines::sha1_implCompress();
65886588
stubName = "sha1_implCompress";
65896589
break;
65906590
case vmIntrinsics::_sha2_implCompress:
65916591
assert(UseSHA256Intrinsics, "need SHA256 instruction support");
6592-
state = get_state_from_digest_object(digestBase_obj, "[I");
6592+
state = get_state_from_digest_object(digestBase_obj, T_INT);
65936593
stubAddr = StubRoutines::sha256_implCompress();
65946594
stubName = "sha256_implCompress";
65956595
break;
65966596
case vmIntrinsics::_sha5_implCompress:
65976597
assert(UseSHA512Intrinsics, "need SHA512 instruction support");
6598-
state = get_state_from_digest_object(digestBase_obj, "[J");
6598+
state = get_state_from_digest_object(digestBase_obj, T_LONG);
65996599
stubAddr = StubRoutines::sha512_implCompress();
66006600
stubName = "sha512_implCompress";
66016601
break;
66026602
case vmIntrinsics::_sha3_implCompress:
66036603
assert(UseSHA3Intrinsics, "need SHA3 instruction support");
6604-
state = get_state_from_digest_object(digestBase_obj, "[B");
6604+
state = get_state_from_digest_object(digestBase_obj, T_BYTE);
66056605
stubAddr = StubRoutines::sha3_implCompress();
66066606
stubName = "sha3_implCompress";
66076607
digest_length = get_digest_length_from_digest_object(digestBase_obj);
@@ -6665,7 +6665,7 @@ bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) {
66656665
const char* klass_digestBase_name = nullptr;
66666666
const char* stub_name = nullptr;
66676667
address stub_addr = nullptr;
6668-
const char* state_type = "[I";
6668+
BasicType elem_type = T_INT;
66696669

66706670
switch (predicate) {
66716671
case 0:
@@ -6694,15 +6694,15 @@ bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) {
66946694
klass_digestBase_name = "sun/security/provider/SHA5";
66956695
stub_name = "sha512_implCompressMB";
66966696
stub_addr = StubRoutines::sha512_implCompressMB();
6697-
state_type = "[J";
6697+
elem_type = T_LONG;
66986698
}
66996699
break;
67006700
case 4:
67016701
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_sha3_implCompress)) {
67026702
klass_digestBase_name = "sun/security/provider/SHA3";
67036703
stub_name = "sha3_implCompressMB";
67046704
stub_addr = StubRoutines::sha3_implCompressMB();
6705-
state_type = "[B";
6705+
elem_type = T_BYTE;
67066706
}
67076707
break;
67086708
default:
@@ -6720,21 +6720,21 @@ bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) {
67206720
ciKlass* klass_digestBase = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_digestBase_name));
67216721
assert(klass_digestBase->is_loaded(), "predicate checks that this class is loaded");
67226722
ciInstanceKlass* instklass_digestBase = klass_digestBase->as_instance_klass();
6723-
return inline_digestBase_implCompressMB(digestBase_obj, instklass_digestBase, state_type, stub_addr, stub_name, src_start, ofs, limit);
6723+
return inline_digestBase_implCompressMB(digestBase_obj, instklass_digestBase, elem_type, stub_addr, stub_name, src_start, ofs, limit);
67246724
}
67256725
return false;
67266726
}
67276727

67286728
//------------------------------inline_digestBase_implCompressMB-----------------------
67296729
bool LibraryCallKit::inline_digestBase_implCompressMB(Node* digestBase_obj, ciInstanceKlass* instklass_digestBase,
6730-
const char* state_type, address stubAddr, const char *stubName,
6730+
BasicType elem_type, address stubAddr, const char *stubName,
67316731
Node* src_start, Node* ofs, Node* limit) {
67326732
const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_digestBase);
67336733
const TypeOopPtr* xtype = aklass->as_instance_type();
67346734
Node* digest_obj = new CheckCastPPNode(control(), digestBase_obj, xtype);
67356735
digest_obj = _gvn.transform(digest_obj);
67366736

6737-
Node* state = get_state_from_digest_object(digest_obj, state_type);
6737+
Node* state = get_state_from_digest_object(digest_obj, elem_type);
67386738
if (state == nullptr) return false;
67396739

67406740
Node* digest_length = nullptr;
@@ -6765,13 +6765,20 @@ bool LibraryCallKit::inline_digestBase_implCompressMB(Node* digestBase_obj, ciIn
67656765
}
67666766

67676767
//------------------------------get_state_from_digest_object-----------------------
6768-
Node * LibraryCallKit::get_state_from_digest_object(Node *digest_object, const char *state_type) {
6768+
Node * LibraryCallKit::get_state_from_digest_object(Node *digest_object, BasicType elem_type) {
6769+
const char* state_type;
6770+
switch (elem_type) {
6771+
case T_BYTE: state_type = "[B"; break;
6772+
case T_INT: state_type = "[I"; break;
6773+
case T_LONG: state_type = "[J"; break;
6774+
default: ShouldNotReachHere();
6775+
}
67696776
Node* digest_state = load_field_from_object(digest_object, "state", state_type);
67706777
assert (digest_state != nullptr, "wrong version of sun.security.provider.MD5/SHA/SHA2/SHA5/SHA3");
67716778
if (digest_state == nullptr) return (Node *) nullptr;
67726779

67736780
// now have the array, need to get the start address of the state array
6774-
Node* state = array_element_address(digest_state, intcon(0), T_INT);
6781+
Node* state = array_element_address(digest_state, intcon(0), elem_type);
67756782
return state;
67766783
}
67776784

src/hotspot/share/opto/library_call.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,9 @@ class LibraryCallKit : public GraphKit {
285285
bool inline_digestBase_implCompress(vmIntrinsics::ID id);
286286
bool inline_digestBase_implCompressMB(int predicate);
287287
bool inline_digestBase_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass,
288-
const char* state_type, address stubAddr, const char *stubName,
288+
BasicType elem_type, address stubAddr, const char *stubName,
289289
Node* src_start, Node* ofs, Node* limit);
290-
Node* get_state_from_digest_object(Node *digestBase_object, const char* state_type);
290+
Node* get_state_from_digest_object(Node *digestBase_object, BasicType elem_type);
291291
Node* get_digest_length_from_digest_object(Node *digestBase_object);
292292
Node* inline_digestBase_implCompressMB_predicate(int predicate);
293293
bool inline_encodeISOArray(bool ascii);

0 commit comments

Comments
 (0)