Fix GarbageCollector to work with VERIFY_OBJECT_ENABLED
There were two problems with the GC:
1.) roots were being missed for most of the C++ fields
2.) Heap::RecordFree(Object) was not being called, only Space::Free
To solve #1, added all C++ shadow fields to libcore.
This involed updating dalvik to cope with the new sizes and offsets.
This had the positive side effect of allowing a lot of special cases
in the object scanning and image writing.
To solve #2, added a call to the now public Heap::RecordFree from MarkSweep
Given the now better working GC:
- Reenabled HeapTest.GarbageCollectClassLinkerInit which is now passing.
- ImageWriter now GC's before writing an image to avoid garbage.
Change-Id: Ie7d1cc89e0bcf314cb37f0cabcb8593bf6e4d4be
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index 607382b..3362fdc 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -320,7 +320,10 @@
EXPECT_FALSE(JavaLangObject->IsSynthetic());
EXPECT_EQ(2U, JavaLangObject->NumDirectMethods());
EXPECT_EQ(11U, JavaLangObject->NumVirtualMethods());
- EXPECT_EQ(0U, JavaLangObject->NumInstanceFields());
+ EXPECT_EQ(2U, JavaLangObject->NumInstanceFields());
+ EXPECT_TRUE(JavaLangObject->GetInstanceField(0)->GetName()->Equals("shadow$_klass_"));
+ EXPECT_TRUE(JavaLangObject->GetInstanceField(1)->GetName()->Equals("shadow$_monitor_"));
+
EXPECT_EQ(0U, JavaLangObject->NumStaticFields());
EXPECT_EQ(0U, JavaLangObject->NumInterfaces());
@@ -369,68 +372,265 @@
AssertDexFile(java_lang_dex_file_.get(), NULL);
}
+struct CheckOffset {
+ size_t cpp_offset;
+ const char* java_name;
+ CheckOffset(size_t c, const char* j) : cpp_offset(c), java_name(j) {}
+};
+
+struct CheckOffsets {
+ size_t s;
+ std::string c;
+ std::vector<CheckOffset> o;
+
+ bool Check() {
+ Class* klass = Runtime::Current()->GetClassLinker()->FindSystemClass(c);
+ CHECK(klass != NULL) << c;
+
+ bool error = false;
+
+ if (!klass->IsClassClass())
+ if (s != klass->GetObjectSize()) {
+ LG << "Class size mismatch:"
+ << " class=" << c
+ << " Java=" << klass->GetObjectSize()
+ << " C++=" << s;
+ error = true;
+ }
+
+ CHECK_EQ(o.size(), klass->NumInstanceFields());
+ for (size_t i = 0; i < o.size(); i++) {
+ Field* field = klass->GetInstanceField(i);
+ if (!field->GetName()->Equals(o[i].java_name)) {
+ error = true;
+ }
+ }
+ if (error) {
+ for (size_t i = 0; i < o.size(); i++) {
+ CheckOffset& offset = o[i];
+ Field* field = klass->GetInstanceField(i);
+ if (!field->GetName()->Equals(o[i].java_name)) {
+ LG << "JAVA FIELD ORDER MISMATCH NEXT LINE:";
+ }
+ LG << "Java field order:"
+ << " i=" << i << " class=" << c
+ << " Java=" << field->GetName()->ToModifiedUtf8()
+ << " CheckOffsets=" << offset.java_name;
+ }
+ }
+
+ for (size_t i = 0; i < o.size(); i++) {
+ CheckOffset& offset = o[i];
+ Field* field = klass->GetInstanceField(i);
+ if (field->GetOffset().Uint32Value() != offset.cpp_offset) {
+ error = true;
+ }
+ }
+ if (error) {
+ for (size_t i = 0; i < o.size(); i++) {
+ CheckOffset& offset = o[i];
+ Field* field = klass->GetInstanceField(i);
+ if (field->GetOffset().Uint32Value() != offset.cpp_offset) {
+ LG << "OFFSET MISMATCH NEXT LINE:";
+ }
+ LG << "Offset: class=" << c << " field=" << offset.java_name
+ << " Java=" << field->GetOffset().Uint32Value() << " C++=" << offset.cpp_offset;
+ }
+ }
+
+ return !error;
+ };
+};
+
+struct ObjectOffsets : public CheckOffsets {
+ ObjectOffsets() {
+ s = sizeof(Object);
+ c = "Ljava/lang/Object;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Object, klass_), "shadow$_klass_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Object, monitor_), "shadow$_monitor_"));
+ };
+};
+
+struct AccessibleObjectOffsets : public CheckOffsets {
+ AccessibleObjectOffsets() {
+ s = sizeof(AccessibleObject);
+ c = "Ljava/lang/reflect/AccessibleObject;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(AccessibleObject, java_flag_), "flag"));
+ };
+};
+
+struct FieldOffsets : public CheckOffsets {
+ FieldOffsets() {
+ s = sizeof(Field);
+ c = "Ljava/lang/reflect/Field;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Field, declaring_class_), "declaringClass"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Field, generic_type_), "genericType"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Field, type_), "type"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Field, name_), "name"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Field, access_flags_), "shadow$_access_flags_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Field, offset_), "shadow$_offset_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Field, type_idx_), "shadow$_type_idx_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Field, slot_), "slot"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Field, generic_types_are_initialized_), "genericTypesAreInitialized"));
+ };
+};
+
+struct MethodOffsets : public CheckOffsets {
+ MethodOffsets() {
+ s = sizeof(Method);
+ c = "Ljava/lang/reflect/Method;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, declaring_class_), "declaringClass"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_exception_types_), "exceptionTypes"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_formal_type_parameters_), "formalTypeParameters"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_generic_exception_types_), "genericExceptionTypes"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_generic_parameter_types_), "genericParameterTypes"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_generic_return_type_), "genericReturnType"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, signature_), "shadow$_signature_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, name_), "name"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_parameter_types_), "parameterTypes"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_return_type_), "returnType"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, mapping_table_), "shadow$_mapping_table_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, invoke_stub_array_), "shadow$_invoke_stub_array_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, code_array_), "shadow$_code_array_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, dex_cache_strings_), "shadow$_dex_cache_strings_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, dex_cache_resolved_types_), "shadow$_dex_cache_resolved_types_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, dex_cache_code_and_direct_methods_), "shadow$_dex_cache_code_and_direct_methods_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, dex_cache_initialized_static_storage_), "shadow$_dex_cache_initialized_static_storage_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, dex_cache_resolved_fields_), "shadow$_dex_cache_resolved_fields_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, dex_cache_resolved_methods_), "shadow$_dex_cache_resolved_methods_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, core_spill_mask_), "shadow$_core_spill_mask_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, code_item_offset_), "shadow$_code_item_offset_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, fp_spill_mask_), "shadow$_fp_spill_mask_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, frame_size_in_bytes_), "shadow$_frame_size_in_bytes_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, invoke_stub_), "shadow$_invoke_stub_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, code_), "shadow$_code_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_return_type_idx_), "shadow$_java_return_type_idx_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, access_flags_), "shadow$_access_flags_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, method_index_), "shadow$_method_index_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, native_method_), "shadow$_native_method_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, num_ins_), "shadow$_num_ins_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, num_outs_), "shadow$_num_outs_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, num_registers_), "shadow$_num_registers_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, proto_idx_), "shadow$_proto_idx_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, return_pc_offset_in_bytes_), "shadow$_return_pc_offset_in_bytes_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, shorty_), "shadow$_shorty_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_generic_types_are_initialized_), "genericTypesAreInitialized"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Method, java_slot_), "slot"));
+ };
+};
+
+struct ClassOffsets : public CheckOffsets {
+ ClassOffsets() {
+ s = sizeof(Class);
+ c = "Ljava/lang/Class;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, name_), "name"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, vtable_), "shadow$_vtable_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, virtual_methods_), "shadow$_virtual_methods_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, class_loader_), "shadow$_class_loader_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, verify_error_class_), "shadow$_verify_error_class_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, super_class_), "shadow$_super_class_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, component_type_), "shadow$_component_type_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, descriptor_), "shadow$_descriptor_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, dex_cache_), "shadow$_dex_cache_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, direct_methods_), "shadow$_direct_methods_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, ifields_), "shadow$_ifields_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, sfields_), "shadow$_sfields_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, interfaces_type_idx_), "shadow$_interfaces_type_idx_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, interfaces_), "shadow$_interfaces_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, ifvi_pool_count_), "shadow$_ifvi_pool_count_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, ifvi_pool_), "shadow$_ifvi_pool_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, iftable_count_), "shadow$_iftable_count_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, num_reference_instance_fields_), "shadow$_num_reference_instance_fields_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, num_reference_static_fields_), "shadow$_num_reference_static_fields_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, object_size_), "shadow$_object_size_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, primitive_type_), "shadow$_primitive_type_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, reference_instance_offsets_), "shadow$_reference_instance_offsets_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, reference_static_offsets_), "shadow$_reference_static_offsets_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, iftable_), "shadow$_iftable_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, source_file_), "shadow$_source_file_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, status_), "shadow$_status_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, clinit_thread_id_), "shadow$_clinit_thread_id_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, super_class_type_idx_), "shadow$_super_class_type_idx_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, class_size_), "shadow$_class_size_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, array_rank_), "shadow$_array_rank_"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Class, access_flags_), "shadow$_access_flags_"));
+ };
+};
+
+struct StringOffsets : public CheckOffsets {
+ StringOffsets() {
+ s = sizeof(String);
+ c = "Ljava/lang/String;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(String, array_), "value"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(String, hash_code_), "hashCode"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(String, offset_), "offset"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(String, count_), "count"));
+ };
+};
+
+struct ThrowableOffsets : public CheckOffsets {
+ ThrowableOffsets() {
+ s = sizeof(Throwable);
+ c = "Ljava/lang/Throwable;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Throwable, cause_), "cause"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Throwable, detail_message_), "detailMessage"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Throwable, stack_state_), "stackState"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Throwable, stack_trace_), "stackTrace"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(Throwable, suppressed_exceptions_), "suppressedExceptions"));
+ };
+};
+
+struct StackTraceElementOffsets : public CheckOffsets {
+ StackTraceElementOffsets() {
+ s = sizeof(StackTraceElement);
+ c = "Ljava/lang/StackTraceElement;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(StackTraceElement, declaring_class_), "declaringClass"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(StackTraceElement, file_name_), "fileName"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(StackTraceElement, method_name_), "methodName"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(StackTraceElement, line_number_), "lineNumber"));
+ };
+};
+
+struct ClassLoaderOffsets : public CheckOffsets {
+ ClassLoaderOffsets() {
+ s = sizeof(ClassLoader);
+ c = "Ljava/lang/ClassLoader;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(ClassLoader, packages_), "packages"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(ClassLoader, parent_), "parent"));
+ };
+};
+
+struct BaseDexClassLoaderOffsets : public CheckOffsets {
+ BaseDexClassLoaderOffsets() {
+ s = sizeof(BaseDexClassLoader);
+ c = "Ldalvik/system/BaseDexClassLoader;";
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(BaseDexClassLoader, original_path_), "originalPath"));
+ o.push_back(CheckOffset(OFFSETOF_MEMBER(BaseDexClassLoader, path_list_), "pathList"));
+ };
+};
+
+struct PathClassLoaderOffsets : public CheckOffsets {
+ PathClassLoaderOffsets() {
+ s = sizeof(PathClassLoader);
+ c = "Ldalvik/system/PathClassLoader;";
+ };
+};
+
// C++ fields must exactly match the fields in the Java classes. If this fails,
// reorder the fields in the C++ class. Managed class fields are ordered by
-// ClassLinker::LinkInstanceFields.
+// ClassLinker::LinkFields.
TEST_F(ClassLinkerTest, ValidateFieldOrderOfJavaCppUnionClasses) {
- Class* string = class_linker_->FindSystemClass( "Ljava/lang/String;");
- ASSERT_EQ(4U, string->NumInstanceFields());
- EXPECT_TRUE(string->GetInstanceField(0)->GetName()->Equals("value"));
- EXPECT_TRUE(string->GetInstanceField(1)->GetName()->Equals("hashCode"));
- EXPECT_TRUE(string->GetInstanceField(2)->GetName()->Equals("offset"));
- EXPECT_TRUE(string->GetInstanceField(3)->GetName()->Equals("count"));
-
- Class* throwable = class_linker_->FindSystemClass( "Ljava/lang/Throwable;");
- ASSERT_EQ(5U, throwable->NumInstanceFields());
- EXPECT_TRUE(throwable->GetInstanceField(0)->GetName()->Equals("cause"));
- EXPECT_TRUE(throwable->GetInstanceField(1)->GetName()->Equals("detailMessage"));
- EXPECT_TRUE(throwable->GetInstanceField(2)->GetName()->Equals("stackState"));
- EXPECT_TRUE(throwable->GetInstanceField(3)->GetName()->Equals("stackTrace"));
- EXPECT_TRUE(throwable->GetInstanceField(4)->GetName()->Equals("suppressedExceptions"));
-
- Class* stack_trace_element = class_linker_->FindSystemClass( "Ljava/lang/StackTraceElement;");
- ASSERT_EQ(4U, stack_trace_element->NumInstanceFields());
- EXPECT_TRUE(stack_trace_element->GetInstanceField(0)->GetName()->Equals("declaringClass"));
- EXPECT_TRUE(stack_trace_element->GetInstanceField(1)->GetName()->Equals("fileName"));
- EXPECT_TRUE(stack_trace_element->GetInstanceField(2)->GetName()->Equals("methodName"));
- EXPECT_TRUE(stack_trace_element->GetInstanceField(3)->GetName()->Equals("lineNumber"));
-
- Class* accessible_object = class_linker_->FindSystemClass("Ljava/lang/reflect/AccessibleObject;");
- ASSERT_EQ(1U, accessible_object->NumInstanceFields());
- EXPECT_TRUE(accessible_object->GetInstanceField(0)->GetName()->Equals("flag"));
-
- Class* field = class_linker_->FindSystemClass("Ljava/lang/reflect/Field;");
- ASSERT_EQ(6U, field->NumInstanceFields());
- EXPECT_TRUE(field->GetInstanceField(0)->GetName()->Equals("declaringClass"));
- EXPECT_TRUE(field->GetInstanceField(1)->GetName()->Equals("genericType"));
- EXPECT_TRUE(field->GetInstanceField(2)->GetName()->Equals("type"));
- EXPECT_TRUE(field->GetInstanceField(3)->GetName()->Equals("name"));
- EXPECT_TRUE(field->GetInstanceField(4)->GetName()->Equals("slot"));
- EXPECT_TRUE(field->GetInstanceField(5)->GetName()->Equals("genericTypesAreInitialized"));
-
- Class* method = class_linker_->FindSystemClass("Ljava/lang/reflect/Method;");
- ASSERT_EQ(11U, method->NumInstanceFields());
- EXPECT_TRUE(method->GetInstanceField( 0)->GetName()->Equals("declaringClass"));
- EXPECT_TRUE(method->GetInstanceField( 1)->GetName()->Equals("exceptionTypes"));
- EXPECT_TRUE(method->GetInstanceField( 2)->GetName()->Equals("formalTypeParameters"));
- EXPECT_TRUE(method->GetInstanceField( 3)->GetName()->Equals("genericExceptionTypes"));
- EXPECT_TRUE(method->GetInstanceField( 4)->GetName()->Equals("genericParameterTypes"));
- EXPECT_TRUE(method->GetInstanceField( 5)->GetName()->Equals("genericReturnType"));
- EXPECT_TRUE(method->GetInstanceField( 6)->GetName()->Equals("returnType"));
- EXPECT_TRUE(method->GetInstanceField( 7)->GetName()->Equals("name"));
- EXPECT_TRUE(method->GetInstanceField( 8)->GetName()->Equals("parameterTypes"));
- EXPECT_TRUE(method->GetInstanceField( 9)->GetName()->Equals("genericTypesAreInitialized"));
- EXPECT_TRUE(method->GetInstanceField(10)->GetName()->Equals("slot"));
-
- Class* class_loader = class_linker_->FindSystemClass("Ljava/lang/ClassLoader;");
- ASSERT_EQ(2U, class_loader->NumInstanceFields());
- EXPECT_TRUE(class_loader->GetInstanceField(0)->GetName()->Equals("packages"));
- EXPECT_TRUE(class_loader->GetInstanceField(1)->GetName()->Equals("parent"));
-
- Class* dex_base_class_loader = class_linker_->FindSystemClass("Ldalvik/system/BaseDexClassLoader;");
- ASSERT_EQ(2U, dex_base_class_loader->NumInstanceFields());
- EXPECT_TRUE(dex_base_class_loader->GetInstanceField(0)->GetName()->Equals("originalPath"));
- EXPECT_TRUE(dex_base_class_loader->GetInstanceField(1)->GetName()->Equals("pathList"));
+ EXPECT_TRUE(ObjectOffsets().Check());
+ EXPECT_TRUE(AccessibleObjectOffsets().Check());
+ EXPECT_TRUE(FieldOffsets().Check());
+ EXPECT_TRUE(MethodOffsets().Check());
+ EXPECT_TRUE(ClassOffsets().Check());
+ EXPECT_TRUE(StringOffsets().Check());
+ EXPECT_TRUE(ThrowableOffsets().Check());
+ EXPECT_TRUE(StackTraceElementOffsets().Check());
+ EXPECT_TRUE(ClassLoaderOffsets().Check());
+ EXPECT_TRUE(BaseDexClassLoaderOffsets().Check());
+ EXPECT_TRUE(PathClassLoaderOffsets().Check());
}
// The first reference array element must be a multiple of 8 bytes from the