summaryrefslogtreecommitdiff
path: root/compiler/optimizing/intrinsic_objects.cc
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2023-11-12 21:10:16 +0000
committer Nicolas Geoffray <ngeoffray@google.com> 2023-11-17 11:02:27 +0000
commitcac08ecc868cc9b0b378cf380b1a18185708f4ca (patch)
tree50e2a527acf1f160c02279e16ca46b75ca658a62 /compiler/optimizing/intrinsic_objects.cc
parentd36e307dbf3e71f03aab1ccbcfdac35234d4e7a9 (diff)
Put all cached boxed values into boot_image_live_objects.
Test: test.py Change-Id: I16dc434207334aad4768e26704ce20dc98a31f6a
Diffstat (limited to 'compiler/optimizing/intrinsic_objects.cc')
-rw-r--r--compiler/optimizing/intrinsic_objects.cc76
1 files changed, 42 insertions, 34 deletions
diff --git a/compiler/optimizing/intrinsic_objects.cc b/compiler/optimizing/intrinsic_objects.cc
index d7042d22c8..7c430acbe4 100644
--- a/compiler/optimizing/intrinsic_objects.cc
+++ b/compiler/optimizing/intrinsic_objects.cc
@@ -29,16 +29,41 @@ namespace art HIDDEN {
static constexpr size_t kIntrinsicObjectsOffset =
enum_cast<size_t>(ImageHeader::kIntrinsicObjectsStart);
-ObjPtr<mirror::ObjectArray<mirror::Object>> IntrinsicObjects::LookupIntegerCache() {
- ArtField* cache_field = WellKnownClasses::java_lang_Integer_IntegerCache_cache;
- ObjPtr<mirror::Class> integer_cache_class = cache_field->GetDeclaringClass();
- DCHECK(integer_cache_class->IsInitialized());
- ObjPtr<mirror::ObjectArray<mirror::Object>> integer_cache =
+template <typename T>
+static void FillIntrinsicsObjects(
+ ArtField* cache_field,
+ ObjPtr<mirror::ObjectArray<mirror::Object>> live_objects,
+ int32_t expected_low,
+ int32_t expected_high,
+ T type_check,
+ size_t& index)
+ REQUIRES_SHARED(Locks::mutator_lock_) {
+ ObjPtr<mirror::ObjectArray<mirror::Object>> cache =
ObjPtr<mirror::ObjectArray<mirror::Object>>::DownCast(
- cache_field->GetObject(integer_cache_class));
- CHECK(integer_cache != nullptr);
- DCHECK(IntrinsicVisitor::CheckIntegerCacheFields(integer_cache));
- return integer_cache;
+ cache_field->GetObject(cache_field->GetDeclaringClass()));
+ DCHECK_EQ(expected_high - expected_low + 1, cache->GetLength());
+ for (int32_t i = 0, length = cache->GetLength(); i != length; ++i) {
+ live_objects->Set(index++, cache->Get(i));
+ type_check(cache->Get(i), expected_low++);
+ }
+}
+
+void IntrinsicObjects::FillIntrinsicObjects(
+ ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects, size_t start_index) {
+ DCHECK_EQ(start_index, ImageHeader::kIntrinsicObjectsStart);
+ size_t index = start_index;
+#define FILL_OBJECTS(name, low, high, type, offset) \
+ FillIntrinsicsObjects( \
+ WellKnownClasses::java_lang_ ##name ##_ ##name ##Cache_cache, \
+ boot_image_live_objects, \
+ low, \
+ high, \
+ [](ObjPtr<mirror::Object> obj, int32_t expected) REQUIRES_SHARED(Locks::mutator_lock_) { \
+ CHECK_EQ(expected, WellKnownClasses::java_lang_ ##name ##_value->Get ##name(obj)); \
+ }, \
+ index);
+ BOXED_TYPES(FILL_OBJECTS)
+#undef FILL_OBJECTS
}
static bool HasIntrinsicObjects(
@@ -50,43 +75,26 @@ static bool HasIntrinsicObjects(
return length != kIntrinsicObjectsOffset;
}
-ObjPtr<mirror::ObjectArray<mirror::Object>> IntrinsicObjects::GetIntegerValueOfCache(
- ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects) {
- if (!HasIntrinsicObjects(boot_image_live_objects)) {
- return nullptr; // No intrinsic objects.
- }
- // No need for read barrier for boot image object or for verifying the value that was just stored.
- ObjPtr<mirror::Object> result =
- boot_image_live_objects->GetWithoutChecks<kVerifyNone, kWithoutReadBarrier>(
- kIntrinsicObjectsOffset);
- DCHECK(result != nullptr);
- DCHECK(result->IsObjectArray());
- DCHECK(result->GetClass()->DescriptorEquals("[Ljava/lang/Integer;"));
- return ObjPtr<mirror::ObjectArray<mirror::Object>>::DownCast(result);
-}
-
-ObjPtr<mirror::Object> IntrinsicObjects::GetIntegerValueOfObject(
+ObjPtr<mirror::Object> IntrinsicObjects::GetValueOfObject(
ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects,
+ size_t start_index,
uint32_t index) {
DCHECK(HasIntrinsicObjects(boot_image_live_objects));
- DCHECK_LT(index,
- static_cast<uint32_t>(GetIntegerValueOfCache(boot_image_live_objects)->GetLength()));
-
// No need for read barrier for boot image object or for verifying the value that was just stored.
ObjPtr<mirror::Object> result =
boot_image_live_objects->GetWithoutChecks<kVerifyNone, kWithoutReadBarrier>(
- kIntrinsicObjectsOffset + /* skip the IntegerCache.cache */ 1u + index);
+ kIntrinsicObjectsOffset + start_index + index);
DCHECK(result != nullptr);
- DCHECK(result->GetClass()->DescriptorEquals("Ljava/lang/Integer;"));
return result;
}
-MemberOffset IntrinsicObjects::GetIntegerValueOfArrayDataOffset(
- ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects) {
+MemberOffset IntrinsicObjects::GetValueOfArrayDataOffset(
+ ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects,
+ size_t start_index) {
DCHECK(HasIntrinsicObjects(boot_image_live_objects));
MemberOffset result =
- mirror::ObjectArray<mirror::Object>::OffsetOfElement(kIntrinsicObjectsOffset + 1u);
- DCHECK_EQ(GetIntegerValueOfObject(boot_image_live_objects, 0u),
+ mirror::ObjectArray<mirror::Object>::OffsetOfElement(kIntrinsicObjectsOffset + start_index);
+ DCHECK_EQ(GetValueOfObject(boot_image_live_objects, start_index, 0u),
(boot_image_live_objects
->GetFieldObject<mirror::Object, kVerifyNone, kWithoutReadBarrier>(result)));
return result;