From cac08ecc868cc9b0b378cf380b1a18185708f4ca Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Sun, 12 Nov 2023 21:10:16 +0000 Subject: Put all cached boxed values into boot_image_live_objects. Test: test.py Change-Id: I16dc434207334aad4768e26704ce20dc98a31f6a --- compiler/optimizing/intrinsic_objects.cc | 76 ++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 34 deletions(-) (limited to 'compiler/optimizing/intrinsic_objects.cc') 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(ImageHeader::kIntrinsicObjectsStart); -ObjPtr> IntrinsicObjects::LookupIntegerCache() { - ArtField* cache_field = WellKnownClasses::java_lang_Integer_IntegerCache_cache; - ObjPtr integer_cache_class = cache_field->GetDeclaringClass(); - DCHECK(integer_cache_class->IsInitialized()); - ObjPtr> integer_cache = +template +static void FillIntrinsicsObjects( + ArtField* cache_field, + ObjPtr> live_objects, + int32_t expected_low, + int32_t expected_high, + T type_check, + size_t& index) + REQUIRES_SHARED(Locks::mutator_lock_) { + ObjPtr> cache = ObjPtr>::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> 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 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> IntrinsicObjects::GetIntegerValueOfCache( - ObjPtr> 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 result = - boot_image_live_objects->GetWithoutChecks( - kIntrinsicObjectsOffset); - DCHECK(result != nullptr); - DCHECK(result->IsObjectArray()); - DCHECK(result->GetClass()->DescriptorEquals("[Ljava/lang/Integer;")); - return ObjPtr>::DownCast(result); -} - -ObjPtr IntrinsicObjects::GetIntegerValueOfObject( +ObjPtr IntrinsicObjects::GetValueOfObject( ObjPtr> boot_image_live_objects, + size_t start_index, uint32_t index) { DCHECK(HasIntrinsicObjects(boot_image_live_objects)); - DCHECK_LT(index, - static_cast(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 result = boot_image_live_objects->GetWithoutChecks( - 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> boot_image_live_objects) { +MemberOffset IntrinsicObjects::GetValueOfArrayDataOffset( + ObjPtr> boot_image_live_objects, + size_t start_index) { DCHECK(HasIntrinsicObjects(boot_image_live_objects)); MemberOffset result = - mirror::ObjectArray::OffsetOfElement(kIntrinsicObjectsOffset + 1u); - DCHECK_EQ(GetIntegerValueOfObject(boot_image_live_objects, 0u), + mirror::ObjectArray::OffsetOfElement(kIntrinsicObjectsOffset + start_index); + DCHECK_EQ(GetValueOfObject(boot_image_live_objects, start_index, 0u), (boot_image_live_objects ->GetFieldObject(result))); return result; -- cgit v1.2.3-59-g8ed1b