65 lines
2.5 KiB
Diff
65 lines
2.5 KiB
Diff
|
|
From 29e183488a96a4c169f89eab9410e0a91a903476 Mon Sep 17 00:00:00 2001
|
||
|
|
From: songyaofei <songyaofei2@huawei.com>
|
||
|
|
Date: Tue, 22 Oct 2019 19:18:39 +0000
|
||
|
|
Subject: [PATCH] Reduce the probability of the crash related to
|
||
|
|
ciObjectFactory::create_new_metadata
|
||
|
|
|
||
|
|
Summary: <interpreter>: add load acquire barriers when profiling klass
|
||
|
|
LLT:
|
||
|
|
Bug url:
|
||
|
|
---
|
||
|
|
hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp | 10 ++++++++++
|
||
|
|
hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp | 1 +
|
||
|
|
hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp | 2 +-
|
||
|
|
3 files changed, 12 insertions(+), 1 deletion(-)
|
||
|
|
|
||
|
|
diff --git a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
|
||
|
|
index d8926cd87d..58fc267f99 100644
|
||
|
|
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
|
||
|
|
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
|
||
|
|
@@ -3234,6 +3234,16 @@ void MacroAssembler::load_klass(Register dst, Register src) {
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
+void MacroAssembler::load_klass_acquire(Register dst, Register src) {
|
||
|
|
+ lea(dst, Address(src, oopDesc::klass_offset_in_bytes()));
|
||
|
|
+ if (UseCompressedClassPointers) {
|
||
|
|
+ ldarw(dst, dst);
|
||
|
|
+ decode_klass_not_null(dst);
|
||
|
|
+ } else {
|
||
|
|
+ ldar(dst, dst);
|
||
|
|
+ }
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
void MacroAssembler::cmp_klass(Register oop, Register trial_klass, Register tmp) {
|
||
|
|
if (UseCompressedClassPointers) {
|
||
|
|
ldrw(tmp, Address(oop, oopDesc::klass_offset_in_bytes()));
|
||
|
|
diff --git a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
|
||
|
|
index 2cf827dcf0..168fe4d3b1 100644
|
||
|
|
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
|
||
|
|
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
|
||
|
|
@@ -790,6 +790,7 @@ public:
|
||
|
|
|
||
|
|
// oop manipulations
|
||
|
|
void load_klass(Register dst, Register src);
|
||
|
|
+ void load_klass_acquire(Register dst, Register src);
|
||
|
|
void store_klass(Register dst, Register src);
|
||
|
|
void cmp_klass(Register oop, Register trial_klass, Register tmp);
|
||
|
|
|
||
|
|
diff --git a/hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp
|
||
|
|
index 1e590780b7..7ee4e317d4 100644
|
||
|
|
--- a/hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp
|
||
|
|
+++ b/hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp
|
||
|
|
@@ -3243,7 +3243,7 @@ void TemplateTable::invokevirtual_helper(Register index,
|
||
|
|
|
||
|
|
// get receiver klass
|
||
|
|
__ null_check(recv, oopDesc::klass_offset_in_bytes());
|
||
|
|
- __ load_klass(r0, recv);
|
||
|
|
+ __ load_klass_acquire(r0, recv);
|
||
|
|
|
||
|
|
// profile this call
|
||
|
|
__ profile_virtual_call(r0, rlocals, r3);
|
||
|
|
--
|
||
|
|
2.12.3
|
||
|
|
|