diff options
author | 2016-11-15 15:51:31 -0800 | |
---|---|---|
committer | 2016-11-16 10:41:40 -0800 | |
commit | 6beced4c017826f7c449f12fac7fa42403657f2b (patch) | |
tree | f53614eeeaa92be9a7398e262d9440f59e3384a5 | |
parent | e89667815b9d0a1eacb91678fed2a7518bb07cc2 (diff) |
Change iftable to never be null
Simplifies code generation by removing a null check. The null case
is rare.
Ritzperf code size: 13107624 -> 13095336
Also addressed comments from previous CL.
Bug: 32577579
Test: test-art-host, run ritzperf both with CC
Change-Id: I2b31e800867112869d7f0643e16c08826296979e
23 files changed, 146 insertions, 122 deletions
diff --git a/compiler/elf_builder.h b/compiler/elf_builder.h index 31a75294bc..7c02384ff2 100644 --- a/compiler/elf_builder.h +++ b/compiler/elf_builder.h @@ -879,7 +879,7 @@ class ElfBuilder FINAL { elf_header.e_ident[EI_MAG2] = ELFMAG2; elf_header.e_ident[EI_MAG3] = ELFMAG3; elf_header.e_ident[EI_CLASS] = (sizeof(Elf_Addr) == sizeof(Elf32_Addr)) - ? ELFCLASS32 : ELFCLASS64;; + ? ELFCLASS32 : ELFCLASS64; elf_header.e_ident[EI_DATA] = ELFDATA2LSB; elf_header.e_ident[EI_VERSION] = EV_CURRENT; elf_header.e_ident[EI_OSABI] = ELFOSABI_LINUX; diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index c6363d1708..7c3a2c6b6e 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -6490,12 +6490,9 @@ void InstructionCodeGeneratorARM::VisitCheckCast(HCheckCast* instruction) { iftable_offset, maybe_temp2_loc, kWithoutReadBarrier); - // Null iftable means it is empty and will always fail the check. - __ CompareAndBranchIfZero(temp, type_check_slow_path->GetEntryLabel()); - - // Loop through the iftable and check if any class matches. + // Iftable is never null. __ ldr(maybe_temp2_loc.AsRegister<Register>(), Address(temp, array_length_offset)); - + // Loop through the iftable and check if any class matches. Label start_loop; __ Bind(&start_loop); __ CompareAndBranchIfZero(maybe_temp2_loc.AsRegister<Register>(), diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index 4ab6065819..6ec9c910ec 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -3802,12 +3802,9 @@ void InstructionCodeGeneratorARM64::VisitCheckCast(HCheckCast* instruction) { iftable_offset, maybe_temp2_loc, kWithoutReadBarrier); - // Null iftable means it is empty and will always fail the check. - __ Cbz(temp, type_check_slow_path->GetEntryLabel()); - - // Loop through the iftable and check if any class matches. + // Iftable is never null. __ Ldr(WRegisterFrom(maybe_temp2_loc), HeapOperand(temp.W(), array_length_offset)); - + // Loop through the iftable and check if any class matches. vixl::aarch64::Label start_loop; __ Bind(&start_loop); __ Cbz(WRegisterFrom(maybe_temp2_loc), type_check_slow_path->GetEntryLabel()); diff --git a/compiler/optimizing/code_generator_arm_vixl.cc b/compiler/optimizing/code_generator_arm_vixl.cc index e9827e8620..c3ea3c7db2 100644 --- a/compiler/optimizing/code_generator_arm_vixl.cc +++ b/compiler/optimizing/code_generator_arm_vixl.cc @@ -5156,11 +5156,14 @@ void InstructionCodeGeneratorARMVIXL::VisitInstanceOf(HInstanceOf* instruction) __ Cbz(obj, &zero); } - // /* HeapReference<Class> */ out = obj->klass_ - GenerateReferenceLoadTwoRegisters(instruction, out_loc, obj_loc, class_offset, maybe_temp_loc); - switch (type_check_kind) { case TypeCheckKind::kExactCheck: { + // /* HeapReference<Class> */ out = obj->klass_ + GenerateReferenceLoadTwoRegisters(instruction, + out_loc, + obj_loc, + class_offset, + maybe_temp_loc); __ Cmp(out, cls); // Classes must be equal for the instanceof to succeed. __ B(ne, &zero); @@ -5170,6 +5173,12 @@ void InstructionCodeGeneratorARMVIXL::VisitInstanceOf(HInstanceOf* instruction) } case TypeCheckKind::kAbstractClassCheck: { + // /* HeapReference<Class> */ out = obj->klass_ + GenerateReferenceLoadTwoRegisters(instruction, + out_loc, + obj_loc, + class_offset, + maybe_temp_loc); // If the class is abstract, we eagerly fetch the super class of the // object to avoid doing a comparison we know will fail. vixl32::Label loop; @@ -5188,6 +5197,12 @@ void InstructionCodeGeneratorARMVIXL::VisitInstanceOf(HInstanceOf* instruction) } case TypeCheckKind::kClassHierarchyCheck: { + // /* HeapReference<Class> */ out = obj->klass_ + GenerateReferenceLoadTwoRegisters(instruction, + out_loc, + obj_loc, + class_offset, + maybe_temp_loc); // Walk over the class hierarchy to find a match. vixl32::Label loop, success; __ Bind(&loop); @@ -5207,6 +5222,12 @@ void InstructionCodeGeneratorARMVIXL::VisitInstanceOf(HInstanceOf* instruction) } case TypeCheckKind::kArrayObjectCheck: { + // /* HeapReference<Class> */ out = obj->klass_ + GenerateReferenceLoadTwoRegisters(instruction, + out_loc, + obj_loc, + class_offset, + maybe_temp_loc); // Do an exact check. vixl32::Label exact_check; __ Cmp(out, cls); @@ -5226,6 +5247,12 @@ void InstructionCodeGeneratorARMVIXL::VisitInstanceOf(HInstanceOf* instruction) } case TypeCheckKind::kArrayCheck: { + // /* HeapReference<Class> */ out = obj->klass_ + GenerateReferenceLoadTwoRegisters(instruction, + out_loc, + obj_loc, + class_offset, + maybe_temp_loc); __ Cmp(out, cls); DCHECK(locations->OnlyCallsOnSlowPath()); slow_path = new (GetGraph()->GetArena()) TypeCheckSlowPathARMVIXL(instruction, diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index 2451b8d247..7e4ad267c8 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -6849,24 +6849,24 @@ void InstructionCodeGeneratorX86::VisitCheckCast(HCheckCast* instruction) { temp_loc, iftable_offset, kWithoutReadBarrier); - // Null iftable means it is empty. - __ testl(temp, temp); - __ j(kZero, type_check_slow_path->GetEntryLabel()); - - // Loop through the iftable and check if any class matches. + // Iftable is never null. __ movl(maybe_temp2_loc.AsRegister<Register>(), Address(temp, array_length_offset)); - + // Loop through the iftable and check if any class matches. NearLabel start_loop; __ Bind(&start_loop); - __ cmpl(cls.AsRegister<Register>(), Address(temp, object_array_data_offset)); - __ j(kEqual, &done); // Return if same class. - // Go to next interface. - __ addl(temp, Immediate(2 * kHeapReferenceSize)); + // Need to subtract first to handle the empty array case. __ subl(maybe_temp2_loc.AsRegister<Register>(), Immediate(2)); - __ j(kNotZero, &start_loop); + __ j(kNegative, type_check_slow_path->GetEntryLabel()); + // Go to next interface if the classes do not match. + __ cmpl(cls.AsRegister<Register>(), + CodeGeneratorX86::ArrayAddress(temp, + maybe_temp2_loc, + TIMES_4, + object_array_data_offset)); + __ j(kNotEqual, &start_loop); + } else { + __ jmp(type_check_slow_path->GetEntryLabel()); } - - __ jmp(type_check_slow_path->GetEntryLabel()); break; } } @@ -7562,7 +7562,7 @@ class RIPFixup : public AssemblerFixup, public ArenaObject<kArenaAllocCodeGenera // The value to patch is the distance from the offset in the constant area // from the address computed by the HX86ComputeBaseMethodAddress instruction. int32_t constant_offset = codegen_->ConstantAreaStart() + offset_into_constant_area_; - int32_t relative_position = constant_offset - codegen_->GetMethodAddressOffset();; + int32_t relative_position = constant_offset - codegen_->GetMethodAddressOffset(); // Patch in the right value. region.StoreUnaligned<int32_t>(pos - 4, relative_position); diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index 2425a4c3cb..19b30192cd 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -6259,23 +6259,24 @@ void InstructionCodeGeneratorX86_64::VisitCheckCast(HCheckCast* instruction) { temp_loc, iftable_offset, kWithoutReadBarrier); - // Null iftable means it is empty. - __ testl(temp, temp); - __ j(kZero, type_check_slow_path->GetEntryLabel()); - - // Loop through the iftable and check if any class matches. + // Iftable is never null. __ movl(maybe_temp2_loc.AsRegister<CpuRegister>(), Address(temp, array_length_offset)); - + // Loop through the iftable and check if any class matches. NearLabel start_loop; __ Bind(&start_loop); - __ cmpl(cls.AsRegister<CpuRegister>(), Address(temp, object_array_data_offset)); - __ j(kEqual, &done); // Return if same class. - // Go to next interface. - __ addl(temp, Immediate(2 * kHeapReferenceSize)); + // Need to subtract first to handle the empty array case. __ subl(maybe_temp2_loc.AsRegister<CpuRegister>(), Immediate(2)); - __ j(kNotZero, &start_loop); + __ j(kNegative, type_check_slow_path->GetEntryLabel()); + // Go to next interface if the classes do not match. + __ cmpl(cls.AsRegister<CpuRegister>(), + CodeGeneratorX86_64::ArrayAddress(temp, + maybe_temp2_loc, + TIMES_4, + object_array_data_offset)); + __ j(kNotEqual, &start_loop); // Return if same class. + } else { + __ jmp(type_check_slow_path->GetEntryLabel()); } - __ jmp(type_check_slow_path->GetEntryLabel()); break; } diff --git a/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc b/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc index 8a9fd90c32..23b2774179 100644 --- a/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc +++ b/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc @@ -49,7 +49,7 @@ static dwarf::Reg DWARFReg(vixl32::SRegister reg) { return dwarf::Reg::ArmFp(static_cast<int>(reg.GetCode())); } -static constexpr size_t kFramePointerSize = static_cast<size_t>(kArmPointerSize);; +static constexpr size_t kFramePointerSize = static_cast<size_t>(kArmPointerSize); void ArmVIXLJNIMacroAssembler::BuildFrame(size_t frame_size, ManagedRegister method_reg, diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index 3d208b5d28..4c01c147c0 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -2783,7 +2783,7 @@ class IMTDumper { bool result = klass->GetImt(pointer_size) == object_class->GetImt(pointer_size); - if (klass->GetIfTable() == nullptr) { + if (klass->GetIfTable()->Count() == 0) { DCHECK(result); } @@ -2889,25 +2889,23 @@ class IMTDumper { std::cerr << " Interfaces:" << std::endl; // Run through iftable, find methods that slot here, see if they fit. mirror::IfTable* if_table = klass->GetIfTable(); - if (if_table != nullptr) { - for (size_t i = 0, num_interfaces = klass->GetIfTableCount(); i < num_interfaces; ++i) { - mirror::Class* iface = if_table->GetInterface(i); - std::string iface_name; - std::cerr << " " << iface->GetDescriptor(&iface_name) << std::endl; - - for (ArtMethod& iface_method : iface->GetVirtualMethods(pointer_size)) { - uint32_t class_hash, name_hash, signature_hash; - ImTable::GetImtHashComponents(&iface_method, &class_hash, &name_hash, &signature_hash); - uint32_t imt_slot = ImTable::GetImtIndex(&iface_method); - std::cerr << " " << iface_method.PrettyMethod(true) - << " slot=" << imt_slot - << std::hex - << " class_hash=0x" << class_hash - << " name_hash=0x" << name_hash - << " signature_hash=0x" << signature_hash - << std::dec - << std::endl; - } + for (size_t i = 0, num_interfaces = klass->GetIfTableCount(); i < num_interfaces; ++i) { + mirror::Class* iface = if_table->GetInterface(i); + std::string iface_name; + std::cerr << " " << iface->GetDescriptor(&iface_name) << std::endl; + + for (ArtMethod& iface_method : iface->GetVirtualMethods(pointer_size)) { + uint32_t class_hash, name_hash, signature_hash; + ImTable::GetImtHashComponents(&iface_method, &class_hash, &name_hash, &signature_hash); + uint32_t imt_slot = ImTable::GetImtIndex(&iface_method); + std::cerr << " " << iface_method.PrettyMethod(true) + << " slot=" << imt_slot + << std::hex + << " class_hash=0x" << class_hash + << " name_hash=0x" << name_hash + << " signature_hash=0x" << signature_hash + << std::dec + << std::endl; } } } @@ -2972,18 +2970,16 @@ class IMTDumper { } else { // Run through iftable, find methods that slot here, see if they fit. mirror::IfTable* if_table = klass->GetIfTable(); - if (if_table != nullptr) { - for (size_t i = 0, num_interfaces = klass->GetIfTableCount(); i < num_interfaces; ++i) { - mirror::Class* iface = if_table->GetInterface(i); - size_t num_methods = iface->NumDeclaredVirtualMethods(); - if (num_methods > 0) { - for (ArtMethod& iface_method : iface->GetMethods(pointer_size)) { - if (ImTable::GetImtIndex(&iface_method) == index) { - std::string i_name = iface_method.PrettyMethod(true); - if (StartsWith(i_name, method.c_str())) { - std::cerr << " Slot " << index << " (1)" << std::endl; - std::cerr << " " << p_name << " (" << i_name << ")" << std::endl; - } + for (size_t i = 0, num_interfaces = klass->GetIfTableCount(); i < num_interfaces; ++i) { + mirror::Class* iface = if_table->GetInterface(i); + size_t num_methods = iface->NumDeclaredVirtualMethods(); + if (num_methods > 0) { + for (ArtMethod& iface_method : iface->GetMethods(pointer_size)) { + if (ImTable::GetImtIndex(&iface_method) == index) { + std::string i_name = iface_method.PrettyMethod(true); + if (StartsWith(i_name, method.c_str())) { + std::cerr << " Slot " << index << " (1)" << std::endl; + std::cerr << " " << p_name << " (" << i_name << ")" << std::endl; } } } diff --git a/patchoat/patchoat.cc b/patchoat/patchoat.cc index 3c8c1a397c..5dc14574a1 100644 --- a/patchoat/patchoat.cc +++ b/patchoat/patchoat.cc @@ -762,16 +762,14 @@ void PatchOat::VisitObject(mirror::Object* object) { if (vtable != nullptr) { vtable->Fixup(RelocatedCopyOfFollowImages(vtable), pointer_size, native_visitor); } - auto* iftable = klass->GetIfTable(); - if (iftable != nullptr) { - for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) { - if (iftable->GetMethodArrayCount(i) > 0) { - auto* method_array = iftable->GetMethodArray(i); - CHECK(method_array != nullptr); - method_array->Fixup(RelocatedCopyOfFollowImages(method_array), - pointer_size, - native_visitor); - } + mirror::IfTable* iftable = klass->GetIfTable(); + for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) { + if (iftable->GetMethodArrayCount(i) > 0) { + auto* method_array = iftable->GetMethodArray(i); + CHECK(method_array != nullptr); + method_array->Fixup(RelocatedCopyOfFollowImages(method_array), + pointer_size, + native_visitor); } } } else if (object->GetClass() == mirror::Method::StaticClass() || diff --git a/runtime/arch/arm/entrypoints_init_arm.cc b/runtime/arch/arm/entrypoints_init_arm.cc index 2a12f1d84a..de72d3a18f 100644 --- a/runtime/arch/arm/entrypoints_init_arm.cc +++ b/runtime/arch/arm/entrypoints_init_arm.cc @@ -86,7 +86,7 @@ void InitEntryPoints(JniEntryPoints* jpoints, QuickEntryPoints* qpoints) { DefaultInitEntryPoints(jpoints, qpoints); // Cast - qpoints->pInstanceofNonTrivial = artInstanceOfFromCode;; + qpoints->pInstanceofNonTrivial = artInstanceOfFromCode; qpoints->pCheckInstanceOf = art_quick_check_instance_of; // Math diff --git a/runtime/class_linker-inl.h b/runtime/class_linker-inl.h index 350855bdba..7359243fc2 100644 --- a/runtime/class_linker-inl.h +++ b/runtime/class_linker-inl.h @@ -69,7 +69,7 @@ inline mirror::String* ClassLinker::ResolveString(uint32_t string_idx, ArtMethod Thread::PoisonObjectPointersIfDebug(); ObjPtr<mirror::Class> declaring_class = referrer->GetDeclaringClass(); // MethodVerifier refuses methods with string_idx out of bounds. - DCHECK_LT(string_idx, declaring_class->GetDexFile().NumStringIds());; + DCHECK_LT(string_idx, declaring_class->GetDexFile().NumStringIds()); ObjPtr<mirror::String> string = mirror::StringDexCachePair::Lookup(declaring_class->GetDexCacheStrings(), string_idx, diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index ac5e6aae31..65e46c2248 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -475,6 +475,9 @@ bool ClassLinker::InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> b SetClassRoot(kJavaLangString, java_lang_String.Get()); SetClassRoot(kJavaLangRefReference, java_lang_ref_Reference.Get()); + // Fill in the empty iftable. Needs to be done after the kObjectArrayClass root is set. + java_lang_Object->SetIfTable(AllocIfTable(self, 0)); + // Setup the primitive type classes. SetClassRoot(kPrimitiveBoolean, CreatePrimitiveClass(self, Primitive::kPrimBoolean)); SetClassRoot(kPrimitiveByte, CreatePrimitiveClass(self, Primitive::kPrimByte)); @@ -916,13 +919,11 @@ static void SanityCheckObjectsCallback(mirror::Object* obj, void* arg ATTRIBUTE_ SanityCheckArtMethod(klass->GetEmbeddedVTableEntry(i, pointer_size), nullptr, image_spaces); } } - auto* iftable = klass->GetIfTable(); - if (iftable != nullptr) { - for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) { - if (iftable->GetMethodArrayCount(i) > 0) { - SanityCheckArtMethodPointerArray( - iftable->GetMethodArray(i), nullptr, pointer_size, image_spaces); - } + mirror::IfTable* iftable = klass->GetIfTable(); + for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) { + if (iftable->GetMethodArrayCount(i) > 0) { + SanityCheckArtMethodPointerArray( + iftable->GetMethodArray(i), nullptr, pointer_size, image_spaces); } } } @@ -3401,7 +3402,8 @@ void ClassLinker::FixupDexCaches(ArtMethod* resolution_method) { } mirror::Class* ClassLinker::CreatePrimitiveClass(Thread* self, Primitive::Type type) { - ObjPtr<mirror::Class> klass = AllocClass(self, mirror::Class::PrimitiveClassSize(image_pointer_size_)); + ObjPtr<mirror::Class> klass = + AllocClass(self, mirror::Class::PrimitiveClassSize(image_pointer_size_)); if (UNLIKELY(klass == nullptr)) { self->AssertPendingOOMException(); return nullptr; @@ -3419,10 +3421,12 @@ mirror::Class* ClassLinker::InitializePrimitiveClass(ObjPtr<mirror::Class> primi ObjectLock<mirror::Class> lock(self, h_class); h_class->SetAccessFlags(kAccPublic | kAccFinal | kAccAbstract); h_class->SetPrimitiveType(type); + h_class->SetIfTable(GetClassRoot(kJavaLangObject)->GetIfTable()); mirror::Class::SetStatus(h_class, mirror::Class::kStatusInitialized, self); const char* descriptor = Primitive::Descriptor(type); - ObjPtr<mirror::Class> existing = InsertClass(descriptor, h_class.Get(), - ComputeModifiedUtf8Hash(descriptor)); + ObjPtr<mirror::Class> existing = InsertClass(descriptor, + h_class.Get(), + ComputeModifiedUtf8Hash(descriptor)); CHECK(existing == nullptr) << "InitPrimitiveClass(" << type << ") failed"; return h_class.Get(); } @@ -4121,6 +4125,8 @@ mirror::Class* ClassLinker::CreateProxyClass(ScopedObjectAccessAlreadyRunnable& DCHECK_EQ(klass->GetPrimitiveType(), Primitive::kPrimNot); klass->SetName(soa.Decode<mirror::String>(name)); klass->SetDexCache(GetClassRoot(kJavaLangReflectProxy)->GetDexCache()); + // Object has an empty iftable, copy it for that reason. + klass->SetIfTable(GetClassRoot(kJavaLangObject)->GetIfTable()); mirror::Class::SetStatus(klass, mirror::Class::kStatusIdx, self); std::string descriptor(GetDescriptorForProxy(klass.Get())); const size_t hash = ComputeModifiedUtf8Hash(descriptor.c_str()); @@ -6381,16 +6387,18 @@ static size_t FillIfTable(ObjPtr<mirror::IfTable> iftable, bool ClassLinker::SetupInterfaceLookupTable(Thread* self, Handle<mirror::Class> klass, Handle<mirror::ObjectArray<mirror::Class>> interfaces) { StackHandleScope<1> hs(self); - const size_t super_ifcount = - klass->HasSuperClass() ? klass->GetSuperClass()->GetIfTableCount() : 0U; + const bool has_superclass = klass->HasSuperClass(); + const size_t super_ifcount = has_superclass ? klass->GetSuperClass()->GetIfTableCount() : 0U; const bool have_interfaces = interfaces.Get() != nullptr; const size_t num_interfaces = have_interfaces ? interfaces->GetLength() : klass->NumDirectInterfaces(); if (num_interfaces == 0) { if (super_ifcount == 0) { + if (LIKELY(has_superclass)) { + klass->SetIfTable(klass->GetSuperClass()->GetIfTable()); + } // Class implements no interfaces. DCHECK_EQ(klass->GetIfTableCount(), 0); - DCHECK(klass->GetIfTable() == nullptr); return true; } // Class implements same interfaces as parent, are any of these not marker interfaces? @@ -6583,7 +6591,7 @@ void ClassLinker::FillImtFromSuperClass(Handle<mirror::Class> klass, } else { // No imt in the super class, need to reconstruct from the iftable. ObjPtr<mirror::IfTable> if_table = super_class->GetIfTable(); - if (if_table != nullptr) { + if (if_table->Count() != 0) { // Ignore copied methods since we will handle these in LinkInterfaceMethods. FillIMTFromIfTable(if_table, unimplemented_method, diff --git a/runtime/class_linker_test.cc b/runtime/class_linker_test.cc index ab2d9d0a95..44590ba327 100644 --- a/runtime/class_linker_test.cc +++ b/runtime/class_linker_test.cc @@ -101,7 +101,8 @@ class ClassLinkerTest : public CommonRuntimeTest { EXPECT_EQ(0U, primitive->NumDirectInterfaces()); EXPECT_FALSE(primitive->HasVTable()); EXPECT_EQ(0, primitive->GetIfTableCount()); - EXPECT_TRUE(primitive->GetIfTable() == nullptr); + EXPECT_TRUE(primitive->GetIfTable() != nullptr); + EXPECT_EQ(primitive->GetIfTable()->Count(), 0u); EXPECT_EQ(kAccPublic | kAccFinal | kAccAbstract, primitive->GetAccessFlags()); } diff --git a/runtime/class_table.h b/runtime/class_table.h index bc9eaf4c2d..558c144013 100644 --- a/runtime/class_table.h +++ b/runtime/class_table.h @@ -48,7 +48,7 @@ class ClassTable { uint32_t operator()(const GcRoot<mirror::Class>& root) const NO_THREAD_SAFETY_ANALYSIS; // Same class loader and descriptor. bool operator()(const GcRoot<mirror::Class>& a, const GcRoot<mirror::Class>& b) const - NO_THREAD_SAFETY_ANALYSIS;; + NO_THREAD_SAFETY_ANALYSIS; // Same descriptor. bool operator()(const GcRoot<mirror::Class>& a, const char* descriptor) const NO_THREAD_SAFETY_ANALYSIS; diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc index 0b602e946a..6019540c9e 100644 --- a/runtime/gc/space/image_space.cc +++ b/runtime/gc/space/image_space.cc @@ -1002,7 +1002,7 @@ class ImageSpaceLoader { mirror::IfTable* iftable = as_klass->GetIfTable<kVerifyNone, kWithoutReadBarrier>(); // Ensure iftable arrays are fixed up since we need GetMethodArray to return the valid // contents. - if (iftable != nullptr && IsInAppImage(iftable)) { + if (IsInAppImage(iftable)) { operator()(iftable); for (int32_t i = 0, count = iftable->Count(); i < count; ++i) { if (iftable->GetMethodArrayCount<kVerifyNone, kWithoutReadBarrier>(i) > 0) { diff --git a/runtime/interpreter/interpreter_common.cc b/runtime/interpreter/interpreter_common.cc index cb775cd7a3..8c63a9e979 100644 --- a/runtime/interpreter/interpreter_common.cc +++ b/runtime/interpreter/interpreter_common.cc @@ -1020,7 +1020,7 @@ inline bool DoInvokePolymorphic(Thread* self, } else { DCHECK(!is_range); ArtField* field = method_handle->GetTargetField(); - Primitive::Type field_type = field->GetTypeAsPrimitiveType();; + Primitive::Type field_type = field->GetTypeAsPrimitiveType(); switch (handle_kind) { case kInstanceGet: { diff --git a/runtime/interpreter/unstarted_runtime.cc b/runtime/interpreter/unstarted_runtime.cc index 2257fd6395..a5b1038d5a 100644 --- a/runtime/interpreter/unstarted_runtime.cc +++ b/runtime/interpreter/unstarted_runtime.cc @@ -424,7 +424,7 @@ static std::unique_ptr<MemMap> FindAndExtractEntry(const std::string& jar_file, std::unique_ptr<ZipArchive> zip_archive(ZipArchive::Open(jar_file.c_str(), error_msg)); if (zip_archive == nullptr) { - return nullptr;; + return nullptr; } std::unique_ptr<ZipEntry> zip_entry(zip_archive->Find(entry_name, error_msg)); if (zip_entry == nullptr) { diff --git a/runtime/jit/jit.cc b/runtime/jit/jit.cc index 4c1006360b..23a5ddd071 100644 --- a/runtime/jit/jit.cc +++ b/runtime/jit/jit.cc @@ -114,7 +114,7 @@ JitOptions* JitOptions::CreateFromRuntimeArguments(const RuntimeArgumentMap& opt } else { jit_options->invoke_transition_weight_ = std::max( jit_options->warmup_threshold_ / Jit::kDefaultInvokeTransitionWeightRatio, - static_cast<size_t>(1));; + static_cast<size_t>(1)); } return jit_options; diff --git a/runtime/mirror/class-inl.h b/runtime/mirror/class-inl.h index bbdb2af16a..9a6d60e0ad 100644 --- a/runtime/mirror/class-inl.h +++ b/runtime/mirror/class-inl.h @@ -526,18 +526,17 @@ inline ArtMethod* Class::FindVirtualMethodForVirtualOrInterface(ArtMethod* metho template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline IfTable* Class::GetIfTable() { - return GetFieldObject<IfTable, kVerifyFlags, kReadBarrierOption>(IfTableOffset()); + ObjPtr<IfTable> ret = GetFieldObject<IfTable, kVerifyFlags, kReadBarrierOption>(IfTableOffset()); + DCHECK(ret != nullptr) << PrettyClass(this); + return ret.Ptr(); } inline int32_t Class::GetIfTableCount() { - ObjPtr<IfTable> iftable = GetIfTable(); - if (iftable == nullptr) { - return 0; - } - return iftable->Count(); + return GetIfTable()->Count(); } inline void Class::SetIfTable(ObjPtr<IfTable> new_iftable) { + DCHECK(new_iftable != nullptr) << PrettyClass(this); SetFieldObject<false>(IfTableOffset(), new_iftable); } diff --git a/runtime/oat.h b/runtime/oat.h index 3aef707dc3..8c84d42043 100644 --- a/runtime/oat.h +++ b/runtime/oat.h @@ -32,7 +32,7 @@ class InstructionSetFeatures; class PACKED(4) OatHeader { public: static constexpr uint8_t kOatMagic[] = { 'o', 'a', 't', '\n' }; - static constexpr uint8_t kOatVersion[] = { '0', '9', '1', '\0' }; + static constexpr uint8_t kOatVersion[] = { '0', '9', '2', '\0' }; static constexpr const char* kImageLocationKey = "image-location"; static constexpr const char* kDex2OatCmdLineKey = "dex2oat-cmdline"; diff --git a/test/530-checker-loops3/src/Main.java b/test/530-checker-loops3/src/Main.java index 6b5c657294..209786a113 100644 --- a/test/530-checker-loops3/src/Main.java +++ b/test/530-checker-loops3/src/Main.java @@ -246,7 +246,7 @@ public class Main { oneConstantIndex(a, b); for (int i = 0; i < a.length; i++) { - expectEquals(2, a[i]);; + expectEquals(2, a[i]); } try { oneConstantIndex(a, b1); @@ -256,7 +256,7 @@ public class Main { multipleConstantIndices(a, b); for (int i = 0; i < a.length; i++) { - expectEquals(6, a[i]);; + expectEquals(6, a[i]); } try { multipleConstantIndices(a, b1); @@ -266,7 +266,7 @@ public class Main { oneInvariantIndex(a, b, 1); for (int i = 0; i < a.length; i++) { - expectEquals(2, a[i]);; + expectEquals(2, a[i]); } try { oneInvariantIndex(a, b1, 1); @@ -276,7 +276,7 @@ public class Main { multipleInvariantIndices(a, b, 1); for (int i = 0; i < a.length; i++) { - expectEquals(6, a[i]);; + expectEquals(6, a[i]); } try { multipleInvariantIndices(a, b1, 1); @@ -286,18 +286,18 @@ public class Main { oneUnitStride(a, b); for (int i = 0; i < a.length; i++) { - expectEquals(i + 1, a[i]);; + expectEquals(i + 1, a[i]); } try { oneUnitStride(a, b1); throw new Error("Should throw AIOOBE"); } catch (ArrayIndexOutOfBoundsException e) { - expectEquals(100, a[0]);; + expectEquals(100, a[0]); } multipleUnitStrides(a, b); for (int i = 1; i < a.length - 1; i++) { - expectEquals(3 * i + 3, a[i]);; + expectEquals(3 * i + 3, a[i]); } try { multipleUnitStrides(a, b1); @@ -308,7 +308,7 @@ public class Main { multipleUnitStridesConditional(a, b); for (int i = 2; i < a.length - 2; i++) { int e = 3 * i + 3 + (((i & 1) == 0) ? i + 2 : i); - expectEquals(e, a[i]);; + expectEquals(e, a[i]); } try { multipleUnitStridesConditional(a, b1); diff --git a/test/586-checker-null-array-get/src/Main.java b/test/586-checker-null-array-get/src/Main.java index e0782bc84d..0ea7d34043 100644 --- a/test/586-checker-null-array-get/src/Main.java +++ b/test/586-checker-null-array-get/src/Main.java @@ -100,7 +100,7 @@ public class Main { /// CHECK-DAG: Return [<<ArrayGet2>>] public static float test1() { Test1 test1 = getNullTest1(); - Test2 test2 = getNullTest2();; + Test2 test2 = getNullTest2(); int[] iarr = test1.iarr; float[] farr = test2.farr; iarr[0] = iarr[1]; diff --git a/test/611-checker-simplify-if/src/Main.java b/test/611-checker-simplify-if/src/Main.java index 774f239df3..c1d75ec357 100644 --- a/test/611-checker-simplify-if/src/Main.java +++ b/test/611-checker-simplify-if/src/Main.java @@ -144,7 +144,7 @@ public class Main { /// CHECK-NOT: GreaterThanOrEqual /// CHECK-NOT: If public static void testGreaterCondition(String[] args) { - int a = 42;; + int a = 42; if (args.length == 42) { a = 34; } else { |