xref: /aosp_15_r20/art/runtime/class_linker.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "class_linker.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <unistd.h>
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker #include <algorithm>
22*795d594fSAndroid Build Coastguard Worker #include <deque>
23*795d594fSAndroid Build Coastguard Worker #include <forward_list>
24*795d594fSAndroid Build Coastguard Worker #include <iostream>
25*795d594fSAndroid Build Coastguard Worker #include <iterator>
26*795d594fSAndroid Build Coastguard Worker #include <map>
27*795d594fSAndroid Build Coastguard Worker #include <memory>
28*795d594fSAndroid Build Coastguard Worker #include <queue>
29*795d594fSAndroid Build Coastguard Worker #include <string>
30*795d594fSAndroid Build Coastguard Worker #include <string_view>
31*795d594fSAndroid Build Coastguard Worker #include <tuple>
32*795d594fSAndroid Build Coastguard Worker #include <utility>
33*795d594fSAndroid Build Coastguard Worker #include <vector>
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker #include "android-base/macros.h"
36*795d594fSAndroid Build Coastguard Worker #include "android-base/stringprintf.h"
37*795d594fSAndroid Build Coastguard Worker #include "android-base/strings.h"
38*795d594fSAndroid Build Coastguard Worker #include "art_field-inl.h"
39*795d594fSAndroid Build Coastguard Worker #include "art_method-inl.h"
40*795d594fSAndroid Build Coastguard Worker #include "barrier.h"
41*795d594fSAndroid Build Coastguard Worker #include "base/arena_allocator.h"
42*795d594fSAndroid Build Coastguard Worker #include "base/arena_bit_vector.h"
43*795d594fSAndroid Build Coastguard Worker #include "base/casts.h"
44*795d594fSAndroid Build Coastguard Worker #include "base/file_utils.h"
45*795d594fSAndroid Build Coastguard Worker #include "base/hash_map.h"
46*795d594fSAndroid Build Coastguard Worker #include "base/hash_set.h"
47*795d594fSAndroid Build Coastguard Worker #include "base/leb128.h"
48*795d594fSAndroid Build Coastguard Worker #include "base/logging.h"
49*795d594fSAndroid Build Coastguard Worker #include "base/mem_map_arena_pool.h"
50*795d594fSAndroid Build Coastguard Worker #include "base/membarrier.h"
51*795d594fSAndroid Build Coastguard Worker #include "base/metrics/metrics.h"
52*795d594fSAndroid Build Coastguard Worker #include "base/mutex-inl.h"
53*795d594fSAndroid Build Coastguard Worker #include "base/os.h"
54*795d594fSAndroid Build Coastguard Worker #include "base/pointer_size.h"
55*795d594fSAndroid Build Coastguard Worker #include "base/quasi_atomic.h"
56*795d594fSAndroid Build Coastguard Worker #include "base/scoped_arena_containers.h"
57*795d594fSAndroid Build Coastguard Worker #include "base/scoped_flock.h"
58*795d594fSAndroid Build Coastguard Worker #include "base/stl_util.h"
59*795d594fSAndroid Build Coastguard Worker #include "base/systrace.h"
60*795d594fSAndroid Build Coastguard Worker #include "base/time_utils.h"
61*795d594fSAndroid Build Coastguard Worker #include "base/unix_file/fd_file.h"
62*795d594fSAndroid Build Coastguard Worker #include "base/utils.h"
63*795d594fSAndroid Build Coastguard Worker #include "base/value_object.h"
64*795d594fSAndroid Build Coastguard Worker #include "cha.h"
65*795d594fSAndroid Build Coastguard Worker #include "class_linker-inl.h"
66*795d594fSAndroid Build Coastguard Worker #include "class_loader_utils.h"
67*795d594fSAndroid Build Coastguard Worker #include "class_root-inl.h"
68*795d594fSAndroid Build Coastguard Worker #include "class_table-inl.h"
69*795d594fSAndroid Build Coastguard Worker #include "common_throws.h"
70*795d594fSAndroid Build Coastguard Worker #include "compiler_callbacks.h"
71*795d594fSAndroid Build Coastguard Worker #include "debug_print.h"
72*795d594fSAndroid Build Coastguard Worker #include "debugger.h"
73*795d594fSAndroid Build Coastguard Worker #include "dex/class_accessor-inl.h"
74*795d594fSAndroid Build Coastguard Worker #include "dex/descriptors_names.h"
75*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file-inl.h"
76*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file.h"
77*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file_annotations.h"
78*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file_exception_helpers.h"
79*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file_loader.h"
80*795d594fSAndroid Build Coastguard Worker #include "dex/modifiers.h"
81*795d594fSAndroid Build Coastguard Worker #include "dex/signature-inl.h"
82*795d594fSAndroid Build Coastguard Worker #include "dex/utf.h"
83*795d594fSAndroid Build Coastguard Worker #include "entrypoints/entrypoint_utils-inl.h"
84*795d594fSAndroid Build Coastguard Worker #include "entrypoints/runtime_asm_entrypoints.h"
85*795d594fSAndroid Build Coastguard Worker #include "experimental_flags.h"
86*795d594fSAndroid Build Coastguard Worker #include "gc/accounting/card_table-inl.h"
87*795d594fSAndroid Build Coastguard Worker #include "gc/accounting/heap_bitmap-inl.h"
88*795d594fSAndroid Build Coastguard Worker #include "gc/accounting/space_bitmap-inl.h"
89*795d594fSAndroid Build Coastguard Worker #include "gc/heap-visit-objects-inl.h"
90*795d594fSAndroid Build Coastguard Worker #include "gc/heap.h"
91*795d594fSAndroid Build Coastguard Worker #include "gc/scoped_gc_critical_section.h"
92*795d594fSAndroid Build Coastguard Worker #include "gc/space/image_space.h"
93*795d594fSAndroid Build Coastguard Worker #include "gc/space/space-inl.h"
94*795d594fSAndroid Build Coastguard Worker #include "gc_root-inl.h"
95*795d594fSAndroid Build Coastguard Worker #include "handle_scope-inl.h"
96*795d594fSAndroid Build Coastguard Worker #include "hidden_api.h"
97*795d594fSAndroid Build Coastguard Worker #include "imt_conflict_table.h"
98*795d594fSAndroid Build Coastguard Worker #include "imtable-inl.h"
99*795d594fSAndroid Build Coastguard Worker #include "intern_table-inl.h"
100*795d594fSAndroid Build Coastguard Worker #include "interpreter/interpreter.h"
101*795d594fSAndroid Build Coastguard Worker #include "interpreter/mterp/nterp.h"
102*795d594fSAndroid Build Coastguard Worker #include "jit/debugger_interface.h"
103*795d594fSAndroid Build Coastguard Worker #include "jit/jit.h"
104*795d594fSAndroid Build Coastguard Worker #include "jit/jit_code_cache.h"
105*795d594fSAndroid Build Coastguard Worker #include "jni/java_vm_ext.h"
106*795d594fSAndroid Build Coastguard Worker #include "jni/jni_internal.h"
107*795d594fSAndroid Build Coastguard Worker #include "linear_alloc-inl.h"
108*795d594fSAndroid Build Coastguard Worker #include "mirror/array-alloc-inl.h"
109*795d594fSAndroid Build Coastguard Worker #include "mirror/array-inl.h"
110*795d594fSAndroid Build Coastguard Worker #include "mirror/call_site.h"
111*795d594fSAndroid Build Coastguard Worker #include "mirror/class-alloc-inl.h"
112*795d594fSAndroid Build Coastguard Worker #include "mirror/class-inl.h"
113*795d594fSAndroid Build Coastguard Worker #include "mirror/class.h"
114*795d594fSAndroid Build Coastguard Worker #include "mirror/class_ext.h"
115*795d594fSAndroid Build Coastguard Worker #include "mirror/class_loader.h"
116*795d594fSAndroid Build Coastguard Worker #include "mirror/dex_cache-inl.h"
117*795d594fSAndroid Build Coastguard Worker #include "mirror/dex_cache.h"
118*795d594fSAndroid Build Coastguard Worker #include "mirror/emulated_stack_frame.h"
119*795d594fSAndroid Build Coastguard Worker #include "mirror/field.h"
120*795d594fSAndroid Build Coastguard Worker #include "mirror/iftable-inl.h"
121*795d594fSAndroid Build Coastguard Worker #include "mirror/method.h"
122*795d594fSAndroid Build Coastguard Worker #include "mirror/method_handle_impl.h"
123*795d594fSAndroid Build Coastguard Worker #include "mirror/method_handles_lookup.h"
124*795d594fSAndroid Build Coastguard Worker #include "mirror/method_type-inl.h"
125*795d594fSAndroid Build Coastguard Worker #include "mirror/object-inl.h"
126*795d594fSAndroid Build Coastguard Worker #include "mirror/object-refvisitor-inl.h"
127*795d594fSAndroid Build Coastguard Worker #include "mirror/object.h"
128*795d594fSAndroid Build Coastguard Worker #include "mirror/object_array-alloc-inl.h"
129*795d594fSAndroid Build Coastguard Worker #include "mirror/object_array-inl.h"
130*795d594fSAndroid Build Coastguard Worker #include "mirror/object_array.h"
131*795d594fSAndroid Build Coastguard Worker #include "mirror/object_reference-inl.h"
132*795d594fSAndroid Build Coastguard Worker #include "mirror/object_reference.h"
133*795d594fSAndroid Build Coastguard Worker #include "mirror/proxy.h"
134*795d594fSAndroid Build Coastguard Worker #include "mirror/reference-inl.h"
135*795d594fSAndroid Build Coastguard Worker #include "mirror/stack_trace_element.h"
136*795d594fSAndroid Build Coastguard Worker #include "mirror/string-inl.h"
137*795d594fSAndroid Build Coastguard Worker #include "mirror/throwable.h"
138*795d594fSAndroid Build Coastguard Worker #include "mirror/var_handle.h"
139*795d594fSAndroid Build Coastguard Worker #include "native/dalvik_system_DexFile.h"
140*795d594fSAndroid Build Coastguard Worker #include "nativehelper/scoped_local_ref.h"
141*795d594fSAndroid Build Coastguard Worker #include "nterp_helpers-inl.h"
142*795d594fSAndroid Build Coastguard Worker #include "nterp_helpers.h"
143*795d594fSAndroid Build Coastguard Worker #include "oat/image-inl.h"
144*795d594fSAndroid Build Coastguard Worker #include "oat/jni_stub_hash_map-inl.h"
145*795d594fSAndroid Build Coastguard Worker #include "oat/oat.h"
146*795d594fSAndroid Build Coastguard Worker #include "oat/oat_file-inl.h"
147*795d594fSAndroid Build Coastguard Worker #include "oat/oat_file.h"
148*795d594fSAndroid Build Coastguard Worker #include "oat/oat_file_assistant.h"
149*795d594fSAndroid Build Coastguard Worker #include "oat/oat_file_manager.h"
150*795d594fSAndroid Build Coastguard Worker #include "object_lock.h"
151*795d594fSAndroid Build Coastguard Worker #include "profile/profile_compilation_info.h"
152*795d594fSAndroid Build Coastguard Worker #include "runtime.h"
153*795d594fSAndroid Build Coastguard Worker #include "runtime_callbacks.h"
154*795d594fSAndroid Build Coastguard Worker #include "scoped_assert_no_transaction_checks.h"
155*795d594fSAndroid Build Coastguard Worker #include "scoped_thread_state_change-inl.h"
156*795d594fSAndroid Build Coastguard Worker #include "startup_completed_task.h"
157*795d594fSAndroid Build Coastguard Worker #include "thread-inl.h"
158*795d594fSAndroid Build Coastguard Worker #include "thread.h"
159*795d594fSAndroid Build Coastguard Worker #include "thread_list.h"
160*795d594fSAndroid Build Coastguard Worker #include "trace.h"
161*795d594fSAndroid Build Coastguard Worker #include "vdex_file.h"
162*795d594fSAndroid Build Coastguard Worker #include "verifier/class_verifier.h"
163*795d594fSAndroid Build Coastguard Worker #include "verifier/verifier_deps.h"
164*795d594fSAndroid Build Coastguard Worker #include "well_known_classes.h"
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
167*795d594fSAndroid Build Coastguard Worker 
168*795d594fSAndroid Build Coastguard Worker using android::base::StringPrintf;
169*795d594fSAndroid Build Coastguard Worker 
170*795d594fSAndroid Build Coastguard Worker static constexpr bool kCheckImageObjects = kIsDebugBuild;
171*795d594fSAndroid Build Coastguard Worker static constexpr bool kVerifyArtMethodDeclaringClasses = kIsDebugBuild;
172*795d594fSAndroid Build Coastguard Worker 
173*795d594fSAndroid Build Coastguard Worker static void ThrowNoClassDefFoundError(const char* fmt, ...)
174*795d594fSAndroid Build Coastguard Worker     __attribute__((__format__(__printf__, 1, 2)))
175*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_);
ThrowNoClassDefFoundError(const char * fmt,...)176*795d594fSAndroid Build Coastguard Worker static void ThrowNoClassDefFoundError(const char* fmt, ...) {
177*795d594fSAndroid Build Coastguard Worker   va_list args;
178*795d594fSAndroid Build Coastguard Worker   va_start(args, fmt);
179*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
180*795d594fSAndroid Build Coastguard Worker   self->ThrowNewExceptionV("Ljava/lang/NoClassDefFoundError;", fmt, args);
181*795d594fSAndroid Build Coastguard Worker   va_end(args);
182*795d594fSAndroid Build Coastguard Worker }
183*795d594fSAndroid Build Coastguard Worker 
GetErroneousStateError(ObjPtr<mirror::Class> c)184*795d594fSAndroid Build Coastguard Worker static ObjPtr<mirror::Object> GetErroneousStateError(ObjPtr<mirror::Class> c)
185*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
186*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ClassExt> ext(c->GetExtData());
187*795d594fSAndroid Build Coastguard Worker   if (ext == nullptr) {
188*795d594fSAndroid Build Coastguard Worker     return nullptr;
189*795d594fSAndroid Build Coastguard Worker   } else {
190*795d594fSAndroid Build Coastguard Worker     return ext->GetErroneousStateError();
191*795d594fSAndroid Build Coastguard Worker   }
192*795d594fSAndroid Build Coastguard Worker }
193*795d594fSAndroid Build Coastguard Worker 
IsVerifyError(ObjPtr<mirror::Object> obj)194*795d594fSAndroid Build Coastguard Worker static bool IsVerifyError(ObjPtr<mirror::Object> obj)
195*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
196*795d594fSAndroid Build Coastguard Worker   // This is slow, but we only use it for rethrowing an error, and for DCHECK.
197*795d594fSAndroid Build Coastguard Worker   return obj->GetClass()->DescriptorEquals("Ljava/lang/VerifyError;");
198*795d594fSAndroid Build Coastguard Worker }
199*795d594fSAndroid Build Coastguard Worker 
200*795d594fSAndroid Build Coastguard Worker // Helper for ThrowEarlierClassFailure. Throws the stored error.
HandleEarlierErroneousStateError(Thread * self,ClassLinker * class_linker,ObjPtr<mirror::Class> c)201*795d594fSAndroid Build Coastguard Worker static void HandleEarlierErroneousStateError(Thread* self,
202*795d594fSAndroid Build Coastguard Worker                                              ClassLinker* class_linker,
203*795d594fSAndroid Build Coastguard Worker                                              ObjPtr<mirror::Class> c)
204*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
205*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> obj = GetErroneousStateError(c);
206*795d594fSAndroid Build Coastguard Worker   DCHECK(obj != nullptr);
207*795d594fSAndroid Build Coastguard Worker   self->AssertNoPendingException();
208*795d594fSAndroid Build Coastguard Worker   DCHECK(!obj->IsClass());
209*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> throwable_class = GetClassRoot<mirror::Throwable>(class_linker);
210*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> error_class = obj->GetClass();
211*795d594fSAndroid Build Coastguard Worker   CHECK(throwable_class->IsAssignableFrom(error_class));
212*795d594fSAndroid Build Coastguard Worker   self->SetException(obj->AsThrowable());
213*795d594fSAndroid Build Coastguard Worker   self->AssertPendingException();
214*795d594fSAndroid Build Coastguard Worker }
215*795d594fSAndroid Build Coastguard Worker 
UpdateClassAfterVerification(Handle<mirror::Class> klass,PointerSize pointer_size,verifier::FailureKind failure_kind)216*795d594fSAndroid Build Coastguard Worker static void UpdateClassAfterVerification(Handle<mirror::Class> klass,
217*795d594fSAndroid Build Coastguard Worker                                          PointerSize pointer_size,
218*795d594fSAndroid Build Coastguard Worker                                          verifier::FailureKind failure_kind)
219*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
220*795d594fSAndroid Build Coastguard Worker   Runtime* runtime = Runtime::Current();
221*795d594fSAndroid Build Coastguard Worker   ClassLinker* class_linker = runtime->GetClassLinker();
222*795d594fSAndroid Build Coastguard Worker   if (klass->IsVerified() && (failure_kind == verifier::FailureKind::kNoFailure)) {
223*795d594fSAndroid Build Coastguard Worker     klass->SetSkipAccessChecksFlagOnAllMethods(pointer_size);
224*795d594fSAndroid Build Coastguard Worker   }
225*795d594fSAndroid Build Coastguard Worker 
226*795d594fSAndroid Build Coastguard Worker   // Now that the class has passed verification, try to set nterp entrypoints
227*795d594fSAndroid Build Coastguard Worker   // to methods that currently use the switch interpreter.
228*795d594fSAndroid Build Coastguard Worker   if (interpreter::CanRuntimeUseNterp()) {
229*795d594fSAndroid Build Coastguard Worker     for (ArtMethod& m : klass->GetMethods(pointer_size)) {
230*795d594fSAndroid Build Coastguard Worker       if (class_linker->IsQuickToInterpreterBridge(m.GetEntryPointFromQuickCompiledCode())) {
231*795d594fSAndroid Build Coastguard Worker         runtime->GetInstrumentation()->InitializeMethodsCode(&m, /*aot_code=*/nullptr);
232*795d594fSAndroid Build Coastguard Worker       }
233*795d594fSAndroid Build Coastguard Worker     }
234*795d594fSAndroid Build Coastguard Worker   }
235*795d594fSAndroid Build Coastguard Worker }
236*795d594fSAndroid Build Coastguard Worker 
237*795d594fSAndroid Build Coastguard Worker // Callback responsible for making a batch of classes visibly initialized after ensuring
238*795d594fSAndroid Build Coastguard Worker // visibility for all threads, either by using `membarrier()` or by running a checkpoint.
239*795d594fSAndroid Build Coastguard Worker class ClassLinker::VisiblyInitializedCallback final
240*795d594fSAndroid Build Coastguard Worker     : public Closure, public IntrusiveForwardListNode<VisiblyInitializedCallback> {
241*795d594fSAndroid Build Coastguard Worker  public:
VisiblyInitializedCallback(ClassLinker * class_linker)242*795d594fSAndroid Build Coastguard Worker   explicit VisiblyInitializedCallback(ClassLinker* class_linker)
243*795d594fSAndroid Build Coastguard Worker       : class_linker_(class_linker),
244*795d594fSAndroid Build Coastguard Worker         num_classes_(0u),
245*795d594fSAndroid Build Coastguard Worker         thread_visibility_counter_(0),
246*795d594fSAndroid Build Coastguard Worker         barriers_() {
247*795d594fSAndroid Build Coastguard Worker     std::fill_n(classes_, kMaxClasses, nullptr);
248*795d594fSAndroid Build Coastguard Worker   }
249*795d594fSAndroid Build Coastguard Worker 
IsEmpty() const250*795d594fSAndroid Build Coastguard Worker   bool IsEmpty() const {
251*795d594fSAndroid Build Coastguard Worker     DCHECK_LE(num_classes_, kMaxClasses);
252*795d594fSAndroid Build Coastguard Worker     return num_classes_ == 0u;
253*795d594fSAndroid Build Coastguard Worker   }
254*795d594fSAndroid Build Coastguard Worker 
IsFull() const255*795d594fSAndroid Build Coastguard Worker   bool IsFull() const {
256*795d594fSAndroid Build Coastguard Worker     DCHECK_LE(num_classes_, kMaxClasses);
257*795d594fSAndroid Build Coastguard Worker     return num_classes_ == kMaxClasses;
258*795d594fSAndroid Build Coastguard Worker   }
259*795d594fSAndroid Build Coastguard Worker 
AddClass(Thread * self,ObjPtr<mirror::Class> klass)260*795d594fSAndroid Build Coastguard Worker   void AddClass(Thread* self, ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) {
261*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(klass->GetStatus(), ClassStatus::kInitialized);
262*795d594fSAndroid Build Coastguard Worker     DCHECK(!IsFull());
263*795d594fSAndroid Build Coastguard Worker     classes_[num_classes_] = self->GetJniEnv()->GetVm()->AddWeakGlobalRef(self, klass);
264*795d594fSAndroid Build Coastguard Worker     ++num_classes_;
265*795d594fSAndroid Build Coastguard Worker   }
266*795d594fSAndroid Build Coastguard Worker 
AddBarrier(Barrier * barrier)267*795d594fSAndroid Build Coastguard Worker   void AddBarrier(Barrier* barrier) {
268*795d594fSAndroid Build Coastguard Worker     barriers_.push_front(barrier);
269*795d594fSAndroid Build Coastguard Worker   }
270*795d594fSAndroid Build Coastguard Worker 
GetAndClearBarriers()271*795d594fSAndroid Build Coastguard Worker   std::forward_list<Barrier*> GetAndClearBarriers() {
272*795d594fSAndroid Build Coastguard Worker     std::forward_list<Barrier*> result;
273*795d594fSAndroid Build Coastguard Worker     result.swap(barriers_);
274*795d594fSAndroid Build Coastguard Worker     result.reverse();  // Return barriers in insertion order.
275*795d594fSAndroid Build Coastguard Worker     return result;
276*795d594fSAndroid Build Coastguard Worker   }
277*795d594fSAndroid Build Coastguard Worker 
MakeVisible(Thread * self)278*795d594fSAndroid Build Coastguard Worker   void MakeVisible(Thread* self) {
279*795d594fSAndroid Build Coastguard Worker     if (class_linker_->visibly_initialize_classes_with_membarier_) {
280*795d594fSAndroid Build Coastguard Worker       // If the associated register command succeeded, this command should never fail.
281*795d594fSAndroid Build Coastguard Worker       int membarrier_result = art::membarrier(MembarrierCommand::kPrivateExpedited);
282*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(membarrier_result, 0) << strerror(errno);
283*795d594fSAndroid Build Coastguard Worker       MarkVisiblyInitialized(self);
284*795d594fSAndroid Build Coastguard Worker     } else {
285*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(thread_visibility_counter_.load(std::memory_order_relaxed), 0);
286*795d594fSAndroid Build Coastguard Worker       size_t count = Runtime::Current()->GetThreadList()->RunCheckpoint(this);
287*795d594fSAndroid Build Coastguard Worker       AdjustThreadVisibilityCounter(self, count);
288*795d594fSAndroid Build Coastguard Worker     }
289*795d594fSAndroid Build Coastguard Worker   }
290*795d594fSAndroid Build Coastguard Worker 
Run(Thread * self)291*795d594fSAndroid Build Coastguard Worker   void Run(Thread* self) override {
292*795d594fSAndroid Build Coastguard Worker     AdjustThreadVisibilityCounter(self, -1);
293*795d594fSAndroid Build Coastguard Worker   }
294*795d594fSAndroid Build Coastguard Worker 
295*795d594fSAndroid Build Coastguard Worker  private:
AdjustThreadVisibilityCounter(Thread * self,ssize_t adjustment)296*795d594fSAndroid Build Coastguard Worker   void AdjustThreadVisibilityCounter(Thread* self, ssize_t adjustment) {
297*795d594fSAndroid Build Coastguard Worker     ssize_t old = thread_visibility_counter_.fetch_add(adjustment, std::memory_order_relaxed);
298*795d594fSAndroid Build Coastguard Worker     if (old + adjustment == 0) {
299*795d594fSAndroid Build Coastguard Worker       // All threads passed the checkpoint. Mark classes as visibly initialized.
300*795d594fSAndroid Build Coastguard Worker       MarkVisiblyInitialized(self);
301*795d594fSAndroid Build Coastguard Worker     }
302*795d594fSAndroid Build Coastguard Worker   }
303*795d594fSAndroid Build Coastguard Worker 
MarkVisiblyInitialized(Thread * self)304*795d594fSAndroid Build Coastguard Worker   void MarkVisiblyInitialized(Thread* self) {
305*795d594fSAndroid Build Coastguard Worker     {
306*795d594fSAndroid Build Coastguard Worker       ScopedObjectAccess soa(self);
307*795d594fSAndroid Build Coastguard Worker       StackHandleScope<1u> hs(self);
308*795d594fSAndroid Build Coastguard Worker       MutableHandle<mirror::Class> klass = hs.NewHandle<mirror::Class>(nullptr);
309*795d594fSAndroid Build Coastguard Worker       JavaVMExt* vm = self->GetJniEnv()->GetVm();
310*795d594fSAndroid Build Coastguard Worker       for (size_t i = 0, num = num_classes_; i != num; ++i) {
311*795d594fSAndroid Build Coastguard Worker         klass.Assign(ObjPtr<mirror::Class>::DownCast(self->DecodeJObject(classes_[i])));
312*795d594fSAndroid Build Coastguard Worker         vm->DeleteWeakGlobalRef(self, classes_[i]);
313*795d594fSAndroid Build Coastguard Worker         if (klass != nullptr) {
314*795d594fSAndroid Build Coastguard Worker           mirror::Class::SetStatus(klass, ClassStatus::kVisiblyInitialized, self);
315*795d594fSAndroid Build Coastguard Worker           class_linker_->FixupStaticTrampolines(self, klass.Get());
316*795d594fSAndroid Build Coastguard Worker         }
317*795d594fSAndroid Build Coastguard Worker       }
318*795d594fSAndroid Build Coastguard Worker       num_classes_ = 0u;
319*795d594fSAndroid Build Coastguard Worker     }
320*795d594fSAndroid Build Coastguard Worker     class_linker_->VisiblyInitializedCallbackDone(self, this);
321*795d594fSAndroid Build Coastguard Worker   }
322*795d594fSAndroid Build Coastguard Worker 
323*795d594fSAndroid Build Coastguard Worker   // Making classes initialized in bigger batches helps with app startup for apps
324*795d594fSAndroid Build Coastguard Worker   // that initialize a lot of classes by running fewer synchronization functions.
325*795d594fSAndroid Build Coastguard Worker   // (On the other hand, bigger batches make class initialization checks more
326*795d594fSAndroid Build Coastguard Worker   // likely to take a slow path but that is mitigated by making partially
327*795d594fSAndroid Build Coastguard Worker   // filled buffers visibly initialized if we take the slow path many times.
328*795d594fSAndroid Build Coastguard Worker   // See `Thread::kMakeVisiblyInitializedCounterTriggerCount`.)
329*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kMaxClasses = 48;
330*795d594fSAndroid Build Coastguard Worker 
331*795d594fSAndroid Build Coastguard Worker   ClassLinker* const class_linker_;
332*795d594fSAndroid Build Coastguard Worker   size_t num_classes_;
333*795d594fSAndroid Build Coastguard Worker   jweak classes_[kMaxClasses];
334*795d594fSAndroid Build Coastguard Worker 
335*795d594fSAndroid Build Coastguard Worker   // The thread visibility counter starts at 0 and it is incremented by the number of
336*795d594fSAndroid Build Coastguard Worker   // threads that need to run this callback (by the thread that request the callback
337*795d594fSAndroid Build Coastguard Worker   // to be run) and decremented once for each `Run()` execution. When it reaches 0,
338*795d594fSAndroid Build Coastguard Worker   // whether after the increment or after a decrement, we know that `Run()` was executed
339*795d594fSAndroid Build Coastguard Worker   // for all threads and therefore we can mark the classes as visibly initialized.
340*795d594fSAndroid Build Coastguard Worker   // Used only if the preferred `membarrier()` command is unsupported.
341*795d594fSAndroid Build Coastguard Worker   std::atomic<ssize_t> thread_visibility_counter_;
342*795d594fSAndroid Build Coastguard Worker 
343*795d594fSAndroid Build Coastguard Worker   // List of barries to `Pass()` for threads that wait for the callback to complete.
344*795d594fSAndroid Build Coastguard Worker   std::forward_list<Barrier*> barriers_;
345*795d594fSAndroid Build Coastguard Worker };
346*795d594fSAndroid Build Coastguard Worker 
MakeInitializedClassesVisiblyInitialized(Thread * self,bool wait)347*795d594fSAndroid Build Coastguard Worker void ClassLinker::MakeInitializedClassesVisiblyInitialized(Thread* self, bool wait) {
348*795d594fSAndroid Build Coastguard Worker   if (kRuntimeISA == InstructionSet::kX86 || kRuntimeISA == InstructionSet::kX86_64) {
349*795d594fSAndroid Build Coastguard Worker     return;  // Nothing to do. Thanks to the x86 memory model classes skip the initialized status.
350*795d594fSAndroid Build Coastguard Worker   }
351*795d594fSAndroid Build Coastguard Worker   std::optional<Barrier> maybe_barrier;  // Avoid constructing the Barrier for `wait == false`.
352*795d594fSAndroid Build Coastguard Worker   if (wait) {
353*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->AssertNotHeld(self);
354*795d594fSAndroid Build Coastguard Worker     maybe_barrier.emplace(0);
355*795d594fSAndroid Build Coastguard Worker   }
356*795d594fSAndroid Build Coastguard Worker   int wait_count = 0;
357*795d594fSAndroid Build Coastguard Worker   VisiblyInitializedCallback* callback = nullptr;
358*795d594fSAndroid Build Coastguard Worker   {
359*795d594fSAndroid Build Coastguard Worker     MutexLock lock(self, visibly_initialized_callback_lock_);
360*795d594fSAndroid Build Coastguard Worker     if (visibly_initialized_callback_ != nullptr && !visibly_initialized_callback_->IsEmpty()) {
361*795d594fSAndroid Build Coastguard Worker       callback = visibly_initialized_callback_.release();
362*795d594fSAndroid Build Coastguard Worker       running_visibly_initialized_callbacks_.push_front(*callback);
363*795d594fSAndroid Build Coastguard Worker     }
364*795d594fSAndroid Build Coastguard Worker     if (wait) {
365*795d594fSAndroid Build Coastguard Worker       DCHECK(maybe_barrier.has_value());
366*795d594fSAndroid Build Coastguard Worker       Barrier* barrier = std::addressof(*maybe_barrier);
367*795d594fSAndroid Build Coastguard Worker       for (VisiblyInitializedCallback& cb : running_visibly_initialized_callbacks_) {
368*795d594fSAndroid Build Coastguard Worker         cb.AddBarrier(barrier);
369*795d594fSAndroid Build Coastguard Worker         ++wait_count;
370*795d594fSAndroid Build Coastguard Worker       }
371*795d594fSAndroid Build Coastguard Worker     }
372*795d594fSAndroid Build Coastguard Worker   }
373*795d594fSAndroid Build Coastguard Worker   if (callback != nullptr) {
374*795d594fSAndroid Build Coastguard Worker     callback->MakeVisible(self);
375*795d594fSAndroid Build Coastguard Worker   }
376*795d594fSAndroid Build Coastguard Worker   if (wait_count != 0) {
377*795d594fSAndroid Build Coastguard Worker     DCHECK(maybe_barrier.has_value());
378*795d594fSAndroid Build Coastguard Worker     maybe_barrier->Increment(self, wait_count);
379*795d594fSAndroid Build Coastguard Worker   }
380*795d594fSAndroid Build Coastguard Worker }
381*795d594fSAndroid Build Coastguard Worker 
VisiblyInitializedCallbackDone(Thread * self,VisiblyInitializedCallback * callback)382*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisiblyInitializedCallbackDone(Thread* self,
383*795d594fSAndroid Build Coastguard Worker                                                  VisiblyInitializedCallback* callback) {
384*795d594fSAndroid Build Coastguard Worker   MutexLock lock(self, visibly_initialized_callback_lock_);
385*795d594fSAndroid Build Coastguard Worker   // Pass the barriers if requested.
386*795d594fSAndroid Build Coastguard Worker   for (Barrier* barrier : callback->GetAndClearBarriers()) {
387*795d594fSAndroid Build Coastguard Worker     barrier->Pass(self);
388*795d594fSAndroid Build Coastguard Worker   }
389*795d594fSAndroid Build Coastguard Worker   // Remove the callback from the list of running callbacks.
390*795d594fSAndroid Build Coastguard Worker   auto before = running_visibly_initialized_callbacks_.before_begin();
391*795d594fSAndroid Build Coastguard Worker   auto it = running_visibly_initialized_callbacks_.begin();
392*795d594fSAndroid Build Coastguard Worker   DCHECK(it != running_visibly_initialized_callbacks_.end());
393*795d594fSAndroid Build Coastguard Worker   while (std::addressof(*it) != callback) {
394*795d594fSAndroid Build Coastguard Worker     before = it;
395*795d594fSAndroid Build Coastguard Worker     ++it;
396*795d594fSAndroid Build Coastguard Worker     DCHECK(it != running_visibly_initialized_callbacks_.end());
397*795d594fSAndroid Build Coastguard Worker   }
398*795d594fSAndroid Build Coastguard Worker   running_visibly_initialized_callbacks_.erase_after(before);
399*795d594fSAndroid Build Coastguard Worker   // Reuse or destroy the callback object.
400*795d594fSAndroid Build Coastguard Worker   if (visibly_initialized_callback_ == nullptr) {
401*795d594fSAndroid Build Coastguard Worker     visibly_initialized_callback_.reset(callback);
402*795d594fSAndroid Build Coastguard Worker   } else {
403*795d594fSAndroid Build Coastguard Worker     delete callback;
404*795d594fSAndroid Build Coastguard Worker   }
405*795d594fSAndroid Build Coastguard Worker }
406*795d594fSAndroid Build Coastguard Worker 
ForceClassInitialized(Thread * self,Handle<mirror::Class> klass)407*795d594fSAndroid Build Coastguard Worker void ClassLinker::ForceClassInitialized(Thread* self, Handle<mirror::Class> klass) {
408*795d594fSAndroid Build Coastguard Worker   ClassLinker::VisiblyInitializedCallback* cb = MarkClassInitialized(self, klass);
409*795d594fSAndroid Build Coastguard Worker   if (cb != nullptr) {
410*795d594fSAndroid Build Coastguard Worker     cb->MakeVisible(self);
411*795d594fSAndroid Build Coastguard Worker   }
412*795d594fSAndroid Build Coastguard Worker   ScopedThreadSuspension sts(self, ThreadState::kSuspended);
413*795d594fSAndroid Build Coastguard Worker   MakeInitializedClassesVisiblyInitialized(self, /*wait=*/true);
414*795d594fSAndroid Build Coastguard Worker }
415*795d594fSAndroid Build Coastguard Worker 
FindBootJniStub(ArtMethod * method)416*795d594fSAndroid Build Coastguard Worker const void* ClassLinker::FindBootJniStub(ArtMethod* method) {
417*795d594fSAndroid Build Coastguard Worker   return FindBootJniStub(JniStubKey(method));
418*795d594fSAndroid Build Coastguard Worker }
419*795d594fSAndroid Build Coastguard Worker 
FindBootJniStub(uint32_t flags,std::string_view shorty)420*795d594fSAndroid Build Coastguard Worker const void* ClassLinker::FindBootJniStub(uint32_t flags, std::string_view shorty) {
421*795d594fSAndroid Build Coastguard Worker   return FindBootJniStub(JniStubKey(flags, shorty));
422*795d594fSAndroid Build Coastguard Worker }
423*795d594fSAndroid Build Coastguard Worker 
FindBootJniStub(JniStubKey key)424*795d594fSAndroid Build Coastguard Worker const void* ClassLinker::FindBootJniStub(JniStubKey key) {
425*795d594fSAndroid Build Coastguard Worker   auto it = boot_image_jni_stubs_.find(key);
426*795d594fSAndroid Build Coastguard Worker   if (it == boot_image_jni_stubs_.end()) {
427*795d594fSAndroid Build Coastguard Worker     return nullptr;
428*795d594fSAndroid Build Coastguard Worker   } else {
429*795d594fSAndroid Build Coastguard Worker     return it->second;
430*795d594fSAndroid Build Coastguard Worker   }
431*795d594fSAndroid Build Coastguard Worker }
432*795d594fSAndroid Build Coastguard Worker 
MarkClassInitialized(Thread * self,Handle<mirror::Class> klass)433*795d594fSAndroid Build Coastguard Worker ClassLinker::VisiblyInitializedCallback* ClassLinker::MarkClassInitialized(
434*795d594fSAndroid Build Coastguard Worker     Thread* self, Handle<mirror::Class> klass) {
435*795d594fSAndroid Build Coastguard Worker   if (kRuntimeISA == InstructionSet::kX86 || kRuntimeISA == InstructionSet::kX86_64) {
436*795d594fSAndroid Build Coastguard Worker     // Thanks to the x86 memory model, we do not need any memory fences and
437*795d594fSAndroid Build Coastguard Worker     // we can immediately mark the class as visibly initialized.
438*795d594fSAndroid Build Coastguard Worker     mirror::Class::SetStatus(klass, ClassStatus::kVisiblyInitialized, self);
439*795d594fSAndroid Build Coastguard Worker     FixupStaticTrampolines(self, klass.Get());
440*795d594fSAndroid Build Coastguard Worker     return nullptr;
441*795d594fSAndroid Build Coastguard Worker   }
442*795d594fSAndroid Build Coastguard Worker   if (Runtime::Current()->IsActiveTransaction()) {
443*795d594fSAndroid Build Coastguard Worker     // Transactions are single-threaded, so we can mark the class as visibly intialized.
444*795d594fSAndroid Build Coastguard Worker     // (Otherwise we'd need to track the callback's entry in the transaction for rollback.)
445*795d594fSAndroid Build Coastguard Worker     mirror::Class::SetStatus(klass, ClassStatus::kVisiblyInitialized, self);
446*795d594fSAndroid Build Coastguard Worker     FixupStaticTrampolines(self, klass.Get());
447*795d594fSAndroid Build Coastguard Worker     return nullptr;
448*795d594fSAndroid Build Coastguard Worker   }
449*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(klass, ClassStatus::kInitialized, self);
450*795d594fSAndroid Build Coastguard Worker   MutexLock lock(self, visibly_initialized_callback_lock_);
451*795d594fSAndroid Build Coastguard Worker   if (visibly_initialized_callback_ == nullptr) {
452*795d594fSAndroid Build Coastguard Worker     visibly_initialized_callback_.reset(new VisiblyInitializedCallback(this));
453*795d594fSAndroid Build Coastguard Worker   }
454*795d594fSAndroid Build Coastguard Worker   DCHECK(!visibly_initialized_callback_->IsFull());
455*795d594fSAndroid Build Coastguard Worker   visibly_initialized_callback_->AddClass(self, klass.Get());
456*795d594fSAndroid Build Coastguard Worker 
457*795d594fSAndroid Build Coastguard Worker   if (visibly_initialized_callback_->IsFull()) {
458*795d594fSAndroid Build Coastguard Worker     VisiblyInitializedCallback* callback = visibly_initialized_callback_.release();
459*795d594fSAndroid Build Coastguard Worker     running_visibly_initialized_callbacks_.push_front(*callback);
460*795d594fSAndroid Build Coastguard Worker     return callback;
461*795d594fSAndroid Build Coastguard Worker   } else {
462*795d594fSAndroid Build Coastguard Worker     return nullptr;
463*795d594fSAndroid Build Coastguard Worker   }
464*795d594fSAndroid Build Coastguard Worker }
465*795d594fSAndroid Build Coastguard Worker 
RegisterNative(Thread * self,ArtMethod * method,const void * native_method)466*795d594fSAndroid Build Coastguard Worker const void* ClassLinker::RegisterNative(
467*795d594fSAndroid Build Coastguard Worker     Thread* self, ArtMethod* method, const void* native_method) {
468*795d594fSAndroid Build Coastguard Worker   CHECK(method->IsNative()) << method->PrettyMethod();
469*795d594fSAndroid Build Coastguard Worker   CHECK(native_method != nullptr) << method->PrettyMethod();
470*795d594fSAndroid Build Coastguard Worker   void* new_native_method = nullptr;
471*795d594fSAndroid Build Coastguard Worker   Runtime* runtime = Runtime::Current();
472*795d594fSAndroid Build Coastguard Worker   runtime->GetRuntimeCallbacks()->RegisterNativeMethod(method,
473*795d594fSAndroid Build Coastguard Worker                                                        native_method,
474*795d594fSAndroid Build Coastguard Worker                                                        /*out*/&new_native_method);
475*795d594fSAndroid Build Coastguard Worker   if (method->IsCriticalNative()) {
476*795d594fSAndroid Build Coastguard Worker     MutexLock lock(self, critical_native_code_with_clinit_check_lock_);
477*795d594fSAndroid Build Coastguard Worker     // Remove old registered method if any.
478*795d594fSAndroid Build Coastguard Worker     auto it = critical_native_code_with_clinit_check_.find(method);
479*795d594fSAndroid Build Coastguard Worker     if (it != critical_native_code_with_clinit_check_.end()) {
480*795d594fSAndroid Build Coastguard Worker       critical_native_code_with_clinit_check_.erase(it);
481*795d594fSAndroid Build Coastguard Worker     }
482*795d594fSAndroid Build Coastguard Worker     // To ensure correct memory visibility, we need the class to be visibly
483*795d594fSAndroid Build Coastguard Worker     // initialized before we can set the JNI entrypoint.
484*795d594fSAndroid Build Coastguard Worker     if (method->GetDeclaringClass()->IsVisiblyInitialized()) {
485*795d594fSAndroid Build Coastguard Worker       method->SetEntryPointFromJni(new_native_method);
486*795d594fSAndroid Build Coastguard Worker     } else {
487*795d594fSAndroid Build Coastguard Worker       critical_native_code_with_clinit_check_.emplace(method, new_native_method);
488*795d594fSAndroid Build Coastguard Worker     }
489*795d594fSAndroid Build Coastguard Worker   } else {
490*795d594fSAndroid Build Coastguard Worker     method->SetEntryPointFromJni(new_native_method);
491*795d594fSAndroid Build Coastguard Worker   }
492*795d594fSAndroid Build Coastguard Worker   return new_native_method;
493*795d594fSAndroid Build Coastguard Worker }
494*795d594fSAndroid Build Coastguard Worker 
UnregisterNative(Thread * self,ArtMethod * method)495*795d594fSAndroid Build Coastguard Worker void ClassLinker::UnregisterNative(Thread* self, ArtMethod* method) {
496*795d594fSAndroid Build Coastguard Worker   CHECK(method->IsNative()) << method->PrettyMethod();
497*795d594fSAndroid Build Coastguard Worker   // Restore stub to lookup native pointer via dlsym.
498*795d594fSAndroid Build Coastguard Worker   if (method->IsCriticalNative()) {
499*795d594fSAndroid Build Coastguard Worker     MutexLock lock(self, critical_native_code_with_clinit_check_lock_);
500*795d594fSAndroid Build Coastguard Worker     auto it = critical_native_code_with_clinit_check_.find(method);
501*795d594fSAndroid Build Coastguard Worker     if (it != critical_native_code_with_clinit_check_.end()) {
502*795d594fSAndroid Build Coastguard Worker       critical_native_code_with_clinit_check_.erase(it);
503*795d594fSAndroid Build Coastguard Worker     }
504*795d594fSAndroid Build Coastguard Worker     method->SetEntryPointFromJni(GetJniDlsymLookupCriticalStub());
505*795d594fSAndroid Build Coastguard Worker   } else {
506*795d594fSAndroid Build Coastguard Worker     method->SetEntryPointFromJni(GetJniDlsymLookupStub());
507*795d594fSAndroid Build Coastguard Worker   }
508*795d594fSAndroid Build Coastguard Worker }
509*795d594fSAndroid Build Coastguard Worker 
GetRegisteredNative(Thread * self,ArtMethod * method)510*795d594fSAndroid Build Coastguard Worker const void* ClassLinker::GetRegisteredNative(Thread* self, ArtMethod* method) {
511*795d594fSAndroid Build Coastguard Worker   if (method->IsCriticalNative()) {
512*795d594fSAndroid Build Coastguard Worker     MutexLock lock(self, critical_native_code_with_clinit_check_lock_);
513*795d594fSAndroid Build Coastguard Worker     auto it = critical_native_code_with_clinit_check_.find(method);
514*795d594fSAndroid Build Coastguard Worker     if (it != critical_native_code_with_clinit_check_.end()) {
515*795d594fSAndroid Build Coastguard Worker       return it->second;
516*795d594fSAndroid Build Coastguard Worker     }
517*795d594fSAndroid Build Coastguard Worker     const void* native_code = method->GetEntryPointFromJni();
518*795d594fSAndroid Build Coastguard Worker     return IsJniDlsymLookupCriticalStub(native_code) ? nullptr : native_code;
519*795d594fSAndroid Build Coastguard Worker   } else {
520*795d594fSAndroid Build Coastguard Worker     const void* native_code = method->GetEntryPointFromJni();
521*795d594fSAndroid Build Coastguard Worker     return IsJniDlsymLookupStub(native_code) ? nullptr : native_code;
522*795d594fSAndroid Build Coastguard Worker   }
523*795d594fSAndroid Build Coastguard Worker }
524*795d594fSAndroid Build Coastguard Worker 
ThrowEarlierClassFailure(ObjPtr<mirror::Class> c,bool wrap_in_no_class_def,bool log)525*795d594fSAndroid Build Coastguard Worker void ClassLinker::ThrowEarlierClassFailure(ObjPtr<mirror::Class> c,
526*795d594fSAndroid Build Coastguard Worker                                            bool wrap_in_no_class_def,
527*795d594fSAndroid Build Coastguard Worker                                            bool log) {
528*795d594fSAndroid Build Coastguard Worker   // The class failed to initialize on a previous attempt, so we want to throw
529*795d594fSAndroid Build Coastguard Worker   // a NoClassDefFoundError (v2 2.17.5).  The exception to this rule is if we
530*795d594fSAndroid Build Coastguard Worker   // failed in verification, in which case v2 5.4.1 says we need to re-throw
531*795d594fSAndroid Build Coastguard Worker   // the previous error.
532*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
533*795d594fSAndroid Build Coastguard Worker   if (!runtime->IsAotCompiler()) {  // Give info if this occurs at runtime.
534*795d594fSAndroid Build Coastguard Worker     std::string extra;
535*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Object> verify_error = GetErroneousStateError(c);
536*795d594fSAndroid Build Coastguard Worker     if (verify_error != nullptr) {
537*795d594fSAndroid Build Coastguard Worker       DCHECK(!verify_error->IsClass());
538*795d594fSAndroid Build Coastguard Worker       extra = verify_error->AsThrowable()->Dump();
539*795d594fSAndroid Build Coastguard Worker     }
540*795d594fSAndroid Build Coastguard Worker     if (log) {
541*795d594fSAndroid Build Coastguard Worker       LOG(INFO) << "Rejecting re-init on previously-failed class " << c->PrettyClass()
542*795d594fSAndroid Build Coastguard Worker                 << ": " << extra;
543*795d594fSAndroid Build Coastguard Worker     }
544*795d594fSAndroid Build Coastguard Worker   }
545*795d594fSAndroid Build Coastguard Worker 
546*795d594fSAndroid Build Coastguard Worker   CHECK(c->IsErroneous()) << c->PrettyClass() << " " << c->GetStatus();
547*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
548*795d594fSAndroid Build Coastguard Worker   if (runtime->IsAotCompiler()) {
549*795d594fSAndroid Build Coastguard Worker     // At compile time, accurate errors and NCDFE are disabled to speed compilation.
550*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Throwable> pre_allocated = runtime->GetPreAllocatedNoClassDefFoundError();
551*795d594fSAndroid Build Coastguard Worker     self->SetException(pre_allocated);
552*795d594fSAndroid Build Coastguard Worker   } else {
553*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Object> erroneous_state_error = GetErroneousStateError(c);
554*795d594fSAndroid Build Coastguard Worker     if (erroneous_state_error != nullptr) {
555*795d594fSAndroid Build Coastguard Worker       // Rethrow stored error.
556*795d594fSAndroid Build Coastguard Worker       HandleEarlierErroneousStateError(self, this, c);
557*795d594fSAndroid Build Coastguard Worker     }
558*795d594fSAndroid Build Coastguard Worker     // TODO This might be wrong if we hit an OOME while allocating the ClassExt. In that case we
559*795d594fSAndroid Build Coastguard Worker     // might have meant to go down the earlier if statement with the original error but it got
560*795d594fSAndroid Build Coastguard Worker     // swallowed by the OOM so we end up here.
561*795d594fSAndroid Build Coastguard Worker     if (erroneous_state_error == nullptr ||
562*795d594fSAndroid Build Coastguard Worker         (wrap_in_no_class_def && !IsVerifyError(erroneous_state_error))) {
563*795d594fSAndroid Build Coastguard Worker       // If there isn't a recorded earlier error, or this is a repeat throw from initialization,
564*795d594fSAndroid Build Coastguard Worker       // the top-level exception must be a NoClassDefFoundError. The potentially already pending
565*795d594fSAndroid Build Coastguard Worker       // exception will be a cause.
566*795d594fSAndroid Build Coastguard Worker       self->ThrowNewWrappedException("Ljava/lang/NoClassDefFoundError;",
567*795d594fSAndroid Build Coastguard Worker                                      c->PrettyDescriptor().c_str());
568*795d594fSAndroid Build Coastguard Worker     }
569*795d594fSAndroid Build Coastguard Worker   }
570*795d594fSAndroid Build Coastguard Worker }
571*795d594fSAndroid Build Coastguard Worker 
VlogClassInitializationFailure(Handle<mirror::Class> klass)572*795d594fSAndroid Build Coastguard Worker static void VlogClassInitializationFailure(Handle<mirror::Class> klass)
573*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
574*795d594fSAndroid Build Coastguard Worker   if (VLOG_IS_ON(class_linker)) {
575*795d594fSAndroid Build Coastguard Worker     std::string temp;
576*795d594fSAndroid Build Coastguard Worker     LOG(INFO) << "Failed to initialize class " << klass->GetDescriptor(&temp) << " from "
577*795d594fSAndroid Build Coastguard Worker               << klass->GetLocation() << "\n" << Thread::Current()->GetException()->Dump();
578*795d594fSAndroid Build Coastguard Worker   }
579*795d594fSAndroid Build Coastguard Worker }
580*795d594fSAndroid Build Coastguard Worker 
WrapExceptionInInitializer(Handle<mirror::Class> klass)581*795d594fSAndroid Build Coastguard Worker static void WrapExceptionInInitializer(Handle<mirror::Class> klass)
582*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
583*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
584*795d594fSAndroid Build Coastguard Worker 
585*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Throwable> cause = self->GetException();
586*795d594fSAndroid Build Coastguard Worker   CHECK(cause != nullptr);
587*795d594fSAndroid Build Coastguard Worker 
588*795d594fSAndroid Build Coastguard Worker   // Boot classpath classes should not fail initialization. This is a consistency debug check.
589*795d594fSAndroid Build Coastguard Worker   // This cannot in general be guaranteed, but in all likelihood leads to breakage down the line.
590*795d594fSAndroid Build Coastguard Worker   if (klass->GetClassLoader() == nullptr && !Runtime::Current()->IsAotCompiler()) {
591*795d594fSAndroid Build Coastguard Worker     std::string tmp;
592*795d594fSAndroid Build Coastguard Worker     // We want to LOG(FATAL) on debug builds since this really shouldn't be happening but we need to
593*795d594fSAndroid Build Coastguard Worker     // make sure to only do it if we don't have AsyncExceptions being thrown around since those
594*795d594fSAndroid Build Coastguard Worker     // could have caused the error.
595*795d594fSAndroid Build Coastguard Worker     bool known_impossible = kIsDebugBuild && !Runtime::Current()->AreAsyncExceptionsThrown();
596*795d594fSAndroid Build Coastguard Worker     LOG(known_impossible ? FATAL : WARNING) << klass->GetDescriptor(&tmp)
597*795d594fSAndroid Build Coastguard Worker                                             << " failed initialization: "
598*795d594fSAndroid Build Coastguard Worker                                             << self->GetException()->Dump();
599*795d594fSAndroid Build Coastguard Worker   }
600*795d594fSAndroid Build Coastguard Worker 
601*795d594fSAndroid Build Coastguard Worker   // We only wrap non-Error exceptions; an Error can just be used as-is.
602*795d594fSAndroid Build Coastguard Worker   if (!cause->IsError()) {
603*795d594fSAndroid Build Coastguard Worker     self->ThrowNewWrappedException("Ljava/lang/ExceptionInInitializerError;", nullptr);
604*795d594fSAndroid Build Coastguard Worker   }
605*795d594fSAndroid Build Coastguard Worker   VlogClassInitializationFailure(klass);
606*795d594fSAndroid Build Coastguard Worker }
607*795d594fSAndroid Build Coastguard Worker 
RegisterMemBarrierForClassInitialization()608*795d594fSAndroid Build Coastguard Worker static bool RegisterMemBarrierForClassInitialization() {
609*795d594fSAndroid Build Coastguard Worker   if (kRuntimeISA == InstructionSet::kX86 || kRuntimeISA == InstructionSet::kX86_64) {
610*795d594fSAndroid Build Coastguard Worker     // Thanks to the x86 memory model, classes skip the initialized status, so there is no need
611*795d594fSAndroid Build Coastguard Worker     // to use `membarrier()` or other synchronization for marking classes visibly initialized.
612*795d594fSAndroid Build Coastguard Worker     return false;
613*795d594fSAndroid Build Coastguard Worker   }
614*795d594fSAndroid Build Coastguard Worker   int membarrier_result = art::membarrier(MembarrierCommand::kRegisterPrivateExpedited);
615*795d594fSAndroid Build Coastguard Worker   return membarrier_result == 0;
616*795d594fSAndroid Build Coastguard Worker }
617*795d594fSAndroid Build Coastguard Worker 
ClassLinker(InternTable * intern_table,bool fast_class_not_found_exceptions)618*795d594fSAndroid Build Coastguard Worker ClassLinker::ClassLinker(InternTable* intern_table, bool fast_class_not_found_exceptions)
619*795d594fSAndroid Build Coastguard Worker     : boot_class_table_(new ClassTable()),
620*795d594fSAndroid Build Coastguard Worker       failed_dex_cache_class_lookups_(0),
621*795d594fSAndroid Build Coastguard Worker       class_roots_(nullptr),
622*795d594fSAndroid Build Coastguard Worker       find_array_class_cache_next_victim_(0),
623*795d594fSAndroid Build Coastguard Worker       init_done_(false),
624*795d594fSAndroid Build Coastguard Worker       log_new_roots_(false),
625*795d594fSAndroid Build Coastguard Worker       intern_table_(intern_table),
626*795d594fSAndroid Build Coastguard Worker       fast_class_not_found_exceptions_(fast_class_not_found_exceptions),
627*795d594fSAndroid Build Coastguard Worker       jni_dlsym_lookup_trampoline_(nullptr),
628*795d594fSAndroid Build Coastguard Worker       jni_dlsym_lookup_critical_trampoline_(nullptr),
629*795d594fSAndroid Build Coastguard Worker       quick_resolution_trampoline_(nullptr),
630*795d594fSAndroid Build Coastguard Worker       quick_imt_conflict_trampoline_(nullptr),
631*795d594fSAndroid Build Coastguard Worker       quick_generic_jni_trampoline_(nullptr),
632*795d594fSAndroid Build Coastguard Worker       quick_to_interpreter_bridge_trampoline_(nullptr),
633*795d594fSAndroid Build Coastguard Worker       nterp_trampoline_(nullptr),
634*795d594fSAndroid Build Coastguard Worker       image_pointer_size_(kRuntimePointerSize),
635*795d594fSAndroid Build Coastguard Worker       visibly_initialized_callback_lock_("visibly initialized callback lock"),
636*795d594fSAndroid Build Coastguard Worker       visibly_initialized_callback_(nullptr),
637*795d594fSAndroid Build Coastguard Worker       running_visibly_initialized_callbacks_(),
638*795d594fSAndroid Build Coastguard Worker       visibly_initialize_classes_with_membarier_(RegisterMemBarrierForClassInitialization()),
639*795d594fSAndroid Build Coastguard Worker       critical_native_code_with_clinit_check_lock_("critical native code with clinit check lock"),
640*795d594fSAndroid Build Coastguard Worker       critical_native_code_with_clinit_check_(),
641*795d594fSAndroid Build Coastguard Worker       boot_image_jni_stubs_(JniStubKeyHash(Runtime::Current()->GetInstructionSet()),
642*795d594fSAndroid Build Coastguard Worker                             JniStubKeyEquals(Runtime::Current()->GetInstructionSet())),
643*795d594fSAndroid Build Coastguard Worker       cha_(Runtime::Current()->IsAotCompiler() ? nullptr : new ClassHierarchyAnalysis()) {
644*795d594fSAndroid Build Coastguard Worker   // For CHA disabled during Aot, see b/34193647.
645*795d594fSAndroid Build Coastguard Worker 
646*795d594fSAndroid Build Coastguard Worker   CHECK(intern_table_ != nullptr);
647*795d594fSAndroid Build Coastguard Worker   static_assert(kFindArrayCacheSize == arraysize(find_array_class_cache_),
648*795d594fSAndroid Build Coastguard Worker                 "Array cache size wrong.");
649*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < kFindArrayCacheSize; i++) {
650*795d594fSAndroid Build Coastguard Worker     find_array_class_cache_[i].store(GcRoot<mirror::Class>(nullptr), std::memory_order_relaxed);
651*795d594fSAndroid Build Coastguard Worker   }
652*795d594fSAndroid Build Coastguard Worker }
653*795d594fSAndroid Build Coastguard Worker 
CheckSystemClass(Thread * self,Handle<mirror::Class> c1,const char * descriptor)654*795d594fSAndroid Build Coastguard Worker void ClassLinker::CheckSystemClass(Thread* self, Handle<mirror::Class> c1, const char* descriptor) {
655*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> c2 = FindSystemClass(self, descriptor);
656*795d594fSAndroid Build Coastguard Worker   if (c2 == nullptr) {
657*795d594fSAndroid Build Coastguard Worker     LOG(FATAL) << "Could not find class " << descriptor;
658*795d594fSAndroid Build Coastguard Worker     UNREACHABLE();
659*795d594fSAndroid Build Coastguard Worker   }
660*795d594fSAndroid Build Coastguard Worker   if (c1.Get() != c2) {
661*795d594fSAndroid Build Coastguard Worker     std::ostringstream os1, os2;
662*795d594fSAndroid Build Coastguard Worker     c1->DumpClass(os1, mirror::Class::kDumpClassFullDetail);
663*795d594fSAndroid Build Coastguard Worker     c2->DumpClass(os2, mirror::Class::kDumpClassFullDetail);
664*795d594fSAndroid Build Coastguard Worker     LOG(FATAL) << "InitWithoutImage: Class mismatch for " << descriptor
665*795d594fSAndroid Build Coastguard Worker                << ". This is most likely the result of a broken build. Make sure that "
666*795d594fSAndroid Build Coastguard Worker                << "libcore and art projects match.\n\n"
667*795d594fSAndroid Build Coastguard Worker                << os1.str() << "\n\n" << os2.str();
668*795d594fSAndroid Build Coastguard Worker     UNREACHABLE();
669*795d594fSAndroid Build Coastguard Worker   }
670*795d594fSAndroid Build Coastguard Worker }
671*795d594fSAndroid Build Coastguard Worker 
AllocIfTable(Thread * self,size_t ifcount,ObjPtr<mirror::Class> iftable_class)672*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::IfTable> AllocIfTable(Thread* self,
673*795d594fSAndroid Build Coastguard Worker                                      size_t ifcount,
674*795d594fSAndroid Build Coastguard Worker                                      ObjPtr<mirror::Class> iftable_class)
675*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
676*795d594fSAndroid Build Coastguard Worker   DCHECK(iftable_class->IsArrayClass());
677*795d594fSAndroid Build Coastguard Worker   DCHECK(iftable_class->GetComponentType()->IsObjectClass());
678*795d594fSAndroid Build Coastguard Worker   return ObjPtr<mirror::IfTable>::DownCast(ObjPtr<mirror::ObjectArray<mirror::Object>>(
679*795d594fSAndroid Build Coastguard Worker       mirror::IfTable::Alloc(self, iftable_class, ifcount * mirror::IfTable::kMax)));
680*795d594fSAndroid Build Coastguard Worker }
681*795d594fSAndroid Build Coastguard Worker 
InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path,std::string * error_msg)682*795d594fSAndroid Build Coastguard Worker bool ClassLinker::InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path,
683*795d594fSAndroid Build Coastguard Worker                                    std::string* error_msg) {
684*795d594fSAndroid Build Coastguard Worker   VLOG(startup) << "ClassLinker::Init";
685*795d594fSAndroid Build Coastguard Worker 
686*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
687*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
688*795d594fSAndroid Build Coastguard Worker   gc::Heap* const heap = runtime->GetHeap();
689*795d594fSAndroid Build Coastguard Worker 
690*795d594fSAndroid Build Coastguard Worker   CHECK(!heap->HasBootImageSpace()) << "Runtime has image. We should use it.";
691*795d594fSAndroid Build Coastguard Worker   CHECK(!init_done_);
692*795d594fSAndroid Build Coastguard Worker 
693*795d594fSAndroid Build Coastguard Worker   // Use the pointer size from the runtime since we are probably creating the image.
694*795d594fSAndroid Build Coastguard Worker   image_pointer_size_ = InstructionSetPointerSize(runtime->GetInstructionSet());
695*795d594fSAndroid Build Coastguard Worker 
696*795d594fSAndroid Build Coastguard Worker   // java_lang_Class comes first, it's needed for AllocClass
697*795d594fSAndroid Build Coastguard Worker   // The GC can't handle an object with a null class since we can't get the size of this object.
698*795d594fSAndroid Build Coastguard Worker   heap->IncrementDisableMovingGC(self);
699*795d594fSAndroid Build Coastguard Worker   StackHandleScope<64> hs(self);  // 64 is picked arbitrarily.
700*795d594fSAndroid Build Coastguard Worker   auto class_class_size = mirror::Class::ClassClassSize(image_pointer_size_);
701*795d594fSAndroid Build Coastguard Worker   // Allocate the object as non-movable so that there are no cases where Object::IsClass returns
702*795d594fSAndroid Build Coastguard Worker   // the incorrect result when comparing to-space vs from-space.
703*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> java_lang_Class(hs.NewHandle(ObjPtr<mirror::Class>::DownCast(
704*795d594fSAndroid Build Coastguard Worker       heap->AllocNonMovableObject(self, nullptr, class_class_size, VoidFunctor()))));
705*795d594fSAndroid Build Coastguard Worker   CHECK(java_lang_Class != nullptr);
706*795d594fSAndroid Build Coastguard Worker   java_lang_Class->SetClassFlags(mirror::kClassFlagClass);
707*795d594fSAndroid Build Coastguard Worker   java_lang_Class->SetClass(java_lang_Class.Get());
708*795d594fSAndroid Build Coastguard Worker   if (kUseBakerReadBarrier) {
709*795d594fSAndroid Build Coastguard Worker     java_lang_Class->AssertReadBarrierState();
710*795d594fSAndroid Build Coastguard Worker   }
711*795d594fSAndroid Build Coastguard Worker   java_lang_Class->SetClassSize(class_class_size);
712*795d594fSAndroid Build Coastguard Worker   java_lang_Class->SetPrimitiveType(Primitive::kPrimNot);
713*795d594fSAndroid Build Coastguard Worker   heap->DecrementDisableMovingGC(self);
714*795d594fSAndroid Build Coastguard Worker   // AllocClass(ObjPtr<mirror::Class>) can now be used
715*795d594fSAndroid Build Coastguard Worker 
716*795d594fSAndroid Build Coastguard Worker   // Class[] is used for reflection support.
717*795d594fSAndroid Build Coastguard Worker   auto class_array_class_size = mirror::ObjectArray<mirror::Class>::ClassSize(image_pointer_size_);
718*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> class_array_class(hs.NewHandle(
719*795d594fSAndroid Build Coastguard Worker       AllocClass(self, java_lang_Class.Get(), class_array_class_size)));
720*795d594fSAndroid Build Coastguard Worker   class_array_class->SetComponentType(java_lang_Class.Get());
721*795d594fSAndroid Build Coastguard Worker 
722*795d594fSAndroid Build Coastguard Worker   // java_lang_Object comes next so that object_array_class can be created.
723*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> java_lang_Object(hs.NewHandle(
724*795d594fSAndroid Build Coastguard Worker       AllocClass(self, java_lang_Class.Get(), mirror::Object::ClassSize(image_pointer_size_))));
725*795d594fSAndroid Build Coastguard Worker   CHECK(java_lang_Object != nullptr);
726*795d594fSAndroid Build Coastguard Worker   // backfill Object as the super class of Class.
727*795d594fSAndroid Build Coastguard Worker   java_lang_Class->SetSuperClass(java_lang_Object.Get());
728*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(java_lang_Object, ClassStatus::kLoaded, self);
729*795d594fSAndroid Build Coastguard Worker 
730*795d594fSAndroid Build Coastguard Worker   java_lang_Object->SetObjectSize(sizeof(mirror::Object));
731*795d594fSAndroid Build Coastguard Worker   // Allocate in non-movable so that it's possible to check if a JNI weak global ref has been
732*795d594fSAndroid Build Coastguard Worker   // cleared without triggering the read barrier and unintentionally mark the sentinel alive.
733*795d594fSAndroid Build Coastguard Worker   runtime->SetSentinel(heap->AllocNonMovableObject(self,
734*795d594fSAndroid Build Coastguard Worker                                                    java_lang_Object.Get(),
735*795d594fSAndroid Build Coastguard Worker                                                    java_lang_Object->GetObjectSize(),
736*795d594fSAndroid Build Coastguard Worker                                                    VoidFunctor()));
737*795d594fSAndroid Build Coastguard Worker 
738*795d594fSAndroid Build Coastguard Worker   // Initialize the SubtypeCheck bitstring for java.lang.Object and java.lang.Class.
739*795d594fSAndroid Build Coastguard Worker   if (kBitstringSubtypeCheckEnabled) {
740*795d594fSAndroid Build Coastguard Worker     // It might seem the lock here is unnecessary, however all the SubtypeCheck
741*795d594fSAndroid Build Coastguard Worker     // functions are annotated to require locks all the way down.
742*795d594fSAndroid Build Coastguard Worker     //
743*795d594fSAndroid Build Coastguard Worker     // We take the lock here to avoid using NO_THREAD_SAFETY_ANALYSIS.
744*795d594fSAndroid Build Coastguard Worker     MutexLock subtype_check_lock(Thread::Current(), *Locks::subtype_check_lock_);
745*795d594fSAndroid Build Coastguard Worker     SubtypeCheck<ObjPtr<mirror::Class>>::EnsureInitialized(java_lang_Object.Get());
746*795d594fSAndroid Build Coastguard Worker     SubtypeCheck<ObjPtr<mirror::Class>>::EnsureInitialized(java_lang_Class.Get());
747*795d594fSAndroid Build Coastguard Worker   }
748*795d594fSAndroid Build Coastguard Worker 
749*795d594fSAndroid Build Coastguard Worker   // Object[] next to hold class roots.
750*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> object_array_class(hs.NewHandle(
751*795d594fSAndroid Build Coastguard Worker       AllocClass(self, java_lang_Class.Get(),
752*795d594fSAndroid Build Coastguard Worker                  mirror::ObjectArray<mirror::Object>::ClassSize(image_pointer_size_))));
753*795d594fSAndroid Build Coastguard Worker   object_array_class->SetComponentType(java_lang_Object.Get());
754*795d594fSAndroid Build Coastguard Worker 
755*795d594fSAndroid Build Coastguard Worker   // Setup java.lang.String.
756*795d594fSAndroid Build Coastguard Worker   //
757*795d594fSAndroid Build Coastguard Worker   // We make this class non-movable for the unlikely case where it were to be
758*795d594fSAndroid Build Coastguard Worker   // moved by a sticky-bit (minor) collection when using the Generational
759*795d594fSAndroid Build Coastguard Worker   // Concurrent Copying (CC) collector, potentially creating a stale reference
760*795d594fSAndroid Build Coastguard Worker   // in the `klass_` field of one of its instances allocated in the Large-Object
761*795d594fSAndroid Build Coastguard Worker   // Space (LOS) -- see the comment about the dirty card scanning logic in
762*795d594fSAndroid Build Coastguard Worker   // art::gc::collector::ConcurrentCopying::MarkingPhase.
763*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> java_lang_String(hs.NewHandle(
764*795d594fSAndroid Build Coastguard Worker       AllocClass</* kMovable= */ false>(
765*795d594fSAndroid Build Coastguard Worker           self, java_lang_Class.Get(), mirror::String::ClassSize(image_pointer_size_))));
766*795d594fSAndroid Build Coastguard Worker   java_lang_String->SetStringClass();
767*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(java_lang_String, ClassStatus::kResolved, self);
768*795d594fSAndroid Build Coastguard Worker 
769*795d594fSAndroid Build Coastguard Worker   // Setup java.lang.ref.Reference.
770*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> java_lang_ref_Reference(hs.NewHandle(
771*795d594fSAndroid Build Coastguard Worker       AllocClass(self, java_lang_Class.Get(), mirror::Reference::ClassSize(image_pointer_size_))));
772*795d594fSAndroid Build Coastguard Worker   java_lang_ref_Reference->SetObjectSize(mirror::Reference::InstanceSize());
773*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(java_lang_ref_Reference, ClassStatus::kResolved, self);
774*795d594fSAndroid Build Coastguard Worker 
775*795d594fSAndroid Build Coastguard Worker   // Create storage for root classes, save away our work so far (requires descriptors).
776*795d594fSAndroid Build Coastguard Worker   class_roots_ = GcRoot<mirror::ObjectArray<mirror::Class>>(
777*795d594fSAndroid Build Coastguard Worker       mirror::ObjectArray<mirror::Class>::Alloc(self,
778*795d594fSAndroid Build Coastguard Worker                                                 object_array_class.Get(),
779*795d594fSAndroid Build Coastguard Worker                                                 static_cast<int32_t>(ClassRoot::kMax)));
780*795d594fSAndroid Build Coastguard Worker   CHECK(!class_roots_.IsNull());
781*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangClass, java_lang_Class.Get());
782*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangObject, java_lang_Object.Get());
783*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kClassArrayClass, class_array_class.Get());
784*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kObjectArrayClass, object_array_class.Get());
785*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangString, java_lang_String.Get());
786*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangRefReference, java_lang_ref_Reference.Get());
787*795d594fSAndroid Build Coastguard Worker 
788*795d594fSAndroid Build Coastguard Worker   // Fill in the empty iftable. Needs to be done after the kObjectArrayClass root is set.
789*795d594fSAndroid Build Coastguard Worker   java_lang_Object->SetIfTable(AllocIfTable(self, 0, object_array_class.Get()));
790*795d594fSAndroid Build Coastguard Worker 
791*795d594fSAndroid Build Coastguard Worker   // Create array interface entries to populate once we can load system classes.
792*795d594fSAndroid Build Coastguard Worker   object_array_class->SetIfTable(AllocIfTable(self, 2, object_array_class.Get()));
793*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(GetArrayIfTable(), object_array_class->GetIfTable());
794*795d594fSAndroid Build Coastguard Worker 
795*795d594fSAndroid Build Coastguard Worker   // Setup the primitive type classes.
796*795d594fSAndroid Build Coastguard Worker   CreatePrimitiveClass(self, Primitive::kPrimBoolean, ClassRoot::kPrimitiveBoolean);
797*795d594fSAndroid Build Coastguard Worker   CreatePrimitiveClass(self, Primitive::kPrimByte, ClassRoot::kPrimitiveByte);
798*795d594fSAndroid Build Coastguard Worker   CreatePrimitiveClass(self, Primitive::kPrimChar, ClassRoot::kPrimitiveChar);
799*795d594fSAndroid Build Coastguard Worker   CreatePrimitiveClass(self, Primitive::kPrimShort, ClassRoot::kPrimitiveShort);
800*795d594fSAndroid Build Coastguard Worker   CreatePrimitiveClass(self, Primitive::kPrimInt, ClassRoot::kPrimitiveInt);
801*795d594fSAndroid Build Coastguard Worker   CreatePrimitiveClass(self, Primitive::kPrimLong, ClassRoot::kPrimitiveLong);
802*795d594fSAndroid Build Coastguard Worker   CreatePrimitiveClass(self, Primitive::kPrimFloat, ClassRoot::kPrimitiveFloat);
803*795d594fSAndroid Build Coastguard Worker   CreatePrimitiveClass(self, Primitive::kPrimDouble, ClassRoot::kPrimitiveDouble);
804*795d594fSAndroid Build Coastguard Worker   CreatePrimitiveClass(self, Primitive::kPrimVoid, ClassRoot::kPrimitiveVoid);
805*795d594fSAndroid Build Coastguard Worker 
806*795d594fSAndroid Build Coastguard Worker   // Allocate the primitive array classes. We need only the native pointer
807*795d594fSAndroid Build Coastguard Worker   // array at this point (int[] or long[], depending on architecture) but
808*795d594fSAndroid Build Coastguard Worker   // we shall perform the same setup steps for all primitive array classes.
809*795d594fSAndroid Build Coastguard Worker   AllocPrimitiveArrayClass(self, ClassRoot::kPrimitiveBoolean, ClassRoot::kBooleanArrayClass);
810*795d594fSAndroid Build Coastguard Worker   AllocPrimitiveArrayClass(self, ClassRoot::kPrimitiveByte, ClassRoot::kByteArrayClass);
811*795d594fSAndroid Build Coastguard Worker   AllocPrimitiveArrayClass(self, ClassRoot::kPrimitiveChar, ClassRoot::kCharArrayClass);
812*795d594fSAndroid Build Coastguard Worker   AllocPrimitiveArrayClass(self, ClassRoot::kPrimitiveShort, ClassRoot::kShortArrayClass);
813*795d594fSAndroid Build Coastguard Worker   AllocPrimitiveArrayClass(self, ClassRoot::kPrimitiveInt, ClassRoot::kIntArrayClass);
814*795d594fSAndroid Build Coastguard Worker   AllocPrimitiveArrayClass(self, ClassRoot::kPrimitiveLong, ClassRoot::kLongArrayClass);
815*795d594fSAndroid Build Coastguard Worker   AllocPrimitiveArrayClass(self, ClassRoot::kPrimitiveFloat, ClassRoot::kFloatArrayClass);
816*795d594fSAndroid Build Coastguard Worker   AllocPrimitiveArrayClass(self, ClassRoot::kPrimitiveDouble, ClassRoot::kDoubleArrayClass);
817*795d594fSAndroid Build Coastguard Worker 
818*795d594fSAndroid Build Coastguard Worker   // now that these are registered, we can use AllocClass() and AllocObjectArray
819*795d594fSAndroid Build Coastguard Worker 
820*795d594fSAndroid Build Coastguard Worker   // Set up DexCache. This cannot be done later since AppendToBootClassPath calls AllocDexCache.
821*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> java_lang_DexCache(hs.NewHandle(
822*795d594fSAndroid Build Coastguard Worker       AllocClass(self, java_lang_Class.Get(), mirror::DexCache::ClassSize(image_pointer_size_))));
823*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangDexCache, java_lang_DexCache.Get());
824*795d594fSAndroid Build Coastguard Worker   java_lang_DexCache->SetDexCacheClass();
825*795d594fSAndroid Build Coastguard Worker   java_lang_DexCache->SetObjectSize(mirror::DexCache::InstanceSize());
826*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(java_lang_DexCache, ClassStatus::kResolved, self);
827*795d594fSAndroid Build Coastguard Worker 
828*795d594fSAndroid Build Coastguard Worker 
829*795d594fSAndroid Build Coastguard Worker   // Setup dalvik.system.ClassExt
830*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> dalvik_system_ClassExt(hs.NewHandle(
831*795d594fSAndroid Build Coastguard Worker       AllocClass(self, java_lang_Class.Get(), mirror::ClassExt::ClassSize(image_pointer_size_))));
832*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kDalvikSystemClassExt, dalvik_system_ClassExt.Get());
833*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(dalvik_system_ClassExt, ClassStatus::kResolved, self);
834*795d594fSAndroid Build Coastguard Worker 
835*795d594fSAndroid Build Coastguard Worker   // Set up array classes for string, field, method
836*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> object_array_string(hs.NewHandle(
837*795d594fSAndroid Build Coastguard Worker       AllocClass(self, java_lang_Class.Get(),
838*795d594fSAndroid Build Coastguard Worker                  mirror::ObjectArray<mirror::String>::ClassSize(image_pointer_size_))));
839*795d594fSAndroid Build Coastguard Worker   object_array_string->SetComponentType(java_lang_String.Get());
840*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangStringArrayClass, object_array_string.Get());
841*795d594fSAndroid Build Coastguard Worker 
842*795d594fSAndroid Build Coastguard Worker   LinearAlloc* linear_alloc = runtime->GetLinearAlloc();
843*795d594fSAndroid Build Coastguard Worker   // Create runtime resolution and imt conflict methods.
844*795d594fSAndroid Build Coastguard Worker   runtime->SetResolutionMethod(runtime->CreateResolutionMethod());
845*795d594fSAndroid Build Coastguard Worker   runtime->SetImtConflictMethod(runtime->CreateImtConflictMethod(linear_alloc));
846*795d594fSAndroid Build Coastguard Worker   runtime->SetImtUnimplementedMethod(runtime->CreateImtConflictMethod(linear_alloc));
847*795d594fSAndroid Build Coastguard Worker 
848*795d594fSAndroid Build Coastguard Worker   // Setup boot_class_path_ and register class_path now that we can use AllocObjectArray to create
849*795d594fSAndroid Build Coastguard Worker   // DexCache instances. Needs to be after String, Field, Method arrays since AllocDexCache uses
850*795d594fSAndroid Build Coastguard Worker   // these roots.
851*795d594fSAndroid Build Coastguard Worker   if (boot_class_path.empty()) {
852*795d594fSAndroid Build Coastguard Worker     *error_msg = "Boot classpath is empty.";
853*795d594fSAndroid Build Coastguard Worker     return false;
854*795d594fSAndroid Build Coastguard Worker   }
855*795d594fSAndroid Build Coastguard Worker   for (auto& dex_file : boot_class_path) {
856*795d594fSAndroid Build Coastguard Worker     if (dex_file == nullptr) {
857*795d594fSAndroid Build Coastguard Worker       *error_msg = "Null dex file.";
858*795d594fSAndroid Build Coastguard Worker       return false;
859*795d594fSAndroid Build Coastguard Worker     }
860*795d594fSAndroid Build Coastguard Worker     AppendToBootClassPath(self, dex_file.get());
861*795d594fSAndroid Build Coastguard Worker     boot_dex_files_.push_back(std::move(dex_file));
862*795d594fSAndroid Build Coastguard Worker   }
863*795d594fSAndroid Build Coastguard Worker 
864*795d594fSAndroid Build Coastguard Worker   // now we can use FindSystemClass
865*795d594fSAndroid Build Coastguard Worker 
866*795d594fSAndroid Build Coastguard Worker   // Set up GenericJNI entrypoint. That is mainly a hack for common_compiler_test.h so that
867*795d594fSAndroid Build Coastguard Worker   // we do not need friend classes or a publicly exposed setter.
868*795d594fSAndroid Build Coastguard Worker   quick_generic_jni_trampoline_ = GetQuickGenericJniStub();
869*795d594fSAndroid Build Coastguard Worker   if (!runtime->IsAotCompiler()) {
870*795d594fSAndroid Build Coastguard Worker     // We need to set up the generic trampolines since we don't have an image.
871*795d594fSAndroid Build Coastguard Worker     jni_dlsym_lookup_trampoline_ = GetJniDlsymLookupStub();
872*795d594fSAndroid Build Coastguard Worker     jni_dlsym_lookup_critical_trampoline_ = GetJniDlsymLookupCriticalStub();
873*795d594fSAndroid Build Coastguard Worker     quick_resolution_trampoline_ = GetQuickResolutionStub();
874*795d594fSAndroid Build Coastguard Worker     quick_imt_conflict_trampoline_ = GetQuickImtConflictStub();
875*795d594fSAndroid Build Coastguard Worker     quick_generic_jni_trampoline_ = GetQuickGenericJniStub();
876*795d594fSAndroid Build Coastguard Worker     quick_to_interpreter_bridge_trampoline_ = GetQuickToInterpreterBridge();
877*795d594fSAndroid Build Coastguard Worker     nterp_trampoline_ = interpreter::GetNterpEntryPoint();
878*795d594fSAndroid Build Coastguard Worker   }
879*795d594fSAndroid Build Coastguard Worker 
880*795d594fSAndroid Build Coastguard Worker   // Object, String, ClassExt and DexCache need to be rerun through FindSystemClass to finish init
881*795d594fSAndroid Build Coastguard Worker   // We also need to immediately clear the finalizable flag for Object so that other classes are
882*795d594fSAndroid Build Coastguard Worker   // not erroneously marked as finalizable. (Object defines an empty finalizer, so that other
883*795d594fSAndroid Build Coastguard Worker   // classes can override it but it is not itself finalizable.)
884*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(java_lang_Object, ClassStatus::kNotReady, self);
885*795d594fSAndroid Build Coastguard Worker   CheckSystemClass(self, java_lang_Object, "Ljava/lang/Object;");
886*795d594fSAndroid Build Coastguard Worker   CHECK(java_lang_Object->IsFinalizable());
887*795d594fSAndroid Build Coastguard Worker   java_lang_Object->ClearFinalizable();
888*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(java_lang_Object->GetObjectSize(), mirror::Object::InstanceSize());
889*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(java_lang_String, ClassStatus::kNotReady, self);
890*795d594fSAndroid Build Coastguard Worker   CheckSystemClass(self, java_lang_String, "Ljava/lang/String;");
891*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(java_lang_DexCache, ClassStatus::kNotReady, self);
892*795d594fSAndroid Build Coastguard Worker   CheckSystemClass(self, java_lang_DexCache, "Ljava/lang/DexCache;");
893*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(java_lang_DexCache->GetObjectSize(), mirror::DexCache::InstanceSize());
894*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(dalvik_system_ClassExt, ClassStatus::kNotReady, self);
895*795d594fSAndroid Build Coastguard Worker   CheckSystemClass(self, dalvik_system_ClassExt, "Ldalvik/system/ClassExt;");
896*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(dalvik_system_ClassExt->GetObjectSize(), mirror::ClassExt::InstanceSize());
897*795d594fSAndroid Build Coastguard Worker 
898*795d594fSAndroid Build Coastguard Worker   // Run Class through FindSystemClass. This initializes the dex_cache_ fields and register it
899*795d594fSAndroid Build Coastguard Worker   // in class_table_.
900*795d594fSAndroid Build Coastguard Worker   CheckSystemClass(self, java_lang_Class, "Ljava/lang/Class;");
901*795d594fSAndroid Build Coastguard Worker 
902*795d594fSAndroid Build Coastguard Worker   // Setup core array classes, i.e. Object[], String[] and Class[] and primitive
903*795d594fSAndroid Build Coastguard Worker   // arrays - can't be done until Object has a vtable and component classes are loaded.
904*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kObjectArrayClass);
905*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kClassArrayClass);
906*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kJavaLangStringArrayClass);
907*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kBooleanArrayClass);
908*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kByteArrayClass);
909*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kCharArrayClass);
910*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kShortArrayClass);
911*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kIntArrayClass);
912*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kLongArrayClass);
913*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kFloatArrayClass);
914*795d594fSAndroid Build Coastguard Worker   FinishCoreArrayClassSetup(ClassRoot::kDoubleArrayClass);
915*795d594fSAndroid Build Coastguard Worker 
916*795d594fSAndroid Build Coastguard Worker   // Setup the single, global copy of "iftable".
917*795d594fSAndroid Build Coastguard Worker   auto java_lang_Cloneable = hs.NewHandle(FindSystemClass(self, "Ljava/lang/Cloneable;"));
918*795d594fSAndroid Build Coastguard Worker   CHECK(java_lang_Cloneable != nullptr);
919*795d594fSAndroid Build Coastguard Worker   auto java_io_Serializable = hs.NewHandle(FindSystemClass(self, "Ljava/io/Serializable;"));
920*795d594fSAndroid Build Coastguard Worker   CHECK(java_io_Serializable != nullptr);
921*795d594fSAndroid Build Coastguard Worker   // We assume that Cloneable/Serializable don't have superinterfaces -- normally we'd have to
922*795d594fSAndroid Build Coastguard Worker   // crawl up and explicitly list all of the supers as well.
923*795d594fSAndroid Build Coastguard Worker   object_array_class->GetIfTable()->SetInterface(0, java_lang_Cloneable.Get());
924*795d594fSAndroid Build Coastguard Worker   object_array_class->GetIfTable()->SetInterface(1, java_io_Serializable.Get());
925*795d594fSAndroid Build Coastguard Worker 
926*795d594fSAndroid Build Coastguard Worker   // Check Class[] and Object[]'s interfaces.
927*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(java_lang_Cloneable.Get(), class_array_class->GetDirectInterface(0));
928*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(java_io_Serializable.Get(), class_array_class->GetDirectInterface(1));
929*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(java_lang_Cloneable.Get(), object_array_class->GetDirectInterface(0));
930*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(java_io_Serializable.Get(), object_array_class->GetDirectInterface(1));
931*795d594fSAndroid Build Coastguard Worker 
932*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(object_array_string.Get(),
933*795d594fSAndroid Build Coastguard Worker            FindSystemClass(self, GetClassRootDescriptor(ClassRoot::kJavaLangStringArrayClass)));
934*795d594fSAndroid Build Coastguard Worker 
935*795d594fSAndroid Build Coastguard Worker   // The Enum class declares a "final" finalize() method to prevent subclasses from introducing
936*795d594fSAndroid Build Coastguard Worker   // a finalizer but it is not itself consedered finalizable. Load the Enum class now and clear
937*795d594fSAndroid Build Coastguard Worker   // the finalizable flag to prevent subclasses from being marked as finalizable.
938*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(LookupClass(self, "Ljava/lang/Enum;", /*class_loader=*/ nullptr), nullptr);
939*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> java_lang_Enum = hs.NewHandle(FindSystemClass(self, "Ljava/lang/Enum;"));
940*795d594fSAndroid Build Coastguard Worker   CHECK(java_lang_Enum->IsFinalizable());
941*795d594fSAndroid Build Coastguard Worker   java_lang_Enum->ClearFinalizable();
942*795d594fSAndroid Build Coastguard Worker 
943*795d594fSAndroid Build Coastguard Worker   // End of special init trickery, all subsequent classes may be loaded via FindSystemClass.
944*795d594fSAndroid Build Coastguard Worker 
945*795d594fSAndroid Build Coastguard Worker   // Create java.lang.reflect.Proxy root.
946*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangReflectProxy,
947*795d594fSAndroid Build Coastguard Worker                FindSystemClass(self, "Ljava/lang/reflect/Proxy;"));
948*795d594fSAndroid Build Coastguard Worker 
949*795d594fSAndroid Build Coastguard Worker   // Create java.lang.reflect.Field.class root.
950*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> class_root = FindSystemClass(self, "Ljava/lang/reflect/Field;");
951*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
952*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangReflectField, class_root);
953*795d594fSAndroid Build Coastguard Worker 
954*795d594fSAndroid Build Coastguard Worker   // Create java.lang.reflect.Field array root.
955*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "[Ljava/lang/reflect/Field;");
956*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
957*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangReflectFieldArrayClass, class_root);
958*795d594fSAndroid Build Coastguard Worker 
959*795d594fSAndroid Build Coastguard Worker   // Create java.lang.reflect.Constructor.class root and array root.
960*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/reflect/Constructor;");
961*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
962*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangReflectConstructor, class_root);
963*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "[Ljava/lang/reflect/Constructor;");
964*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
965*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangReflectConstructorArrayClass, class_root);
966*795d594fSAndroid Build Coastguard Worker 
967*795d594fSAndroid Build Coastguard Worker   // Create java.lang.reflect.Method.class root and array root.
968*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/reflect/Method;");
969*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
970*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangReflectMethod, class_root);
971*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "[Ljava/lang/reflect/Method;");
972*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
973*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangReflectMethodArrayClass, class_root);
974*795d594fSAndroid Build Coastguard Worker 
975*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.CallSite.class root
976*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/CallSite;");
977*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
978*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeCallSite, class_root);
979*795d594fSAndroid Build Coastguard Worker 
980*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.MethodType.class root
981*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/MethodType;");
982*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
983*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeMethodType, class_root);
984*795d594fSAndroid Build Coastguard Worker 
985*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.MethodHandleImpl.class root
986*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/MethodHandleImpl;");
987*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
988*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeMethodHandleImpl, class_root);
989*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeMethodHandle, class_root->GetSuperClass());
990*795d594fSAndroid Build Coastguard Worker 
991*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.MethodHandles.Lookup.class root
992*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/MethodHandles$Lookup;");
993*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
994*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeMethodHandlesLookup, class_root);
995*795d594fSAndroid Build Coastguard Worker 
996*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.VarHandle.class root
997*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/VarHandle;");
998*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
999*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeVarHandle, class_root);
1000*795d594fSAndroid Build Coastguard Worker 
1001*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.FieldVarHandle.class root
1002*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/FieldVarHandle;");
1003*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
1004*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeFieldVarHandle, class_root);
1005*795d594fSAndroid Build Coastguard Worker 
1006*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.StaticFieldVarHandle.class root
1007*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/StaticFieldVarHandle;");
1008*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
1009*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeStaticFieldVarHandle, class_root);
1010*795d594fSAndroid Build Coastguard Worker 
1011*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.ArrayElementVarHandle.class root
1012*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/ArrayElementVarHandle;");
1013*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
1014*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeArrayElementVarHandle, class_root);
1015*795d594fSAndroid Build Coastguard Worker 
1016*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.ByteArrayViewVarHandle.class root
1017*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/ByteArrayViewVarHandle;");
1018*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
1019*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeByteArrayViewVarHandle, class_root);
1020*795d594fSAndroid Build Coastguard Worker 
1021*795d594fSAndroid Build Coastguard Worker   // Create java.lang.invoke.ByteBufferViewVarHandle.class root
1022*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/invoke/ByteBufferViewVarHandle;");
1023*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
1024*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangInvokeByteBufferViewVarHandle, class_root);
1025*795d594fSAndroid Build Coastguard Worker 
1026*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ldalvik/system/EmulatedStackFrame;");
1027*795d594fSAndroid Build Coastguard Worker   CHECK(class_root != nullptr);
1028*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kDalvikSystemEmulatedStackFrame, class_root);
1029*795d594fSAndroid Build Coastguard Worker 
1030*795d594fSAndroid Build Coastguard Worker   // java.lang.ref classes need to be specially flagged, but otherwise are normal classes
1031*795d594fSAndroid Build Coastguard Worker   // finish initializing Reference class
1032*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(java_lang_ref_Reference, ClassStatus::kNotReady, self);
1033*795d594fSAndroid Build Coastguard Worker   CheckSystemClass(self, java_lang_ref_Reference, "Ljava/lang/ref/Reference;");
1034*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(java_lang_ref_Reference->GetObjectSize(), mirror::Reference::InstanceSize());
1035*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(java_lang_ref_Reference->GetClassSize(),
1036*795d594fSAndroid Build Coastguard Worker            mirror::Reference::ClassSize(image_pointer_size_));
1037*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/ref/FinalizerReference;");
1038*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(class_root->GetClassFlags(), mirror::kClassFlagNormal);
1039*795d594fSAndroid Build Coastguard Worker   class_root->SetClassFlags(class_root->GetClassFlags() | mirror::kClassFlagFinalizerReference);
1040*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/ref/PhantomReference;");
1041*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(class_root->GetClassFlags(), mirror::kClassFlagNormal);
1042*795d594fSAndroid Build Coastguard Worker   class_root->SetClassFlags(class_root->GetClassFlags() | mirror::kClassFlagPhantomReference);
1043*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/ref/SoftReference;");
1044*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(class_root->GetClassFlags(), mirror::kClassFlagNormal);
1045*795d594fSAndroid Build Coastguard Worker   class_root->SetClassFlags(class_root->GetClassFlags() | mirror::kClassFlagSoftReference);
1046*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/ref/WeakReference;");
1047*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(class_root->GetClassFlags(), mirror::kClassFlagNormal);
1048*795d594fSAndroid Build Coastguard Worker   class_root->SetClassFlags(class_root->GetClassFlags() | mirror::kClassFlagWeakReference);
1049*795d594fSAndroid Build Coastguard Worker 
1050*795d594fSAndroid Build Coastguard Worker   // Setup the ClassLoader, verifying the object_size_.
1051*795d594fSAndroid Build Coastguard Worker   class_root = FindSystemClass(self, "Ljava/lang/ClassLoader;");
1052*795d594fSAndroid Build Coastguard Worker   class_root->SetClassLoaderClass();
1053*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(class_root->GetObjectSize(), mirror::ClassLoader::InstanceSize());
1054*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangClassLoader, class_root);
1055*795d594fSAndroid Build Coastguard Worker 
1056*795d594fSAndroid Build Coastguard Worker   // Set up java.lang.Throwable, java.lang.ClassNotFoundException, and
1057*795d594fSAndroid Build Coastguard Worker   // java.lang.StackTraceElement as a convenience.
1058*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangThrowable, FindSystemClass(self, "Ljava/lang/Throwable;"));
1059*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangClassNotFoundException,
1060*795d594fSAndroid Build Coastguard Worker                FindSystemClass(self, "Ljava/lang/ClassNotFoundException;"));
1061*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangStackTraceElement,
1062*795d594fSAndroid Build Coastguard Worker                FindSystemClass(self, "Ljava/lang/StackTraceElement;"));
1063*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangStackTraceElementArrayClass,
1064*795d594fSAndroid Build Coastguard Worker                FindSystemClass(self, "[Ljava/lang/StackTraceElement;"));
1065*795d594fSAndroid Build Coastguard Worker   SetClassRoot(ClassRoot::kJavaLangClassLoaderArrayClass,
1066*795d594fSAndroid Build Coastguard Worker                FindSystemClass(self, "[Ljava/lang/ClassLoader;"));
1067*795d594fSAndroid Build Coastguard Worker 
1068*795d594fSAndroid Build Coastguard Worker   // Create conflict tables that depend on the class linker.
1069*795d594fSAndroid Build Coastguard Worker   runtime->FixupConflictTables();
1070*795d594fSAndroid Build Coastguard Worker 
1071*795d594fSAndroid Build Coastguard Worker   FinishInit(self);
1072*795d594fSAndroid Build Coastguard Worker 
1073*795d594fSAndroid Build Coastguard Worker   VLOG(startup) << "ClassLinker::InitFromCompiler exiting";
1074*795d594fSAndroid Build Coastguard Worker 
1075*795d594fSAndroid Build Coastguard Worker   return true;
1076*795d594fSAndroid Build Coastguard Worker }
1077*795d594fSAndroid Build Coastguard Worker 
CreateStringInitBindings(Thread * self,ClassLinker * class_linker)1078*795d594fSAndroid Build Coastguard Worker static void CreateStringInitBindings(Thread* self, ClassLinker* class_linker)
1079*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
1080*795d594fSAndroid Build Coastguard Worker   // Find String.<init> -> StringFactory bindings.
1081*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> string_factory_class =
1082*795d594fSAndroid Build Coastguard Worker       class_linker->FindSystemClass(self, "Ljava/lang/StringFactory;");
1083*795d594fSAndroid Build Coastguard Worker   CHECK(string_factory_class != nullptr);
1084*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> string_class = GetClassRoot<mirror::String>(class_linker);
1085*795d594fSAndroid Build Coastguard Worker   WellKnownClasses::InitStringInit(string_class, string_factory_class);
1086*795d594fSAndroid Build Coastguard Worker   // Update the primordial thread.
1087*795d594fSAndroid Build Coastguard Worker   self->InitStringEntryPoints();
1088*795d594fSAndroid Build Coastguard Worker }
1089*795d594fSAndroid Build Coastguard Worker 
FinishInit(Thread * self)1090*795d594fSAndroid Build Coastguard Worker void ClassLinker::FinishInit(Thread* self) {
1091*795d594fSAndroid Build Coastguard Worker   VLOG(startup) << "ClassLinker::FinishInit entering";
1092*795d594fSAndroid Build Coastguard Worker 
1093*795d594fSAndroid Build Coastguard Worker   CreateStringInitBindings(self, this);
1094*795d594fSAndroid Build Coastguard Worker 
1095*795d594fSAndroid Build Coastguard Worker   // Let the heap know some key offsets into java.lang.ref instances
1096*795d594fSAndroid Build Coastguard Worker   // Note: we hard code the field indexes here rather than using FindInstanceField
1097*795d594fSAndroid Build Coastguard Worker   // as the types of the field can't be resolved prior to the runtime being
1098*795d594fSAndroid Build Coastguard Worker   // fully initialized
1099*795d594fSAndroid Build Coastguard Worker   StackHandleScope<3> hs(self);
1100*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> java_lang_ref_Reference =
1101*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(GetClassRoot<mirror::Reference>(this));
1102*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> java_lang_ref_FinalizerReference =
1103*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(FindSystemClass(self, "Ljava/lang/ref/FinalizerReference;"));
1104*795d594fSAndroid Build Coastguard Worker 
1105*795d594fSAndroid Build Coastguard Worker   ArtField* pendingNext = java_lang_ref_Reference->GetInstanceField(0);
1106*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(pendingNext->GetName(), "pendingNext");
1107*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(pendingNext->GetTypeDescriptor(), "Ljava/lang/ref/Reference;");
1108*795d594fSAndroid Build Coastguard Worker 
1109*795d594fSAndroid Build Coastguard Worker   ArtField* queue = java_lang_ref_Reference->GetInstanceField(1);
1110*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(queue->GetName(), "queue");
1111*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(queue->GetTypeDescriptor(), "Ljava/lang/ref/ReferenceQueue;");
1112*795d594fSAndroid Build Coastguard Worker 
1113*795d594fSAndroid Build Coastguard Worker   ArtField* queueNext = java_lang_ref_Reference->GetInstanceField(2);
1114*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(queueNext->GetName(), "queueNext");
1115*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(queueNext->GetTypeDescriptor(), "Ljava/lang/ref/Reference;");
1116*795d594fSAndroid Build Coastguard Worker 
1117*795d594fSAndroid Build Coastguard Worker   ArtField* referent = java_lang_ref_Reference->GetInstanceField(3);
1118*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(referent->GetName(), "referent");
1119*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(referent->GetTypeDescriptor(), "Ljava/lang/Object;");
1120*795d594fSAndroid Build Coastguard Worker 
1121*795d594fSAndroid Build Coastguard Worker   ArtField* zombie = java_lang_ref_FinalizerReference->GetInstanceField(2);
1122*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(zombie->GetName(), "zombie");
1123*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(zombie->GetTypeDescriptor(), "Ljava/lang/Object;");
1124*795d594fSAndroid Build Coastguard Worker 
1125*795d594fSAndroid Build Coastguard Worker   // ensure all class_roots_ are initialized
1126*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_cast<size_t>(ClassRoot::kMax); i++) {
1127*795d594fSAndroid Build Coastguard Worker     ClassRoot class_root = static_cast<ClassRoot>(i);
1128*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass = GetClassRoot(class_root);
1129*795d594fSAndroid Build Coastguard Worker     CHECK(klass != nullptr);
1130*795d594fSAndroid Build Coastguard Worker     DCHECK(klass->IsArrayClass() || klass->IsPrimitive() || klass->GetDexCache() != nullptr);
1131*795d594fSAndroid Build Coastguard Worker     // note SetClassRoot does additional validation.
1132*795d594fSAndroid Build Coastguard Worker     // if possible add new checks there to catch errors early
1133*795d594fSAndroid Build Coastguard Worker   }
1134*795d594fSAndroid Build Coastguard Worker 
1135*795d594fSAndroid Build Coastguard Worker   CHECK(GetArrayIfTable() != nullptr);
1136*795d594fSAndroid Build Coastguard Worker 
1137*795d594fSAndroid Build Coastguard Worker   // disable the slow paths in FindClass and CreatePrimitiveClass now
1138*795d594fSAndroid Build Coastguard Worker   // that Object, Class, and Object[] are setup
1139*795d594fSAndroid Build Coastguard Worker   init_done_ = true;
1140*795d594fSAndroid Build Coastguard Worker 
1141*795d594fSAndroid Build Coastguard Worker   // Under sanitization, the small carve-out to handle stack overflow might not be enough to
1142*795d594fSAndroid Build Coastguard Worker   // initialize the StackOverflowError class (as it might require running the verifier). Instead,
1143*795d594fSAndroid Build Coastguard Worker   // ensure that the class will be initialized.
1144*795d594fSAndroid Build Coastguard Worker   if (kMemoryToolIsAvailable && !Runtime::Current()->IsAotCompiler()) {
1145*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> soe_klass = FindSystemClass(self, "Ljava/lang/StackOverflowError;");
1146*795d594fSAndroid Build Coastguard Worker     if (soe_klass == nullptr || !EnsureInitialized(self, hs.NewHandle(soe_klass), true, true)) {
1147*795d594fSAndroid Build Coastguard Worker       // Strange, but don't crash.
1148*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << "Could not prepare StackOverflowError.";
1149*795d594fSAndroid Build Coastguard Worker       self->ClearException();
1150*795d594fSAndroid Build Coastguard Worker     }
1151*795d594fSAndroid Build Coastguard Worker   }
1152*795d594fSAndroid Build Coastguard Worker 
1153*795d594fSAndroid Build Coastguard Worker   VLOG(startup) << "ClassLinker::FinishInit exiting";
1154*795d594fSAndroid Build Coastguard Worker }
1155*795d594fSAndroid Build Coastguard Worker 
EnsureRootInitialized(ClassLinker * class_linker,Thread * self,ObjPtr<mirror::Class> klass)1156*795d594fSAndroid Build Coastguard Worker static void EnsureRootInitialized(ClassLinker* class_linker,
1157*795d594fSAndroid Build Coastguard Worker                                   Thread* self,
1158*795d594fSAndroid Build Coastguard Worker                                   ObjPtr<mirror::Class> klass)
1159*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
1160*795d594fSAndroid Build Coastguard Worker   if (!klass->IsVisiblyInitialized()) {
1161*795d594fSAndroid Build Coastguard Worker     DCHECK(!klass->IsArrayClass());
1162*795d594fSAndroid Build Coastguard Worker     DCHECK(!klass->IsPrimitive());
1163*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
1164*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> h_class(hs.NewHandle(klass));
1165*795d594fSAndroid Build Coastguard Worker     if (!class_linker->EnsureInitialized(
1166*795d594fSAndroid Build Coastguard Worker              self, h_class, /*can_init_fields=*/ true, /*can_init_parents=*/ true)) {
1167*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "Exception when initializing " << h_class->PrettyClass()
1168*795d594fSAndroid Build Coastguard Worker           << ": " << self->GetException()->Dump();
1169*795d594fSAndroid Build Coastguard Worker     }
1170*795d594fSAndroid Build Coastguard Worker   }
1171*795d594fSAndroid Build Coastguard Worker }
1172*795d594fSAndroid Build Coastguard Worker 
RunEarlyRootClinits(Thread * self)1173*795d594fSAndroid Build Coastguard Worker void ClassLinker::RunEarlyRootClinits(Thread* self) {
1174*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1u> hs(self);
1175*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::Class>> class_roots = hs.NewHandle(GetClassRoots());
1176*795d594fSAndroid Build Coastguard Worker   EnsureRootInitialized(this, self, GetClassRoot<mirror::Class>(class_roots.Get()));
1177*795d594fSAndroid Build Coastguard Worker   EnsureRootInitialized(this, self, GetClassRoot<mirror::String>(class_roots.Get()));
1178*795d594fSAndroid Build Coastguard Worker   // `Field` class is needed for register_java_net_InetAddress in libcore, b/28153851.
1179*795d594fSAndroid Build Coastguard Worker   EnsureRootInitialized(this, self, GetClassRoot<mirror::Field>(class_roots.Get()));
1180*795d594fSAndroid Build Coastguard Worker 
1181*795d594fSAndroid Build Coastguard Worker   WellKnownClasses::Init(self->GetJniEnv());
1182*795d594fSAndroid Build Coastguard Worker 
1183*795d594fSAndroid Build Coastguard Worker   // `FinalizerReference` class is needed for initialization of `java.net.InetAddress`.
1184*795d594fSAndroid Build Coastguard Worker   // (Indirectly by constructing a `ObjectStreamField` which uses a `StringBuilder`
1185*795d594fSAndroid Build Coastguard Worker   // and, when resizing, initializes the `System` class for `System.arraycopy()`
1186*795d594fSAndroid Build Coastguard Worker   // and `System.<clinit> creates a finalizable object.)
1187*795d594fSAndroid Build Coastguard Worker   EnsureRootInitialized(
1188*795d594fSAndroid Build Coastguard Worker       this, self, WellKnownClasses::java_lang_ref_FinalizerReference_add->GetDeclaringClass());
1189*795d594fSAndroid Build Coastguard Worker }
1190*795d594fSAndroid Build Coastguard Worker 
RunRootClinits(Thread * self)1191*795d594fSAndroid Build Coastguard Worker void ClassLinker::RunRootClinits(Thread* self) {
1192*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1u> hs(self);
1193*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::Class>> class_roots = hs.NewHandle(GetClassRoots());
1194*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_cast<size_t>(ClassRoot::kMax); ++i) {
1195*795d594fSAndroid Build Coastguard Worker     EnsureRootInitialized(this, self, GetClassRoot(ClassRoot(i), class_roots.Get()));
1196*795d594fSAndroid Build Coastguard Worker   }
1197*795d594fSAndroid Build Coastguard Worker 
1198*795d594fSAndroid Build Coastguard Worker   // Make sure certain well-known classes are initialized. Note that well-known
1199*795d594fSAndroid Build Coastguard Worker   // classes are always in the boot image, so this code is primarily intended
1200*795d594fSAndroid Build Coastguard Worker   // for running without boot image but may be needed for boot image if the
1201*795d594fSAndroid Build Coastguard Worker   // AOT-initialization fails due to introduction of new code to `<clinit>`.
1202*795d594fSAndroid Build Coastguard Worker   ArtMethod* methods_of_classes_to_initialize[] = {
1203*795d594fSAndroid Build Coastguard Worker       // Initialize primitive boxing classes (avoid check at runtime).
1204*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Boolean_valueOf,
1205*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Byte_valueOf,
1206*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Character_valueOf,
1207*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Double_valueOf,
1208*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Float_valueOf,
1209*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Integer_valueOf,
1210*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Long_valueOf,
1211*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Short_valueOf,
1212*795d594fSAndroid Build Coastguard Worker       // Initialize `StackOverflowError`.
1213*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_StackOverflowError_init,
1214*795d594fSAndroid Build Coastguard Worker       // Ensure class loader classes are initialized (avoid check at runtime).
1215*795d594fSAndroid Build Coastguard Worker       // Superclass `ClassLoader` is a class root and already initialized above.
1216*795d594fSAndroid Build Coastguard Worker       // Superclass `BaseDexClassLoader` is initialized implicitly.
1217*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::dalvik_system_DelegateLastClassLoader_init,
1218*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::dalvik_system_DexClassLoader_init,
1219*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::dalvik_system_InMemoryDexClassLoader_init,
1220*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::dalvik_system_PathClassLoader_init,
1221*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader_init,
1222*795d594fSAndroid Build Coastguard Worker       // Ensure `Daemons` class is initialized (avoid check at runtime).
1223*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Daemons_start,
1224*795d594fSAndroid Build Coastguard Worker       // Ensure `Thread` and `ThreadGroup` classes are initialized (avoid check at runtime).
1225*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Thread_init,
1226*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_ThreadGroup_add,
1227*795d594fSAndroid Build Coastguard Worker       // Ensure reference classes are initialized (avoid check at runtime).
1228*795d594fSAndroid Build Coastguard Worker       // The `FinalizerReference` class was initialized in `RunEarlyRootClinits()`.
1229*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_ref_ReferenceQueue_add,
1230*795d594fSAndroid Build Coastguard Worker       // Ensure `InvocationTargetException` class is initialized (avoid check at runtime).
1231*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_reflect_InvocationTargetException_init,
1232*795d594fSAndroid Build Coastguard Worker       // Ensure `Parameter` class is initialized (avoid check at runtime).
1233*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_reflect_Parameter_init,
1234*795d594fSAndroid Build Coastguard Worker       // Ensure `MethodHandles` and `MethodType` classes are initialized (avoid check at runtime).
1235*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_invoke_MethodHandles_lookup,
1236*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_invoke_MethodType_makeImpl,
1237*795d594fSAndroid Build Coastguard Worker       // Ensure `DirectByteBuffer` class is initialized (avoid check at runtime).
1238*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_nio_DirectByteBuffer_init,
1239*795d594fSAndroid Build Coastguard Worker       // Ensure `FloatingDecimal` class is initialized (avoid check at runtime).
1240*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::jdk_internal_math_FloatingDecimal_getBinaryToASCIIConverter_D,
1241*795d594fSAndroid Build Coastguard Worker       // Ensure reflection annotation classes are initialized (avoid check at runtime).
1242*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::libcore_reflect_AnnotationFactory_createAnnotation,
1243*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::libcore_reflect_AnnotationMember_init,
1244*795d594fSAndroid Build Coastguard Worker       // We're suppressing exceptions from `DdmServer` and we do not want to repeatedly
1245*795d594fSAndroid Build Coastguard Worker       // suppress class initialization error (say, due to OOM), so initialize it early.
1246*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::org_apache_harmony_dalvik_ddmc_DdmServer_dispatch,
1247*795d594fSAndroid Build Coastguard Worker   };
1248*795d594fSAndroid Build Coastguard Worker   for (ArtMethod* method : methods_of_classes_to_initialize) {
1249*795d594fSAndroid Build Coastguard Worker     EnsureRootInitialized(this, self, method->GetDeclaringClass());
1250*795d594fSAndroid Build Coastguard Worker   }
1251*795d594fSAndroid Build Coastguard Worker   ArtField* fields_of_classes_to_initialize[] = {
1252*795d594fSAndroid Build Coastguard Worker       // Ensure classes used by class loaders are initialized (avoid check at runtime).
1253*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::dalvik_system_DexFile_cookie,
1254*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::dalvik_system_DexPathList_dexElements,
1255*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::dalvik_system_DexPathList__Element_dexFile,
1256*795d594fSAndroid Build Coastguard Worker       // Ensure `VMRuntime` is initialized (avoid check at runtime).
1257*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::dalvik_system_VMRuntime_nonSdkApiUsageConsumer,
1258*795d594fSAndroid Build Coastguard Worker       // Initialize empty arrays needed by `StackOverflowError`.
1259*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_util_Collections_EMPTY_LIST,
1260*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::libcore_util_EmptyArray_STACK_TRACE_ELEMENT,
1261*795d594fSAndroid Build Coastguard Worker       // Initialize boxing caches needed by the compiler.
1262*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Byte_ByteCache_cache,
1263*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Character_CharacterCache_cache,
1264*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Integer_IntegerCache_cache,
1265*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Long_LongCache_cache,
1266*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_Short_ShortCache_cache,
1267*795d594fSAndroid Build Coastguard Worker   };
1268*795d594fSAndroid Build Coastguard Worker   for (ArtField* field : fields_of_classes_to_initialize) {
1269*795d594fSAndroid Build Coastguard Worker     EnsureRootInitialized(this, self, field->GetDeclaringClass());
1270*795d594fSAndroid Build Coastguard Worker   }
1271*795d594fSAndroid Build Coastguard Worker }
1272*795d594fSAndroid Build Coastguard Worker 
1273*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
ComputeMethodHash(ArtMethod * method)1274*795d594fSAndroid Build Coastguard Worker static uint32_t ComputeMethodHash(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_) {
1275*795d594fSAndroid Build Coastguard Worker   DCHECK(!method->IsRuntimeMethod());
1276*795d594fSAndroid Build Coastguard Worker   DCHECK(!method->IsProxyMethod());
1277*795d594fSAndroid Build Coastguard Worker   DCHECK(!method->IsObsolete());
1278*795d594fSAndroid Build Coastguard Worker   // Do not use `ArtMethod::GetNameView()` to avoid unnecessary runtime/proxy/obsolete method
1279*795d594fSAndroid Build Coastguard Worker   // checks. It is safe to avoid the read barrier here, see `ArtMethod::GetDexFile()`.
1280*795d594fSAndroid Build Coastguard Worker   const DexFile& dex_file = method->GetDeclaringClass<kWithoutReadBarrier>()->GetDexFile();
1281*795d594fSAndroid Build Coastguard Worker   const dex::MethodId& method_id = dex_file.GetMethodId(method->GetDexMethodIndex());
1282*795d594fSAndroid Build Coastguard Worker   std::string_view name = dex_file.GetMethodNameView(method_id);
1283*795d594fSAndroid Build Coastguard Worker   return ComputeModifiedUtf8Hash(name);
1284*795d594fSAndroid Build Coastguard Worker }
1285*795d594fSAndroid Build Coastguard Worker 
1286*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
MethodSignatureEquals(ArtMethod * lhs,ArtMethod * rhs)1287*795d594fSAndroid Build Coastguard Worker static bool MethodSignatureEquals(ArtMethod* lhs, ArtMethod* rhs)
1288*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
1289*795d594fSAndroid Build Coastguard Worker   DCHECK(!lhs->IsRuntimeMethod());
1290*795d594fSAndroid Build Coastguard Worker   DCHECK(!lhs->IsProxyMethod());
1291*795d594fSAndroid Build Coastguard Worker   DCHECK(!lhs->IsObsolete());
1292*795d594fSAndroid Build Coastguard Worker   DCHECK(!rhs->IsRuntimeMethod());
1293*795d594fSAndroid Build Coastguard Worker   DCHECK(!rhs->IsProxyMethod());
1294*795d594fSAndroid Build Coastguard Worker   DCHECK(!rhs->IsObsolete());
1295*795d594fSAndroid Build Coastguard Worker   // Do not use `ArtMethod::GetDexFile()` to avoid unnecessary obsolete method checks.
1296*795d594fSAndroid Build Coastguard Worker   // It is safe to avoid the read barrier here, see `ArtMethod::GetDexFile()`.
1297*795d594fSAndroid Build Coastguard Worker   const DexFile& lhs_dex_file = lhs->GetDeclaringClass<kWithoutReadBarrier>()->GetDexFile();
1298*795d594fSAndroid Build Coastguard Worker   const DexFile& rhs_dex_file = rhs->GetDeclaringClass<kWithoutReadBarrier>()->GetDexFile();
1299*795d594fSAndroid Build Coastguard Worker   const dex::MethodId& lhs_mid = lhs_dex_file.GetMethodId(lhs->GetDexMethodIndex());
1300*795d594fSAndroid Build Coastguard Worker   const dex::MethodId& rhs_mid = rhs_dex_file.GetMethodId(rhs->GetDexMethodIndex());
1301*795d594fSAndroid Build Coastguard Worker   if (&lhs_dex_file == &rhs_dex_file) {
1302*795d594fSAndroid Build Coastguard Worker     return lhs_mid.name_idx_ == rhs_mid.name_idx_ &&
1303*795d594fSAndroid Build Coastguard Worker            lhs_mid.proto_idx_ == rhs_mid.proto_idx_;
1304*795d594fSAndroid Build Coastguard Worker   } else {
1305*795d594fSAndroid Build Coastguard Worker     return
1306*795d594fSAndroid Build Coastguard Worker         lhs_dex_file.GetMethodNameView(lhs_mid) == rhs_dex_file.GetMethodNameView(rhs_mid) &&
1307*795d594fSAndroid Build Coastguard Worker         lhs_dex_file.GetMethodSignature(lhs_mid) == rhs_dex_file.GetMethodSignature(rhs_mid);
1308*795d594fSAndroid Build Coastguard Worker   }
1309*795d594fSAndroid Build Coastguard Worker }
1310*795d594fSAndroid Build Coastguard Worker 
InitializeObjectVirtualMethodHashes(ObjPtr<mirror::Class> java_lang_Object,PointerSize pointer_size,ArrayRef<uint32_t> virtual_method_hashes)1311*795d594fSAndroid Build Coastguard Worker static void InitializeObjectVirtualMethodHashes(ObjPtr<mirror::Class> java_lang_Object,
1312*795d594fSAndroid Build Coastguard Worker                                                 PointerSize pointer_size,
1313*795d594fSAndroid Build Coastguard Worker                                                 /*out*/ ArrayRef<uint32_t> virtual_method_hashes)
1314*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
1315*795d594fSAndroid Build Coastguard Worker   ArraySlice<ArtMethod> virtual_methods = java_lang_Object->GetVirtualMethods(pointer_size);
1316*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(virtual_method_hashes.size(), virtual_methods.size());
1317*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i != virtual_method_hashes.size(); ++i) {
1318*795d594fSAndroid Build Coastguard Worker     virtual_method_hashes[i] = ComputeMethodHash(&virtual_methods[i]);
1319*795d594fSAndroid Build Coastguard Worker   }
1320*795d594fSAndroid Build Coastguard Worker }
1321*795d594fSAndroid Build Coastguard Worker 
1322*795d594fSAndroid Build Coastguard Worker struct TrampolineCheckData {
1323*795d594fSAndroid Build Coastguard Worker   const void* quick_resolution_trampoline;
1324*795d594fSAndroid Build Coastguard Worker   const void* quick_imt_conflict_trampoline;
1325*795d594fSAndroid Build Coastguard Worker   const void* quick_generic_jni_trampoline;
1326*795d594fSAndroid Build Coastguard Worker   const void* quick_to_interpreter_bridge_trampoline;
1327*795d594fSAndroid Build Coastguard Worker   const void* nterp_trampoline;
1328*795d594fSAndroid Build Coastguard Worker   PointerSize pointer_size;
1329*795d594fSAndroid Build Coastguard Worker   ArtMethod* m;
1330*795d594fSAndroid Build Coastguard Worker   bool error;
1331*795d594fSAndroid Build Coastguard Worker };
1332*795d594fSAndroid Build Coastguard Worker 
InitFromBootImage(std::string * error_msg)1333*795d594fSAndroid Build Coastguard Worker bool ClassLinker::InitFromBootImage(std::string* error_msg) {
1334*795d594fSAndroid Build Coastguard Worker   VLOG(startup) << __FUNCTION__ << " entering";
1335*795d594fSAndroid Build Coastguard Worker   CHECK(!init_done_);
1336*795d594fSAndroid Build Coastguard Worker 
1337*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
1338*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
1339*795d594fSAndroid Build Coastguard Worker   gc::Heap* const heap = runtime->GetHeap();
1340*795d594fSAndroid Build Coastguard Worker   std::vector<gc::space::ImageSpace*> spaces = heap->GetBootImageSpaces();
1341*795d594fSAndroid Build Coastguard Worker   CHECK(!spaces.empty());
1342*795d594fSAndroid Build Coastguard Worker   const ImageHeader& image_header = spaces[0]->GetImageHeader();
1343*795d594fSAndroid Build Coastguard Worker   image_pointer_size_ = image_header.GetPointerSize();
1344*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(image_pointer_size_ != PointerSize::k32 &&
1345*795d594fSAndroid Build Coastguard Worker                image_pointer_size_ != PointerSize::k64)) {
1346*795d594fSAndroid Build Coastguard Worker     *error_msg =
1347*795d594fSAndroid Build Coastguard Worker         StringPrintf("Invalid image pointer size: %u", static_cast<uint32_t>(image_pointer_size_));
1348*795d594fSAndroid Build Coastguard Worker     return false;
1349*795d594fSAndroid Build Coastguard Worker   }
1350*795d594fSAndroid Build Coastguard Worker   if (!runtime->IsAotCompiler()) {
1351*795d594fSAndroid Build Coastguard Worker     // Only the Aot compiler supports having an image with a different pointer size than the
1352*795d594fSAndroid Build Coastguard Worker     // runtime. This happens on the host for compiling 32 bit tests since we use a 64 bit libart
1353*795d594fSAndroid Build Coastguard Worker     // compiler. We may also use 32 bit dex2oat on a system with 64 bit apps.
1354*795d594fSAndroid Build Coastguard Worker     if (image_pointer_size_ != kRuntimePointerSize) {
1355*795d594fSAndroid Build Coastguard Worker       *error_msg = StringPrintf("Runtime must use current image pointer size: %zu vs %zu",
1356*795d594fSAndroid Build Coastguard Worker                                 static_cast<size_t>(image_pointer_size_),
1357*795d594fSAndroid Build Coastguard Worker                                 sizeof(void*));
1358*795d594fSAndroid Build Coastguard Worker       return false;
1359*795d594fSAndroid Build Coastguard Worker     }
1360*795d594fSAndroid Build Coastguard Worker   }
1361*795d594fSAndroid Build Coastguard Worker   DCHECK(!runtime->HasResolutionMethod());
1362*795d594fSAndroid Build Coastguard Worker   runtime->SetResolutionMethod(image_header.GetImageMethod(ImageHeader::kResolutionMethod));
1363*795d594fSAndroid Build Coastguard Worker   runtime->SetImtConflictMethod(image_header.GetImageMethod(ImageHeader::kImtConflictMethod));
1364*795d594fSAndroid Build Coastguard Worker   runtime->SetImtUnimplementedMethod(
1365*795d594fSAndroid Build Coastguard Worker       image_header.GetImageMethod(ImageHeader::kImtUnimplementedMethod));
1366*795d594fSAndroid Build Coastguard Worker   runtime->SetCalleeSaveMethod(
1367*795d594fSAndroid Build Coastguard Worker       image_header.GetImageMethod(ImageHeader::kSaveAllCalleeSavesMethod),
1368*795d594fSAndroid Build Coastguard Worker       CalleeSaveType::kSaveAllCalleeSaves);
1369*795d594fSAndroid Build Coastguard Worker   runtime->SetCalleeSaveMethod(
1370*795d594fSAndroid Build Coastguard Worker       image_header.GetImageMethod(ImageHeader::kSaveRefsOnlyMethod),
1371*795d594fSAndroid Build Coastguard Worker       CalleeSaveType::kSaveRefsOnly);
1372*795d594fSAndroid Build Coastguard Worker   runtime->SetCalleeSaveMethod(
1373*795d594fSAndroid Build Coastguard Worker       image_header.GetImageMethod(ImageHeader::kSaveRefsAndArgsMethod),
1374*795d594fSAndroid Build Coastguard Worker       CalleeSaveType::kSaveRefsAndArgs);
1375*795d594fSAndroid Build Coastguard Worker   runtime->SetCalleeSaveMethod(
1376*795d594fSAndroid Build Coastguard Worker       image_header.GetImageMethod(ImageHeader::kSaveEverythingMethod),
1377*795d594fSAndroid Build Coastguard Worker       CalleeSaveType::kSaveEverything);
1378*795d594fSAndroid Build Coastguard Worker   runtime->SetCalleeSaveMethod(
1379*795d594fSAndroid Build Coastguard Worker       image_header.GetImageMethod(ImageHeader::kSaveEverythingMethodForClinit),
1380*795d594fSAndroid Build Coastguard Worker       CalleeSaveType::kSaveEverythingForClinit);
1381*795d594fSAndroid Build Coastguard Worker   runtime->SetCalleeSaveMethod(
1382*795d594fSAndroid Build Coastguard Worker       image_header.GetImageMethod(ImageHeader::kSaveEverythingMethodForSuspendCheck),
1383*795d594fSAndroid Build Coastguard Worker       CalleeSaveType::kSaveEverythingForSuspendCheck);
1384*795d594fSAndroid Build Coastguard Worker 
1385*795d594fSAndroid Build Coastguard Worker   std::vector<const OatFile*> oat_files =
1386*795d594fSAndroid Build Coastguard Worker       runtime->GetOatFileManager().RegisterImageOatFiles(spaces);
1387*795d594fSAndroid Build Coastguard Worker   DCHECK(!oat_files.empty());
1388*795d594fSAndroid Build Coastguard Worker   const OatHeader& default_oat_header = oat_files[0]->GetOatHeader();
1389*795d594fSAndroid Build Coastguard Worker   jni_dlsym_lookup_trampoline_ = default_oat_header.GetJniDlsymLookupTrampoline();
1390*795d594fSAndroid Build Coastguard Worker   jni_dlsym_lookup_critical_trampoline_ = default_oat_header.GetJniDlsymLookupCriticalTrampoline();
1391*795d594fSAndroid Build Coastguard Worker   quick_resolution_trampoline_ = default_oat_header.GetQuickResolutionTrampoline();
1392*795d594fSAndroid Build Coastguard Worker   quick_imt_conflict_trampoline_ = default_oat_header.GetQuickImtConflictTrampoline();
1393*795d594fSAndroid Build Coastguard Worker   quick_generic_jni_trampoline_ = default_oat_header.GetQuickGenericJniTrampoline();
1394*795d594fSAndroid Build Coastguard Worker   quick_to_interpreter_bridge_trampoline_ = default_oat_header.GetQuickToInterpreterBridge();
1395*795d594fSAndroid Build Coastguard Worker   nterp_trampoline_ = default_oat_header.GetNterpTrampoline();
1396*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
1397*795d594fSAndroid Build Coastguard Worker     // Check that the other images use the same trampoline.
1398*795d594fSAndroid Build Coastguard Worker     for (size_t i = 1; i < oat_files.size(); ++i) {
1399*795d594fSAndroid Build Coastguard Worker       const OatHeader& ith_oat_header = oat_files[i]->GetOatHeader();
1400*795d594fSAndroid Build Coastguard Worker       const void* ith_jni_dlsym_lookup_trampoline_ =
1401*795d594fSAndroid Build Coastguard Worker           ith_oat_header.GetJniDlsymLookupTrampoline();
1402*795d594fSAndroid Build Coastguard Worker       const void* ith_jni_dlsym_lookup_critical_trampoline_ =
1403*795d594fSAndroid Build Coastguard Worker           ith_oat_header.GetJniDlsymLookupCriticalTrampoline();
1404*795d594fSAndroid Build Coastguard Worker       const void* ith_quick_resolution_trampoline =
1405*795d594fSAndroid Build Coastguard Worker           ith_oat_header.GetQuickResolutionTrampoline();
1406*795d594fSAndroid Build Coastguard Worker       const void* ith_quick_imt_conflict_trampoline =
1407*795d594fSAndroid Build Coastguard Worker           ith_oat_header.GetQuickImtConflictTrampoline();
1408*795d594fSAndroid Build Coastguard Worker       const void* ith_quick_generic_jni_trampoline =
1409*795d594fSAndroid Build Coastguard Worker           ith_oat_header.GetQuickGenericJniTrampoline();
1410*795d594fSAndroid Build Coastguard Worker       const void* ith_quick_to_interpreter_bridge_trampoline =
1411*795d594fSAndroid Build Coastguard Worker           ith_oat_header.GetQuickToInterpreterBridge();
1412*795d594fSAndroid Build Coastguard Worker       const void* ith_nterp_trampoline =
1413*795d594fSAndroid Build Coastguard Worker           ith_oat_header.GetNterpTrampoline();
1414*795d594fSAndroid Build Coastguard Worker       if (ith_jni_dlsym_lookup_trampoline_ != jni_dlsym_lookup_trampoline_ ||
1415*795d594fSAndroid Build Coastguard Worker           ith_jni_dlsym_lookup_critical_trampoline_ != jni_dlsym_lookup_critical_trampoline_ ||
1416*795d594fSAndroid Build Coastguard Worker           ith_quick_resolution_trampoline != quick_resolution_trampoline_ ||
1417*795d594fSAndroid Build Coastguard Worker           ith_quick_imt_conflict_trampoline != quick_imt_conflict_trampoline_ ||
1418*795d594fSAndroid Build Coastguard Worker           ith_quick_generic_jni_trampoline != quick_generic_jni_trampoline_ ||
1419*795d594fSAndroid Build Coastguard Worker           ith_quick_to_interpreter_bridge_trampoline != quick_to_interpreter_bridge_trampoline_ ||
1420*795d594fSAndroid Build Coastguard Worker           ith_nterp_trampoline != nterp_trampoline_) {
1421*795d594fSAndroid Build Coastguard Worker         // Make sure that all methods in this image do not contain those trampolines as
1422*795d594fSAndroid Build Coastguard Worker         // entrypoints. Otherwise the class-linker won't be able to work with a single set.
1423*795d594fSAndroid Build Coastguard Worker         TrampolineCheckData data;
1424*795d594fSAndroid Build Coastguard Worker         data.error = false;
1425*795d594fSAndroid Build Coastguard Worker         data.pointer_size = GetImagePointerSize();
1426*795d594fSAndroid Build Coastguard Worker         data.quick_resolution_trampoline = ith_quick_resolution_trampoline;
1427*795d594fSAndroid Build Coastguard Worker         data.quick_imt_conflict_trampoline = ith_quick_imt_conflict_trampoline;
1428*795d594fSAndroid Build Coastguard Worker         data.quick_generic_jni_trampoline = ith_quick_generic_jni_trampoline;
1429*795d594fSAndroid Build Coastguard Worker         data.quick_to_interpreter_bridge_trampoline = ith_quick_to_interpreter_bridge_trampoline;
1430*795d594fSAndroid Build Coastguard Worker         data.nterp_trampoline = ith_nterp_trampoline;
1431*795d594fSAndroid Build Coastguard Worker         ReaderMutexLock mu(self, *Locks::heap_bitmap_lock_);
1432*795d594fSAndroid Build Coastguard Worker         auto visitor = [&](mirror::Object* obj) REQUIRES_SHARED(Locks::mutator_lock_) {
1433*795d594fSAndroid Build Coastguard Worker           if (obj->IsClass()) {
1434*795d594fSAndroid Build Coastguard Worker             ObjPtr<mirror::Class> klass = obj->AsClass();
1435*795d594fSAndroid Build Coastguard Worker             for (ArtMethod& m : klass->GetMethods(data.pointer_size)) {
1436*795d594fSAndroid Build Coastguard Worker               const void* entrypoint =
1437*795d594fSAndroid Build Coastguard Worker                   m.GetEntryPointFromQuickCompiledCodePtrSize(data.pointer_size);
1438*795d594fSAndroid Build Coastguard Worker               if (entrypoint == data.quick_resolution_trampoline ||
1439*795d594fSAndroid Build Coastguard Worker                   entrypoint == data.quick_imt_conflict_trampoline ||
1440*795d594fSAndroid Build Coastguard Worker                   entrypoint == data.quick_generic_jni_trampoline ||
1441*795d594fSAndroid Build Coastguard Worker                   entrypoint == data.quick_to_interpreter_bridge_trampoline) {
1442*795d594fSAndroid Build Coastguard Worker                 data.m = &m;
1443*795d594fSAndroid Build Coastguard Worker                 data.error = true;
1444*795d594fSAndroid Build Coastguard Worker                 return;
1445*795d594fSAndroid Build Coastguard Worker               }
1446*795d594fSAndroid Build Coastguard Worker             }
1447*795d594fSAndroid Build Coastguard Worker           }
1448*795d594fSAndroid Build Coastguard Worker         };
1449*795d594fSAndroid Build Coastguard Worker         spaces[i]->GetLiveBitmap()->Walk(visitor);
1450*795d594fSAndroid Build Coastguard Worker         if (data.error) {
1451*795d594fSAndroid Build Coastguard Worker           ArtMethod* m = data.m;
1452*795d594fSAndroid Build Coastguard Worker           LOG(ERROR) << "Found a broken ArtMethod: " << ArtMethod::PrettyMethod(m);
1453*795d594fSAndroid Build Coastguard Worker           *error_msg = "Found an ArtMethod with a bad entrypoint";
1454*795d594fSAndroid Build Coastguard Worker           return false;
1455*795d594fSAndroid Build Coastguard Worker         }
1456*795d594fSAndroid Build Coastguard Worker       }
1457*795d594fSAndroid Build Coastguard Worker     }
1458*795d594fSAndroid Build Coastguard Worker   }
1459*795d594fSAndroid Build Coastguard Worker 
1460*795d594fSAndroid Build Coastguard Worker   class_roots_ = GcRoot<mirror::ObjectArray<mirror::Class>>(
1461*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::ObjectArray<mirror::Class>>::DownCast(
1462*795d594fSAndroid Build Coastguard Worker           image_header.GetImageRoot(ImageHeader::kClassRoots)));
1463*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(GetClassRoot<mirror::Class>(this)->GetClassFlags(), mirror::kClassFlagClass);
1464*795d594fSAndroid Build Coastguard Worker 
1465*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(GetClassRoot<mirror::Object>(this)->GetObjectSize(), sizeof(mirror::Object));
1466*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects =
1467*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::ObjectArray<mirror::Object>>::DownCast(
1468*795d594fSAndroid Build Coastguard Worker           image_header.GetImageRoot(ImageHeader::kBootImageLiveObjects));
1469*795d594fSAndroid Build Coastguard Worker   runtime->SetSentinel(boot_image_live_objects->Get(ImageHeader::kClearedJniWeakSentinel));
1470*795d594fSAndroid Build Coastguard Worker   DCHECK(runtime->GetSentinel().Read()->GetClass() == GetClassRoot<mirror::Object>(this));
1471*795d594fSAndroid Build Coastguard Worker 
1472*795d594fSAndroid Build Coastguard Worker   // Boot class loader, use a null handle.
1473*795d594fSAndroid Build Coastguard Worker   if (!AddImageSpaces(ArrayRef<gc::space::ImageSpace*>(spaces),
1474*795d594fSAndroid Build Coastguard Worker                       ScopedNullHandle<mirror::ClassLoader>(),
1475*795d594fSAndroid Build Coastguard Worker                       /*context=*/nullptr,
1476*795d594fSAndroid Build Coastguard Worker                       &boot_dex_files_,
1477*795d594fSAndroid Build Coastguard Worker                       error_msg)) {
1478*795d594fSAndroid Build Coastguard Worker     return false;
1479*795d594fSAndroid Build Coastguard Worker   }
1480*795d594fSAndroid Build Coastguard Worker   // We never use AOT code for debuggable.
1481*795d594fSAndroid Build Coastguard Worker   if (!runtime->IsJavaDebuggable()) {
1482*795d594fSAndroid Build Coastguard Worker     for (gc::space::ImageSpace* space : spaces) {
1483*795d594fSAndroid Build Coastguard Worker       const ImageHeader& header = space->GetImageHeader();
1484*795d594fSAndroid Build Coastguard Worker       header.VisitJniStubMethods([&](ArtMethod* method)
1485*795d594fSAndroid Build Coastguard Worker           REQUIRES_SHARED(Locks::mutator_lock_) {
1486*795d594fSAndroid Build Coastguard Worker         const void* stub = method->GetOatMethodQuickCode(image_pointer_size_);
1487*795d594fSAndroid Build Coastguard Worker         boot_image_jni_stubs_.Put(std::make_pair(JniStubKey(method), stub));
1488*795d594fSAndroid Build Coastguard Worker         return method;
1489*795d594fSAndroid Build Coastguard Worker       }, space->Begin(), image_pointer_size_);
1490*795d594fSAndroid Build Coastguard Worker     }
1491*795d594fSAndroid Build Coastguard Worker   }
1492*795d594fSAndroid Build Coastguard Worker 
1493*795d594fSAndroid Build Coastguard Worker   InitializeObjectVirtualMethodHashes(GetClassRoot<mirror::Object>(this),
1494*795d594fSAndroid Build Coastguard Worker                                       image_pointer_size_,
1495*795d594fSAndroid Build Coastguard Worker                                       ArrayRef<uint32_t>(object_virtual_method_hashes_));
1496*795d594fSAndroid Build Coastguard Worker   FinishInit(self);
1497*795d594fSAndroid Build Coastguard Worker 
1498*795d594fSAndroid Build Coastguard Worker   VLOG(startup) << __FUNCTION__ << " exiting";
1499*795d594fSAndroid Build Coastguard Worker   return true;
1500*795d594fSAndroid Build Coastguard Worker }
1501*795d594fSAndroid Build Coastguard Worker 
AddExtraBootDexFiles(Thread * self,std::vector<std::unique_ptr<const DexFile>> && additional_dex_files)1502*795d594fSAndroid Build Coastguard Worker void ClassLinker::AddExtraBootDexFiles(
1503*795d594fSAndroid Build Coastguard Worker     Thread* self,
1504*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>>&& additional_dex_files) {
1505*795d594fSAndroid Build Coastguard Worker   for (std::unique_ptr<const DexFile>& dex_file : additional_dex_files) {
1506*795d594fSAndroid Build Coastguard Worker     AppendToBootClassPath(self, dex_file.get());
1507*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
1508*795d594fSAndroid Build Coastguard Worker       for (const auto& boot_dex_file : boot_dex_files_) {
1509*795d594fSAndroid Build Coastguard Worker         DCHECK_NE(boot_dex_file->GetLocation(), dex_file->GetLocation());
1510*795d594fSAndroid Build Coastguard Worker       }
1511*795d594fSAndroid Build Coastguard Worker     }
1512*795d594fSAndroid Build Coastguard Worker     boot_dex_files_.push_back(std::move(dex_file));
1513*795d594fSAndroid Build Coastguard Worker   }
1514*795d594fSAndroid Build Coastguard Worker }
1515*795d594fSAndroid Build Coastguard Worker 
IsBootClassLoader(ObjPtr<mirror::Object> class_loader)1516*795d594fSAndroid Build Coastguard Worker bool ClassLinker::IsBootClassLoader(ObjPtr<mirror::Object> class_loader) {
1517*795d594fSAndroid Build Coastguard Worker   return class_loader == nullptr ||
1518*795d594fSAndroid Build Coastguard Worker          WellKnownClasses::java_lang_BootClassLoader == class_loader->GetClass();
1519*795d594fSAndroid Build Coastguard Worker }
1520*795d594fSAndroid Build Coastguard Worker 
1521*795d594fSAndroid Build Coastguard Worker class CHAOnDeleteUpdateClassVisitor {
1522*795d594fSAndroid Build Coastguard Worker  public:
CHAOnDeleteUpdateClassVisitor(LinearAlloc * alloc)1523*795d594fSAndroid Build Coastguard Worker   explicit CHAOnDeleteUpdateClassVisitor(LinearAlloc* alloc)
1524*795d594fSAndroid Build Coastguard Worker       : allocator_(alloc), cha_(Runtime::Current()->GetClassLinker()->GetClassHierarchyAnalysis()),
1525*795d594fSAndroid Build Coastguard Worker         pointer_size_(Runtime::Current()->GetClassLinker()->GetImagePointerSize()),
1526*795d594fSAndroid Build Coastguard Worker         self_(Thread::Current()) {}
1527*795d594fSAndroid Build Coastguard Worker 
operator ()(ObjPtr<mirror::Class> klass)1528*795d594fSAndroid Build Coastguard Worker   bool operator()(ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) {
1529*795d594fSAndroid Build Coastguard Worker     // This class is going to be unloaded. Tell CHA about it.
1530*795d594fSAndroid Build Coastguard Worker     cha_->ResetSingleImplementationInHierarchy(klass, allocator_, pointer_size_);
1531*795d594fSAndroid Build Coastguard Worker     return true;
1532*795d594fSAndroid Build Coastguard Worker   }
1533*795d594fSAndroid Build Coastguard Worker  private:
1534*795d594fSAndroid Build Coastguard Worker   const LinearAlloc* allocator_;
1535*795d594fSAndroid Build Coastguard Worker   const ClassHierarchyAnalysis* cha_;
1536*795d594fSAndroid Build Coastguard Worker   const PointerSize pointer_size_;
1537*795d594fSAndroid Build Coastguard Worker   const Thread* self_;
1538*795d594fSAndroid Build Coastguard Worker };
1539*795d594fSAndroid Build Coastguard Worker 
1540*795d594fSAndroid Build Coastguard Worker /*
1541*795d594fSAndroid Build Coastguard Worker  * A class used to ensure that all references to strings interned in an AppImage have been
1542*795d594fSAndroid Build Coastguard Worker  * properly recorded in the interned references list, and is only ever run in debug mode.
1543*795d594fSAndroid Build Coastguard Worker  */
1544*795d594fSAndroid Build Coastguard Worker class CountInternedStringReferencesVisitor {
1545*795d594fSAndroid Build Coastguard Worker  public:
CountInternedStringReferencesVisitor(const gc::space::ImageSpace & space,const InternTable::UnorderedSet & image_interns)1546*795d594fSAndroid Build Coastguard Worker   CountInternedStringReferencesVisitor(const gc::space::ImageSpace& space,
1547*795d594fSAndroid Build Coastguard Worker                                        const InternTable::UnorderedSet& image_interns)
1548*795d594fSAndroid Build Coastguard Worker       : space_(space),
1549*795d594fSAndroid Build Coastguard Worker         image_interns_(image_interns),
1550*795d594fSAndroid Build Coastguard Worker         count_(0u) {}
1551*795d594fSAndroid Build Coastguard Worker 
TestObject(ObjPtr<mirror::Object> referred_obj) const1552*795d594fSAndroid Build Coastguard Worker   void TestObject(ObjPtr<mirror::Object> referred_obj) const
1553*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
1554*795d594fSAndroid Build Coastguard Worker     if (referred_obj != nullptr &&
1555*795d594fSAndroid Build Coastguard Worker         space_.HasAddress(referred_obj.Ptr()) &&
1556*795d594fSAndroid Build Coastguard Worker         referred_obj->IsString()) {
1557*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::String> referred_str = referred_obj->AsString();
1558*795d594fSAndroid Build Coastguard Worker       uint32_t hash = static_cast<uint32_t>(referred_str->GetStoredHashCode());
1559*795d594fSAndroid Build Coastguard Worker       // All image strings have the hash code calculated, even if they are not interned.
1560*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(hash, static_cast<uint32_t>(referred_str->ComputeHashCode()));
1561*795d594fSAndroid Build Coastguard Worker       auto it = image_interns_.FindWithHash(GcRoot<mirror::String>(referred_str), hash);
1562*795d594fSAndroid Build Coastguard Worker       if (it != image_interns_.end() && it->Read() == referred_str) {
1563*795d594fSAndroid Build Coastguard Worker         ++count_;
1564*795d594fSAndroid Build Coastguard Worker       }
1565*795d594fSAndroid Build Coastguard Worker     }
1566*795d594fSAndroid Build Coastguard Worker   }
1567*795d594fSAndroid Build Coastguard Worker 
VisitRootIfNonNull(mirror::CompressedReference<mirror::Object> * root) const1568*795d594fSAndroid Build Coastguard Worker   void VisitRootIfNonNull(
1569*795d594fSAndroid Build Coastguard Worker       mirror::CompressedReference<mirror::Object>* root) const
1570*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
1571*795d594fSAndroid Build Coastguard Worker     if (!root->IsNull()) {
1572*795d594fSAndroid Build Coastguard Worker       VisitRoot(root);
1573*795d594fSAndroid Build Coastguard Worker     }
1574*795d594fSAndroid Build Coastguard Worker   }
1575*795d594fSAndroid Build Coastguard Worker 
VisitRoot(mirror::CompressedReference<mirror::Object> * root) const1576*795d594fSAndroid Build Coastguard Worker   void VisitRoot(mirror::CompressedReference<mirror::Object>* root) const
1577*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
1578*795d594fSAndroid Build Coastguard Worker     TestObject(root->AsMirrorPtr());
1579*795d594fSAndroid Build Coastguard Worker   }
1580*795d594fSAndroid Build Coastguard Worker 
1581*795d594fSAndroid Build Coastguard Worker   // Visit Class Fields
operator ()(ObjPtr<mirror::Object> obj,MemberOffset offset,bool is_static) const1582*795d594fSAndroid Build Coastguard Worker   void operator()(ObjPtr<mirror::Object> obj,
1583*795d594fSAndroid Build Coastguard Worker                   MemberOffset offset,
1584*795d594fSAndroid Build Coastguard Worker                   [[maybe_unused]] bool is_static) const REQUIRES_SHARED(Locks::mutator_lock_) {
1585*795d594fSAndroid Build Coastguard Worker     // References within image or across images don't need a read barrier.
1586*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Object> referred_obj =
1587*795d594fSAndroid Build Coastguard Worker         obj->GetFieldObject<mirror::Object, kVerifyNone, kWithoutReadBarrier>(offset);
1588*795d594fSAndroid Build Coastguard Worker     TestObject(referred_obj);
1589*795d594fSAndroid Build Coastguard Worker   }
1590*795d594fSAndroid Build Coastguard Worker 
operator ()(ObjPtr<mirror::Class> klass,ObjPtr<mirror::Reference> ref) const1591*795d594fSAndroid Build Coastguard Worker   void operator()([[maybe_unused]] ObjPtr<mirror::Class> klass, ObjPtr<mirror::Reference> ref) const
1592*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(Locks::heap_bitmap_lock_) {
1593*795d594fSAndroid Build Coastguard Worker     operator()(ref, mirror::Reference::ReferentOffset(), /*is_static=*/ false);
1594*795d594fSAndroid Build Coastguard Worker   }
1595*795d594fSAndroid Build Coastguard Worker 
GetCount() const1596*795d594fSAndroid Build Coastguard Worker   size_t GetCount() const {
1597*795d594fSAndroid Build Coastguard Worker     return count_;
1598*795d594fSAndroid Build Coastguard Worker   }
1599*795d594fSAndroid Build Coastguard Worker 
1600*795d594fSAndroid Build Coastguard Worker  private:
1601*795d594fSAndroid Build Coastguard Worker   const gc::space::ImageSpace& space_;
1602*795d594fSAndroid Build Coastguard Worker   const InternTable::UnorderedSet& image_interns_;
1603*795d594fSAndroid Build Coastguard Worker   mutable size_t count_;  // Modified from the `const` callbacks.
1604*795d594fSAndroid Build Coastguard Worker };
1605*795d594fSAndroid Build Coastguard Worker 
1606*795d594fSAndroid Build Coastguard Worker /*
1607*795d594fSAndroid Build Coastguard Worker  * This function counts references to strings interned in the AppImage.
1608*795d594fSAndroid Build Coastguard Worker  * This is used in debug build to check against the number of the recorded references.
1609*795d594fSAndroid Build Coastguard Worker  */
CountInternedStringReferences(gc::space::ImageSpace & space,const InternTable::UnorderedSet & image_interns)1610*795d594fSAndroid Build Coastguard Worker size_t CountInternedStringReferences(gc::space::ImageSpace& space,
1611*795d594fSAndroid Build Coastguard Worker                                      const InternTable::UnorderedSet& image_interns)
1612*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
1613*795d594fSAndroid Build Coastguard Worker   const gc::accounting::ContinuousSpaceBitmap* bitmap = space.GetMarkBitmap();
1614*795d594fSAndroid Build Coastguard Worker   const ImageHeader& image_header = space.GetImageHeader();
1615*795d594fSAndroid Build Coastguard Worker   const uint8_t* target_base = space.GetMemMap()->Begin();
1616*795d594fSAndroid Build Coastguard Worker   const ImageSection& objects_section = image_header.GetObjectsSection();
1617*795d594fSAndroid Build Coastguard Worker 
1618*795d594fSAndroid Build Coastguard Worker   auto objects_begin = reinterpret_cast<uintptr_t>(target_base + objects_section.Offset());
1619*795d594fSAndroid Build Coastguard Worker   auto objects_end = reinterpret_cast<uintptr_t>(target_base + objects_section.End());
1620*795d594fSAndroid Build Coastguard Worker 
1621*795d594fSAndroid Build Coastguard Worker   CountInternedStringReferencesVisitor visitor(space, image_interns);
1622*795d594fSAndroid Build Coastguard Worker   bitmap->VisitMarkedRange(objects_begin,
1623*795d594fSAndroid Build Coastguard Worker                            objects_end,
1624*795d594fSAndroid Build Coastguard Worker                            [&space, &visitor](mirror::Object* obj)
1625*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
1626*795d594fSAndroid Build Coastguard Worker     if (space.HasAddress(obj)) {
1627*795d594fSAndroid Build Coastguard Worker       if (obj->IsDexCache()) {
1628*795d594fSAndroid Build Coastguard Worker         obj->VisitReferences</* kVisitNativeRoots= */ true,
1629*795d594fSAndroid Build Coastguard Worker                              kVerifyNone,
1630*795d594fSAndroid Build Coastguard Worker                              kWithoutReadBarrier>(visitor, visitor);
1631*795d594fSAndroid Build Coastguard Worker       } else {
1632*795d594fSAndroid Build Coastguard Worker         // Don't visit native roots for non-dex-cache as they can't contain
1633*795d594fSAndroid Build Coastguard Worker         // native references to strings.  This is verified during compilation
1634*795d594fSAndroid Build Coastguard Worker         // by ImageWriter::VerifyNativeGCRootInvariants.
1635*795d594fSAndroid Build Coastguard Worker         obj->VisitReferences</* kVisitNativeRoots= */ false,
1636*795d594fSAndroid Build Coastguard Worker                              kVerifyNone,
1637*795d594fSAndroid Build Coastguard Worker                              kWithoutReadBarrier>(visitor, visitor);
1638*795d594fSAndroid Build Coastguard Worker       }
1639*795d594fSAndroid Build Coastguard Worker     }
1640*795d594fSAndroid Build Coastguard Worker   });
1641*795d594fSAndroid Build Coastguard Worker   return visitor.GetCount();
1642*795d594fSAndroid Build Coastguard Worker }
1643*795d594fSAndroid Build Coastguard Worker 
1644*795d594fSAndroid Build Coastguard Worker template <typename Visitor>
VisitInternedStringReferences(gc::space::ImageSpace * space,const Visitor & visitor)1645*795d594fSAndroid Build Coastguard Worker static void VisitInternedStringReferences(
1646*795d594fSAndroid Build Coastguard Worker     gc::space::ImageSpace* space,
1647*795d594fSAndroid Build Coastguard Worker     const Visitor& visitor) REQUIRES_SHARED(Locks::mutator_lock_) {
1648*795d594fSAndroid Build Coastguard Worker   const uint8_t* target_base = space->Begin();
1649*795d594fSAndroid Build Coastguard Worker   const ImageSection& sro_section =
1650*795d594fSAndroid Build Coastguard Worker       space->GetImageHeader().GetImageStringReferenceOffsetsSection();
1651*795d594fSAndroid Build Coastguard Worker   const size_t num_string_offsets = sro_section.Size() / sizeof(AppImageReferenceOffsetInfo);
1652*795d594fSAndroid Build Coastguard Worker 
1653*795d594fSAndroid Build Coastguard Worker   VLOG(image)
1654*795d594fSAndroid Build Coastguard Worker       << "ClassLinker:AppImage:InternStrings:imageStringReferenceOffsetCount = "
1655*795d594fSAndroid Build Coastguard Worker       << num_string_offsets;
1656*795d594fSAndroid Build Coastguard Worker 
1657*795d594fSAndroid Build Coastguard Worker   const auto* sro_base =
1658*795d594fSAndroid Build Coastguard Worker       reinterpret_cast<const AppImageReferenceOffsetInfo*>(target_base + sro_section.Offset());
1659*795d594fSAndroid Build Coastguard Worker 
1660*795d594fSAndroid Build Coastguard Worker   for (size_t offset_index = 0; offset_index < num_string_offsets; ++offset_index) {
1661*795d594fSAndroid Build Coastguard Worker     uint32_t base_offset = sro_base[offset_index].first;
1662*795d594fSAndroid Build Coastguard Worker 
1663*795d594fSAndroid Build Coastguard Worker     uint32_t raw_member_offset = sro_base[offset_index].second;
1664*795d594fSAndroid Build Coastguard Worker     DCHECK_ALIGNED(base_offset, 2);
1665*795d594fSAndroid Build Coastguard Worker 
1666*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Object> obj_ptr =
1667*795d594fSAndroid Build Coastguard Worker         reinterpret_cast<mirror::Object*>(space->Begin() + base_offset);
1668*795d594fSAndroid Build Coastguard Worker     if (obj_ptr->IsDexCache() && raw_member_offset >= sizeof(mirror::DexCache)) {
1669*795d594fSAndroid Build Coastguard Worker       // Special case for strings referenced from dex cache array: the offset is
1670*795d594fSAndroid Build Coastguard Worker       // actually decoded as an index into the dex cache string array.
1671*795d594fSAndroid Build Coastguard Worker       uint32_t index = raw_member_offset - sizeof(mirror::DexCache);
1672*795d594fSAndroid Build Coastguard Worker       mirror::GcRootArray<mirror::String>* array = obj_ptr->AsDexCache()->GetStringsArray();
1673*795d594fSAndroid Build Coastguard Worker       // The array could be concurrently set to null. See `StartupCompletedTask`.
1674*795d594fSAndroid Build Coastguard Worker       if (array != nullptr) {
1675*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::String> referred_string = array->Get(index);
1676*795d594fSAndroid Build Coastguard Worker         DCHECK(referred_string != nullptr);
1677*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::String> visited = visitor(referred_string);
1678*795d594fSAndroid Build Coastguard Worker         if (visited != referred_string) {
1679*795d594fSAndroid Build Coastguard Worker           array->Set(index, visited.Ptr());
1680*795d594fSAndroid Build Coastguard Worker         }
1681*795d594fSAndroid Build Coastguard Worker       }
1682*795d594fSAndroid Build Coastguard Worker     } else {
1683*795d594fSAndroid Build Coastguard Worker       DCHECK_ALIGNED(raw_member_offset, 2);
1684*795d594fSAndroid Build Coastguard Worker       MemberOffset member_offset(raw_member_offset);
1685*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::String> referred_string =
1686*795d594fSAndroid Build Coastguard Worker           obj_ptr->GetFieldObject<mirror::String,
1687*795d594fSAndroid Build Coastguard Worker                                   kVerifyNone,
1688*795d594fSAndroid Build Coastguard Worker                                   kWithoutReadBarrier,
1689*795d594fSAndroid Build Coastguard Worker                                   /* kIsVolatile= */ false>(member_offset);
1690*795d594fSAndroid Build Coastguard Worker       DCHECK(referred_string != nullptr);
1691*795d594fSAndroid Build Coastguard Worker 
1692*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::String> visited = visitor(referred_string);
1693*795d594fSAndroid Build Coastguard Worker       if (visited != referred_string) {
1694*795d594fSAndroid Build Coastguard Worker         obj_ptr->SetFieldObject</* kTransactionActive= */ false,
1695*795d594fSAndroid Build Coastguard Worker                                 /* kCheckTransaction= */ false,
1696*795d594fSAndroid Build Coastguard Worker                                 kVerifyNone,
1697*795d594fSAndroid Build Coastguard Worker                                 /* kIsVolatile= */ false>(member_offset, visited);
1698*795d594fSAndroid Build Coastguard Worker       }
1699*795d594fSAndroid Build Coastguard Worker     }
1700*795d594fSAndroid Build Coastguard Worker   }
1701*795d594fSAndroid Build Coastguard Worker }
1702*795d594fSAndroid Build Coastguard Worker 
VerifyInternedStringReferences(gc::space::ImageSpace * space)1703*795d594fSAndroid Build Coastguard Worker static void VerifyInternedStringReferences(gc::space::ImageSpace* space)
1704*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
1705*795d594fSAndroid Build Coastguard Worker   InternTable::UnorderedSet image_interns;
1706*795d594fSAndroid Build Coastguard Worker   const ImageSection& section = space->GetImageHeader().GetInternedStringsSection();
1707*795d594fSAndroid Build Coastguard Worker   if (section.Size() > 0) {
1708*795d594fSAndroid Build Coastguard Worker     size_t read_count;
1709*795d594fSAndroid Build Coastguard Worker     const uint8_t* data = space->Begin() + section.Offset();
1710*795d594fSAndroid Build Coastguard Worker     InternTable::UnorderedSet image_set(data, /*make_copy_of_data=*/ false, &read_count);
1711*795d594fSAndroid Build Coastguard Worker     image_set.swap(image_interns);
1712*795d594fSAndroid Build Coastguard Worker   }
1713*795d594fSAndroid Build Coastguard Worker   size_t num_recorded_refs = 0u;
1714*795d594fSAndroid Build Coastguard Worker   VisitInternedStringReferences(
1715*795d594fSAndroid Build Coastguard Worker       space,
1716*795d594fSAndroid Build Coastguard Worker       [&image_interns, &num_recorded_refs](ObjPtr<mirror::String> str)
1717*795d594fSAndroid Build Coastguard Worker           REQUIRES_SHARED(Locks::mutator_lock_) {
1718*795d594fSAndroid Build Coastguard Worker         auto it = image_interns.find(GcRoot<mirror::String>(str));
1719*795d594fSAndroid Build Coastguard Worker         CHECK(it != image_interns.end());
1720*795d594fSAndroid Build Coastguard Worker         CHECK(it->Read() == str);
1721*795d594fSAndroid Build Coastguard Worker         ++num_recorded_refs;
1722*795d594fSAndroid Build Coastguard Worker         return str;
1723*795d594fSAndroid Build Coastguard Worker       });
1724*795d594fSAndroid Build Coastguard Worker   size_t num_found_refs = CountInternedStringReferences(*space, image_interns);
1725*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(num_recorded_refs, num_found_refs);
1726*795d594fSAndroid Build Coastguard Worker }
1727*795d594fSAndroid Build Coastguard Worker 
1728*795d594fSAndroid Build Coastguard Worker // new_class_set is the set of classes that were read from the class table section in the image.
1729*795d594fSAndroid Build Coastguard Worker // If there was no class table section, it is null.
1730*795d594fSAndroid Build Coastguard Worker // Note: using a class here to avoid having to make ClassLinker internals public.
1731*795d594fSAndroid Build Coastguard Worker class AppImageLoadingHelper {
1732*795d594fSAndroid Build Coastguard Worker  public:
1733*795d594fSAndroid Build Coastguard Worker   static void Update(
1734*795d594fSAndroid Build Coastguard Worker       ClassLinker* class_linker,
1735*795d594fSAndroid Build Coastguard Worker       gc::space::ImageSpace* space,
1736*795d594fSAndroid Build Coastguard Worker       Handle<mirror::ClassLoader> class_loader,
1737*795d594fSAndroid Build Coastguard Worker       Handle<mirror::ObjectArray<mirror::DexCache>> dex_caches)
1738*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::dex_lock_)
1739*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1740*795d594fSAndroid Build Coastguard Worker 
1741*795d594fSAndroid Build Coastguard Worker   static void HandleAppImageStrings(gc::space::ImageSpace* space)
1742*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
1743*795d594fSAndroid Build Coastguard Worker };
1744*795d594fSAndroid Build Coastguard Worker 
Update(ClassLinker * class_linker,gc::space::ImageSpace * space,Handle<mirror::ClassLoader> class_loader,Handle<mirror::ObjectArray<mirror::DexCache>> dex_caches)1745*795d594fSAndroid Build Coastguard Worker void AppImageLoadingHelper::Update(
1746*795d594fSAndroid Build Coastguard Worker     ClassLinker* class_linker,
1747*795d594fSAndroid Build Coastguard Worker     gc::space::ImageSpace* space,
1748*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ClassLoader> class_loader,
1749*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ObjectArray<mirror::DexCache>> dex_caches)
1750*795d594fSAndroid Build Coastguard Worker     REQUIRES(!Locks::dex_lock_)
1751*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
1752*795d594fSAndroid Build Coastguard Worker   ScopedTrace app_image_timing("AppImage:Updating");
1753*795d594fSAndroid Build Coastguard Worker 
1754*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild && ClassLinker::kAppImageMayContainStrings) {
1755*795d594fSAndroid Build Coastguard Worker     // In debug build, verify the string references before applying
1756*795d594fSAndroid Build Coastguard Worker     // the Runtime::LoadAppImageStartupCache() option.
1757*795d594fSAndroid Build Coastguard Worker     VerifyInternedStringReferences(space);
1758*795d594fSAndroid Build Coastguard Worker   }
1759*795d594fSAndroid Build Coastguard Worker   DCHECK(class_loader.Get() != nullptr);
1760*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
1761*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
1762*795d594fSAndroid Build Coastguard Worker   gc::Heap* const heap = runtime->GetHeap();
1763*795d594fSAndroid Build Coastguard Worker   const ImageHeader& header = space->GetImageHeader();
1764*795d594fSAndroid Build Coastguard Worker   int32_t number_of_dex_cache_arrays_cleared = 0;
1765*795d594fSAndroid Build Coastguard Worker   {
1766*795d594fSAndroid Build Coastguard Worker     // Register dex caches with the class loader.
1767*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
1768*795d594fSAndroid Build Coastguard Worker     for (auto dex_cache : dex_caches.Iterate<mirror::DexCache>()) {
1769*795d594fSAndroid Build Coastguard Worker       const DexFile* const dex_file = dex_cache->GetDexFile();
1770*795d594fSAndroid Build Coastguard Worker       {
1771*795d594fSAndroid Build Coastguard Worker         WriterMutexLock mu2(self, *Locks::dex_lock_);
1772*795d594fSAndroid Build Coastguard Worker         CHECK(class_linker->FindDexCacheDataLocked(*dex_file) == nullptr);
1773*795d594fSAndroid Build Coastguard Worker         if (runtime->GetStartupCompleted()) {
1774*795d594fSAndroid Build Coastguard Worker           number_of_dex_cache_arrays_cleared++;
1775*795d594fSAndroid Build Coastguard Worker           // Free up dex cache arrays that we would only allocate at startup.
1776*795d594fSAndroid Build Coastguard Worker           // We do this here before registering and within the lock to be
1777*795d594fSAndroid Build Coastguard Worker           // consistent with `StartupCompletedTask`.
1778*795d594fSAndroid Build Coastguard Worker           dex_cache->UnlinkStartupCaches();
1779*795d594fSAndroid Build Coastguard Worker         }
1780*795d594fSAndroid Build Coastguard Worker         VLOG(image) << "App image registers dex file " << dex_file->GetLocation();
1781*795d594fSAndroid Build Coastguard Worker         class_linker->RegisterDexFileLocked(*dex_file, dex_cache, class_loader.Get());
1782*795d594fSAndroid Build Coastguard Worker       }
1783*795d594fSAndroid Build Coastguard Worker     }
1784*795d594fSAndroid Build Coastguard Worker   }
1785*795d594fSAndroid Build Coastguard Worker   if (number_of_dex_cache_arrays_cleared == dex_caches->GetLength()) {
1786*795d594fSAndroid Build Coastguard Worker     // Free up dex cache arrays that we would only allocate at startup.
1787*795d594fSAndroid Build Coastguard Worker     // If `number_of_dex_cache_arrays_cleared` isn't the number of dex caches in
1788*795d594fSAndroid Build Coastguard Worker     // the image, then there is a race with the `StartupCompletedTask`, which
1789*795d594fSAndroid Build Coastguard Worker     // will release the space instead.
1790*795d594fSAndroid Build Coastguard Worker     space->ReleaseMetadata();
1791*795d594fSAndroid Build Coastguard Worker   }
1792*795d594fSAndroid Build Coastguard Worker 
1793*795d594fSAndroid Build Coastguard Worker   if (ClassLinker::kAppImageMayContainStrings) {
1794*795d594fSAndroid Build Coastguard Worker     HandleAppImageStrings(space);
1795*795d594fSAndroid Build Coastguard Worker   }
1796*795d594fSAndroid Build Coastguard Worker 
1797*795d594fSAndroid Build Coastguard Worker   if (kVerifyArtMethodDeclaringClasses) {
1798*795d594fSAndroid Build Coastguard Worker     ScopedTrace timing("AppImage:VerifyDeclaringClasses");
1799*795d594fSAndroid Build Coastguard Worker     ReaderMutexLock rmu(self, *Locks::heap_bitmap_lock_);
1800*795d594fSAndroid Build Coastguard Worker     gc::accounting::HeapBitmap* live_bitmap = heap->GetLiveBitmap();
1801*795d594fSAndroid Build Coastguard Worker     header.VisitPackedArtMethods([&](ArtMethod& method)
1802*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_, Locks::heap_bitmap_lock_) {
1803*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> klass = method.GetDeclaringClassUnchecked();
1804*795d594fSAndroid Build Coastguard Worker       if (klass != nullptr) {
1805*795d594fSAndroid Build Coastguard Worker         CHECK(live_bitmap->Test(klass.Ptr())) << "Image method has unmarked declaring class";
1806*795d594fSAndroid Build Coastguard Worker       }
1807*795d594fSAndroid Build Coastguard Worker     }, space->Begin(), kRuntimePointerSize);
1808*795d594fSAndroid Build Coastguard Worker   }
1809*795d594fSAndroid Build Coastguard Worker }
1810*795d594fSAndroid Build Coastguard Worker 
HandleAppImageStrings(gc::space::ImageSpace * space)1811*795d594fSAndroid Build Coastguard Worker void AppImageLoadingHelper::HandleAppImageStrings(gc::space::ImageSpace* space) {
1812*795d594fSAndroid Build Coastguard Worker   // Iterate over the string reference offsets stored in the image and intern
1813*795d594fSAndroid Build Coastguard Worker   // the strings they point to.
1814*795d594fSAndroid Build Coastguard Worker   ScopedTrace timing("AppImage:InternString");
1815*795d594fSAndroid Build Coastguard Worker 
1816*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
1817*795d594fSAndroid Build Coastguard Worker   InternTable* const intern_table = runtime->GetInternTable();
1818*795d594fSAndroid Build Coastguard Worker 
1819*795d594fSAndroid Build Coastguard Worker   // Add the intern table, removing any conflicts. For conflicts, store the new address in a map
1820*795d594fSAndroid Build Coastguard Worker   // for faster lookup.
1821*795d594fSAndroid Build Coastguard Worker   // TODO: Optimize with a bitmap or bloom filter
1822*795d594fSAndroid Build Coastguard Worker   SafeMap<mirror::String*, mirror::String*> intern_remap;
1823*795d594fSAndroid Build Coastguard Worker   auto func = [&](InternTable::UnorderedSet& interns)
1824*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
1825*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::intern_table_lock_) {
1826*795d594fSAndroid Build Coastguard Worker     const size_t non_boot_image_strings = intern_table->CountInterns(
1827*795d594fSAndroid Build Coastguard Worker         /*visit_boot_images=*/false,
1828*795d594fSAndroid Build Coastguard Worker         /*visit_non_boot_images=*/true);
1829*795d594fSAndroid Build Coastguard Worker     VLOG(image) << "AppImage:stringsInInternTableSize = " << interns.size();
1830*795d594fSAndroid Build Coastguard Worker     VLOG(image) << "AppImage:nonBootImageInternStrings = " << non_boot_image_strings;
1831*795d594fSAndroid Build Coastguard Worker     // Visit the smaller of the two sets to compute the intersection.
1832*795d594fSAndroid Build Coastguard Worker     if (interns.size() < non_boot_image_strings) {
1833*795d594fSAndroid Build Coastguard Worker       for (auto it = interns.begin(); it != interns.end(); ) {
1834*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::String> string = it->Read();
1835*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::String> existing = intern_table->LookupWeakLocked(string);
1836*795d594fSAndroid Build Coastguard Worker         if (existing == nullptr) {
1837*795d594fSAndroid Build Coastguard Worker           existing = intern_table->LookupStrongLocked(string);
1838*795d594fSAndroid Build Coastguard Worker         }
1839*795d594fSAndroid Build Coastguard Worker         if (existing != nullptr) {
1840*795d594fSAndroid Build Coastguard Worker           intern_remap.Put(string.Ptr(), existing.Ptr());
1841*795d594fSAndroid Build Coastguard Worker           it = interns.erase(it);
1842*795d594fSAndroid Build Coastguard Worker         } else {
1843*795d594fSAndroid Build Coastguard Worker           ++it;
1844*795d594fSAndroid Build Coastguard Worker         }
1845*795d594fSAndroid Build Coastguard Worker       }
1846*795d594fSAndroid Build Coastguard Worker     } else {
1847*795d594fSAndroid Build Coastguard Worker       intern_table->VisitInterns([&](const GcRoot<mirror::String>& root)
1848*795d594fSAndroid Build Coastguard Worker           REQUIRES_SHARED(Locks::mutator_lock_)
1849*795d594fSAndroid Build Coastguard Worker           REQUIRES(Locks::intern_table_lock_) {
1850*795d594fSAndroid Build Coastguard Worker         auto it = interns.find(root);
1851*795d594fSAndroid Build Coastguard Worker         if (it != interns.end()) {
1852*795d594fSAndroid Build Coastguard Worker           ObjPtr<mirror::String> existing = root.Read();
1853*795d594fSAndroid Build Coastguard Worker           intern_remap.Put(it->Read(), existing.Ptr());
1854*795d594fSAndroid Build Coastguard Worker           it = interns.erase(it);
1855*795d594fSAndroid Build Coastguard Worker         }
1856*795d594fSAndroid Build Coastguard Worker       }, /*visit_boot_images=*/false, /*visit_non_boot_images=*/true);
1857*795d594fSAndroid Build Coastguard Worker     }
1858*795d594fSAndroid Build Coastguard Worker     // Consistency check to ensure correctness.
1859*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
1860*795d594fSAndroid Build Coastguard Worker       for (GcRoot<mirror::String>& root : interns) {
1861*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::String> string = root.Read();
1862*795d594fSAndroid Build Coastguard Worker         CHECK(intern_table->LookupWeakLocked(string) == nullptr) << string->ToModifiedUtf8();
1863*795d594fSAndroid Build Coastguard Worker         CHECK(intern_table->LookupStrongLocked(string) == nullptr) << string->ToModifiedUtf8();
1864*795d594fSAndroid Build Coastguard Worker       }
1865*795d594fSAndroid Build Coastguard Worker     }
1866*795d594fSAndroid Build Coastguard Worker   };
1867*795d594fSAndroid Build Coastguard Worker   intern_table->AddImageStringsToTable(space, func);
1868*795d594fSAndroid Build Coastguard Worker   if (!intern_remap.empty()) {
1869*795d594fSAndroid Build Coastguard Worker     VLOG(image) << "AppImage:conflictingInternStrings = " << intern_remap.size();
1870*795d594fSAndroid Build Coastguard Worker     VisitInternedStringReferences(
1871*795d594fSAndroid Build Coastguard Worker         space,
1872*795d594fSAndroid Build Coastguard Worker         [&intern_remap](ObjPtr<mirror::String> str) REQUIRES_SHARED(Locks::mutator_lock_) {
1873*795d594fSAndroid Build Coastguard Worker           auto it = intern_remap.find(str.Ptr());
1874*795d594fSAndroid Build Coastguard Worker           if (it != intern_remap.end()) {
1875*795d594fSAndroid Build Coastguard Worker             return ObjPtr<mirror::String>(it->second);
1876*795d594fSAndroid Build Coastguard Worker           }
1877*795d594fSAndroid Build Coastguard Worker           return str;
1878*795d594fSAndroid Build Coastguard Worker         });
1879*795d594fSAndroid Build Coastguard Worker   }
1880*795d594fSAndroid Build Coastguard Worker }
1881*795d594fSAndroid Build Coastguard Worker 
OpenOatDexFile(const OatFile * oat_file,const char * location,std::string * error_msg)1882*795d594fSAndroid Build Coastguard Worker static std::unique_ptr<const DexFile> OpenOatDexFile(const OatFile* oat_file,
1883*795d594fSAndroid Build Coastguard Worker                                                      const char* location,
1884*795d594fSAndroid Build Coastguard Worker                                                      std::string* error_msg)
1885*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
1886*795d594fSAndroid Build Coastguard Worker   DCHECK(error_msg != nullptr);
1887*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> dex_file;
1888*795d594fSAndroid Build Coastguard Worker   const OatDexFile* oat_dex_file = oat_file->GetOatDexFile(location, error_msg);
1889*795d594fSAndroid Build Coastguard Worker   if (oat_dex_file == nullptr) {
1890*795d594fSAndroid Build Coastguard Worker     return std::unique_ptr<const DexFile>();
1891*795d594fSAndroid Build Coastguard Worker   }
1892*795d594fSAndroid Build Coastguard Worker   std::string inner_error_msg;
1893*795d594fSAndroid Build Coastguard Worker   dex_file = oat_dex_file->OpenDexFile(&inner_error_msg);
1894*795d594fSAndroid Build Coastguard Worker   if (dex_file == nullptr) {
1895*795d594fSAndroid Build Coastguard Worker     *error_msg = StringPrintf("Failed to open dex file %s from within oat file %s error '%s'",
1896*795d594fSAndroid Build Coastguard Worker                               location,
1897*795d594fSAndroid Build Coastguard Worker                               oat_file->GetLocation().c_str(),
1898*795d594fSAndroid Build Coastguard Worker                               inner_error_msg.c_str());
1899*795d594fSAndroid Build Coastguard Worker     return std::unique_ptr<const DexFile>();
1900*795d594fSAndroid Build Coastguard Worker   }
1901*795d594fSAndroid Build Coastguard Worker 
1902*795d594fSAndroid Build Coastguard Worker   if (dex_file->GetLocationChecksum() != oat_dex_file->GetDexFileLocationChecksum()) {
1903*795d594fSAndroid Build Coastguard Worker     CHECK(dex_file->GetSha1() != oat_dex_file->GetSha1());
1904*795d594fSAndroid Build Coastguard Worker     *error_msg = StringPrintf("Checksums do not match for %s: %x vs %x",
1905*795d594fSAndroid Build Coastguard Worker                               location,
1906*795d594fSAndroid Build Coastguard Worker                               dex_file->GetLocationChecksum(),
1907*795d594fSAndroid Build Coastguard Worker                               oat_dex_file->GetDexFileLocationChecksum());
1908*795d594fSAndroid Build Coastguard Worker     return std::unique_ptr<const DexFile>();
1909*795d594fSAndroid Build Coastguard Worker   }
1910*795d594fSAndroid Build Coastguard Worker   CHECK(dex_file->GetSha1() == oat_dex_file->GetSha1());
1911*795d594fSAndroid Build Coastguard Worker   return dex_file;
1912*795d594fSAndroid Build Coastguard Worker }
1913*795d594fSAndroid Build Coastguard Worker 
OpenImageDexFiles(gc::space::ImageSpace * space,std::vector<std::unique_ptr<const DexFile>> * out_dex_files,std::string * error_msg)1914*795d594fSAndroid Build Coastguard Worker bool ClassLinker::OpenImageDexFiles(gc::space::ImageSpace* space,
1915*795d594fSAndroid Build Coastguard Worker                                     std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
1916*795d594fSAndroid Build Coastguard Worker                                     std::string* error_msg) {
1917*795d594fSAndroid Build Coastguard Worker   ScopedAssertNoThreadSuspension nts(__FUNCTION__);
1918*795d594fSAndroid Build Coastguard Worker   const ImageHeader& header = space->GetImageHeader();
1919*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> dex_caches_object = header.GetImageRoot(ImageHeader::kDexCaches);
1920*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_caches_object != nullptr);
1921*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ObjectArray<mirror::DexCache>> dex_caches =
1922*795d594fSAndroid Build Coastguard Worker       dex_caches_object->AsObjectArray<mirror::DexCache>();
1923*795d594fSAndroid Build Coastguard Worker   const OatFile* oat_file = space->GetOatFile();
1924*795d594fSAndroid Build Coastguard Worker   for (auto dex_cache : dex_caches->Iterate()) {
1925*795d594fSAndroid Build Coastguard Worker     std::string dex_file_location(dex_cache->GetLocation()->ToModifiedUtf8());
1926*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<const DexFile> dex_file = OpenOatDexFile(oat_file,
1927*795d594fSAndroid Build Coastguard Worker                                                              dex_file_location.c_str(),
1928*795d594fSAndroid Build Coastguard Worker                                                              error_msg);
1929*795d594fSAndroid Build Coastguard Worker     if (dex_file == nullptr) {
1930*795d594fSAndroid Build Coastguard Worker       return false;
1931*795d594fSAndroid Build Coastguard Worker     }
1932*795d594fSAndroid Build Coastguard Worker     dex_cache->SetDexFile(dex_file.get());
1933*795d594fSAndroid Build Coastguard Worker     out_dex_files->push_back(std::move(dex_file));
1934*795d594fSAndroid Build Coastguard Worker   }
1935*795d594fSAndroid Build Coastguard Worker   return true;
1936*795d594fSAndroid Build Coastguard Worker }
1937*795d594fSAndroid Build Coastguard Worker 
OpenAndInitImageDexFiles(const gc::space::ImageSpace * space,Handle<mirror::ClassLoader> class_loader,std::vector<std::unique_ptr<const DexFile>> * out_dex_files,std::string * error_msg)1938*795d594fSAndroid Build Coastguard Worker bool ClassLinker::OpenAndInitImageDexFiles(
1939*795d594fSAndroid Build Coastguard Worker     const gc::space::ImageSpace* space,
1940*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ClassLoader> class_loader,
1941*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
1942*795d594fSAndroid Build Coastguard Worker     std::string* error_msg) {
1943*795d594fSAndroid Build Coastguard Worker   DCHECK(out_dex_files != nullptr);
1944*795d594fSAndroid Build Coastguard Worker   const bool app_image = class_loader != nullptr;
1945*795d594fSAndroid Build Coastguard Worker   const ImageHeader& header = space->GetImageHeader();
1946*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> dex_caches_object = header.GetImageRoot(ImageHeader::kDexCaches);
1947*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_caches_object != nullptr);
1948*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
1949*795d594fSAndroid Build Coastguard Worker   StackHandleScope<3> hs(self);
1950*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::DexCache>> dex_caches(
1951*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(dex_caches_object->AsObjectArray<mirror::DexCache>()));
1952*795d594fSAndroid Build Coastguard Worker   const OatFile* oat_file = space->GetOatFile();
1953*795d594fSAndroid Build Coastguard Worker   if (oat_file->GetOatHeader().GetDexFileCount() !=
1954*795d594fSAndroid Build Coastguard Worker       static_cast<uint32_t>(dex_caches->GetLength())) {
1955*795d594fSAndroid Build Coastguard Worker     *error_msg =
1956*795d594fSAndroid Build Coastguard Worker         "Dex cache count and dex file count mismatch while trying to initialize from image";
1957*795d594fSAndroid Build Coastguard Worker     return false;
1958*795d594fSAndroid Build Coastguard Worker   }
1959*795d594fSAndroid Build Coastguard Worker 
1960*795d594fSAndroid Build Coastguard Worker   for (auto dex_cache : dex_caches.Iterate<mirror::DexCache>()) {
1961*795d594fSAndroid Build Coastguard Worker     std::string dex_file_location = dex_cache->GetLocation()->ToModifiedUtf8();
1962*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<const DexFile> dex_file =
1963*795d594fSAndroid Build Coastguard Worker         OpenOatDexFile(oat_file, dex_file_location.c_str(), error_msg);
1964*795d594fSAndroid Build Coastguard Worker     if (dex_file == nullptr) {
1965*795d594fSAndroid Build Coastguard Worker       return false;
1966*795d594fSAndroid Build Coastguard Worker     }
1967*795d594fSAndroid Build Coastguard Worker 
1968*795d594fSAndroid Build Coastguard Worker     {
1969*795d594fSAndroid Build Coastguard Worker       // Native fields are all null.  Initialize them.
1970*795d594fSAndroid Build Coastguard Worker       WriterMutexLock mu(self, *Locks::dex_lock_);
1971*795d594fSAndroid Build Coastguard Worker       dex_cache->Initialize(dex_file.get(), class_loader.Get());
1972*795d594fSAndroid Build Coastguard Worker     }
1973*795d594fSAndroid Build Coastguard Worker     if (!app_image) {
1974*795d594fSAndroid Build Coastguard Worker       // Register dex files, keep track of existing ones that are conflicts.
1975*795d594fSAndroid Build Coastguard Worker       AppendToBootClassPath(dex_file.get(), dex_cache);
1976*795d594fSAndroid Build Coastguard Worker     }
1977*795d594fSAndroid Build Coastguard Worker     out_dex_files->push_back(std::move(dex_file));
1978*795d594fSAndroid Build Coastguard Worker   }
1979*795d594fSAndroid Build Coastguard Worker   return true;
1980*795d594fSAndroid Build Coastguard Worker }
1981*795d594fSAndroid Build Coastguard Worker 
1982*795d594fSAndroid Build Coastguard Worker // Helper class for ArtMethod checks when adding an image. Keeps all required functionality
1983*795d594fSAndroid Build Coastguard Worker // together and caches some intermediate results.
1984*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
1985*795d594fSAndroid Build Coastguard Worker class ImageChecker final {
1986*795d594fSAndroid Build Coastguard Worker  public:
CheckObjects(gc::Heap * heap,gc::space::ImageSpace * space)1987*795d594fSAndroid Build Coastguard Worker   static void CheckObjects(gc::Heap* heap, gc::space::ImageSpace* space)
1988*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
1989*795d594fSAndroid Build Coastguard Worker     // There can be no GC during boot image initialization, so we do not need read barriers.
1990*795d594fSAndroid Build Coastguard Worker     ScopedDebugDisallowReadBarriers sddrb(Thread::Current());
1991*795d594fSAndroid Build Coastguard Worker 
1992*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(kPointerSize, space->GetImageHeader().GetPointerSize());
1993*795d594fSAndroid Build Coastguard Worker     const ImageSection& objects_section = space->GetImageHeader().GetObjectsSection();
1994*795d594fSAndroid Build Coastguard Worker     uintptr_t space_begin = reinterpret_cast<uintptr_t>(space->Begin());
1995*795d594fSAndroid Build Coastguard Worker     uintptr_t objects_begin = space_begin + objects_section.Offset();
1996*795d594fSAndroid Build Coastguard Worker     uintptr_t objects_end = objects_begin + objects_section.Size();
1997*795d594fSAndroid Build Coastguard Worker     ImageChecker ic(heap);
1998*795d594fSAndroid Build Coastguard Worker     auto visitor = [&](mirror::Object* obj) REQUIRES_SHARED(Locks::mutator_lock_) {
1999*795d594fSAndroid Build Coastguard Worker       DCHECK(obj != nullptr);
2000*795d594fSAndroid Build Coastguard Worker       mirror::Class* obj_klass = obj->GetClass<kDefaultVerifyFlags, kWithoutReadBarrier>();
2001*795d594fSAndroid Build Coastguard Worker       CHECK(obj_klass != nullptr) << "Null class in object " << obj;
2002*795d594fSAndroid Build Coastguard Worker       mirror::Class* class_class = obj_klass->GetClass<kDefaultVerifyFlags, kWithoutReadBarrier>();
2003*795d594fSAndroid Build Coastguard Worker       CHECK(class_class != nullptr) << "Null class class " << obj;
2004*795d594fSAndroid Build Coastguard Worker       if (obj_klass == class_class) {
2005*795d594fSAndroid Build Coastguard Worker         auto klass = obj->AsClass();
2006*795d594fSAndroid Build Coastguard Worker         for (ArtField& field : klass->GetIFields()) {
2007*795d594fSAndroid Build Coastguard Worker           CHECK_EQ(field.GetDeclaringClass<kWithoutReadBarrier>(), klass);
2008*795d594fSAndroid Build Coastguard Worker         }
2009*795d594fSAndroid Build Coastguard Worker         for (ArtField& field : klass->GetSFields()) {
2010*795d594fSAndroid Build Coastguard Worker           CHECK_EQ(field.GetDeclaringClass<kWithoutReadBarrier>(), klass);
2011*795d594fSAndroid Build Coastguard Worker         }
2012*795d594fSAndroid Build Coastguard Worker         for (ArtMethod& m : klass->GetMethods(kPointerSize)) {
2013*795d594fSAndroid Build Coastguard Worker           ic.CheckArtMethod(&m, klass);
2014*795d594fSAndroid Build Coastguard Worker         }
2015*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::PointerArray> vtable =
2016*795d594fSAndroid Build Coastguard Worker             klass->GetVTable<kDefaultVerifyFlags, kWithoutReadBarrier>();
2017*795d594fSAndroid Build Coastguard Worker         if (vtable != nullptr) {
2018*795d594fSAndroid Build Coastguard Worker           ic.CheckArtMethodPointerArray(vtable);
2019*795d594fSAndroid Build Coastguard Worker         }
2020*795d594fSAndroid Build Coastguard Worker         if (klass->ShouldHaveImt()) {
2021*795d594fSAndroid Build Coastguard Worker           ImTable* imt = klass->GetImt(kPointerSize);
2022*795d594fSAndroid Build Coastguard Worker           for (size_t i = 0; i < ImTable::kSize; ++i) {
2023*795d594fSAndroid Build Coastguard Worker             ic.CheckArtMethod(imt->Get(i, kPointerSize), /*expected_class=*/ nullptr);
2024*795d594fSAndroid Build Coastguard Worker           }
2025*795d594fSAndroid Build Coastguard Worker         }
2026*795d594fSAndroid Build Coastguard Worker         if (klass->ShouldHaveEmbeddedVTable()) {
2027*795d594fSAndroid Build Coastguard Worker           for (int32_t i = 0; i < klass->GetEmbeddedVTableLength(); ++i) {
2028*795d594fSAndroid Build Coastguard Worker             ic.CheckArtMethod(klass->GetEmbeddedVTableEntry(i, kPointerSize),
2029*795d594fSAndroid Build Coastguard Worker                               /*expected_class=*/ nullptr);
2030*795d594fSAndroid Build Coastguard Worker           }
2031*795d594fSAndroid Build Coastguard Worker         }
2032*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::IfTable> iftable =
2033*795d594fSAndroid Build Coastguard Worker             klass->GetIfTable<kDefaultVerifyFlags, kWithoutReadBarrier>();
2034*795d594fSAndroid Build Coastguard Worker         int32_t iftable_count = (iftable != nullptr) ? iftable->Count() : 0;
2035*795d594fSAndroid Build Coastguard Worker         for (int32_t i = 0; i < iftable_count; ++i) {
2036*795d594fSAndroid Build Coastguard Worker           ObjPtr<mirror::PointerArray> method_array =
2037*795d594fSAndroid Build Coastguard Worker               iftable->GetMethodArrayOrNull<kDefaultVerifyFlags, kWithoutReadBarrier>(i);
2038*795d594fSAndroid Build Coastguard Worker           if (method_array != nullptr) {
2039*795d594fSAndroid Build Coastguard Worker             ic.CheckArtMethodPointerArray(method_array);
2040*795d594fSAndroid Build Coastguard Worker           }
2041*795d594fSAndroid Build Coastguard Worker         }
2042*795d594fSAndroid Build Coastguard Worker       }
2043*795d594fSAndroid Build Coastguard Worker     };
2044*795d594fSAndroid Build Coastguard Worker     space->GetLiveBitmap()->VisitMarkedRange(objects_begin, objects_end, visitor);
2045*795d594fSAndroid Build Coastguard Worker   }
2046*795d594fSAndroid Build Coastguard Worker 
2047*795d594fSAndroid Build Coastguard Worker  private:
ImageChecker(gc::Heap * heap)2048*795d594fSAndroid Build Coastguard Worker   explicit ImageChecker(gc::Heap* heap) {
2049*795d594fSAndroid Build Coastguard Worker     ArrayRef<gc::space::ImageSpace* const> spaces(heap->GetBootImageSpaces());
2050*795d594fSAndroid Build Coastguard Worker     space_begin_.reserve(spaces.size());
2051*795d594fSAndroid Build Coastguard Worker     for (gc::space::ImageSpace* space : spaces) {
2052*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(static_cast<const void*>(space->Begin()), &space->GetImageHeader());
2053*795d594fSAndroid Build Coastguard Worker       space_begin_.push_back(space->Begin());
2054*795d594fSAndroid Build Coastguard Worker     }
2055*795d594fSAndroid Build Coastguard Worker   }
2056*795d594fSAndroid Build Coastguard Worker 
CheckArtMethod(ArtMethod * m,ObjPtr<mirror::Class> expected_class)2057*795d594fSAndroid Build Coastguard Worker   void CheckArtMethod(ArtMethod* m, ObjPtr<mirror::Class> expected_class)
2058*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
2059*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> declaring_class = m->GetDeclaringClassUnchecked<kWithoutReadBarrier>();
2060*795d594fSAndroid Build Coastguard Worker     if (m->IsRuntimeMethod()) {
2061*795d594fSAndroid Build Coastguard Worker       CHECK(declaring_class == nullptr) << declaring_class << " " << m->PrettyMethod();
2062*795d594fSAndroid Build Coastguard Worker     } else if (m->IsCopied()) {
2063*795d594fSAndroid Build Coastguard Worker       CHECK(declaring_class != nullptr) << m->PrettyMethod();
2064*795d594fSAndroid Build Coastguard Worker     } else if (expected_class != nullptr) {
2065*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(declaring_class, expected_class) << m->PrettyMethod();
2066*795d594fSAndroid Build Coastguard Worker     }
2067*795d594fSAndroid Build Coastguard Worker     bool contains = false;
2068*795d594fSAndroid Build Coastguard Worker     for (const uint8_t* begin : space_begin_) {
2069*795d594fSAndroid Build Coastguard Worker       const size_t offset = reinterpret_cast<uint8_t*>(m) - begin;
2070*795d594fSAndroid Build Coastguard Worker       const ImageHeader* header = reinterpret_cast<const ImageHeader*>(begin);
2071*795d594fSAndroid Build Coastguard Worker       if (header->GetMethodsSection().Contains(offset) ||
2072*795d594fSAndroid Build Coastguard Worker           header->GetRuntimeMethodsSection().Contains(offset)) {
2073*795d594fSAndroid Build Coastguard Worker         contains = true;
2074*795d594fSAndroid Build Coastguard Worker         break;
2075*795d594fSAndroid Build Coastguard Worker       }
2076*795d594fSAndroid Build Coastguard Worker     }
2077*795d594fSAndroid Build Coastguard Worker     CHECK(contains) << m << " not found";
2078*795d594fSAndroid Build Coastguard Worker   }
2079*795d594fSAndroid Build Coastguard Worker 
CheckArtMethodPointerArray(ObjPtr<mirror::PointerArray> arr)2080*795d594fSAndroid Build Coastguard Worker   void CheckArtMethodPointerArray(ObjPtr<mirror::PointerArray> arr)
2081*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
2082*795d594fSAndroid Build Coastguard Worker     CHECK(arr != nullptr);
2083*795d594fSAndroid Build Coastguard Worker     for (int32_t j = 0; j < arr->GetLength(); ++j) {
2084*795d594fSAndroid Build Coastguard Worker       auto* method = arr->GetElementPtrSize<ArtMethod*>(j, kPointerSize);
2085*795d594fSAndroid Build Coastguard Worker       CHECK(method != nullptr);
2086*795d594fSAndroid Build Coastguard Worker       CheckArtMethod(method, /*expected_class=*/ nullptr);
2087*795d594fSAndroid Build Coastguard Worker     }
2088*795d594fSAndroid Build Coastguard Worker   }
2089*795d594fSAndroid Build Coastguard Worker 
2090*795d594fSAndroid Build Coastguard Worker   std::vector<const uint8_t*> space_begin_;
2091*795d594fSAndroid Build Coastguard Worker };
2092*795d594fSAndroid Build Coastguard Worker 
VerifyAppImage(const ImageHeader & header,const Handle<mirror::ClassLoader> & class_loader,ClassTable * class_table,gc::space::ImageSpace * space)2093*795d594fSAndroid Build Coastguard Worker static void VerifyAppImage(const ImageHeader& header,
2094*795d594fSAndroid Build Coastguard Worker                            const Handle<mirror::ClassLoader>& class_loader,
2095*795d594fSAndroid Build Coastguard Worker                            ClassTable* class_table,
2096*795d594fSAndroid Build Coastguard Worker                            gc::space::ImageSpace* space)
2097*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
2098*795d594fSAndroid Build Coastguard Worker   header.VisitPackedArtMethods([&](ArtMethod& method) REQUIRES_SHARED(Locks::mutator_lock_) {
2099*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass = method.GetDeclaringClass();
2100*795d594fSAndroid Build Coastguard Worker     if (klass != nullptr && !Runtime::Current()->GetHeap()->ObjectIsInBootImageSpace(klass)) {
2101*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(class_table->LookupByDescriptor(klass), klass)
2102*795d594fSAndroid Build Coastguard Worker           << mirror::Class::PrettyClass(klass);
2103*795d594fSAndroid Build Coastguard Worker     }
2104*795d594fSAndroid Build Coastguard Worker   }, space->Begin(), kRuntimePointerSize);
2105*795d594fSAndroid Build Coastguard Worker   {
2106*795d594fSAndroid Build Coastguard Worker     // Verify that all direct interfaces of classes in the class table are also resolved.
2107*795d594fSAndroid Build Coastguard Worker     std::vector<ObjPtr<mirror::Class>> classes;
2108*795d594fSAndroid Build Coastguard Worker     auto verify_direct_interfaces_in_table = [&](ObjPtr<mirror::Class> klass)
2109*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
2110*795d594fSAndroid Build Coastguard Worker       if (!klass->IsPrimitive() && klass->GetClassLoader() == class_loader.Get()) {
2111*795d594fSAndroid Build Coastguard Worker         classes.push_back(klass);
2112*795d594fSAndroid Build Coastguard Worker       }
2113*795d594fSAndroid Build Coastguard Worker       return true;
2114*795d594fSAndroid Build Coastguard Worker     };
2115*795d594fSAndroid Build Coastguard Worker     class_table->Visit(verify_direct_interfaces_in_table);
2116*795d594fSAndroid Build Coastguard Worker     for (ObjPtr<mirror::Class> klass : classes) {
2117*795d594fSAndroid Build Coastguard Worker       for (uint32_t i = 0, num = klass->NumDirectInterfaces(); i != num; ++i) {
2118*795d594fSAndroid Build Coastguard Worker         CHECK(klass->GetDirectInterface(i) != nullptr)
2119*795d594fSAndroid Build Coastguard Worker             << klass->PrettyDescriptor() << " iface #" << i;
2120*795d594fSAndroid Build Coastguard Worker       }
2121*795d594fSAndroid Build Coastguard Worker     }
2122*795d594fSAndroid Build Coastguard Worker   }
2123*795d594fSAndroid Build Coastguard Worker }
2124*795d594fSAndroid Build Coastguard Worker 
AddImageSpace(gc::space::ImageSpace * space,Handle<mirror::ClassLoader> class_loader,ClassLoaderContext * context,const std::vector<std::unique_ptr<const DexFile>> & dex_files,std::string * error_msg)2125*795d594fSAndroid Build Coastguard Worker bool ClassLinker::AddImageSpace(gc::space::ImageSpace* space,
2126*795d594fSAndroid Build Coastguard Worker                                 Handle<mirror::ClassLoader> class_loader,
2127*795d594fSAndroid Build Coastguard Worker                                 ClassLoaderContext* context,
2128*795d594fSAndroid Build Coastguard Worker                                 const std::vector<std::unique_ptr<const DexFile>>& dex_files,
2129*795d594fSAndroid Build Coastguard Worker                                 std::string* error_msg) {
2130*795d594fSAndroid Build Coastguard Worker   DCHECK(error_msg != nullptr);
2131*795d594fSAndroid Build Coastguard Worker   const uint64_t start_time = NanoTime();
2132*795d594fSAndroid Build Coastguard Worker   const bool app_image = class_loader != nullptr;
2133*795d594fSAndroid Build Coastguard Worker   const ImageHeader& header = space->GetImageHeader();
2134*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> dex_caches_object = header.GetImageRoot(ImageHeader::kDexCaches);
2135*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_caches_object != nullptr);
2136*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
2137*795d594fSAndroid Build Coastguard Worker   gc::Heap* const heap = runtime->GetHeap();
2138*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
2139*795d594fSAndroid Build Coastguard Worker   // Check that the image is what we are expecting.
2140*795d594fSAndroid Build Coastguard Worker   if (image_pointer_size_ != space->GetImageHeader().GetPointerSize()) {
2141*795d594fSAndroid Build Coastguard Worker     *error_msg = StringPrintf("Application image pointer size does not match runtime: %zu vs %zu",
2142*795d594fSAndroid Build Coastguard Worker                               static_cast<size_t>(space->GetImageHeader().GetPointerSize()),
2143*795d594fSAndroid Build Coastguard Worker                               static_cast<size_t>(image_pointer_size_));
2144*795d594fSAndroid Build Coastguard Worker     return false;
2145*795d594fSAndroid Build Coastguard Worker   }
2146*795d594fSAndroid Build Coastguard Worker   size_t expected_image_roots = ImageHeader::NumberOfImageRoots(app_image);
2147*795d594fSAndroid Build Coastguard Worker   if (static_cast<size_t>(header.GetImageRoots()->GetLength()) != expected_image_roots) {
2148*795d594fSAndroid Build Coastguard Worker     *error_msg = StringPrintf("Expected %zu image roots but got %d",
2149*795d594fSAndroid Build Coastguard Worker                               expected_image_roots,
2150*795d594fSAndroid Build Coastguard Worker                               header.GetImageRoots()->GetLength());
2151*795d594fSAndroid Build Coastguard Worker     return false;
2152*795d594fSAndroid Build Coastguard Worker   }
2153*795d594fSAndroid Build Coastguard Worker   StackHandleScope<3> hs(self);
2154*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::DexCache>> dex_caches(
2155*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(dex_caches_object->AsObjectArray<mirror::DexCache>()));
2156*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::Class>> class_roots(hs.NewHandle(
2157*795d594fSAndroid Build Coastguard Worker       header.GetImageRoot(ImageHeader::kClassRoots)->AsObjectArray<mirror::Class>()));
2158*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::Object> special_root(hs.NewHandle(
2159*795d594fSAndroid Build Coastguard Worker       app_image ? header.GetImageRoot(ImageHeader::kSpecialRoots) : nullptr));
2160*795d594fSAndroid Build Coastguard Worker   DCHECK(class_roots != nullptr);
2161*795d594fSAndroid Build Coastguard Worker   if (class_roots->GetLength() != static_cast<int32_t>(ClassRoot::kMax)) {
2162*795d594fSAndroid Build Coastguard Worker     *error_msg = StringPrintf("Expected %d class roots but got %d",
2163*795d594fSAndroid Build Coastguard Worker                               class_roots->GetLength(),
2164*795d594fSAndroid Build Coastguard Worker                               static_cast<int32_t>(ClassRoot::kMax));
2165*795d594fSAndroid Build Coastguard Worker     return false;
2166*795d594fSAndroid Build Coastguard Worker   }
2167*795d594fSAndroid Build Coastguard Worker   // Check against existing class roots to make sure they match the ones in the boot image.
2168*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ObjectArray<mirror::Class>> existing_class_roots = GetClassRoots();
2169*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < static_cast<size_t>(ClassRoot::kMax); i++) {
2170*795d594fSAndroid Build Coastguard Worker     if (class_roots->Get(i) != GetClassRoot(static_cast<ClassRoot>(i), existing_class_roots)) {
2171*795d594fSAndroid Build Coastguard Worker       *error_msg = "App image class roots must have pointer equality with runtime ones.";
2172*795d594fSAndroid Build Coastguard Worker       return false;
2173*795d594fSAndroid Build Coastguard Worker     }
2174*795d594fSAndroid Build Coastguard Worker   }
2175*795d594fSAndroid Build Coastguard Worker   const OatFile* oat_file = space->GetOatFile();
2176*795d594fSAndroid Build Coastguard Worker 
2177*795d594fSAndroid Build Coastguard Worker   if (app_image) {
2178*795d594fSAndroid Build Coastguard Worker     ScopedAssertNoThreadSuspension sants("Checking app image");
2179*795d594fSAndroid Build Coastguard Worker     if (special_root == nullptr) {
2180*795d594fSAndroid Build Coastguard Worker       *error_msg = "Unexpected null special root in app image";
2181*795d594fSAndroid Build Coastguard Worker       return false;
2182*795d594fSAndroid Build Coastguard Worker     } else if (special_root->IsByteArray()) {
2183*795d594fSAndroid Build Coastguard Worker       OatHeader* oat_header = reinterpret_cast<OatHeader*>(special_root->AsByteArray()->GetData());
2184*795d594fSAndroid Build Coastguard Worker       if (!oat_header->IsValid()) {
2185*795d594fSAndroid Build Coastguard Worker         *error_msg = "Invalid oat header in special root";
2186*795d594fSAndroid Build Coastguard Worker         return false;
2187*795d594fSAndroid Build Coastguard Worker       }
2188*795d594fSAndroid Build Coastguard Worker       if (oat_file->GetVdexFile()->GetNumberOfDexFiles() != oat_header->GetDexFileCount()) {
2189*795d594fSAndroid Build Coastguard Worker         *error_msg = "Checksums count does not match";
2190*795d594fSAndroid Build Coastguard Worker         return false;
2191*795d594fSAndroid Build Coastguard Worker       }
2192*795d594fSAndroid Build Coastguard Worker       if (oat_header->IsConcurrentCopying() != gUseReadBarrier) {
2193*795d594fSAndroid Build Coastguard Worker         *error_msg = "GCs do not match";
2194*795d594fSAndroid Build Coastguard Worker         return false;
2195*795d594fSAndroid Build Coastguard Worker       }
2196*795d594fSAndroid Build Coastguard Worker 
2197*795d594fSAndroid Build Coastguard Worker       // Check if the dex checksums match the dex files that we just loaded.
2198*795d594fSAndroid Build Coastguard Worker       uint32_t* checksums = reinterpret_cast<uint32_t*>(
2199*795d594fSAndroid Build Coastguard Worker           reinterpret_cast<uint8_t*>(oat_header) + oat_header->GetHeaderSize());
2200*795d594fSAndroid Build Coastguard Worker       for (uint32_t i = 0; i  < oat_header->GetDexFileCount(); ++i) {
2201*795d594fSAndroid Build Coastguard Worker         uint32_t dex_checksum = dex_files.at(i)->GetHeader().checksum_;
2202*795d594fSAndroid Build Coastguard Worker         if (checksums[i] != dex_checksum) {
2203*795d594fSAndroid Build Coastguard Worker           *error_msg = StringPrintf(
2204*795d594fSAndroid Build Coastguard Worker               "Image and dex file checksums did not match for %s: image has %d, dex file has %d",
2205*795d594fSAndroid Build Coastguard Worker               dex_files.at(i)->GetLocation().c_str(),
2206*795d594fSAndroid Build Coastguard Worker               checksums[i],
2207*795d594fSAndroid Build Coastguard Worker               dex_checksum);
2208*795d594fSAndroid Build Coastguard Worker           return false;
2209*795d594fSAndroid Build Coastguard Worker         }
2210*795d594fSAndroid Build Coastguard Worker       }
2211*795d594fSAndroid Build Coastguard Worker 
2212*795d594fSAndroid Build Coastguard Worker       // Validate the class loader context.
2213*795d594fSAndroid Build Coastguard Worker       const char* stored_context = oat_header->GetStoreValueByKey(OatHeader::kClassPathKey);
2214*795d594fSAndroid Build Coastguard Worker       if (stored_context == nullptr) {
2215*795d594fSAndroid Build Coastguard Worker         *error_msg = "Missing class loader context in special root";
2216*795d594fSAndroid Build Coastguard Worker         return false;
2217*795d594fSAndroid Build Coastguard Worker       }
2218*795d594fSAndroid Build Coastguard Worker       if (context->VerifyClassLoaderContextMatch(stored_context) ==
2219*795d594fSAndroid Build Coastguard Worker               ClassLoaderContext::VerificationResult::kMismatch) {
2220*795d594fSAndroid Build Coastguard Worker         *error_msg = StringPrintf("Class loader contexts don't match: %s", stored_context);
2221*795d594fSAndroid Build Coastguard Worker         return false;
2222*795d594fSAndroid Build Coastguard Worker       }
2223*795d594fSAndroid Build Coastguard Worker 
2224*795d594fSAndroid Build Coastguard Worker       // Validate the apex versions.
2225*795d594fSAndroid Build Coastguard Worker       if (!gc::space::ImageSpace::ValidateApexVersions(*oat_header,
2226*795d594fSAndroid Build Coastguard Worker                                                        runtime->GetApexVersions(),
2227*795d594fSAndroid Build Coastguard Worker                                                        space->GetImageLocation(),
2228*795d594fSAndroid Build Coastguard Worker                                                        error_msg)) {
2229*795d594fSAndroid Build Coastguard Worker         return false;
2230*795d594fSAndroid Build Coastguard Worker       }
2231*795d594fSAndroid Build Coastguard Worker 
2232*795d594fSAndroid Build Coastguard Worker       // Validate the boot classpath.
2233*795d594fSAndroid Build Coastguard Worker       const char* bcp = oat_header->GetStoreValueByKey(OatHeader::kBootClassPathKey);
2234*795d594fSAndroid Build Coastguard Worker       if (bcp == nullptr) {
2235*795d594fSAndroid Build Coastguard Worker         *error_msg = "Missing boot classpath in special root";
2236*795d594fSAndroid Build Coastguard Worker         return false;
2237*795d594fSAndroid Build Coastguard Worker       }
2238*795d594fSAndroid Build Coastguard Worker       std::string runtime_bcp = android::base::Join(runtime->GetBootClassPathLocations(), ':');
2239*795d594fSAndroid Build Coastguard Worker       if (strcmp(bcp, runtime_bcp.c_str()) != 0) {
2240*795d594fSAndroid Build Coastguard Worker         *error_msg = StringPrintf("Mismatch boot classpath: image has %s, runtime has %s",
2241*795d594fSAndroid Build Coastguard Worker                                   bcp,
2242*795d594fSAndroid Build Coastguard Worker                                   runtime_bcp.c_str());
2243*795d594fSAndroid Build Coastguard Worker         return false;
2244*795d594fSAndroid Build Coastguard Worker       }
2245*795d594fSAndroid Build Coastguard Worker 
2246*795d594fSAndroid Build Coastguard Worker       // Validate the dex checksums of the boot classpath.
2247*795d594fSAndroid Build Coastguard Worker       const char* bcp_checksums =
2248*795d594fSAndroid Build Coastguard Worker           oat_header->GetStoreValueByKey(OatHeader::kBootClassPathChecksumsKey);
2249*795d594fSAndroid Build Coastguard Worker       if (bcp_checksums == nullptr) {
2250*795d594fSAndroid Build Coastguard Worker         *error_msg = "Missing boot classpath checksums in special root";
2251*795d594fSAndroid Build Coastguard Worker         return false;
2252*795d594fSAndroid Build Coastguard Worker       }
2253*795d594fSAndroid Build Coastguard Worker       if (strcmp(bcp_checksums, runtime->GetBootClassPathChecksums().c_str()) != 0) {
2254*795d594fSAndroid Build Coastguard Worker         *error_msg = StringPrintf("Mismatch boot classpath checksums: image has %s, runtime has %s",
2255*795d594fSAndroid Build Coastguard Worker                                   bcp_checksums,
2256*795d594fSAndroid Build Coastguard Worker                                   runtime->GetBootClassPathChecksums().c_str());
2257*795d594fSAndroid Build Coastguard Worker         return false;
2258*795d594fSAndroid Build Coastguard Worker       }
2259*795d594fSAndroid Build Coastguard Worker     } else if (IsBootClassLoader(special_root.Get())) {
2260*795d594fSAndroid Build Coastguard Worker       *error_msg = "Unexpected BootClassLoader in app image";
2261*795d594fSAndroid Build Coastguard Worker       return false;
2262*795d594fSAndroid Build Coastguard Worker     } else if (!special_root->IsClassLoader()) {
2263*795d594fSAndroid Build Coastguard Worker       *error_msg = "Unexpected special root in app image";
2264*795d594fSAndroid Build Coastguard Worker       return false;
2265*795d594fSAndroid Build Coastguard Worker     }
2266*795d594fSAndroid Build Coastguard Worker   }
2267*795d594fSAndroid Build Coastguard Worker 
2268*795d594fSAndroid Build Coastguard Worker   if (kCheckImageObjects) {
2269*795d594fSAndroid Build Coastguard Worker     if (!app_image) {
2270*795d594fSAndroid Build Coastguard Worker       if (image_pointer_size_ == PointerSize::k64) {
2271*795d594fSAndroid Build Coastguard Worker         ImageChecker<PointerSize::k64>::CheckObjects(heap, space);
2272*795d594fSAndroid Build Coastguard Worker       } else {
2273*795d594fSAndroid Build Coastguard Worker         ImageChecker<PointerSize::k32>::CheckObjects(heap, space);
2274*795d594fSAndroid Build Coastguard Worker       }
2275*795d594fSAndroid Build Coastguard Worker     }
2276*795d594fSAndroid Build Coastguard Worker   }
2277*795d594fSAndroid Build Coastguard Worker 
2278*795d594fSAndroid Build Coastguard Worker   // Set entry point to interpreter if in InterpretOnly mode.
2279*795d594fSAndroid Build Coastguard Worker   if (!runtime->IsAotCompiler() &&
2280*795d594fSAndroid Build Coastguard Worker       (runtime->GetInstrumentation()->InterpretOnly() ||
2281*795d594fSAndroid Build Coastguard Worker        runtime->IsJavaDebuggable())) {
2282*795d594fSAndroid Build Coastguard Worker     // Set image methods' entry point to interpreter.
2283*795d594fSAndroid Build Coastguard Worker     header.VisitPackedArtMethods([&](ArtMethod& method) REQUIRES_SHARED(Locks::mutator_lock_) {
2284*795d594fSAndroid Build Coastguard Worker       if (!method.IsRuntimeMethod()) {
2285*795d594fSAndroid Build Coastguard Worker         DCHECK(method.GetDeclaringClass() != nullptr);
2286*795d594fSAndroid Build Coastguard Worker         if (!method.IsNative() && !method.IsResolutionMethod()) {
2287*795d594fSAndroid Build Coastguard Worker           method.SetEntryPointFromQuickCompiledCodePtrSize(GetQuickToInterpreterBridge(),
2288*795d594fSAndroid Build Coastguard Worker                                                             image_pointer_size_);
2289*795d594fSAndroid Build Coastguard Worker         }
2290*795d594fSAndroid Build Coastguard Worker       }
2291*795d594fSAndroid Build Coastguard Worker     }, space->Begin(), image_pointer_size_);
2292*795d594fSAndroid Build Coastguard Worker   }
2293*795d594fSAndroid Build Coastguard Worker 
2294*795d594fSAndroid Build Coastguard Worker   if (!runtime->IsAotCompiler()) {
2295*795d594fSAndroid Build Coastguard Worker     // If the boot image is not loaded by the zygote, we don't need the shared
2296*795d594fSAndroid Build Coastguard Worker     // memory optimization.
2297*795d594fSAndroid Build Coastguard Worker     // If we are profiling the boot classpath, we disable the shared memory
2298*795d594fSAndroid Build Coastguard Worker     // optimization to make sure boot classpath methods all get properly
2299*795d594fSAndroid Build Coastguard Worker     // profiled.
2300*795d594fSAndroid Build Coastguard Worker     // For debuggable runtimes we don't use AOT code, so don't use shared memory
2301*795d594fSAndroid Build Coastguard Worker     // optimization so the methods can be JITed better.
2302*795d594fSAndroid Build Coastguard Worker     //
2303*795d594fSAndroid Build Coastguard Worker     // We need to disable the flag before doing ResetCounter below, as counters
2304*795d594fSAndroid Build Coastguard Worker     // of shared memory method always hold the "hot" value.
2305*795d594fSAndroid Build Coastguard Worker     if (!runtime->IsZygote() ||
2306*795d594fSAndroid Build Coastguard Worker         runtime->GetJITOptions()->GetProfileSaverOptions().GetProfileBootClassPath() ||
2307*795d594fSAndroid Build Coastguard Worker         runtime->IsJavaDebuggable()) {
2308*795d594fSAndroid Build Coastguard Worker       header.VisitPackedArtMethods([&](ArtMethod& method) REQUIRES_SHARED(Locks::mutator_lock_) {
2309*795d594fSAndroid Build Coastguard Worker         method.ClearMemorySharedMethod();
2310*795d594fSAndroid Build Coastguard Worker       }, space->Begin(), image_pointer_size_);
2311*795d594fSAndroid Build Coastguard Worker     }
2312*795d594fSAndroid Build Coastguard Worker 
2313*795d594fSAndroid Build Coastguard Worker     ScopedTrace trace("AppImage:UpdateCodeItemAndNterp");
2314*795d594fSAndroid Build Coastguard Worker     bool can_use_nterp = interpreter::CanRuntimeUseNterp();
2315*795d594fSAndroid Build Coastguard Worker     uint16_t hotness_threshold = runtime->GetJITOptions()->GetWarmupThreshold();
2316*795d594fSAndroid Build Coastguard Worker     header.VisitPackedArtMethods([&](ArtMethod& method) REQUIRES_SHARED(Locks::mutator_lock_) {
2317*795d594fSAndroid Build Coastguard Worker       // In the image, the `data` pointer field of the ArtMethod contains the code
2318*795d594fSAndroid Build Coastguard Worker       // item offset. Change this to the actual pointer to the code item.
2319*795d594fSAndroid Build Coastguard Worker       if (method.HasCodeItem()) {
2320*795d594fSAndroid Build Coastguard Worker         const dex::CodeItem* code_item = method.GetDexFile()->GetCodeItem(
2321*795d594fSAndroid Build Coastguard Worker             reinterpret_cast32<uint32_t>(method.GetDataPtrSize(image_pointer_size_)));
2322*795d594fSAndroid Build Coastguard Worker         method.SetCodeItem(code_item, method.GetDexFile()->IsCompactDexFile());
2323*795d594fSAndroid Build Coastguard Worker         // The hotness counter may have changed since we compiled the image, so
2324*795d594fSAndroid Build Coastguard Worker         // reset it with the runtime value.
2325*795d594fSAndroid Build Coastguard Worker         method.ResetCounter(hotness_threshold);
2326*795d594fSAndroid Build Coastguard Worker       }
2327*795d594fSAndroid Build Coastguard Worker       if (method.GetEntryPointFromQuickCompiledCode() == nterp_trampoline_) {
2328*795d594fSAndroid Build Coastguard Worker         if (can_use_nterp) {
2329*795d594fSAndroid Build Coastguard Worker           // Set image methods' entry point that point to the nterp trampoline to the
2330*795d594fSAndroid Build Coastguard Worker           // nterp entry point. This allows taking the fast path when doing a
2331*795d594fSAndroid Build Coastguard Worker           // nterp->nterp call.
2332*795d594fSAndroid Build Coastguard Worker           DCHECK(!method.StillNeedsClinitCheck());
2333*795d594fSAndroid Build Coastguard Worker           method.SetEntryPointFromQuickCompiledCode(interpreter::GetNterpEntryPoint());
2334*795d594fSAndroid Build Coastguard Worker         } else {
2335*795d594fSAndroid Build Coastguard Worker           method.SetEntryPointFromQuickCompiledCode(GetQuickToInterpreterBridge());
2336*795d594fSAndroid Build Coastguard Worker         }
2337*795d594fSAndroid Build Coastguard Worker       }
2338*795d594fSAndroid Build Coastguard Worker     }, space->Begin(), image_pointer_size_);
2339*795d594fSAndroid Build Coastguard Worker   }
2340*795d594fSAndroid Build Coastguard Worker 
2341*795d594fSAndroid Build Coastguard Worker   if (runtime->IsVerificationSoftFail()) {
2342*795d594fSAndroid Build Coastguard Worker     header.VisitPackedArtMethods([&](ArtMethod& method) REQUIRES_SHARED(Locks::mutator_lock_) {
2343*795d594fSAndroid Build Coastguard Worker       if (method.IsManagedAndInvokable()) {
2344*795d594fSAndroid Build Coastguard Worker         method.ClearSkipAccessChecks();
2345*795d594fSAndroid Build Coastguard Worker       }
2346*795d594fSAndroid Build Coastguard Worker     }, space->Begin(), image_pointer_size_);
2347*795d594fSAndroid Build Coastguard Worker   }
2348*795d594fSAndroid Build Coastguard Worker 
2349*795d594fSAndroid Build Coastguard Worker   ClassTable* class_table = nullptr;
2350*795d594fSAndroid Build Coastguard Worker   {
2351*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
2352*795d594fSAndroid Build Coastguard Worker     class_table = InsertClassTableForClassLoader(class_loader.Get());
2353*795d594fSAndroid Build Coastguard Worker   }
2354*795d594fSAndroid Build Coastguard Worker   // If we have a class table section, read it and use it for verification in
2355*795d594fSAndroid Build Coastguard Worker   // UpdateAppImageClassLoadersAndDexCaches.
2356*795d594fSAndroid Build Coastguard Worker   ClassTable::ClassSet temp_set;
2357*795d594fSAndroid Build Coastguard Worker   const ImageSection& class_table_section = header.GetClassTableSection();
2358*795d594fSAndroid Build Coastguard Worker   const bool added_class_table = class_table_section.Size() > 0u;
2359*795d594fSAndroid Build Coastguard Worker   if (added_class_table) {
2360*795d594fSAndroid Build Coastguard Worker     const uint64_t start_time2 = NanoTime();
2361*795d594fSAndroid Build Coastguard Worker     size_t read_count = 0;
2362*795d594fSAndroid Build Coastguard Worker     temp_set = ClassTable::ClassSet(space->Begin() + class_table_section.Offset(),
2363*795d594fSAndroid Build Coastguard Worker                                     /*make copy*/false,
2364*795d594fSAndroid Build Coastguard Worker                                     &read_count);
2365*795d594fSAndroid Build Coastguard Worker     VLOG(image) << "Adding class table classes took " << PrettyDuration(NanoTime() - start_time2);
2366*795d594fSAndroid Build Coastguard Worker   }
2367*795d594fSAndroid Build Coastguard Worker   if (app_image) {
2368*795d594fSAndroid Build Coastguard Worker     AppImageLoadingHelper::Update(this, space, class_loader, dex_caches);
2369*795d594fSAndroid Build Coastguard Worker 
2370*795d594fSAndroid Build Coastguard Worker     {
2371*795d594fSAndroid Build Coastguard Worker       ScopedTrace trace("AppImage:UpdateClassLoaders");
2372*795d594fSAndroid Build Coastguard Worker       // Update class loader and resolved strings. If added_class_table is false, the resolved
2373*795d594fSAndroid Build Coastguard Worker       // strings were forwarded UpdateAppImageClassLoadersAndDexCaches.
2374*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::ClassLoader> loader(class_loader.Get());
2375*795d594fSAndroid Build Coastguard Worker       for (const ClassTable::TableSlot& root : temp_set) {
2376*795d594fSAndroid Build Coastguard Worker         // Note: We probably don't need the read barrier unless we copy the app image objects into
2377*795d594fSAndroid Build Coastguard Worker         // the region space.
2378*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::Class> klass(root.Read());
2379*795d594fSAndroid Build Coastguard Worker         // Do not update class loader for boot image classes where the app image
2380*795d594fSAndroid Build Coastguard Worker         // class loader is only the initiating loader but not the defining loader.
2381*795d594fSAndroid Build Coastguard Worker         if (space->HasAddress(klass.Ptr())) {
2382*795d594fSAndroid Build Coastguard Worker           klass->SetClassLoader(loader);
2383*795d594fSAndroid Build Coastguard Worker         } else {
2384*795d594fSAndroid Build Coastguard Worker           DCHECK(klass->IsBootStrapClassLoaded());
2385*795d594fSAndroid Build Coastguard Worker           DCHECK(Runtime::Current()->GetHeap()->ObjectIsInBootImageSpace(klass.Ptr()));
2386*795d594fSAndroid Build Coastguard Worker         }
2387*795d594fSAndroid Build Coastguard Worker       }
2388*795d594fSAndroid Build Coastguard Worker     }
2389*795d594fSAndroid Build Coastguard Worker 
2390*795d594fSAndroid Build Coastguard Worker     if (kBitstringSubtypeCheckEnabled) {
2391*795d594fSAndroid Build Coastguard Worker       // Every class in the app image has initially SubtypeCheckInfo in the
2392*795d594fSAndroid Build Coastguard Worker       // Uninitialized state.
2393*795d594fSAndroid Build Coastguard Worker       //
2394*795d594fSAndroid Build Coastguard Worker       // The SubtypeCheck invariants imply that a SubtypeCheckInfo is at least Initialized
2395*795d594fSAndroid Build Coastguard Worker       // after class initialization is complete. The app image ClassStatus as-is
2396*795d594fSAndroid Build Coastguard Worker       // are almost all ClassStatus::Initialized, and being in the
2397*795d594fSAndroid Build Coastguard Worker       // SubtypeCheckInfo::kUninitialized state is violating that invariant.
2398*795d594fSAndroid Build Coastguard Worker       //
2399*795d594fSAndroid Build Coastguard Worker       // Force every app image class's SubtypeCheck to be at least kIninitialized.
2400*795d594fSAndroid Build Coastguard Worker       //
2401*795d594fSAndroid Build Coastguard Worker       // See also ImageWriter::FixupClass.
2402*795d594fSAndroid Build Coastguard Worker       ScopedTrace trace("AppImage:RecacluateSubtypeCheckBitstrings");
2403*795d594fSAndroid Build Coastguard Worker       MutexLock subtype_check_lock(Thread::Current(), *Locks::subtype_check_lock_);
2404*795d594fSAndroid Build Coastguard Worker       for (const ClassTable::TableSlot& root : temp_set) {
2405*795d594fSAndroid Build Coastguard Worker         SubtypeCheck<ObjPtr<mirror::Class>>::EnsureInitialized(root.Read());
2406*795d594fSAndroid Build Coastguard Worker       }
2407*795d594fSAndroid Build Coastguard Worker     }
2408*795d594fSAndroid Build Coastguard Worker   }
2409*795d594fSAndroid Build Coastguard Worker   if (!oat_file->GetBssGcRoots().empty()) {
2410*795d594fSAndroid Build Coastguard Worker     // Insert oat file to class table for visiting .bss GC roots.
2411*795d594fSAndroid Build Coastguard Worker     class_table->InsertOatFile(oat_file);
2412*795d594fSAndroid Build Coastguard Worker   }
2413*795d594fSAndroid Build Coastguard Worker 
2414*795d594fSAndroid Build Coastguard Worker   if (added_class_table) {
2415*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
2416*795d594fSAndroid Build Coastguard Worker     class_table->AddClassSet(std::move(temp_set));
2417*795d594fSAndroid Build Coastguard Worker   }
2418*795d594fSAndroid Build Coastguard Worker 
2419*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild && app_image) {
2420*795d594fSAndroid Build Coastguard Worker     // This verification needs to happen after the classes have been added to the class loader.
2421*795d594fSAndroid Build Coastguard Worker     // Since it ensures classes are in the class table.
2422*795d594fSAndroid Build Coastguard Worker     ScopedTrace trace("AppImage:Verify");
2423*795d594fSAndroid Build Coastguard Worker     VerifyAppImage(header, class_loader, class_table, space);
2424*795d594fSAndroid Build Coastguard Worker   }
2425*795d594fSAndroid Build Coastguard Worker 
2426*795d594fSAndroid Build Coastguard Worker   VLOG(class_linker) << "Adding image space took " << PrettyDuration(NanoTime() - start_time);
2427*795d594fSAndroid Build Coastguard Worker   return true;
2428*795d594fSAndroid Build Coastguard Worker }
2429*795d594fSAndroid Build Coastguard Worker 
AddImageSpaces(ArrayRef<gc::space::ImageSpace * > spaces,Handle<mirror::ClassLoader> class_loader,ClassLoaderContext * context,std::vector<std::unique_ptr<const DexFile>> * dex_files,std::string * error_msg)2430*795d594fSAndroid Build Coastguard Worker bool ClassLinker::AddImageSpaces(ArrayRef<gc::space::ImageSpace*> spaces,
2431*795d594fSAndroid Build Coastguard Worker                                  Handle<mirror::ClassLoader> class_loader,
2432*795d594fSAndroid Build Coastguard Worker                                  ClassLoaderContext* context,
2433*795d594fSAndroid Build Coastguard Worker                                  /*out*/ std::vector<std::unique_ptr<const DexFile>>* dex_files,
2434*795d594fSAndroid Build Coastguard Worker                                  /*out*/ std::string* error_msg) {
2435*795d594fSAndroid Build Coastguard Worker   std::vector<std::vector<std::unique_ptr<const DexFile>>> dex_files_by_space_index;
2436*795d594fSAndroid Build Coastguard Worker   for (const gc::space::ImageSpace* space : spaces) {
2437*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> space_dex_files;
2438*795d594fSAndroid Build Coastguard Worker     if (!OpenAndInitImageDexFiles(space, class_loader, /*out*/ &space_dex_files, error_msg)) {
2439*795d594fSAndroid Build Coastguard Worker       return false;
2440*795d594fSAndroid Build Coastguard Worker     }
2441*795d594fSAndroid Build Coastguard Worker     dex_files_by_space_index.push_back(std::move(space_dex_files));
2442*795d594fSAndroid Build Coastguard Worker   }
2443*795d594fSAndroid Build Coastguard Worker   // This must be done in a separate loop after all dex files are initialized because there can be
2444*795d594fSAndroid Build Coastguard Worker   // references from an image space to another image space that comes after it.
2445*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0u, size = spaces.size(); i != size; ++i) {
2446*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>>& space_dex_files = dex_files_by_space_index[i];
2447*795d594fSAndroid Build Coastguard Worker     if (!AddImageSpace(spaces[i], class_loader, context, space_dex_files, error_msg)) {
2448*795d594fSAndroid Build Coastguard Worker       return false;
2449*795d594fSAndroid Build Coastguard Worker     }
2450*795d594fSAndroid Build Coastguard Worker     // Append opened dex files at the end.
2451*795d594fSAndroid Build Coastguard Worker     std::move(space_dex_files.begin(), space_dex_files.end(), std::back_inserter(*dex_files));
2452*795d594fSAndroid Build Coastguard Worker   }
2453*795d594fSAndroid Build Coastguard Worker   return true;
2454*795d594fSAndroid Build Coastguard Worker }
2455*795d594fSAndroid Build Coastguard Worker 
VisitClassRoots(RootVisitor * visitor,VisitRootFlags flags)2456*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags) {
2457*795d594fSAndroid Build Coastguard Worker   // Acquire tracing_enabled before locking class linker lock to prevent lock order violation. Since
2458*795d594fSAndroid Build Coastguard Worker   // enabling tracing requires the mutator lock, there are no race conditions here.
2459*795d594fSAndroid Build Coastguard Worker   const bool tracing_enabled = Trace::IsTracingEnabled();
2460*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
2461*795d594fSAndroid Build Coastguard Worker   WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
2462*795d594fSAndroid Build Coastguard Worker   if (gUseReadBarrier) {
2463*795d594fSAndroid Build Coastguard Worker     // We do not track new roots for CC.
2464*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(0, flags & (kVisitRootFlagNewRoots |
2465*795d594fSAndroid Build Coastguard Worker                           kVisitRootFlagClearRootLog |
2466*795d594fSAndroid Build Coastguard Worker                           kVisitRootFlagStartLoggingNewRoots |
2467*795d594fSAndroid Build Coastguard Worker                           kVisitRootFlagStopLoggingNewRoots));
2468*795d594fSAndroid Build Coastguard Worker   }
2469*795d594fSAndroid Build Coastguard Worker   if ((flags & kVisitRootFlagAllRoots) != 0) {
2470*795d594fSAndroid Build Coastguard Worker     // Argument for how root visiting deals with ArtField and ArtMethod roots.
2471*795d594fSAndroid Build Coastguard Worker     // There is 3 GC cases to handle:
2472*795d594fSAndroid Build Coastguard Worker     // Non moving concurrent:
2473*795d594fSAndroid Build Coastguard Worker     // This case is easy to handle since the reference members of ArtMethod and ArtFields are held
2474*795d594fSAndroid Build Coastguard Worker     // live by the class and class roots.
2475*795d594fSAndroid Build Coastguard Worker     //
2476*795d594fSAndroid Build Coastguard Worker     // Moving non-concurrent:
2477*795d594fSAndroid Build Coastguard Worker     // This case needs to call visit VisitNativeRoots in case the classes or dex cache arrays move.
2478*795d594fSAndroid Build Coastguard Worker     // To prevent missing roots, this case needs to ensure that there is no
2479*795d594fSAndroid Build Coastguard Worker     // suspend points between the point which we allocate ArtMethod arrays and place them in a
2480*795d594fSAndroid Build Coastguard Worker     // class which is in the class table.
2481*795d594fSAndroid Build Coastguard Worker     //
2482*795d594fSAndroid Build Coastguard Worker     // Moving concurrent:
2483*795d594fSAndroid Build Coastguard Worker     // Need to make sure to not copy ArtMethods without doing read barriers since the roots are
2484*795d594fSAndroid Build Coastguard Worker     // marked concurrently and we don't hold the classlinker_classes_lock_ when we do the copy.
2485*795d594fSAndroid Build Coastguard Worker     //
2486*795d594fSAndroid Build Coastguard Worker     // Use an unbuffered visitor since the class table uses a temporary GcRoot for holding decoded
2487*795d594fSAndroid Build Coastguard Worker     // ClassTable::TableSlot. The buffered root visiting would access a stale stack location for
2488*795d594fSAndroid Build Coastguard Worker     // these objects.
2489*795d594fSAndroid Build Coastguard Worker     UnbufferedRootVisitor root_visitor(visitor, RootInfo(kRootStickyClass));
2490*795d594fSAndroid Build Coastguard Worker     boot_class_table_->VisitRoots(root_visitor);
2491*795d594fSAndroid Build Coastguard Worker     // If tracing is enabled, then mark all the class loaders to prevent unloading.
2492*795d594fSAndroid Build Coastguard Worker     if ((flags & kVisitRootFlagClassLoader) != 0 || tracing_enabled) {
2493*795d594fSAndroid Build Coastguard Worker       for (const ClassLoaderData& data : class_loaders_) {
2494*795d594fSAndroid Build Coastguard Worker         GcRoot<mirror::Object> root(GcRoot<mirror::Object>(self->DecodeJObject(data.weak_root)));
2495*795d594fSAndroid Build Coastguard Worker         root.VisitRootIfNonNull(visitor, RootInfo(kRootVMInternal));
2496*795d594fSAndroid Build Coastguard Worker       }
2497*795d594fSAndroid Build Coastguard Worker     }
2498*795d594fSAndroid Build Coastguard Worker   } else if (!gUseReadBarrier && (flags & kVisitRootFlagNewRoots) != 0) {
2499*795d594fSAndroid Build Coastguard Worker     for (auto& root : new_roots_) {
2500*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Object> old_ref = root.Read<kWithoutReadBarrier>();
2501*795d594fSAndroid Build Coastguard Worker       root.VisitRoot(visitor, RootInfo(kRootStickyClass));
2502*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Object> new_ref = root.Read<kWithoutReadBarrier>();
2503*795d594fSAndroid Build Coastguard Worker       // Concurrent moving GC marked new roots through the to-space invariant.
2504*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(new_ref, old_ref);
2505*795d594fSAndroid Build Coastguard Worker     }
2506*795d594fSAndroid Build Coastguard Worker     for (const OatFile* oat_file : new_bss_roots_boot_oat_files_) {
2507*795d594fSAndroid Build Coastguard Worker       for (GcRoot<mirror::Object>& root : oat_file->GetBssGcRoots()) {
2508*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::Object> old_ref = root.Read<kWithoutReadBarrier>();
2509*795d594fSAndroid Build Coastguard Worker         if (old_ref != nullptr) {
2510*795d594fSAndroid Build Coastguard Worker           DCHECK(old_ref->IsClass() || old_ref->IsString());
2511*795d594fSAndroid Build Coastguard Worker           root.VisitRoot(visitor, RootInfo(kRootStickyClass));
2512*795d594fSAndroid Build Coastguard Worker           ObjPtr<mirror::Object> new_ref = root.Read<kWithoutReadBarrier>();
2513*795d594fSAndroid Build Coastguard Worker           // Concurrent moving GC marked new roots through the to-space invariant.
2514*795d594fSAndroid Build Coastguard Worker           DCHECK_EQ(new_ref, old_ref);
2515*795d594fSAndroid Build Coastguard Worker         }
2516*795d594fSAndroid Build Coastguard Worker       }
2517*795d594fSAndroid Build Coastguard Worker     }
2518*795d594fSAndroid Build Coastguard Worker   }
2519*795d594fSAndroid Build Coastguard Worker   if (!gUseReadBarrier && (flags & kVisitRootFlagClearRootLog) != 0) {
2520*795d594fSAndroid Build Coastguard Worker     new_roots_.clear();
2521*795d594fSAndroid Build Coastguard Worker     new_bss_roots_boot_oat_files_.clear();
2522*795d594fSAndroid Build Coastguard Worker   }
2523*795d594fSAndroid Build Coastguard Worker   if (!gUseReadBarrier && (flags & kVisitRootFlagStartLoggingNewRoots) != 0) {
2524*795d594fSAndroid Build Coastguard Worker     log_new_roots_ = true;
2525*795d594fSAndroid Build Coastguard Worker   } else if (!gUseReadBarrier && (flags & kVisitRootFlagStopLoggingNewRoots) != 0) {
2526*795d594fSAndroid Build Coastguard Worker     log_new_roots_ = false;
2527*795d594fSAndroid Build Coastguard Worker   }
2528*795d594fSAndroid Build Coastguard Worker   // We deliberately ignore the class roots in the image since we
2529*795d594fSAndroid Build Coastguard Worker   // handle image roots by using the MS/CMS rescanning of dirty cards.
2530*795d594fSAndroid Build Coastguard Worker }
2531*795d594fSAndroid Build Coastguard Worker 
2532*795d594fSAndroid Build Coastguard Worker // Keep in sync with InitCallback. Anything we visit, we need to
2533*795d594fSAndroid Build Coastguard Worker // reinit references to when reinitializing a ClassLinker from a
2534*795d594fSAndroid Build Coastguard Worker // mapped image.
VisitRoots(RootVisitor * visitor,VisitRootFlags flags,bool visit_class_roots)2535*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisitRoots(RootVisitor* visitor, VisitRootFlags flags, bool visit_class_roots) {
2536*795d594fSAndroid Build Coastguard Worker   class_roots_.VisitRootIfNonNull(visitor, RootInfo(kRootVMInternal));
2537*795d594fSAndroid Build Coastguard Worker   if (visit_class_roots) {
2538*795d594fSAndroid Build Coastguard Worker     VisitClassRoots(visitor, flags);
2539*795d594fSAndroid Build Coastguard Worker   }
2540*795d594fSAndroid Build Coastguard Worker   // Instead of visiting the find_array_class_cache_ drop it so that it doesn't prevent class
2541*795d594fSAndroid Build Coastguard Worker   // unloading if we are marking roots.
2542*795d594fSAndroid Build Coastguard Worker   DropFindArrayClassCache();
2543*795d594fSAndroid Build Coastguard Worker }
2544*795d594fSAndroid Build Coastguard Worker 
2545*795d594fSAndroid Build Coastguard Worker class VisitClassLoaderClassesVisitor : public ClassLoaderVisitor {
2546*795d594fSAndroid Build Coastguard Worker  public:
VisitClassLoaderClassesVisitor(ClassVisitor * visitor)2547*795d594fSAndroid Build Coastguard Worker   explicit VisitClassLoaderClassesVisitor(ClassVisitor* visitor)
2548*795d594fSAndroid Build Coastguard Worker       : visitor_(visitor),
2549*795d594fSAndroid Build Coastguard Worker         done_(false) {}
2550*795d594fSAndroid Build Coastguard Worker 
Visit(ObjPtr<mirror::ClassLoader> class_loader)2551*795d594fSAndroid Build Coastguard Worker   void Visit(ObjPtr<mirror::ClassLoader> class_loader)
2552*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) override {
2553*795d594fSAndroid Build Coastguard Worker     ClassTable* const class_table = class_loader->GetClassTable();
2554*795d594fSAndroid Build Coastguard Worker     if (!done_ && class_table != nullptr) {
2555*795d594fSAndroid Build Coastguard Worker       DefiningClassLoaderFilterVisitor visitor(class_loader, visitor_);
2556*795d594fSAndroid Build Coastguard Worker       if (!class_table->Visit(visitor)) {
2557*795d594fSAndroid Build Coastguard Worker         // If the visitor ClassTable returns false it means that we don't need to continue.
2558*795d594fSAndroid Build Coastguard Worker         done_ = true;
2559*795d594fSAndroid Build Coastguard Worker       }
2560*795d594fSAndroid Build Coastguard Worker     }
2561*795d594fSAndroid Build Coastguard Worker   }
2562*795d594fSAndroid Build Coastguard Worker 
2563*795d594fSAndroid Build Coastguard Worker  private:
2564*795d594fSAndroid Build Coastguard Worker   // Class visitor that limits the class visits from a ClassTable to the classes with
2565*795d594fSAndroid Build Coastguard Worker   // the provided defining class loader. This filter is used to avoid multiple visits
2566*795d594fSAndroid Build Coastguard Worker   // of the same class which can be recorded for multiple initiating class loaders.
2567*795d594fSAndroid Build Coastguard Worker   class DefiningClassLoaderFilterVisitor : public ClassVisitor {
2568*795d594fSAndroid Build Coastguard Worker    public:
DefiningClassLoaderFilterVisitor(ObjPtr<mirror::ClassLoader> defining_class_loader,ClassVisitor * visitor)2569*795d594fSAndroid Build Coastguard Worker     DefiningClassLoaderFilterVisitor(ObjPtr<mirror::ClassLoader> defining_class_loader,
2570*795d594fSAndroid Build Coastguard Worker                                      ClassVisitor* visitor)
2571*795d594fSAndroid Build Coastguard Worker         : defining_class_loader_(defining_class_loader), visitor_(visitor) { }
2572*795d594fSAndroid Build Coastguard Worker 
operator ()(ObjPtr<mirror::Class> klass)2573*795d594fSAndroid Build Coastguard Worker     bool operator()(ObjPtr<mirror::Class> klass) override REQUIRES_SHARED(Locks::mutator_lock_) {
2574*795d594fSAndroid Build Coastguard Worker       if (klass->GetClassLoader() != defining_class_loader_) {
2575*795d594fSAndroid Build Coastguard Worker         return true;
2576*795d594fSAndroid Build Coastguard Worker       }
2577*795d594fSAndroid Build Coastguard Worker       return (*visitor_)(klass);
2578*795d594fSAndroid Build Coastguard Worker     }
2579*795d594fSAndroid Build Coastguard Worker 
2580*795d594fSAndroid Build Coastguard Worker     const ObjPtr<mirror::ClassLoader> defining_class_loader_;
2581*795d594fSAndroid Build Coastguard Worker     ClassVisitor* const visitor_;
2582*795d594fSAndroid Build Coastguard Worker   };
2583*795d594fSAndroid Build Coastguard Worker 
2584*795d594fSAndroid Build Coastguard Worker   ClassVisitor* const visitor_;
2585*795d594fSAndroid Build Coastguard Worker   // If done is true then we don't need to do any more visiting.
2586*795d594fSAndroid Build Coastguard Worker   bool done_;
2587*795d594fSAndroid Build Coastguard Worker };
2588*795d594fSAndroid Build Coastguard Worker 
VisitClassesInternal(ClassVisitor * visitor)2589*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisitClassesInternal(ClassVisitor* visitor) {
2590*795d594fSAndroid Build Coastguard Worker   if (boot_class_table_->Visit(*visitor)) {
2591*795d594fSAndroid Build Coastguard Worker     VisitClassLoaderClassesVisitor loader_visitor(visitor);
2592*795d594fSAndroid Build Coastguard Worker     VisitClassLoaders(&loader_visitor);
2593*795d594fSAndroid Build Coastguard Worker   }
2594*795d594fSAndroid Build Coastguard Worker }
2595*795d594fSAndroid Build Coastguard Worker 
VisitClasses(ClassVisitor * visitor)2596*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisitClasses(ClassVisitor* visitor) {
2597*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
2598*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_);
2599*795d594fSAndroid Build Coastguard Worker   // Not safe to have thread suspension when we are holding a lock.
2600*795d594fSAndroid Build Coastguard Worker   if (self != nullptr) {
2601*795d594fSAndroid Build Coastguard Worker     ScopedAssertNoThreadSuspension nts(__FUNCTION__);
2602*795d594fSAndroid Build Coastguard Worker     VisitClassesInternal(visitor);
2603*795d594fSAndroid Build Coastguard Worker   } else {
2604*795d594fSAndroid Build Coastguard Worker     VisitClassesInternal(visitor);
2605*795d594fSAndroid Build Coastguard Worker   }
2606*795d594fSAndroid Build Coastguard Worker }
2607*795d594fSAndroid Build Coastguard Worker 
2608*795d594fSAndroid Build Coastguard Worker class GetClassesInToVector : public ClassVisitor {
2609*795d594fSAndroid Build Coastguard Worker  public:
operator ()(ObjPtr<mirror::Class> klass)2610*795d594fSAndroid Build Coastguard Worker   bool operator()(ObjPtr<mirror::Class> klass) override {
2611*795d594fSAndroid Build Coastguard Worker     classes_.push_back(klass);
2612*795d594fSAndroid Build Coastguard Worker     return true;
2613*795d594fSAndroid Build Coastguard Worker   }
2614*795d594fSAndroid Build Coastguard Worker   std::vector<ObjPtr<mirror::Class>> classes_;
2615*795d594fSAndroid Build Coastguard Worker };
2616*795d594fSAndroid Build Coastguard Worker 
2617*795d594fSAndroid Build Coastguard Worker class GetClassInToObjectArray : public ClassVisitor {
2618*795d594fSAndroid Build Coastguard Worker  public:
GetClassInToObjectArray(mirror::ObjectArray<mirror::Class> * arr)2619*795d594fSAndroid Build Coastguard Worker   explicit GetClassInToObjectArray(mirror::ObjectArray<mirror::Class>* arr)
2620*795d594fSAndroid Build Coastguard Worker       : arr_(arr), index_(0) {}
2621*795d594fSAndroid Build Coastguard Worker 
operator ()(ObjPtr<mirror::Class> klass)2622*795d594fSAndroid Build Coastguard Worker   bool operator()(ObjPtr<mirror::Class> klass) override REQUIRES_SHARED(Locks::mutator_lock_) {
2623*795d594fSAndroid Build Coastguard Worker     ++index_;
2624*795d594fSAndroid Build Coastguard Worker     if (index_ <= arr_->GetLength()) {
2625*795d594fSAndroid Build Coastguard Worker       arr_->Set(index_ - 1, klass);
2626*795d594fSAndroid Build Coastguard Worker       return true;
2627*795d594fSAndroid Build Coastguard Worker     }
2628*795d594fSAndroid Build Coastguard Worker     return false;
2629*795d594fSAndroid Build Coastguard Worker   }
2630*795d594fSAndroid Build Coastguard Worker 
Succeeded() const2631*795d594fSAndroid Build Coastguard Worker   bool Succeeded() const REQUIRES_SHARED(Locks::mutator_lock_) {
2632*795d594fSAndroid Build Coastguard Worker     return index_ <= arr_->GetLength();
2633*795d594fSAndroid Build Coastguard Worker   }
2634*795d594fSAndroid Build Coastguard Worker 
2635*795d594fSAndroid Build Coastguard Worker  private:
2636*795d594fSAndroid Build Coastguard Worker   mirror::ObjectArray<mirror::Class>* const arr_;
2637*795d594fSAndroid Build Coastguard Worker   int32_t index_;
2638*795d594fSAndroid Build Coastguard Worker };
2639*795d594fSAndroid Build Coastguard Worker 
VisitClassesWithoutClassesLock(ClassVisitor * visitor)2640*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisitClassesWithoutClassesLock(ClassVisitor* visitor) {
2641*795d594fSAndroid Build Coastguard Worker   // TODO: it may be possible to avoid secondary storage if we iterate over dex caches. The problem
2642*795d594fSAndroid Build Coastguard Worker   // is avoiding duplicates.
2643*795d594fSAndroid Build Coastguard Worker   if (!kMovingClasses) {
2644*795d594fSAndroid Build Coastguard Worker     ScopedAssertNoThreadSuspension nts(__FUNCTION__);
2645*795d594fSAndroid Build Coastguard Worker     GetClassesInToVector accumulator;
2646*795d594fSAndroid Build Coastguard Worker     VisitClasses(&accumulator);
2647*795d594fSAndroid Build Coastguard Worker     for (ObjPtr<mirror::Class> klass : accumulator.classes_) {
2648*795d594fSAndroid Build Coastguard Worker       if (!visitor->operator()(klass)) {
2649*795d594fSAndroid Build Coastguard Worker         return;
2650*795d594fSAndroid Build Coastguard Worker       }
2651*795d594fSAndroid Build Coastguard Worker     }
2652*795d594fSAndroid Build Coastguard Worker   } else {
2653*795d594fSAndroid Build Coastguard Worker     Thread* const self = Thread::Current();
2654*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
2655*795d594fSAndroid Build Coastguard Worker     auto classes = hs.NewHandle<mirror::ObjectArray<mirror::Class>>(nullptr);
2656*795d594fSAndroid Build Coastguard Worker     // We size the array assuming classes won't be added to the class table during the visit.
2657*795d594fSAndroid Build Coastguard Worker     // If this assumption fails we iterate again.
2658*795d594fSAndroid Build Coastguard Worker     while (true) {
2659*795d594fSAndroid Build Coastguard Worker       size_t class_table_size;
2660*795d594fSAndroid Build Coastguard Worker       {
2661*795d594fSAndroid Build Coastguard Worker         ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_);
2662*795d594fSAndroid Build Coastguard Worker         // Add 100 in case new classes get loaded when we are filling in the object array.
2663*795d594fSAndroid Build Coastguard Worker         class_table_size = NumZygoteClasses() + NumNonZygoteClasses() + 100;
2664*795d594fSAndroid Build Coastguard Worker       }
2665*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> array_of_class = GetClassRoot<mirror::ObjectArray<mirror::Class>>(this);
2666*795d594fSAndroid Build Coastguard Worker       classes.Assign(
2667*795d594fSAndroid Build Coastguard Worker           mirror::ObjectArray<mirror::Class>::Alloc(self, array_of_class, class_table_size));
2668*795d594fSAndroid Build Coastguard Worker       CHECK(classes != nullptr);  // OOME.
2669*795d594fSAndroid Build Coastguard Worker       GetClassInToObjectArray accumulator(classes.Get());
2670*795d594fSAndroid Build Coastguard Worker       VisitClasses(&accumulator);
2671*795d594fSAndroid Build Coastguard Worker       if (accumulator.Succeeded()) {
2672*795d594fSAndroid Build Coastguard Worker         break;
2673*795d594fSAndroid Build Coastguard Worker       }
2674*795d594fSAndroid Build Coastguard Worker     }
2675*795d594fSAndroid Build Coastguard Worker     for (int32_t i = 0; i < classes->GetLength(); ++i) {
2676*795d594fSAndroid Build Coastguard Worker       // If the class table shrank during creation of the clases array we expect null elements. If
2677*795d594fSAndroid Build Coastguard Worker       // the class table grew then the loop repeats. If classes are created after the loop has
2678*795d594fSAndroid Build Coastguard Worker       // finished then we don't visit.
2679*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> klass = classes->Get(i);
2680*795d594fSAndroid Build Coastguard Worker       if (klass != nullptr && !visitor->operator()(klass)) {
2681*795d594fSAndroid Build Coastguard Worker         return;
2682*795d594fSAndroid Build Coastguard Worker       }
2683*795d594fSAndroid Build Coastguard Worker     }
2684*795d594fSAndroid Build Coastguard Worker   }
2685*795d594fSAndroid Build Coastguard Worker }
2686*795d594fSAndroid Build Coastguard Worker 
~ClassLinker()2687*795d594fSAndroid Build Coastguard Worker ClassLinker::~ClassLinker() {
2688*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
2689*795d594fSAndroid Build Coastguard Worker   for (const ClassLoaderData& data : class_loaders_) {
2690*795d594fSAndroid Build Coastguard Worker     // CHA unloading analysis is not needed. No negative consequences are expected because
2691*795d594fSAndroid Build Coastguard Worker     // all the classloaders are deleted at the same time.
2692*795d594fSAndroid Build Coastguard Worker     PrepareToDeleteClassLoader(self, data, /*cleanup_cha=*/false);
2693*795d594fSAndroid Build Coastguard Worker   }
2694*795d594fSAndroid Build Coastguard Worker   for (const ClassLoaderData& data : class_loaders_) {
2695*795d594fSAndroid Build Coastguard Worker     delete data.allocator;
2696*795d594fSAndroid Build Coastguard Worker     delete data.class_table;
2697*795d594fSAndroid Build Coastguard Worker   }
2698*795d594fSAndroid Build Coastguard Worker   class_loaders_.clear();
2699*795d594fSAndroid Build Coastguard Worker   while (!running_visibly_initialized_callbacks_.empty()) {
2700*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<VisiblyInitializedCallback> callback(
2701*795d594fSAndroid Build Coastguard Worker         std::addressof(running_visibly_initialized_callbacks_.front()));
2702*795d594fSAndroid Build Coastguard Worker     running_visibly_initialized_callbacks_.pop_front();
2703*795d594fSAndroid Build Coastguard Worker   }
2704*795d594fSAndroid Build Coastguard Worker }
2705*795d594fSAndroid Build Coastguard Worker 
PrepareToDeleteClassLoader(Thread * self,const ClassLoaderData & data,bool cleanup_cha)2706*795d594fSAndroid Build Coastguard Worker void ClassLinker::PrepareToDeleteClassLoader(Thread* self,
2707*795d594fSAndroid Build Coastguard Worker                                              const ClassLoaderData& data,
2708*795d594fSAndroid Build Coastguard Worker                                              bool cleanup_cha) {
2709*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
2710*795d594fSAndroid Build Coastguard Worker   JavaVMExt* const vm = runtime->GetJavaVM();
2711*795d594fSAndroid Build Coastguard Worker   vm->DeleteWeakGlobalRef(self, data.weak_root);
2712*795d594fSAndroid Build Coastguard Worker   // Notify the JIT that we need to remove the methods and/or profiling info.
2713*795d594fSAndroid Build Coastguard Worker   if (runtime->GetJit() != nullptr) {
2714*795d594fSAndroid Build Coastguard Worker     jit::JitCodeCache* code_cache = runtime->GetJit()->GetCodeCache();
2715*795d594fSAndroid Build Coastguard Worker     if (code_cache != nullptr) {
2716*795d594fSAndroid Build Coastguard Worker       // For the JIT case, RemoveMethodsIn removes the CHA dependencies.
2717*795d594fSAndroid Build Coastguard Worker       code_cache->RemoveMethodsIn(self, *data.allocator);
2718*795d594fSAndroid Build Coastguard Worker     }
2719*795d594fSAndroid Build Coastguard Worker   } else if (cha_ != nullptr) {
2720*795d594fSAndroid Build Coastguard Worker     // If we don't have a JIT, we need to manually remove the CHA dependencies manually.
2721*795d594fSAndroid Build Coastguard Worker     cha_->RemoveDependenciesForLinearAlloc(self, data.allocator);
2722*795d594fSAndroid Build Coastguard Worker   }
2723*795d594fSAndroid Build Coastguard Worker   // Cleanup references to single implementation ArtMethods that will be deleted.
2724*795d594fSAndroid Build Coastguard Worker   if (cleanup_cha) {
2725*795d594fSAndroid Build Coastguard Worker     CHAOnDeleteUpdateClassVisitor visitor(data.allocator);
2726*795d594fSAndroid Build Coastguard Worker     data.class_table->Visit<kWithoutReadBarrier>(visitor);
2727*795d594fSAndroid Build Coastguard Worker   }
2728*795d594fSAndroid Build Coastguard Worker   {
2729*795d594fSAndroid Build Coastguard Worker     MutexLock lock(self, critical_native_code_with_clinit_check_lock_);
2730*795d594fSAndroid Build Coastguard Worker     auto end = critical_native_code_with_clinit_check_.end();
2731*795d594fSAndroid Build Coastguard Worker     for (auto it = critical_native_code_with_clinit_check_.begin(); it != end; ) {
2732*795d594fSAndroid Build Coastguard Worker       if (data.allocator->ContainsUnsafe(it->first)) {
2733*795d594fSAndroid Build Coastguard Worker         it = critical_native_code_with_clinit_check_.erase(it);
2734*795d594fSAndroid Build Coastguard Worker       } else {
2735*795d594fSAndroid Build Coastguard Worker         ++it;
2736*795d594fSAndroid Build Coastguard Worker       }
2737*795d594fSAndroid Build Coastguard Worker     }
2738*795d594fSAndroid Build Coastguard Worker   }
2739*795d594fSAndroid Build Coastguard Worker }
2740*795d594fSAndroid Build Coastguard Worker 
AllocPointerArray(Thread * self,size_t length)2741*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::PointerArray> ClassLinker::AllocPointerArray(Thread* self, size_t length) {
2742*795d594fSAndroid Build Coastguard Worker   return ObjPtr<mirror::PointerArray>::DownCast(
2743*795d594fSAndroid Build Coastguard Worker       image_pointer_size_ == PointerSize::k64
2744*795d594fSAndroid Build Coastguard Worker           ? ObjPtr<mirror::Array>(mirror::LongArray::Alloc(self, length))
2745*795d594fSAndroid Build Coastguard Worker           : ObjPtr<mirror::Array>(mirror::IntArray::Alloc(self, length)));
2746*795d594fSAndroid Build Coastguard Worker }
2747*795d594fSAndroid Build Coastguard Worker 
AllocDexCache(Thread * self,const DexFile & dex_file)2748*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::DexCache> ClassLinker::AllocDexCache(Thread* self, const DexFile& dex_file) {
2749*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(self);
2750*795d594fSAndroid Build Coastguard Worker   auto dex_cache(hs.NewHandle(ObjPtr<mirror::DexCache>::DownCast(
2751*795d594fSAndroid Build Coastguard Worker       GetClassRoot<mirror::DexCache>(this)->AllocObject(self))));
2752*795d594fSAndroid Build Coastguard Worker   if (dex_cache == nullptr) {
2753*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
2754*795d594fSAndroid Build Coastguard Worker     return nullptr;
2755*795d594fSAndroid Build Coastguard Worker   }
2756*795d594fSAndroid Build Coastguard Worker   // Use InternWeak() so that the location String can be collected when the ClassLoader
2757*795d594fSAndroid Build Coastguard Worker   // with this DexCache is collected.
2758*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::String> location = intern_table_->InternWeak(dex_file.GetLocation().c_str());
2759*795d594fSAndroid Build Coastguard Worker   if (location == nullptr) {
2760*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
2761*795d594fSAndroid Build Coastguard Worker     return nullptr;
2762*795d594fSAndroid Build Coastguard Worker   }
2763*795d594fSAndroid Build Coastguard Worker   dex_cache->SetLocation(location);
2764*795d594fSAndroid Build Coastguard Worker   return dex_cache.Get();
2765*795d594fSAndroid Build Coastguard Worker }
2766*795d594fSAndroid Build Coastguard Worker 
AllocAndInitializeDexCache(Thread * self,const DexFile & dex_file,ObjPtr<mirror::ClassLoader> class_loader)2767*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::DexCache> ClassLinker::AllocAndInitializeDexCache(
2768*795d594fSAndroid Build Coastguard Worker     Thread* self, const DexFile& dex_file, ObjPtr<mirror::ClassLoader> class_loader) {
2769*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(self);
2770*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> h_class_loader(hs.NewHandle(class_loader));
2771*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> dex_cache = AllocDexCache(self, dex_file);
2772*795d594fSAndroid Build Coastguard Worker   if (dex_cache != nullptr) {
2773*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::dex_lock_);
2774*795d594fSAndroid Build Coastguard Worker     dex_cache->Initialize(&dex_file, h_class_loader.Get());
2775*795d594fSAndroid Build Coastguard Worker   }
2776*795d594fSAndroid Build Coastguard Worker   return dex_cache;
2777*795d594fSAndroid Build Coastguard Worker }
2778*795d594fSAndroid Build Coastguard Worker 
2779*795d594fSAndroid Build Coastguard Worker template <bool kMovable, typename PreFenceVisitor>
AllocClass(Thread * self,ObjPtr<mirror::Class> java_lang_Class,uint32_t class_size,const PreFenceVisitor & pre_fence_visitor)2780*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::AllocClass(Thread* self,
2781*795d594fSAndroid Build Coastguard Worker                                               ObjPtr<mirror::Class> java_lang_Class,
2782*795d594fSAndroid Build Coastguard Worker                                               uint32_t class_size,
2783*795d594fSAndroid Build Coastguard Worker                                               const PreFenceVisitor& pre_fence_visitor) {
2784*795d594fSAndroid Build Coastguard Worker   DCHECK_GE(class_size, sizeof(mirror::Class));
2785*795d594fSAndroid Build Coastguard Worker   gc::Heap* heap = Runtime::Current()->GetHeap();
2786*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> k = (kMovingClasses && kMovable) ?
2787*795d594fSAndroid Build Coastguard Worker       heap->AllocObject(self, java_lang_Class, class_size, pre_fence_visitor) :
2788*795d594fSAndroid Build Coastguard Worker       heap->AllocNonMovableObject(self, java_lang_Class, class_size, pre_fence_visitor);
2789*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(k == nullptr)) {
2790*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
2791*795d594fSAndroid Build Coastguard Worker     return nullptr;
2792*795d594fSAndroid Build Coastguard Worker   }
2793*795d594fSAndroid Build Coastguard Worker   return k->AsClass();
2794*795d594fSAndroid Build Coastguard Worker }
2795*795d594fSAndroid Build Coastguard Worker 
2796*795d594fSAndroid Build Coastguard Worker template <bool kMovable>
AllocClass(Thread * self,ObjPtr<mirror::Class> java_lang_Class,uint32_t class_size)2797*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::AllocClass(Thread* self,
2798*795d594fSAndroid Build Coastguard Worker                                               ObjPtr<mirror::Class> java_lang_Class,
2799*795d594fSAndroid Build Coastguard Worker                                               uint32_t class_size) {
2800*795d594fSAndroid Build Coastguard Worker   mirror::Class::InitializeClassVisitor visitor(class_size);
2801*795d594fSAndroid Build Coastguard Worker   return AllocClass<kMovable>(self, java_lang_Class, class_size, visitor);
2802*795d594fSAndroid Build Coastguard Worker }
2803*795d594fSAndroid Build Coastguard Worker 
AllocClass(Thread * self,uint32_t class_size)2804*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::AllocClass(Thread* self, uint32_t class_size) {
2805*795d594fSAndroid Build Coastguard Worker   return AllocClass(self, GetClassRoot<mirror::Class>(this), class_size);
2806*795d594fSAndroid Build Coastguard Worker }
2807*795d594fSAndroid Build Coastguard Worker 
AllocPrimitiveArrayClass(Thread * self,ClassRoot primitive_root,ClassRoot array_root)2808*795d594fSAndroid Build Coastguard Worker void ClassLinker::AllocPrimitiveArrayClass(Thread* self,
2809*795d594fSAndroid Build Coastguard Worker                                            ClassRoot primitive_root,
2810*795d594fSAndroid Build Coastguard Worker                                            ClassRoot array_root) {
2811*795d594fSAndroid Build Coastguard Worker   // We make this class non-movable for the unlikely case where it were to be
2812*795d594fSAndroid Build Coastguard Worker   // moved by a sticky-bit (minor) collection when using the Generational
2813*795d594fSAndroid Build Coastguard Worker   // Concurrent Copying (CC) collector, potentially creating a stale reference
2814*795d594fSAndroid Build Coastguard Worker   // in the `klass_` field of one of its instances allocated in the Large-Object
2815*795d594fSAndroid Build Coastguard Worker   // Space (LOS) -- see the comment about the dirty card scanning logic in
2816*795d594fSAndroid Build Coastguard Worker   // art::gc::collector::ConcurrentCopying::MarkingPhase.
2817*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> array_class = AllocClass</* kMovable= */ false>(
2818*795d594fSAndroid Build Coastguard Worker       self, GetClassRoot<mirror::Class>(this), mirror::Array::ClassSize(image_pointer_size_));
2819*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> component_type = GetClassRoot(primitive_root, this);
2820*795d594fSAndroid Build Coastguard Worker   DCHECK(component_type->IsPrimitive());
2821*795d594fSAndroid Build Coastguard Worker   array_class->SetComponentType(component_type);
2822*795d594fSAndroid Build Coastguard Worker   SetClassRoot(array_root, array_class);
2823*795d594fSAndroid Build Coastguard Worker }
2824*795d594fSAndroid Build Coastguard Worker 
FinishArrayClassSetup(ObjPtr<mirror::Class> array_class)2825*795d594fSAndroid Build Coastguard Worker void ClassLinker::FinishArrayClassSetup(ObjPtr<mirror::Class> array_class) {
2826*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> java_lang_Object = GetClassRoot<mirror::Object>(this);
2827*795d594fSAndroid Build Coastguard Worker   array_class->SetSuperClass(java_lang_Object);
2828*795d594fSAndroid Build Coastguard Worker   array_class->SetVTable(java_lang_Object->GetVTable());
2829*795d594fSAndroid Build Coastguard Worker   array_class->SetPrimitiveType(Primitive::kPrimNot);
2830*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> component_type = array_class->GetComponentType();
2831*795d594fSAndroid Build Coastguard Worker   DCHECK_LT(component_type->GetPrimitiveTypeSizeShift(), 4u);
2832*795d594fSAndroid Build Coastguard Worker   uint32_t class_flags =
2833*795d594fSAndroid Build Coastguard Worker       component_type->GetPrimitiveTypeSizeShift() << mirror::kArrayComponentSizeShiftShift;
2834*795d594fSAndroid Build Coastguard Worker   class_flags |= component_type->IsPrimitive()
2835*795d594fSAndroid Build Coastguard Worker                      ? (mirror::kClassFlagNoReferenceFields | mirror::kClassFlagPrimitiveArray)
2836*795d594fSAndroid Build Coastguard Worker                      : mirror::kClassFlagObjectArray;
2837*795d594fSAndroid Build Coastguard Worker   array_class->SetClassFlags(class_flags);
2838*795d594fSAndroid Build Coastguard Worker   array_class->SetClassLoader(component_type->GetClassLoader());
2839*795d594fSAndroid Build Coastguard Worker   array_class->SetStatusForPrimitiveOrArray(ClassStatus::kLoaded);
2840*795d594fSAndroid Build Coastguard Worker   array_class->PopulateEmbeddedVTable(image_pointer_size_);
2841*795d594fSAndroid Build Coastguard Worker   ImTable* object_imt = java_lang_Object->GetImt(image_pointer_size_);
2842*795d594fSAndroid Build Coastguard Worker   array_class->SetImt(object_imt, image_pointer_size_);
2843*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(array_class->NumMethods(), 0u);
2844*795d594fSAndroid Build Coastguard Worker 
2845*795d594fSAndroid Build Coastguard Worker   // don't need to set new_class->SetObjectSize(..)
2846*795d594fSAndroid Build Coastguard Worker   // because Object::SizeOf delegates to Array::SizeOf
2847*795d594fSAndroid Build Coastguard Worker 
2848*795d594fSAndroid Build Coastguard Worker   // All arrays have java/lang/Cloneable and java/io/Serializable as
2849*795d594fSAndroid Build Coastguard Worker   // interfaces.  We need to set that up here, so that stuff like
2850*795d594fSAndroid Build Coastguard Worker   // "instanceof" works right.
2851*795d594fSAndroid Build Coastguard Worker 
2852*795d594fSAndroid Build Coastguard Worker   // Use the single, global copies of "interfaces" and "iftable"
2853*795d594fSAndroid Build Coastguard Worker   // (remember not to free them for arrays).
2854*795d594fSAndroid Build Coastguard Worker   {
2855*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::IfTable> array_iftable = GetArrayIfTable();
2856*795d594fSAndroid Build Coastguard Worker     CHECK(array_iftable != nullptr);
2857*795d594fSAndroid Build Coastguard Worker     array_class->SetIfTable(array_iftable);
2858*795d594fSAndroid Build Coastguard Worker   }
2859*795d594fSAndroid Build Coastguard Worker 
2860*795d594fSAndroid Build Coastguard Worker   // Inherit access flags from the component type.
2861*795d594fSAndroid Build Coastguard Worker   int access_flags = component_type->GetAccessFlags();
2862*795d594fSAndroid Build Coastguard Worker   // Lose any implementation detail flags; in particular, arrays aren't finalizable.
2863*795d594fSAndroid Build Coastguard Worker   access_flags &= kAccJavaFlagsMask;
2864*795d594fSAndroid Build Coastguard Worker   // Arrays can't be used as a superclass or interface, so we want to add "abstract final"
2865*795d594fSAndroid Build Coastguard Worker   // and remove "interface".
2866*795d594fSAndroid Build Coastguard Worker   access_flags |= kAccAbstract | kAccFinal;
2867*795d594fSAndroid Build Coastguard Worker   access_flags &= ~kAccInterface;
2868*795d594fSAndroid Build Coastguard Worker 
2869*795d594fSAndroid Build Coastguard Worker   array_class->SetAccessFlagsDuringLinking(access_flags);
2870*795d594fSAndroid Build Coastguard Worker 
2871*795d594fSAndroid Build Coastguard Worker   // Array classes are fully initialized either during single threaded startup,
2872*795d594fSAndroid Build Coastguard Worker   // or from a pre-fence visitor, so visibly initialized.
2873*795d594fSAndroid Build Coastguard Worker   array_class->SetStatusForPrimitiveOrArray(ClassStatus::kVisiblyInitialized);
2874*795d594fSAndroid Build Coastguard Worker }
2875*795d594fSAndroid Build Coastguard Worker 
FinishCoreArrayClassSetup(ClassRoot array_root)2876*795d594fSAndroid Build Coastguard Worker void ClassLinker::FinishCoreArrayClassSetup(ClassRoot array_root) {
2877*795d594fSAndroid Build Coastguard Worker   // Do not hold lock on the array class object, the initialization of
2878*795d594fSAndroid Build Coastguard Worker   // core array classes is done while the process is still single threaded.
2879*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> array_class = GetClassRoot(array_root, this);
2880*795d594fSAndroid Build Coastguard Worker   FinishArrayClassSetup(array_class);
2881*795d594fSAndroid Build Coastguard Worker 
2882*795d594fSAndroid Build Coastguard Worker   std::string descriptor;
2883*795d594fSAndroid Build Coastguard Worker   const char* raw_descriptor = array_class->GetDescriptor(&descriptor);
2884*795d594fSAndroid Build Coastguard Worker   DCHECK(raw_descriptor == descriptor.c_str());
2885*795d594fSAndroid Build Coastguard Worker   size_t hash = ComputeModifiedUtf8Hash(descriptor);
2886*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> existing = InsertClass(descriptor, array_class, hash);
2887*795d594fSAndroid Build Coastguard Worker   CHECK(existing == nullptr);
2888*795d594fSAndroid Build Coastguard Worker }
2889*795d594fSAndroid Build Coastguard Worker 
AllocStackTraceElementArray(Thread * self,size_t length)2890*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> ClassLinker::AllocStackTraceElementArray(
2891*795d594fSAndroid Build Coastguard Worker     Thread* self,
2892*795d594fSAndroid Build Coastguard Worker     size_t length) {
2893*795d594fSAndroid Build Coastguard Worker   return mirror::ObjectArray<mirror::StackTraceElement>::Alloc(
2894*795d594fSAndroid Build Coastguard Worker       self, GetClassRoot<mirror::ObjectArray<mirror::StackTraceElement>>(this), length);
2895*795d594fSAndroid Build Coastguard Worker }
2896*795d594fSAndroid Build Coastguard Worker 
EnsureResolved(Thread * self,std::string_view descriptor,ObjPtr<mirror::Class> klass)2897*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::EnsureResolved(Thread* self,
2898*795d594fSAndroid Build Coastguard Worker                                                   std::string_view descriptor,
2899*795d594fSAndroid Build Coastguard Worker                                                   ObjPtr<mirror::Class> klass) {
2900*795d594fSAndroid Build Coastguard Worker   DCHECK(klass != nullptr);
2901*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
2902*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
2903*795d594fSAndroid Build Coastguard Worker     HandleWrapperObjPtr<mirror::Class> h = hs.NewHandleWrapper(&klass);
2904*795d594fSAndroid Build Coastguard Worker     Thread::PoisonObjectPointersIfDebug();
2905*795d594fSAndroid Build Coastguard Worker   }
2906*795d594fSAndroid Build Coastguard Worker 
2907*795d594fSAndroid Build Coastguard Worker   // For temporary classes we must wait for them to be retired.
2908*795d594fSAndroid Build Coastguard Worker   if (init_done_ && klass->IsTemp()) {
2909*795d594fSAndroid Build Coastguard Worker     CHECK(!klass->IsResolved());
2910*795d594fSAndroid Build Coastguard Worker     if (klass->IsErroneousUnresolved()) {
2911*795d594fSAndroid Build Coastguard Worker       ThrowEarlierClassFailure(klass);
2912*795d594fSAndroid Build Coastguard Worker       return nullptr;
2913*795d594fSAndroid Build Coastguard Worker     }
2914*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
2915*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> h_class(hs.NewHandle(klass));
2916*795d594fSAndroid Build Coastguard Worker     ObjectLock<mirror::Class> lock(self, h_class);
2917*795d594fSAndroid Build Coastguard Worker     // Loop and wait for the resolving thread to retire this class.
2918*795d594fSAndroid Build Coastguard Worker     while (!h_class->IsRetired() && !h_class->IsErroneousUnresolved()) {
2919*795d594fSAndroid Build Coastguard Worker       lock.WaitIgnoringInterrupts();
2920*795d594fSAndroid Build Coastguard Worker     }
2921*795d594fSAndroid Build Coastguard Worker     if (h_class->IsErroneousUnresolved()) {
2922*795d594fSAndroid Build Coastguard Worker       ThrowEarlierClassFailure(h_class.Get());
2923*795d594fSAndroid Build Coastguard Worker       return nullptr;
2924*795d594fSAndroid Build Coastguard Worker     }
2925*795d594fSAndroid Build Coastguard Worker     CHECK(h_class->IsRetired());
2926*795d594fSAndroid Build Coastguard Worker     // Get the updated class from class table.
2927*795d594fSAndroid Build Coastguard Worker     klass = LookupClass(self, descriptor, h_class.Get()->GetClassLoader());
2928*795d594fSAndroid Build Coastguard Worker   }
2929*795d594fSAndroid Build Coastguard Worker 
2930*795d594fSAndroid Build Coastguard Worker   // Wait for the class if it has not already been linked.
2931*795d594fSAndroid Build Coastguard Worker   size_t index = 0;
2932*795d594fSAndroid Build Coastguard Worker   // Maximum number of yield iterations until we start sleeping.
2933*795d594fSAndroid Build Coastguard Worker   static const size_t kNumYieldIterations = 1000;
2934*795d594fSAndroid Build Coastguard Worker   // How long each sleep is in us.
2935*795d594fSAndroid Build Coastguard Worker   static const size_t kSleepDurationUS = 1000;  // 1 ms.
2936*795d594fSAndroid Build Coastguard Worker   while (!klass->IsResolved() && !klass->IsErroneousUnresolved()) {
2937*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
2938*795d594fSAndroid Build Coastguard Worker     HandleWrapperObjPtr<mirror::Class> h_class(hs.NewHandleWrapper(&klass));
2939*795d594fSAndroid Build Coastguard Worker     {
2940*795d594fSAndroid Build Coastguard Worker       ObjectTryLock<mirror::Class> lock(self, h_class);
2941*795d594fSAndroid Build Coastguard Worker       // Can not use a monitor wait here since it may block when returning and deadlock if another
2942*795d594fSAndroid Build Coastguard Worker       // thread has locked klass.
2943*795d594fSAndroid Build Coastguard Worker       if (lock.Acquired()) {
2944*795d594fSAndroid Build Coastguard Worker         // Check for circular dependencies between classes, the lock is required for SetStatus.
2945*795d594fSAndroid Build Coastguard Worker         if (!h_class->IsResolved() && h_class->GetClinitThreadId() == self->GetTid()) {
2946*795d594fSAndroid Build Coastguard Worker           ThrowClassCircularityError(h_class.Get());
2947*795d594fSAndroid Build Coastguard Worker           mirror::Class::SetStatus(h_class, ClassStatus::kErrorUnresolved, self);
2948*795d594fSAndroid Build Coastguard Worker           return nullptr;
2949*795d594fSAndroid Build Coastguard Worker         }
2950*795d594fSAndroid Build Coastguard Worker       }
2951*795d594fSAndroid Build Coastguard Worker     }
2952*795d594fSAndroid Build Coastguard Worker     {
2953*795d594fSAndroid Build Coastguard Worker       // Handle wrapper deals with klass moving.
2954*795d594fSAndroid Build Coastguard Worker       ScopedThreadSuspension sts(self, ThreadState::kSuspended);
2955*795d594fSAndroid Build Coastguard Worker       if (index < kNumYieldIterations) {
2956*795d594fSAndroid Build Coastguard Worker         sched_yield();
2957*795d594fSAndroid Build Coastguard Worker       } else {
2958*795d594fSAndroid Build Coastguard Worker         usleep(kSleepDurationUS);
2959*795d594fSAndroid Build Coastguard Worker       }
2960*795d594fSAndroid Build Coastguard Worker     }
2961*795d594fSAndroid Build Coastguard Worker     ++index;
2962*795d594fSAndroid Build Coastguard Worker   }
2963*795d594fSAndroid Build Coastguard Worker 
2964*795d594fSAndroid Build Coastguard Worker   if (klass->IsErroneousUnresolved()) {
2965*795d594fSAndroid Build Coastguard Worker     ThrowEarlierClassFailure(klass);
2966*795d594fSAndroid Build Coastguard Worker     return nullptr;
2967*795d594fSAndroid Build Coastguard Worker   }
2968*795d594fSAndroid Build Coastguard Worker   // Return the loaded class.  No exceptions should be pending.
2969*795d594fSAndroid Build Coastguard Worker   CHECK(klass->IsResolved()) << klass->PrettyClass();
2970*795d594fSAndroid Build Coastguard Worker   self->AssertNoPendingException();
2971*795d594fSAndroid Build Coastguard Worker   return klass;
2972*795d594fSAndroid Build Coastguard Worker }
2973*795d594fSAndroid Build Coastguard Worker 
2974*795d594fSAndroid Build Coastguard Worker using ClassPathEntry = std::pair<const DexFile*, const dex::ClassDef*>;
2975*795d594fSAndroid Build Coastguard Worker 
2976*795d594fSAndroid Build Coastguard Worker // Search a collection of DexFiles for a descriptor
FindInClassPath(std::string_view descriptor,size_t hash,const std::vector<const DexFile * > & class_path)2977*795d594fSAndroid Build Coastguard Worker ClassPathEntry FindInClassPath(std::string_view descriptor,
2978*795d594fSAndroid Build Coastguard Worker                                size_t hash,
2979*795d594fSAndroid Build Coastguard Worker                                const std::vector<const DexFile*>& class_path) {
2980*795d594fSAndroid Build Coastguard Worker   for (const DexFile* dex_file : class_path) {
2981*795d594fSAndroid Build Coastguard Worker     DCHECK(dex_file != nullptr);
2982*795d594fSAndroid Build Coastguard Worker     const dex::ClassDef* dex_class_def = OatDexFile::FindClassDef(*dex_file, descriptor, hash);
2983*795d594fSAndroid Build Coastguard Worker     if (dex_class_def != nullptr) {
2984*795d594fSAndroid Build Coastguard Worker       return ClassPathEntry(dex_file, dex_class_def);
2985*795d594fSAndroid Build Coastguard Worker     }
2986*795d594fSAndroid Build Coastguard Worker   }
2987*795d594fSAndroid Build Coastguard Worker   return ClassPathEntry(nullptr, nullptr);
2988*795d594fSAndroid Build Coastguard Worker }
2989*795d594fSAndroid Build Coastguard Worker 
2990*795d594fSAndroid Build Coastguard Worker // Helper macro to make sure each class loader lookup call handles the case the
2991*795d594fSAndroid Build Coastguard Worker // class loader is not recognized, or the lookup threw an exception.
2992*795d594fSAndroid Build Coastguard Worker #define RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(call_, result_, thread_) \
2993*795d594fSAndroid Build Coastguard Worker do {                                                                          \
2994*795d594fSAndroid Build Coastguard Worker   auto local_call = call_;                                                    \
2995*795d594fSAndroid Build Coastguard Worker   if (!local_call) {                                                          \
2996*795d594fSAndroid Build Coastguard Worker     return false;                                                             \
2997*795d594fSAndroid Build Coastguard Worker   }                                                                           \
2998*795d594fSAndroid Build Coastguard Worker   auto local_result = result_;                                                \
2999*795d594fSAndroid Build Coastguard Worker   if (local_result != nullptr) {                                              \
3000*795d594fSAndroid Build Coastguard Worker     return true;                                                              \
3001*795d594fSAndroid Build Coastguard Worker   }                                                                           \
3002*795d594fSAndroid Build Coastguard Worker   auto local_thread = thread_;                                                \
3003*795d594fSAndroid Build Coastguard Worker   if (local_thread->IsExceptionPending()) {                                   \
3004*795d594fSAndroid Build Coastguard Worker     /* Pending exception means there was an error other than */               \
3005*795d594fSAndroid Build Coastguard Worker     /* ClassNotFound that must be returned to the caller. */                  \
3006*795d594fSAndroid Build Coastguard Worker     return false;                                                             \
3007*795d594fSAndroid Build Coastguard Worker   }                                                                           \
3008*795d594fSAndroid Build Coastguard Worker } while (0)
3009*795d594fSAndroid Build Coastguard Worker 
FindClassInSharedLibraries(Thread * self,const char * descriptor,size_t descriptor_length,size_t hash,Handle<mirror::ClassLoader> class_loader,ObjPtr<mirror::Class> * result)3010*795d594fSAndroid Build Coastguard Worker bool ClassLinker::FindClassInSharedLibraries(Thread* self,
3011*795d594fSAndroid Build Coastguard Worker                                              const char* descriptor,
3012*795d594fSAndroid Build Coastguard Worker                                              size_t descriptor_length,
3013*795d594fSAndroid Build Coastguard Worker                                              size_t hash,
3014*795d594fSAndroid Build Coastguard Worker                                              Handle<mirror::ClassLoader> class_loader,
3015*795d594fSAndroid Build Coastguard Worker                                              /*out*/ ObjPtr<mirror::Class>* result) {
3016*795d594fSAndroid Build Coastguard Worker   ArtField* field = WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoaders;
3017*795d594fSAndroid Build Coastguard Worker   return FindClassInSharedLibrariesHelper(
3018*795d594fSAndroid Build Coastguard Worker       self, descriptor, descriptor_length, hash, class_loader, field, result);
3019*795d594fSAndroid Build Coastguard Worker }
3020*795d594fSAndroid Build Coastguard Worker 
FindClassInSharedLibrariesHelper(Thread * self,const char * descriptor,size_t descriptor_length,size_t hash,Handle<mirror::ClassLoader> class_loader,ArtField * field,ObjPtr<mirror::Class> * result)3021*795d594fSAndroid Build Coastguard Worker bool ClassLinker::FindClassInSharedLibrariesHelper(Thread* self,
3022*795d594fSAndroid Build Coastguard Worker                                                    const char* descriptor,
3023*795d594fSAndroid Build Coastguard Worker                                                    size_t descriptor_length,
3024*795d594fSAndroid Build Coastguard Worker                                                    size_t hash,
3025*795d594fSAndroid Build Coastguard Worker                                                    Handle<mirror::ClassLoader> class_loader,
3026*795d594fSAndroid Build Coastguard Worker                                                    ArtField* field,
3027*795d594fSAndroid Build Coastguard Worker                                                    /*out*/ ObjPtr<mirror::Class>* result) {
3028*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> raw_shared_libraries = field->GetObject(class_loader.Get());
3029*795d594fSAndroid Build Coastguard Worker   if (raw_shared_libraries == nullptr) {
3030*795d594fSAndroid Build Coastguard Worker     return true;
3031*795d594fSAndroid Build Coastguard Worker   }
3032*795d594fSAndroid Build Coastguard Worker 
3033*795d594fSAndroid Build Coastguard Worker   StackHandleScope<2> hs(self);
3034*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries(
3035*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(raw_shared_libraries->AsObjectArray<mirror::ClassLoader>()));
3036*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::ClassLoader> temp_loader = hs.NewHandle<mirror::ClassLoader>(nullptr);
3037*795d594fSAndroid Build Coastguard Worker   for (auto loader : shared_libraries.Iterate<mirror::ClassLoader>()) {
3038*795d594fSAndroid Build Coastguard Worker     temp_loader.Assign(loader);
3039*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3040*795d594fSAndroid Build Coastguard Worker         FindClassInBaseDexClassLoader(
3041*795d594fSAndroid Build Coastguard Worker             self, descriptor, descriptor_length, hash, temp_loader, result),
3042*795d594fSAndroid Build Coastguard Worker         *result,
3043*795d594fSAndroid Build Coastguard Worker         self);
3044*795d594fSAndroid Build Coastguard Worker   }
3045*795d594fSAndroid Build Coastguard Worker   return true;
3046*795d594fSAndroid Build Coastguard Worker }
3047*795d594fSAndroid Build Coastguard Worker 
FindClassInSharedLibrariesAfter(Thread * self,const char * descriptor,size_t descriptor_length,size_t hash,Handle<mirror::ClassLoader> class_loader,ObjPtr<mirror::Class> * result)3048*795d594fSAndroid Build Coastguard Worker bool ClassLinker::FindClassInSharedLibrariesAfter(Thread* self,
3049*795d594fSAndroid Build Coastguard Worker                                                   const char* descriptor,
3050*795d594fSAndroid Build Coastguard Worker                                                   size_t descriptor_length,
3051*795d594fSAndroid Build Coastguard Worker                                                   size_t hash,
3052*795d594fSAndroid Build Coastguard Worker                                                   Handle<mirror::ClassLoader> class_loader,
3053*795d594fSAndroid Build Coastguard Worker                                                   /*out*/ ObjPtr<mirror::Class>* result) {
3054*795d594fSAndroid Build Coastguard Worker   ArtField* field = WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoadersAfter;
3055*795d594fSAndroid Build Coastguard Worker   return FindClassInSharedLibrariesHelper(
3056*795d594fSAndroid Build Coastguard Worker       self, descriptor, descriptor_length, hash, class_loader, field, result);
3057*795d594fSAndroid Build Coastguard Worker }
3058*795d594fSAndroid Build Coastguard Worker 
FindClassInBaseDexClassLoader(Thread * self,const char * descriptor,size_t descriptor_length,size_t hash,Handle<mirror::ClassLoader> class_loader,ObjPtr<mirror::Class> * result)3059*795d594fSAndroid Build Coastguard Worker bool ClassLinker::FindClassInBaseDexClassLoader(Thread* self,
3060*795d594fSAndroid Build Coastguard Worker                                                 const char* descriptor,
3061*795d594fSAndroid Build Coastguard Worker                                                 size_t descriptor_length,
3062*795d594fSAndroid Build Coastguard Worker                                                 size_t hash,
3063*795d594fSAndroid Build Coastguard Worker                                                 Handle<mirror::ClassLoader> class_loader,
3064*795d594fSAndroid Build Coastguard Worker                                                 /*out*/ ObjPtr<mirror::Class>* result) {
3065*795d594fSAndroid Build Coastguard Worker   // Termination case: boot class loader.
3066*795d594fSAndroid Build Coastguard Worker   if (IsBootClassLoader(class_loader.Get())) {
3067*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3068*795d594fSAndroid Build Coastguard Worker         FindClassInBootClassLoaderClassPath(self, descriptor, descriptor_length, hash, result),
3069*795d594fSAndroid Build Coastguard Worker         *result,
3070*795d594fSAndroid Build Coastguard Worker         self);
3071*795d594fSAndroid Build Coastguard Worker     return true;
3072*795d594fSAndroid Build Coastguard Worker   }
3073*795d594fSAndroid Build Coastguard Worker 
3074*795d594fSAndroid Build Coastguard Worker   if (IsPathOrDexClassLoader(class_loader) || IsInMemoryDexClassLoader(class_loader)) {
3075*795d594fSAndroid Build Coastguard Worker     // For regular path or dex class loader the search order is:
3076*795d594fSAndroid Build Coastguard Worker     //    - parent
3077*795d594fSAndroid Build Coastguard Worker     //    - shared libraries
3078*795d594fSAndroid Build Coastguard Worker     //    - class loader dex files
3079*795d594fSAndroid Build Coastguard Worker 
3080*795d594fSAndroid Build Coastguard Worker     // Create a handle as RegisterDexFile may allocate dex caches (and cause thread suspension).
3081*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
3082*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ClassLoader> h_parent(hs.NewHandle(class_loader->GetParent()));
3083*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3084*795d594fSAndroid Build Coastguard Worker         FindClassInBaseDexClassLoader(self, descriptor, descriptor_length, hash, h_parent, result),
3085*795d594fSAndroid Build Coastguard Worker         *result,
3086*795d594fSAndroid Build Coastguard Worker         self);
3087*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3088*795d594fSAndroid Build Coastguard Worker         FindClassInSharedLibraries(self, descriptor, descriptor_length, hash, class_loader, result),
3089*795d594fSAndroid Build Coastguard Worker         *result,
3090*795d594fSAndroid Build Coastguard Worker         self);
3091*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3092*795d594fSAndroid Build Coastguard Worker         FindClassInBaseDexClassLoaderClassPath(
3093*795d594fSAndroid Build Coastguard Worker             self, descriptor, descriptor_length, hash, class_loader, result),
3094*795d594fSAndroid Build Coastguard Worker         *result,
3095*795d594fSAndroid Build Coastguard Worker         self);
3096*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3097*795d594fSAndroid Build Coastguard Worker         FindClassInSharedLibrariesAfter(
3098*795d594fSAndroid Build Coastguard Worker             self, descriptor, descriptor_length, hash, class_loader, result),
3099*795d594fSAndroid Build Coastguard Worker         *result,
3100*795d594fSAndroid Build Coastguard Worker         self);
3101*795d594fSAndroid Build Coastguard Worker     // We did not find a class, but the class loader chain was recognized, so we
3102*795d594fSAndroid Build Coastguard Worker     // return true.
3103*795d594fSAndroid Build Coastguard Worker     return true;
3104*795d594fSAndroid Build Coastguard Worker   }
3105*795d594fSAndroid Build Coastguard Worker 
3106*795d594fSAndroid Build Coastguard Worker   if (IsDelegateLastClassLoader(class_loader)) {
3107*795d594fSAndroid Build Coastguard Worker     // For delegate last, the search order is:
3108*795d594fSAndroid Build Coastguard Worker     //    - boot class path
3109*795d594fSAndroid Build Coastguard Worker     //    - shared libraries
3110*795d594fSAndroid Build Coastguard Worker     //    - class loader dex files
3111*795d594fSAndroid Build Coastguard Worker     //    - parent
3112*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3113*795d594fSAndroid Build Coastguard Worker         FindClassInBootClassLoaderClassPath(self, descriptor, descriptor_length, hash, result),
3114*795d594fSAndroid Build Coastguard Worker         *result,
3115*795d594fSAndroid Build Coastguard Worker         self);
3116*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3117*795d594fSAndroid Build Coastguard Worker         FindClassInSharedLibraries(self, descriptor, descriptor_length, hash, class_loader, result),
3118*795d594fSAndroid Build Coastguard Worker         *result,
3119*795d594fSAndroid Build Coastguard Worker         self);
3120*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3121*795d594fSAndroid Build Coastguard Worker         FindClassInBaseDexClassLoaderClassPath(
3122*795d594fSAndroid Build Coastguard Worker             self, descriptor, descriptor_length, hash, class_loader, result),
3123*795d594fSAndroid Build Coastguard Worker         *result,
3124*795d594fSAndroid Build Coastguard Worker         self);
3125*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3126*795d594fSAndroid Build Coastguard Worker         FindClassInSharedLibrariesAfter(
3127*795d594fSAndroid Build Coastguard Worker             self, descriptor, descriptor_length, hash, class_loader, result),
3128*795d594fSAndroid Build Coastguard Worker         *result,
3129*795d594fSAndroid Build Coastguard Worker         self);
3130*795d594fSAndroid Build Coastguard Worker 
3131*795d594fSAndroid Build Coastguard Worker     // Create a handle as RegisterDexFile may allocate dex caches (and cause thread suspension).
3132*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
3133*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ClassLoader> h_parent(hs.NewHandle(class_loader->GetParent()));
3134*795d594fSAndroid Build Coastguard Worker     RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
3135*795d594fSAndroid Build Coastguard Worker         FindClassInBaseDexClassLoader(self, descriptor, descriptor_length, hash, h_parent, result),
3136*795d594fSAndroid Build Coastguard Worker         *result,
3137*795d594fSAndroid Build Coastguard Worker         self);
3138*795d594fSAndroid Build Coastguard Worker     // We did not find a class, but the class loader chain was recognized, so we
3139*795d594fSAndroid Build Coastguard Worker     // return true.
3140*795d594fSAndroid Build Coastguard Worker     return true;
3141*795d594fSAndroid Build Coastguard Worker   }
3142*795d594fSAndroid Build Coastguard Worker 
3143*795d594fSAndroid Build Coastguard Worker   // Unsupported class loader.
3144*795d594fSAndroid Build Coastguard Worker   *result = nullptr;
3145*795d594fSAndroid Build Coastguard Worker   return false;
3146*795d594fSAndroid Build Coastguard Worker }
3147*795d594fSAndroid Build Coastguard Worker 
3148*795d594fSAndroid Build Coastguard Worker #undef RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION
3149*795d594fSAndroid Build Coastguard Worker 
3150*795d594fSAndroid Build Coastguard Worker namespace {
3151*795d594fSAndroid Build Coastguard Worker 
3152*795d594fSAndroid Build Coastguard Worker // Matches exceptions caught in DexFile.defineClass.
MatchesDexFileCaughtExceptions(ObjPtr<mirror::Throwable> throwable,ClassLinker * class_linker)3153*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool MatchesDexFileCaughtExceptions(ObjPtr<mirror::Throwable> throwable,
3154*795d594fSAndroid Build Coastguard Worker                                                   ClassLinker* class_linker)
3155*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
3156*795d594fSAndroid Build Coastguard Worker   return
3157*795d594fSAndroid Build Coastguard Worker       // ClassNotFoundException.
3158*795d594fSAndroid Build Coastguard Worker       throwable->InstanceOf(GetClassRoot(ClassRoot::kJavaLangClassNotFoundException,
3159*795d594fSAndroid Build Coastguard Worker                                          class_linker))
3160*795d594fSAndroid Build Coastguard Worker       ||
3161*795d594fSAndroid Build Coastguard Worker       // NoClassDefFoundError. TODO: Reconsider this. b/130746382.
3162*795d594fSAndroid Build Coastguard Worker       throwable->InstanceOf(Runtime::Current()->GetPreAllocatedNoClassDefFoundError()->GetClass());
3163*795d594fSAndroid Build Coastguard Worker }
3164*795d594fSAndroid Build Coastguard Worker 
3165*795d594fSAndroid Build Coastguard Worker // Clear exceptions caught in DexFile.defineClass.
FilterDexFileCaughtExceptions(Thread * self,ClassLinker * class_linker)3166*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void FilterDexFileCaughtExceptions(Thread* self, ClassLinker* class_linker)
3167*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
3168*795d594fSAndroid Build Coastguard Worker   if (MatchesDexFileCaughtExceptions(self->GetException(), class_linker)) {
3169*795d594fSAndroid Build Coastguard Worker     self->ClearException();
3170*795d594fSAndroid Build Coastguard Worker   }
3171*795d594fSAndroid Build Coastguard Worker }
3172*795d594fSAndroid Build Coastguard Worker 
3173*795d594fSAndroid Build Coastguard Worker }  // namespace
3174*795d594fSAndroid Build Coastguard Worker 
3175*795d594fSAndroid Build Coastguard Worker // Finds the class in the boot class loader.
3176*795d594fSAndroid Build Coastguard Worker // If the class is found the method returns the resolved class. Otherwise it returns null.
FindClassInBootClassLoaderClassPath(Thread * self,const char * descriptor,size_t descriptor_length,size_t hash,ObjPtr<mirror::Class> * result)3177*795d594fSAndroid Build Coastguard Worker bool ClassLinker::FindClassInBootClassLoaderClassPath(Thread* self,
3178*795d594fSAndroid Build Coastguard Worker                                                       const char* descriptor,
3179*795d594fSAndroid Build Coastguard Worker                                                       size_t descriptor_length,
3180*795d594fSAndroid Build Coastguard Worker                                                       size_t hash,
3181*795d594fSAndroid Build Coastguard Worker                                                       /*out*/ ObjPtr<mirror::Class>* result) {
3182*795d594fSAndroid Build Coastguard Worker   std::string_view sv_descriptor(descriptor, descriptor_length);
3183*795d594fSAndroid Build Coastguard Worker   ClassPathEntry pair = FindInClassPath(sv_descriptor, hash, boot_class_path_);
3184*795d594fSAndroid Build Coastguard Worker   if (pair.second != nullptr) {
3185*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass = LookupClass(self, sv_descriptor, hash, nullptr);
3186*795d594fSAndroid Build Coastguard Worker     if (klass != nullptr) {
3187*795d594fSAndroid Build Coastguard Worker       *result = EnsureResolved(self, sv_descriptor, klass);
3188*795d594fSAndroid Build Coastguard Worker     } else {
3189*795d594fSAndroid Build Coastguard Worker       *result = DefineClass(self,
3190*795d594fSAndroid Build Coastguard Worker                             descriptor,
3191*795d594fSAndroid Build Coastguard Worker                             descriptor_length,
3192*795d594fSAndroid Build Coastguard Worker                             hash,
3193*795d594fSAndroid Build Coastguard Worker                             ScopedNullHandle<mirror::ClassLoader>(),
3194*795d594fSAndroid Build Coastguard Worker                             *pair.first,
3195*795d594fSAndroid Build Coastguard Worker                             *pair.second);
3196*795d594fSAndroid Build Coastguard Worker     }
3197*795d594fSAndroid Build Coastguard Worker     if (*result == nullptr) {
3198*795d594fSAndroid Build Coastguard Worker       CHECK(self->IsExceptionPending()) << descriptor;
3199*795d594fSAndroid Build Coastguard Worker       FilterDexFileCaughtExceptions(self, this);
3200*795d594fSAndroid Build Coastguard Worker     }
3201*795d594fSAndroid Build Coastguard Worker   }
3202*795d594fSAndroid Build Coastguard Worker   // The boot classloader is always a known lookup.
3203*795d594fSAndroid Build Coastguard Worker   return true;
3204*795d594fSAndroid Build Coastguard Worker }
3205*795d594fSAndroid Build Coastguard Worker 
FindClassInBaseDexClassLoaderClassPath(Thread * self,const char * descriptor,size_t descriptor_length,size_t hash,Handle<mirror::ClassLoader> class_loader,ObjPtr<mirror::Class> * result)3206*795d594fSAndroid Build Coastguard Worker bool ClassLinker::FindClassInBaseDexClassLoaderClassPath(
3207*795d594fSAndroid Build Coastguard Worker     Thread* self,
3208*795d594fSAndroid Build Coastguard Worker     const char* descriptor,
3209*795d594fSAndroid Build Coastguard Worker     size_t descriptor_length,
3210*795d594fSAndroid Build Coastguard Worker     size_t hash,
3211*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ClassLoader> class_loader,
3212*795d594fSAndroid Build Coastguard Worker     /*out*/ ObjPtr<mirror::Class>* result) {
3213*795d594fSAndroid Build Coastguard Worker   DCHECK(IsPathOrDexClassLoader(class_loader) ||
3214*795d594fSAndroid Build Coastguard Worker          IsInMemoryDexClassLoader(class_loader) ||
3215*795d594fSAndroid Build Coastguard Worker          IsDelegateLastClassLoader(class_loader))
3216*795d594fSAndroid Build Coastguard Worker       << "Unexpected class loader for descriptor " << descriptor;
3217*795d594fSAndroid Build Coastguard Worker 
3218*795d594fSAndroid Build Coastguard Worker   std::string_view sv_descriptor(descriptor, descriptor_length);
3219*795d594fSAndroid Build Coastguard Worker   const DexFile* dex_file = nullptr;
3220*795d594fSAndroid Build Coastguard Worker   const dex::ClassDef* class_def = nullptr;
3221*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> ret;
3222*795d594fSAndroid Build Coastguard Worker   auto find_class_def = [&](const DexFile* cp_dex_file) REQUIRES_SHARED(Locks::mutator_lock_) {
3223*795d594fSAndroid Build Coastguard Worker     const dex::ClassDef* cp_class_def = OatDexFile::FindClassDef(*cp_dex_file, sv_descriptor, hash);
3224*795d594fSAndroid Build Coastguard Worker     if (cp_class_def != nullptr) {
3225*795d594fSAndroid Build Coastguard Worker       dex_file = cp_dex_file;
3226*795d594fSAndroid Build Coastguard Worker       class_def = cp_class_def;
3227*795d594fSAndroid Build Coastguard Worker       return false;  // Found a class definition, stop visit.
3228*795d594fSAndroid Build Coastguard Worker     }
3229*795d594fSAndroid Build Coastguard Worker     return true;  // Continue with the next DexFile.
3230*795d594fSAndroid Build Coastguard Worker   };
3231*795d594fSAndroid Build Coastguard Worker   VisitClassLoaderDexFiles(self, class_loader, find_class_def);
3232*795d594fSAndroid Build Coastguard Worker 
3233*795d594fSAndroid Build Coastguard Worker   if (class_def != nullptr) {
3234*795d594fSAndroid Build Coastguard Worker     *result =
3235*795d594fSAndroid Build Coastguard Worker         DefineClass(self, descriptor, descriptor_length, hash, class_loader, *dex_file, *class_def);
3236*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(*result == nullptr)) {
3237*795d594fSAndroid Build Coastguard Worker       CHECK(self->IsExceptionPending()) << descriptor;
3238*795d594fSAndroid Build Coastguard Worker       FilterDexFileCaughtExceptions(self, this);
3239*795d594fSAndroid Build Coastguard Worker     } else {
3240*795d594fSAndroid Build Coastguard Worker       DCHECK(!self->IsExceptionPending());
3241*795d594fSAndroid Build Coastguard Worker     }
3242*795d594fSAndroid Build Coastguard Worker   }
3243*795d594fSAndroid Build Coastguard Worker   // A BaseDexClassLoader is always a known lookup.
3244*795d594fSAndroid Build Coastguard Worker   return true;
3245*795d594fSAndroid Build Coastguard Worker }
3246*795d594fSAndroid Build Coastguard Worker 
FindClass(Thread * self,const DexFile & dex_file,dex::TypeIndex type_index,Handle<mirror::ClassLoader> class_loader)3247*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::FindClass(Thread* self,
3248*795d594fSAndroid Build Coastguard Worker                                              const DexFile& dex_file,
3249*795d594fSAndroid Build Coastguard Worker                                              dex::TypeIndex type_index,
3250*795d594fSAndroid Build Coastguard Worker                                              Handle<mirror::ClassLoader> class_loader) {
3251*795d594fSAndroid Build Coastguard Worker   dex::StringIndex descriptor_idx = dex_file.GetTypeId(type_index).descriptor_idx_;
3252*795d594fSAndroid Build Coastguard Worker   uint32_t utf16_length;
3253*795d594fSAndroid Build Coastguard Worker   const char* descriptor = dex_file.GetStringDataAndUtf16Length(descriptor_idx, &utf16_length);
3254*795d594fSAndroid Build Coastguard Worker   size_t descriptor_length = DexFile::Utf8Length(descriptor, utf16_length);
3255*795d594fSAndroid Build Coastguard Worker   return FindClass(self, descriptor, descriptor_length, class_loader);
3256*795d594fSAndroid Build Coastguard Worker }
3257*795d594fSAndroid Build Coastguard Worker 
FindClass(Thread * self,const char * descriptor,size_t descriptor_length,Handle<mirror::ClassLoader> class_loader)3258*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::FindClass(Thread* self,
3259*795d594fSAndroid Build Coastguard Worker                                              const char* descriptor,
3260*795d594fSAndroid Build Coastguard Worker                                              size_t descriptor_length,
3261*795d594fSAndroid Build Coastguard Worker                                              Handle<mirror::ClassLoader> class_loader) {
3262*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(strlen(descriptor), descriptor_length);
3263*795d594fSAndroid Build Coastguard Worker   DCHECK_NE(descriptor_length, 0u) << "descriptor is empty string";
3264*795d594fSAndroid Build Coastguard Worker   DCHECK(self != nullptr);
3265*795d594fSAndroid Build Coastguard Worker   self->AssertNoPendingException();
3266*795d594fSAndroid Build Coastguard Worker   self->PoisonObjectPointers();  // For DefineClass, CreateArrayClass, etc...
3267*795d594fSAndroid Build Coastguard Worker   if (descriptor_length == 1u) {
3268*795d594fSAndroid Build Coastguard Worker     // only the descriptors of primitive types should be 1 character long, also avoid class lookup
3269*795d594fSAndroid Build Coastguard Worker     // for primitive classes that aren't backed by dex files.
3270*795d594fSAndroid Build Coastguard Worker     return FindPrimitiveClass(descriptor[0]);
3271*795d594fSAndroid Build Coastguard Worker   }
3272*795d594fSAndroid Build Coastguard Worker   const std::string_view sv_descriptor(descriptor, descriptor_length);
3273*795d594fSAndroid Build Coastguard Worker   const size_t hash = ComputeModifiedUtf8Hash(sv_descriptor);
3274*795d594fSAndroid Build Coastguard Worker   // Find the class in the loaded classes table.
3275*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> klass = LookupClass(self, sv_descriptor, hash, class_loader.Get());
3276*795d594fSAndroid Build Coastguard Worker   if (klass != nullptr) {
3277*795d594fSAndroid Build Coastguard Worker     return EnsureResolved(self, sv_descriptor, klass);
3278*795d594fSAndroid Build Coastguard Worker   }
3279*795d594fSAndroid Build Coastguard Worker   // Class is not yet loaded.
3280*795d594fSAndroid Build Coastguard Worker   if (descriptor[0] != '[' && class_loader == nullptr) {
3281*795d594fSAndroid Build Coastguard Worker     // Non-array class and the boot class loader, search the boot class path.
3282*795d594fSAndroid Build Coastguard Worker     ClassPathEntry pair = FindInClassPath(sv_descriptor, hash, boot_class_path_);
3283*795d594fSAndroid Build Coastguard Worker     if (pair.second != nullptr) {
3284*795d594fSAndroid Build Coastguard Worker       return DefineClass(self,
3285*795d594fSAndroid Build Coastguard Worker                          descriptor,
3286*795d594fSAndroid Build Coastguard Worker                          descriptor_length,
3287*795d594fSAndroid Build Coastguard Worker                          hash,
3288*795d594fSAndroid Build Coastguard Worker                          ScopedNullHandle<mirror::ClassLoader>(),
3289*795d594fSAndroid Build Coastguard Worker                          *pair.first,
3290*795d594fSAndroid Build Coastguard Worker                          *pair.second);
3291*795d594fSAndroid Build Coastguard Worker     } else {
3292*795d594fSAndroid Build Coastguard Worker       // The boot class loader is searched ahead of the application class loader, failures are
3293*795d594fSAndroid Build Coastguard Worker       // expected and will be wrapped in a ClassNotFoundException. Use the pre-allocated error to
3294*795d594fSAndroid Build Coastguard Worker       // trigger the chaining with a proper stack trace.
3295*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Throwable> pre_allocated =
3296*795d594fSAndroid Build Coastguard Worker           Runtime::Current()->GetPreAllocatedNoClassDefFoundError();
3297*795d594fSAndroid Build Coastguard Worker       self->SetException(pre_allocated);
3298*795d594fSAndroid Build Coastguard Worker       return nullptr;
3299*795d594fSAndroid Build Coastguard Worker     }
3300*795d594fSAndroid Build Coastguard Worker   }
3301*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> result_ptr;
3302*795d594fSAndroid Build Coastguard Worker   bool descriptor_equals;
3303*795d594fSAndroid Build Coastguard Worker   if (descriptor[0] == '[') {
3304*795d594fSAndroid Build Coastguard Worker     result_ptr = CreateArrayClass(self, descriptor, descriptor_length, hash, class_loader);
3305*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(result_ptr == nullptr, self->IsExceptionPending());
3306*795d594fSAndroid Build Coastguard Worker     DCHECK(result_ptr == nullptr || result_ptr->DescriptorEquals(sv_descriptor));
3307*795d594fSAndroid Build Coastguard Worker     descriptor_equals = true;
3308*795d594fSAndroid Build Coastguard Worker   } else {
3309*795d594fSAndroid Build Coastguard Worker     ScopedObjectAccessUnchecked soa(self);
3310*795d594fSAndroid Build Coastguard Worker     bool known_hierarchy = FindClassInBaseDexClassLoader(
3311*795d594fSAndroid Build Coastguard Worker         self, descriptor, descriptor_length, hash, class_loader, &result_ptr);
3312*795d594fSAndroid Build Coastguard Worker     if (result_ptr != nullptr) {
3313*795d594fSAndroid Build Coastguard Worker       // The chain was understood and we found the class. We still need to add the class to
3314*795d594fSAndroid Build Coastguard Worker       // the class table to protect from racy programs that can try and redefine the path list
3315*795d594fSAndroid Build Coastguard Worker       // which would change the Class<?> returned for subsequent evaluation of const-class.
3316*795d594fSAndroid Build Coastguard Worker       DCHECK(known_hierarchy);
3317*795d594fSAndroid Build Coastguard Worker       DCHECK(result_ptr->DescriptorEquals(sv_descriptor));
3318*795d594fSAndroid Build Coastguard Worker       descriptor_equals = true;
3319*795d594fSAndroid Build Coastguard Worker     } else if (!self->IsExceptionPending()) {
3320*795d594fSAndroid Build Coastguard Worker       // Either the chain wasn't understood or the class wasn't found.
3321*795d594fSAndroid Build Coastguard Worker       // If there is a pending exception we didn't clear, it is a not a ClassNotFoundException and
3322*795d594fSAndroid Build Coastguard Worker       // we should return it instead of silently clearing and retrying.
3323*795d594fSAndroid Build Coastguard Worker       //
3324*795d594fSAndroid Build Coastguard Worker       // If the chain was understood but we did not find the class, let the Java-side
3325*795d594fSAndroid Build Coastguard Worker       // rediscover all this and throw the exception with the right stack trace. Note that
3326*795d594fSAndroid Build Coastguard Worker       // the Java-side could still succeed for racy programs if another thread is actively
3327*795d594fSAndroid Build Coastguard Worker       // modifying the class loader's path list.
3328*795d594fSAndroid Build Coastguard Worker 
3329*795d594fSAndroid Build Coastguard Worker       // The runtime is not allowed to call into java from a runtime-thread so just abort.
3330*795d594fSAndroid Build Coastguard Worker       if (self->IsRuntimeThread()) {
3331*795d594fSAndroid Build Coastguard Worker         // Oops, we can't call into java so we can't run actual class-loader code.
3332*795d594fSAndroid Build Coastguard Worker         // This is true for e.g. for the compiler (jit or aot).
3333*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::Throwable> pre_allocated =
3334*795d594fSAndroid Build Coastguard Worker             Runtime::Current()->GetPreAllocatedNoClassDefFoundError();
3335*795d594fSAndroid Build Coastguard Worker         self->SetException(pre_allocated);
3336*795d594fSAndroid Build Coastguard Worker         return nullptr;
3337*795d594fSAndroid Build Coastguard Worker       }
3338*795d594fSAndroid Build Coastguard Worker 
3339*795d594fSAndroid Build Coastguard Worker       // Inlined DescriptorToDot(descriptor) with extra validation.
3340*795d594fSAndroid Build Coastguard Worker       //
3341*795d594fSAndroid Build Coastguard Worker       // Throw NoClassDefFoundError early rather than potentially load a class only to fail
3342*795d594fSAndroid Build Coastguard Worker       // the DescriptorEquals() check below and give a confusing error message. For example,
3343*795d594fSAndroid Build Coastguard Worker       // when native code erroneously calls JNI GetFieldId() with signature "java/lang/String"
3344*795d594fSAndroid Build Coastguard Worker       // instead of "Ljava/lang/String;", the message below using the "dot" names would be
3345*795d594fSAndroid Build Coastguard Worker       // "class loader [...] returned class java.lang.String instead of java.lang.String".
3346*795d594fSAndroid Build Coastguard Worker       if (UNLIKELY(descriptor[0] != 'L') ||
3347*795d594fSAndroid Build Coastguard Worker           UNLIKELY(descriptor[descriptor_length - 1] != ';') ||
3348*795d594fSAndroid Build Coastguard Worker           UNLIKELY(memchr(descriptor + 1, '.', descriptor_length - 2) != nullptr)) {
3349*795d594fSAndroid Build Coastguard Worker         ThrowNoClassDefFoundError("Invalid descriptor: %s.", descriptor);
3350*795d594fSAndroid Build Coastguard Worker         return nullptr;
3351*795d594fSAndroid Build Coastguard Worker       }
3352*795d594fSAndroid Build Coastguard Worker 
3353*795d594fSAndroid Build Coastguard Worker       std::string class_name_string(sv_descriptor.substr(1u, descriptor_length - 2u));
3354*795d594fSAndroid Build Coastguard Worker       std::replace(class_name_string.begin(), class_name_string.end(), '/', '.');
3355*795d594fSAndroid Build Coastguard Worker       if (known_hierarchy &&
3356*795d594fSAndroid Build Coastguard Worker           fast_class_not_found_exceptions_ &&
3357*795d594fSAndroid Build Coastguard Worker           !Runtime::Current()->IsJavaDebuggable()) {
3358*795d594fSAndroid Build Coastguard Worker         // For known hierarchy, we know that the class is going to throw an exception. If we aren't
3359*795d594fSAndroid Build Coastguard Worker         // debuggable, optimize this path by throwing directly here without going back to Java
3360*795d594fSAndroid Build Coastguard Worker         // language. This reduces how many ClassNotFoundExceptions happen.
3361*795d594fSAndroid Build Coastguard Worker         self->ThrowNewExceptionF("Ljava/lang/ClassNotFoundException;",
3362*795d594fSAndroid Build Coastguard Worker                                  "%s",
3363*795d594fSAndroid Build Coastguard Worker                                  class_name_string.c_str());
3364*795d594fSAndroid Build Coastguard Worker       } else {
3365*795d594fSAndroid Build Coastguard Worker         StackHandleScope<1u> hs(self);
3366*795d594fSAndroid Build Coastguard Worker         Handle<mirror::String> class_name_object = hs.NewHandle(
3367*795d594fSAndroid Build Coastguard Worker             mirror::String::AllocFromModifiedUtf8(self, class_name_string.c_str()));
3368*795d594fSAndroid Build Coastguard Worker         if (class_name_object == nullptr) {
3369*795d594fSAndroid Build Coastguard Worker           DCHECK(self->IsExceptionPending());  // OOME.
3370*795d594fSAndroid Build Coastguard Worker           return nullptr;
3371*795d594fSAndroid Build Coastguard Worker         }
3372*795d594fSAndroid Build Coastguard Worker         DCHECK(class_loader != nullptr);
3373*795d594fSAndroid Build Coastguard Worker         result_ptr = ObjPtr<mirror::Class>::DownCast(
3374*795d594fSAndroid Build Coastguard Worker             WellKnownClasses::java_lang_ClassLoader_loadClass->InvokeVirtual<'L', 'L'>(
3375*795d594fSAndroid Build Coastguard Worker                 self, class_loader.Get(), class_name_object.Get()));
3376*795d594fSAndroid Build Coastguard Worker         if (result_ptr == nullptr && !self->IsExceptionPending()) {
3377*795d594fSAndroid Build Coastguard Worker           // broken loader - throw NPE to be compatible with Dalvik
3378*795d594fSAndroid Build Coastguard Worker           ThrowNullPointerException(StringPrintf("ClassLoader.loadClass returned null for %s",
3379*795d594fSAndroid Build Coastguard Worker                                                  class_name_string.c_str()).c_str());
3380*795d594fSAndroid Build Coastguard Worker           return nullptr;
3381*795d594fSAndroid Build Coastguard Worker         }
3382*795d594fSAndroid Build Coastguard Worker         // Check the name of the returned class.
3383*795d594fSAndroid Build Coastguard Worker         descriptor_equals = (result_ptr != nullptr) && result_ptr->DescriptorEquals(sv_descriptor);
3384*795d594fSAndroid Build Coastguard Worker       }
3385*795d594fSAndroid Build Coastguard Worker     } else {
3386*795d594fSAndroid Build Coastguard Worker       DCHECK(!MatchesDexFileCaughtExceptions(self->GetException(), this));
3387*795d594fSAndroid Build Coastguard Worker     }
3388*795d594fSAndroid Build Coastguard Worker   }
3389*795d594fSAndroid Build Coastguard Worker 
3390*795d594fSAndroid Build Coastguard Worker   if (self->IsExceptionPending()) {
3391*795d594fSAndroid Build Coastguard Worker     // If the ClassLoader threw or array class allocation failed, pass that exception up.
3392*795d594fSAndroid Build Coastguard Worker     // However, to comply with the RI behavior, first check if another thread succeeded.
3393*795d594fSAndroid Build Coastguard Worker     result_ptr = LookupClass(self, sv_descriptor, hash, class_loader.Get());
3394*795d594fSAndroid Build Coastguard Worker     if (result_ptr != nullptr && !result_ptr->IsErroneous()) {
3395*795d594fSAndroid Build Coastguard Worker       self->ClearException();
3396*795d594fSAndroid Build Coastguard Worker       return EnsureResolved(self, sv_descriptor, result_ptr);
3397*795d594fSAndroid Build Coastguard Worker     }
3398*795d594fSAndroid Build Coastguard Worker     return nullptr;
3399*795d594fSAndroid Build Coastguard Worker   }
3400*795d594fSAndroid Build Coastguard Worker 
3401*795d594fSAndroid Build Coastguard Worker   // Try to insert the class to the class table, checking for mismatch.
3402*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> old;
3403*795d594fSAndroid Build Coastguard Worker   {
3404*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
3405*795d594fSAndroid Build Coastguard Worker     ClassTable* const class_table = InsertClassTableForClassLoader(class_loader.Get());
3406*795d594fSAndroid Build Coastguard Worker     old = class_table->Lookup(sv_descriptor, hash);
3407*795d594fSAndroid Build Coastguard Worker     if (old == nullptr) {
3408*795d594fSAndroid Build Coastguard Worker       old = result_ptr;  // For the comparison below, after releasing the lock.
3409*795d594fSAndroid Build Coastguard Worker       if (descriptor_equals) {
3410*795d594fSAndroid Build Coastguard Worker         class_table->InsertWithHash(result_ptr, hash);
3411*795d594fSAndroid Build Coastguard Worker         WriteBarrier::ForEveryFieldWrite(class_loader.Get());
3412*795d594fSAndroid Build Coastguard Worker       }  // else throw below, after releasing the lock.
3413*795d594fSAndroid Build Coastguard Worker     }
3414*795d594fSAndroid Build Coastguard Worker   }
3415*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(old != result_ptr)) {
3416*795d594fSAndroid Build Coastguard Worker     // Return `old` (even if `!descriptor_equals`) to mimic the RI behavior for parallel
3417*795d594fSAndroid Build Coastguard Worker     // capable class loaders.  (All class loaders are considered parallel capable on Android.)
3418*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> loader_class = class_loader->GetClass();
3419*795d594fSAndroid Build Coastguard Worker     const char* loader_class_name =
3420*795d594fSAndroid Build Coastguard Worker         loader_class->GetDexFile().GetTypeDescriptor(loader_class->GetDexTypeIndex());
3421*795d594fSAndroid Build Coastguard Worker     LOG(WARNING) << "Initiating class loader of type " << DescriptorToDot(loader_class_name)
3422*795d594fSAndroid Build Coastguard Worker         << " is not well-behaved; it returned a different Class for racing loadClass(\""
3423*795d594fSAndroid Build Coastguard Worker         << DescriptorToDot(descriptor) << "\").";
3424*795d594fSAndroid Build Coastguard Worker     return EnsureResolved(self, sv_descriptor, old);
3425*795d594fSAndroid Build Coastguard Worker   }
3426*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(!descriptor_equals)) {
3427*795d594fSAndroid Build Coastguard Worker     std::string result_storage;
3428*795d594fSAndroid Build Coastguard Worker     const char* result_name = result_ptr->GetDescriptor(&result_storage);
3429*795d594fSAndroid Build Coastguard Worker     std::string loader_storage;
3430*795d594fSAndroid Build Coastguard Worker     const char* loader_class_name = class_loader->GetClass()->GetDescriptor(&loader_storage);
3431*795d594fSAndroid Build Coastguard Worker     ThrowNoClassDefFoundError(
3432*795d594fSAndroid Build Coastguard Worker         "Initiating class loader of type %s returned class %s instead of %s.",
3433*795d594fSAndroid Build Coastguard Worker         DescriptorToDot(loader_class_name).c_str(),
3434*795d594fSAndroid Build Coastguard Worker         DescriptorToDot(result_name).c_str(),
3435*795d594fSAndroid Build Coastguard Worker         DescriptorToDot(descriptor).c_str());
3436*795d594fSAndroid Build Coastguard Worker     return nullptr;
3437*795d594fSAndroid Build Coastguard Worker   }
3438*795d594fSAndroid Build Coastguard Worker   // Success.
3439*795d594fSAndroid Build Coastguard Worker   return result_ptr;
3440*795d594fSAndroid Build Coastguard Worker }
3441*795d594fSAndroid Build Coastguard Worker 
3442*795d594fSAndroid Build Coastguard Worker // Helper for maintaining DefineClass counting. We need to notify callbacks when we start/end a
3443*795d594fSAndroid Build Coastguard Worker // define-class and how many recursive DefineClasses we are at in order to allow for doing  things
3444*795d594fSAndroid Build Coastguard Worker // like pausing class definition.
3445*795d594fSAndroid Build Coastguard Worker struct ScopedDefiningClass {
3446*795d594fSAndroid Build Coastguard Worker  public:
REQUIRES_SHAREDart::ScopedDefiningClass3447*795d594fSAndroid Build Coastguard Worker   explicit ScopedDefiningClass(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_)
3448*795d594fSAndroid Build Coastguard Worker       : self_(self), returned_(false) {
3449*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->AssertSharedHeld(self_);
3450*795d594fSAndroid Build Coastguard Worker     Runtime::Current()->GetRuntimeCallbacks()->BeginDefineClass();
3451*795d594fSAndroid Build Coastguard Worker     self_->IncrDefineClassCount();
3452*795d594fSAndroid Build Coastguard Worker   }
REQUIRES_SHAREDart::ScopedDefiningClass3453*795d594fSAndroid Build Coastguard Worker   ~ScopedDefiningClass() REQUIRES_SHARED(Locks::mutator_lock_) {
3454*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->AssertSharedHeld(self_);
3455*795d594fSAndroid Build Coastguard Worker     CHECK(returned_);
3456*795d594fSAndroid Build Coastguard Worker   }
3457*795d594fSAndroid Build Coastguard Worker 
Finishart::ScopedDefiningClass3458*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> Finish(Handle<mirror::Class> h_klass)
3459*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
3460*795d594fSAndroid Build Coastguard Worker     CHECK(!returned_);
3461*795d594fSAndroid Build Coastguard Worker     self_->DecrDefineClassCount();
3462*795d594fSAndroid Build Coastguard Worker     Runtime::Current()->GetRuntimeCallbacks()->EndDefineClass();
3463*795d594fSAndroid Build Coastguard Worker     Thread::PoisonObjectPointersIfDebug();
3464*795d594fSAndroid Build Coastguard Worker     returned_ = true;
3465*795d594fSAndroid Build Coastguard Worker     return h_klass.Get();
3466*795d594fSAndroid Build Coastguard Worker   }
3467*795d594fSAndroid Build Coastguard Worker 
Finishart::ScopedDefiningClass3468*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> Finish(ObjPtr<mirror::Class> klass)
3469*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
3470*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self_);
3471*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> h_klass(hs.NewHandle(klass));
3472*795d594fSAndroid Build Coastguard Worker     return Finish(h_klass);
3473*795d594fSAndroid Build Coastguard Worker   }
3474*795d594fSAndroid Build Coastguard Worker 
Finishart::ScopedDefiningClass3475*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> Finish([[maybe_unused]] nullptr_t np)
3476*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
3477*795d594fSAndroid Build Coastguard Worker     ScopedNullHandle<mirror::Class> snh;
3478*795d594fSAndroid Build Coastguard Worker     return Finish(snh);
3479*795d594fSAndroid Build Coastguard Worker   }
3480*795d594fSAndroid Build Coastguard Worker 
3481*795d594fSAndroid Build Coastguard Worker  private:
3482*795d594fSAndroid Build Coastguard Worker   Thread* self_;
3483*795d594fSAndroid Build Coastguard Worker   bool returned_;
3484*795d594fSAndroid Build Coastguard Worker };
3485*795d594fSAndroid Build Coastguard Worker 
DefineClass(Thread * self,const char * descriptor,size_t descriptor_length,size_t hash,Handle<mirror::ClassLoader> class_loader,const DexFile & dex_file,const dex::ClassDef & dex_class_def)3486*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::DefineClass(Thread* self,
3487*795d594fSAndroid Build Coastguard Worker                                                const char* descriptor,
3488*795d594fSAndroid Build Coastguard Worker                                                size_t descriptor_length,
3489*795d594fSAndroid Build Coastguard Worker                                                size_t hash,
3490*795d594fSAndroid Build Coastguard Worker                                                Handle<mirror::ClassLoader> class_loader,
3491*795d594fSAndroid Build Coastguard Worker                                                const DexFile& dex_file,
3492*795d594fSAndroid Build Coastguard Worker                                                const dex::ClassDef& dex_class_def) {
3493*795d594fSAndroid Build Coastguard Worker   std::string_view sv_descriptor(descriptor, descriptor_length);
3494*795d594fSAndroid Build Coastguard Worker   ScopedDefiningClass sdc(self);
3495*795d594fSAndroid Build Coastguard Worker   StackHandleScope<3> hs(self);
3496*795d594fSAndroid Build Coastguard Worker   metrics::AutoTimer timer{GetMetrics()->ClassLoadingTotalTime()};
3497*795d594fSAndroid Build Coastguard Worker   metrics::AutoTimer timeDelta{GetMetrics()->ClassLoadingTotalTimeDelta()};
3498*795d594fSAndroid Build Coastguard Worker   auto klass = hs.NewHandle<mirror::Class>(nullptr);
3499*795d594fSAndroid Build Coastguard Worker 
3500*795d594fSAndroid Build Coastguard Worker   // Load the class from the dex file.
3501*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(!init_done_)) {
3502*795d594fSAndroid Build Coastguard Worker     // finish up init of hand crafted class_roots_
3503*795d594fSAndroid Build Coastguard Worker     if (sv_descriptor == "Ljava/lang/Object;") {
3504*795d594fSAndroid Build Coastguard Worker       klass.Assign(GetClassRoot<mirror::Object>(this));
3505*795d594fSAndroid Build Coastguard Worker     } else if (sv_descriptor == "Ljava/lang/Class;") {
3506*795d594fSAndroid Build Coastguard Worker       klass.Assign(GetClassRoot<mirror::Class>(this));
3507*795d594fSAndroid Build Coastguard Worker     } else if (sv_descriptor == "Ljava/lang/String;") {
3508*795d594fSAndroid Build Coastguard Worker       klass.Assign(GetClassRoot<mirror::String>(this));
3509*795d594fSAndroid Build Coastguard Worker     } else if (sv_descriptor == "Ljava/lang/ref/Reference;") {
3510*795d594fSAndroid Build Coastguard Worker       klass.Assign(GetClassRoot<mirror::Reference>(this));
3511*795d594fSAndroid Build Coastguard Worker     } else if (sv_descriptor == "Ljava/lang/DexCache;") {
3512*795d594fSAndroid Build Coastguard Worker       klass.Assign(GetClassRoot<mirror::DexCache>(this));
3513*795d594fSAndroid Build Coastguard Worker     } else if (sv_descriptor == "Ldalvik/system/ClassExt;") {
3514*795d594fSAndroid Build Coastguard Worker       klass.Assign(GetClassRoot<mirror::ClassExt>(this));
3515*795d594fSAndroid Build Coastguard Worker     }
3516*795d594fSAndroid Build Coastguard Worker   }
3517*795d594fSAndroid Build Coastguard Worker 
3518*795d594fSAndroid Build Coastguard Worker   // For AOT-compilation of an app, we may use only a public SDK to resolve symbols. If the SDK
3519*795d594fSAndroid Build Coastguard Worker   // checks are configured (a non null SdkChecker) and the descriptor is not in the provided
3520*795d594fSAndroid Build Coastguard Worker   // public class path then we prevent the definition of the class.
3521*795d594fSAndroid Build Coastguard Worker   //
3522*795d594fSAndroid Build Coastguard Worker   // NOTE that we only do the checks for the boot classpath APIs. Anything else, like the app
3523*795d594fSAndroid Build Coastguard Worker   // classpath is not checked.
3524*795d594fSAndroid Build Coastguard Worker   if (class_loader == nullptr &&
3525*795d594fSAndroid Build Coastguard Worker       Runtime::Current()->IsAotCompiler() &&
3526*795d594fSAndroid Build Coastguard Worker       DenyAccessBasedOnPublicSdk(descriptor)) {
3527*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Throwable> pre_allocated =
3528*795d594fSAndroid Build Coastguard Worker         Runtime::Current()->GetPreAllocatedNoClassDefFoundError();
3529*795d594fSAndroid Build Coastguard Worker     self->SetException(pre_allocated);
3530*795d594fSAndroid Build Coastguard Worker     return sdc.Finish(nullptr);
3531*795d594fSAndroid Build Coastguard Worker   }
3532*795d594fSAndroid Build Coastguard Worker 
3533*795d594fSAndroid Build Coastguard Worker   // This is to prevent the calls to ClassLoad and ClassPrepare which can cause java/user-supplied
3534*795d594fSAndroid Build Coastguard Worker   // code to be executed. We put it up here so we can avoid all the allocations associated with
3535*795d594fSAndroid Build Coastguard Worker   // creating the class. This can happen with (eg) jit threads.
3536*795d594fSAndroid Build Coastguard Worker   if (!self->CanLoadClasses()) {
3537*795d594fSAndroid Build Coastguard Worker     // Make sure we don't try to load anything, potentially causing an infinite loop.
3538*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Throwable> pre_allocated =
3539*795d594fSAndroid Build Coastguard Worker         Runtime::Current()->GetPreAllocatedNoClassDefFoundError();
3540*795d594fSAndroid Build Coastguard Worker     self->SetException(pre_allocated);
3541*795d594fSAndroid Build Coastguard Worker     return sdc.Finish(nullptr);
3542*795d594fSAndroid Build Coastguard Worker   }
3543*795d594fSAndroid Build Coastguard Worker 
3544*795d594fSAndroid Build Coastguard Worker   ScopedTrace trace(descriptor);
3545*795d594fSAndroid Build Coastguard Worker   if (klass == nullptr) {
3546*795d594fSAndroid Build Coastguard Worker     // Allocate a class with the status of not ready.
3547*795d594fSAndroid Build Coastguard Worker     // Interface object should get the right size here. Regular class will
3548*795d594fSAndroid Build Coastguard Worker     // figure out the right size later and be replaced with one of the right
3549*795d594fSAndroid Build Coastguard Worker     // size when the class becomes resolved.
3550*795d594fSAndroid Build Coastguard Worker     if (CanAllocClass()) {
3551*795d594fSAndroid Build Coastguard Worker       klass.Assign(AllocClass(self, SizeOfClassWithoutEmbeddedTables(dex_file, dex_class_def)));
3552*795d594fSAndroid Build Coastguard Worker     } else {
3553*795d594fSAndroid Build Coastguard Worker       return sdc.Finish(nullptr);
3554*795d594fSAndroid Build Coastguard Worker     }
3555*795d594fSAndroid Build Coastguard Worker   }
3556*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(klass == nullptr)) {
3557*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
3558*795d594fSAndroid Build Coastguard Worker     return sdc.Finish(nullptr);
3559*795d594fSAndroid Build Coastguard Worker   }
3560*795d594fSAndroid Build Coastguard Worker   // Get the real dex file. This will return the input if there aren't any callbacks or they do
3561*795d594fSAndroid Build Coastguard Worker   // nothing.
3562*795d594fSAndroid Build Coastguard Worker   DexFile const* new_dex_file = nullptr;
3563*795d594fSAndroid Build Coastguard Worker   dex::ClassDef const* new_class_def = nullptr;
3564*795d594fSAndroid Build Coastguard Worker   // TODO We should ideally figure out some way to move this after we get a lock on the klass so it
3565*795d594fSAndroid Build Coastguard Worker   // will only be called once.
3566*795d594fSAndroid Build Coastguard Worker   Runtime::Current()->GetRuntimeCallbacks()->ClassPreDefine(descriptor,
3567*795d594fSAndroid Build Coastguard Worker                                                             klass,
3568*795d594fSAndroid Build Coastguard Worker                                                             class_loader,
3569*795d594fSAndroid Build Coastguard Worker                                                             dex_file,
3570*795d594fSAndroid Build Coastguard Worker                                                             dex_class_def,
3571*795d594fSAndroid Build Coastguard Worker                                                             &new_dex_file,
3572*795d594fSAndroid Build Coastguard Worker                                                             &new_class_def);
3573*795d594fSAndroid Build Coastguard Worker   // Check to see if an exception happened during runtime callbacks. Return if so.
3574*795d594fSAndroid Build Coastguard Worker   if (self->IsExceptionPending()) {
3575*795d594fSAndroid Build Coastguard Worker     return sdc.Finish(nullptr);
3576*795d594fSAndroid Build Coastguard Worker   }
3577*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> dex_cache = RegisterDexFile(*new_dex_file, class_loader.Get());
3578*795d594fSAndroid Build Coastguard Worker   if (dex_cache == nullptr) {
3579*795d594fSAndroid Build Coastguard Worker     self->AssertPendingException();
3580*795d594fSAndroid Build Coastguard Worker     return sdc.Finish(nullptr);
3581*795d594fSAndroid Build Coastguard Worker   }
3582*795d594fSAndroid Build Coastguard Worker   klass->SetDexCache(dex_cache);
3583*795d594fSAndroid Build Coastguard Worker   SetupClass(*new_dex_file, *new_class_def, klass, class_loader.Get());
3584*795d594fSAndroid Build Coastguard Worker 
3585*795d594fSAndroid Build Coastguard Worker   // Mark the string class by setting its access flag.
3586*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(!init_done_)) {
3587*795d594fSAndroid Build Coastguard Worker     if (sv_descriptor == "Ljava/lang/String;") {
3588*795d594fSAndroid Build Coastguard Worker       klass->SetStringClass();
3589*795d594fSAndroid Build Coastguard Worker     }
3590*795d594fSAndroid Build Coastguard Worker   }
3591*795d594fSAndroid Build Coastguard Worker 
3592*795d594fSAndroid Build Coastguard Worker   ObjectLock<mirror::Class> lock(self, klass);
3593*795d594fSAndroid Build Coastguard Worker   klass->SetClinitThreadId(self->GetTid());
3594*795d594fSAndroid Build Coastguard Worker   // Make sure we have a valid empty iftable even if there are errors.
3595*795d594fSAndroid Build Coastguard Worker   klass->SetIfTable(GetClassRoot<mirror::Object>(this)->GetIfTable());
3596*795d594fSAndroid Build Coastguard Worker 
3597*795d594fSAndroid Build Coastguard Worker   // Add the newly loaded class to the loaded classes table.
3598*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> existing = InsertClass(sv_descriptor, klass.Get(), hash);
3599*795d594fSAndroid Build Coastguard Worker   if (existing != nullptr) {
3600*795d594fSAndroid Build Coastguard Worker     // We failed to insert because we raced with another thread. Calling EnsureResolved may cause
3601*795d594fSAndroid Build Coastguard Worker     // this thread to block.
3602*795d594fSAndroid Build Coastguard Worker     return sdc.Finish(EnsureResolved(self, sv_descriptor, existing));
3603*795d594fSAndroid Build Coastguard Worker   }
3604*795d594fSAndroid Build Coastguard Worker 
3605*795d594fSAndroid Build Coastguard Worker   // Load the fields and other things after we are inserted in the table. This is so that we don't
3606*795d594fSAndroid Build Coastguard Worker   // end up allocating unfree-able linear alloc resources and then lose the race condition. The
3607*795d594fSAndroid Build Coastguard Worker   // other reason is that the field roots are only visited from the class table. So we need to be
3608*795d594fSAndroid Build Coastguard Worker   // inserted before we allocate / fill in these fields.
3609*795d594fSAndroid Build Coastguard Worker   LoadClass(self, *new_dex_file, *new_class_def, klass);
3610*795d594fSAndroid Build Coastguard Worker   if (self->IsExceptionPending()) {
3611*795d594fSAndroid Build Coastguard Worker     VLOG(class_linker) << self->GetException()->Dump();
3612*795d594fSAndroid Build Coastguard Worker     // An exception occured during load, set status to erroneous while holding klass' lock in case
3613*795d594fSAndroid Build Coastguard Worker     // notification is necessary.
3614*795d594fSAndroid Build Coastguard Worker     if (!klass->IsErroneous()) {
3615*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kErrorUnresolved, self);
3616*795d594fSAndroid Build Coastguard Worker     }
3617*795d594fSAndroid Build Coastguard Worker     return sdc.Finish(nullptr);
3618*795d594fSAndroid Build Coastguard Worker   }
3619*795d594fSAndroid Build Coastguard Worker 
3620*795d594fSAndroid Build Coastguard Worker   // Finish loading (if necessary) by finding parents
3621*795d594fSAndroid Build Coastguard Worker   CHECK(!klass->IsLoaded());
3622*795d594fSAndroid Build Coastguard Worker   if (!LoadSuperAndInterfaces(klass, *new_dex_file)) {
3623*795d594fSAndroid Build Coastguard Worker     // Loading failed.
3624*795d594fSAndroid Build Coastguard Worker     if (!klass->IsErroneous()) {
3625*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kErrorUnresolved, self);
3626*795d594fSAndroid Build Coastguard Worker     }
3627*795d594fSAndroid Build Coastguard Worker     return sdc.Finish(nullptr);
3628*795d594fSAndroid Build Coastguard Worker   }
3629*795d594fSAndroid Build Coastguard Worker   CHECK(klass->IsLoaded());
3630*795d594fSAndroid Build Coastguard Worker 
3631*795d594fSAndroid Build Coastguard Worker   // At this point the class is loaded. Publish a ClassLoad event.
3632*795d594fSAndroid Build Coastguard Worker   // Note: this may be a temporary class. It is a listener's responsibility to handle this.
3633*795d594fSAndroid Build Coastguard Worker   Runtime::Current()->GetRuntimeCallbacks()->ClassLoad(klass);
3634*795d594fSAndroid Build Coastguard Worker 
3635*795d594fSAndroid Build Coastguard Worker   // Link the class (if necessary)
3636*795d594fSAndroid Build Coastguard Worker   CHECK(!klass->IsResolved());
3637*795d594fSAndroid Build Coastguard Worker   // TODO: Use fast jobjects?
3638*795d594fSAndroid Build Coastguard Worker   auto interfaces = hs.NewHandle<mirror::ObjectArray<mirror::Class>>(nullptr);
3639*795d594fSAndroid Build Coastguard Worker 
3640*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::Class> h_new_class = hs.NewHandle<mirror::Class>(nullptr);
3641*795d594fSAndroid Build Coastguard Worker   if (!LinkClass(self, descriptor, klass, interfaces, &h_new_class)) {
3642*795d594fSAndroid Build Coastguard Worker     // Linking failed.
3643*795d594fSAndroid Build Coastguard Worker     if (!klass->IsErroneous()) {
3644*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kErrorUnresolved, self);
3645*795d594fSAndroid Build Coastguard Worker     }
3646*795d594fSAndroid Build Coastguard Worker     return sdc.Finish(nullptr);
3647*795d594fSAndroid Build Coastguard Worker   }
3648*795d594fSAndroid Build Coastguard Worker   self->AssertNoPendingException();
3649*795d594fSAndroid Build Coastguard Worker   CHECK(h_new_class != nullptr) << descriptor;
3650*795d594fSAndroid Build Coastguard Worker   CHECK(h_new_class->IsResolved()) << descriptor << " " << h_new_class->GetStatus();
3651*795d594fSAndroid Build Coastguard Worker 
3652*795d594fSAndroid Build Coastguard Worker   // Instrumentation may have updated entrypoints for all methods of all
3653*795d594fSAndroid Build Coastguard Worker   // classes. However it could not update methods of this class while we
3654*795d594fSAndroid Build Coastguard Worker   // were loading it. Now the class is resolved, we can update entrypoints
3655*795d594fSAndroid Build Coastguard Worker   // as required by instrumentation.
3656*795d594fSAndroid Build Coastguard Worker   if (Runtime::Current()->GetInstrumentation()->EntryExitStubsInstalled()) {
3657*795d594fSAndroid Build Coastguard Worker     // We must be in the kRunnable state to prevent instrumentation from
3658*795d594fSAndroid Build Coastguard Worker     // suspending all threads to update entrypoints while we are doing it
3659*795d594fSAndroid Build Coastguard Worker     // for this class.
3660*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(self->GetState(), ThreadState::kRunnable);
3661*795d594fSAndroid Build Coastguard Worker     Runtime::Current()->GetInstrumentation()->InstallStubsForClass(h_new_class.Get());
3662*795d594fSAndroid Build Coastguard Worker   }
3663*795d594fSAndroid Build Coastguard Worker 
3664*795d594fSAndroid Build Coastguard Worker   /*
3665*795d594fSAndroid Build Coastguard Worker    * We send CLASS_PREPARE events to the debugger from here.  The
3666*795d594fSAndroid Build Coastguard Worker    * definition of "preparation" is creating the static fields for a
3667*795d594fSAndroid Build Coastguard Worker    * class and initializing them to the standard default values, but not
3668*795d594fSAndroid Build Coastguard Worker    * executing any code (that comes later, during "initialization").
3669*795d594fSAndroid Build Coastguard Worker    *
3670*795d594fSAndroid Build Coastguard Worker    * We did the static preparation in LinkClass.
3671*795d594fSAndroid Build Coastguard Worker    *
3672*795d594fSAndroid Build Coastguard Worker    * The class has been prepared and resolved but possibly not yet verified
3673*795d594fSAndroid Build Coastguard Worker    * at this point.
3674*795d594fSAndroid Build Coastguard Worker    */
3675*795d594fSAndroid Build Coastguard Worker   Runtime::Current()->GetRuntimeCallbacks()->ClassPrepare(klass, h_new_class);
3676*795d594fSAndroid Build Coastguard Worker 
3677*795d594fSAndroid Build Coastguard Worker   // Notify native debugger of the new class and its layout.
3678*795d594fSAndroid Build Coastguard Worker   jit::Jit::NewTypeLoadedIfUsingJit(h_new_class.Get());
3679*795d594fSAndroid Build Coastguard Worker 
3680*795d594fSAndroid Build Coastguard Worker   return sdc.Finish(h_new_class);
3681*795d594fSAndroid Build Coastguard Worker }
3682*795d594fSAndroid Build Coastguard Worker 
SizeOfClassWithoutEmbeddedTables(const DexFile & dex_file,const dex::ClassDef & dex_class_def)3683*795d594fSAndroid Build Coastguard Worker uint32_t ClassLinker::SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
3684*795d594fSAndroid Build Coastguard Worker                                                        const dex::ClassDef& dex_class_def) {
3685*795d594fSAndroid Build Coastguard Worker   size_t num_ref = 0;
3686*795d594fSAndroid Build Coastguard Worker   size_t num_8 = 0;
3687*795d594fSAndroid Build Coastguard Worker   size_t num_16 = 0;
3688*795d594fSAndroid Build Coastguard Worker   size_t num_32 = 0;
3689*795d594fSAndroid Build Coastguard Worker   size_t num_64 = 0;
3690*795d594fSAndroid Build Coastguard Worker   ClassAccessor accessor(dex_file, dex_class_def);
3691*795d594fSAndroid Build Coastguard Worker   // We allow duplicate definitions of the same field in a class_data_item
3692*795d594fSAndroid Build Coastguard Worker   // but ignore the repeated indexes here, b/21868015.
3693*795d594fSAndroid Build Coastguard Worker   uint32_t last_field_idx = dex::kDexNoIndex;
3694*795d594fSAndroid Build Coastguard Worker   for (const ClassAccessor::Field& field : accessor.GetStaticFields()) {
3695*795d594fSAndroid Build Coastguard Worker     uint32_t field_idx = field.GetIndex();
3696*795d594fSAndroid Build Coastguard Worker     // Ordering enforced by DexFileVerifier.
3697*795d594fSAndroid Build Coastguard Worker     DCHECK(last_field_idx == dex::kDexNoIndex || last_field_idx <= field_idx);
3698*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(field_idx == last_field_idx)) {
3699*795d594fSAndroid Build Coastguard Worker       continue;
3700*795d594fSAndroid Build Coastguard Worker     }
3701*795d594fSAndroid Build Coastguard Worker     last_field_idx = field_idx;
3702*795d594fSAndroid Build Coastguard Worker     const dex::FieldId& field_id = dex_file.GetFieldId(field_idx);
3703*795d594fSAndroid Build Coastguard Worker     const char* descriptor = dex_file.GetFieldTypeDescriptor(field_id);
3704*795d594fSAndroid Build Coastguard Worker     char c = descriptor[0];
3705*795d594fSAndroid Build Coastguard Worker     switch (c) {
3706*795d594fSAndroid Build Coastguard Worker       case 'L':
3707*795d594fSAndroid Build Coastguard Worker       case '[':
3708*795d594fSAndroid Build Coastguard Worker         num_ref++;
3709*795d594fSAndroid Build Coastguard Worker         break;
3710*795d594fSAndroid Build Coastguard Worker       case 'J':
3711*795d594fSAndroid Build Coastguard Worker       case 'D':
3712*795d594fSAndroid Build Coastguard Worker         num_64++;
3713*795d594fSAndroid Build Coastguard Worker         break;
3714*795d594fSAndroid Build Coastguard Worker       case 'I':
3715*795d594fSAndroid Build Coastguard Worker       case 'F':
3716*795d594fSAndroid Build Coastguard Worker         num_32++;
3717*795d594fSAndroid Build Coastguard Worker         break;
3718*795d594fSAndroid Build Coastguard Worker       case 'S':
3719*795d594fSAndroid Build Coastguard Worker       case 'C':
3720*795d594fSAndroid Build Coastguard Worker         num_16++;
3721*795d594fSAndroid Build Coastguard Worker         break;
3722*795d594fSAndroid Build Coastguard Worker       case 'B':
3723*795d594fSAndroid Build Coastguard Worker       case 'Z':
3724*795d594fSAndroid Build Coastguard Worker         num_8++;
3725*795d594fSAndroid Build Coastguard Worker         break;
3726*795d594fSAndroid Build Coastguard Worker       default:
3727*795d594fSAndroid Build Coastguard Worker         LOG(FATAL) << "Unknown descriptor: " << c;
3728*795d594fSAndroid Build Coastguard Worker         UNREACHABLE();
3729*795d594fSAndroid Build Coastguard Worker     }
3730*795d594fSAndroid Build Coastguard Worker   }
3731*795d594fSAndroid Build Coastguard Worker   return mirror::Class::ComputeClassSize(/*has_embedded_vtable=*/false,
3732*795d594fSAndroid Build Coastguard Worker                                          /*num_vtable_entries=*/0,
3733*795d594fSAndroid Build Coastguard Worker                                          num_8,
3734*795d594fSAndroid Build Coastguard Worker                                          num_16,
3735*795d594fSAndroid Build Coastguard Worker                                          num_32,
3736*795d594fSAndroid Build Coastguard Worker                                          num_64,
3737*795d594fSAndroid Build Coastguard Worker                                          num_ref,
3738*795d594fSAndroid Build Coastguard Worker                                          /*num_ref_bitmap_entries=*/0,
3739*795d594fSAndroid Build Coastguard Worker                                          image_pointer_size_);
3740*795d594fSAndroid Build Coastguard Worker }
3741*795d594fSAndroid Build Coastguard Worker 
FixupStaticTrampolines(Thread * self,ObjPtr<mirror::Class> klass)3742*795d594fSAndroid Build Coastguard Worker void ClassLinker::FixupStaticTrampolines(Thread* self, ObjPtr<mirror::Class> klass) {
3743*795d594fSAndroid Build Coastguard Worker   ScopedAssertNoThreadSuspension sants(__FUNCTION__);
3744*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->IsVisiblyInitialized()) << klass->PrettyDescriptor();
3745*795d594fSAndroid Build Coastguard Worker   size_t num_direct_methods = klass->NumDirectMethods();
3746*795d594fSAndroid Build Coastguard Worker   if (num_direct_methods == 0) {
3747*795d594fSAndroid Build Coastguard Worker     return;  // No direct methods => no static methods.
3748*795d594fSAndroid Build Coastguard Worker   }
3749*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(klass->IsProxyClass())) {
3750*795d594fSAndroid Build Coastguard Worker     return;
3751*795d594fSAndroid Build Coastguard Worker   }
3752*795d594fSAndroid Build Coastguard Worker   PointerSize pointer_size = image_pointer_size_;
3753*795d594fSAndroid Build Coastguard Worker   if (std::any_of(klass->GetDirectMethods(pointer_size).begin(),
3754*795d594fSAndroid Build Coastguard Worker                   klass->GetDirectMethods(pointer_size).end(),
3755*795d594fSAndroid Build Coastguard Worker                   [](const ArtMethod& m) { return m.IsCriticalNative(); })) {
3756*795d594fSAndroid Build Coastguard Worker     // Store registered @CriticalNative methods, if any, to JNI entrypoints.
3757*795d594fSAndroid Build Coastguard Worker     // Direct methods are a contiguous chunk of memory, so use the ordering of the map.
3758*795d594fSAndroid Build Coastguard Worker     ArtMethod* first_method = klass->GetDirectMethod(0u, pointer_size);
3759*795d594fSAndroid Build Coastguard Worker     ArtMethod* last_method = klass->GetDirectMethod(num_direct_methods - 1u, pointer_size);
3760*795d594fSAndroid Build Coastguard Worker     MutexLock lock(self, critical_native_code_with_clinit_check_lock_);
3761*795d594fSAndroid Build Coastguard Worker     auto lb = critical_native_code_with_clinit_check_.lower_bound(first_method);
3762*795d594fSAndroid Build Coastguard Worker     while (lb != critical_native_code_with_clinit_check_.end() && lb->first <= last_method) {
3763*795d594fSAndroid Build Coastguard Worker       lb->first->SetEntryPointFromJni(lb->second);
3764*795d594fSAndroid Build Coastguard Worker       lb = critical_native_code_with_clinit_check_.erase(lb);
3765*795d594fSAndroid Build Coastguard Worker     }
3766*795d594fSAndroid Build Coastguard Worker   }
3767*795d594fSAndroid Build Coastguard Worker   Runtime* runtime = Runtime::Current();
3768*795d594fSAndroid Build Coastguard Worker   if (runtime->IsAotCompiler()) {
3769*795d594fSAndroid Build Coastguard Worker     // We should not update entrypoints when running the transactional
3770*795d594fSAndroid Build Coastguard Worker     // interpreter.
3771*795d594fSAndroid Build Coastguard Worker     return;
3772*795d594fSAndroid Build Coastguard Worker   }
3773*795d594fSAndroid Build Coastguard Worker 
3774*795d594fSAndroid Build Coastguard Worker   instrumentation::Instrumentation* instrumentation = runtime->GetInstrumentation();
3775*795d594fSAndroid Build Coastguard Worker   bool enable_boot_jni_stub = !runtime->IsJavaDebuggable();
3776*795d594fSAndroid Build Coastguard Worker   for (size_t method_index = 0; method_index < num_direct_methods; ++method_index) {
3777*795d594fSAndroid Build Coastguard Worker     ArtMethod* method = klass->GetDirectMethod(method_index, pointer_size);
3778*795d594fSAndroid Build Coastguard Worker     if (method->NeedsClinitCheckBeforeCall()) {
3779*795d594fSAndroid Build Coastguard Worker       const void* quick_code = instrumentation->GetCodeForInvoke(method);
3780*795d594fSAndroid Build Coastguard Worker       if (method->IsNative() && IsQuickGenericJniStub(quick_code) && enable_boot_jni_stub) {
3781*795d594fSAndroid Build Coastguard Worker         const void* boot_jni_stub = FindBootJniStub(method);
3782*795d594fSAndroid Build Coastguard Worker         if (boot_jni_stub != nullptr) {
3783*795d594fSAndroid Build Coastguard Worker           // Use boot JNI stub if found.
3784*795d594fSAndroid Build Coastguard Worker           quick_code = boot_jni_stub;
3785*795d594fSAndroid Build Coastguard Worker         }
3786*795d594fSAndroid Build Coastguard Worker       }
3787*795d594fSAndroid Build Coastguard Worker       instrumentation->UpdateMethodsCode(method, quick_code);
3788*795d594fSAndroid Build Coastguard Worker     }
3789*795d594fSAndroid Build Coastguard Worker   }
3790*795d594fSAndroid Build Coastguard Worker   // Ignore virtual methods on the iterator.
3791*795d594fSAndroid Build Coastguard Worker }
3792*795d594fSAndroid Build Coastguard Worker 
3793*795d594fSAndroid Build Coastguard Worker // Does anything needed to make sure that the compiler will not generate a direct invoke to this
3794*795d594fSAndroid Build Coastguard Worker // method. Should only be called on non-invokable methods.
EnsureThrowsInvocationError(ClassLinker * class_linker,ArtMethod * method)3795*795d594fSAndroid Build Coastguard Worker inline void EnsureThrowsInvocationError(ClassLinker* class_linker, ArtMethod* method)
3796*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
3797*795d594fSAndroid Build Coastguard Worker   DCHECK(method != nullptr);
3798*795d594fSAndroid Build Coastguard Worker   DCHECK(!method->IsInvokable());
3799*795d594fSAndroid Build Coastguard Worker   method->SetEntryPointFromQuickCompiledCodePtrSize(
3800*795d594fSAndroid Build Coastguard Worker       class_linker->GetQuickToInterpreterBridgeTrampoline(),
3801*795d594fSAndroid Build Coastguard Worker       class_linker->GetImagePointerSize());
3802*795d594fSAndroid Build Coastguard Worker }
3803*795d594fSAndroid Build Coastguard Worker 
3804*795d594fSAndroid Build Coastguard Worker class ClassLinker::OatClassCodeIterator {
3805*795d594fSAndroid Build Coastguard Worker  public:
OatClassCodeIterator(const OatFile::OatClass & oat_class)3806*795d594fSAndroid Build Coastguard Worker   explicit OatClassCodeIterator(const OatFile::OatClass& oat_class)
3807*795d594fSAndroid Build Coastguard Worker       : begin_(oat_class.methods_pointer_ != nullptr && oat_class.oat_file_->IsExecutable()
3808*795d594fSAndroid Build Coastguard Worker                    ? oat_class.oat_file_->Begin()
3809*795d594fSAndroid Build Coastguard Worker                    : nullptr),
3810*795d594fSAndroid Build Coastguard Worker         bitmap_(oat_class.bitmap_),
3811*795d594fSAndroid Build Coastguard Worker         current_(oat_class.methods_pointer_ != nullptr && oat_class.oat_file_->IsExecutable()
3812*795d594fSAndroid Build Coastguard Worker                      ? oat_class.methods_pointer_
3813*795d594fSAndroid Build Coastguard Worker                      : nullptr),
3814*795d594fSAndroid Build Coastguard Worker         method_index_(0u),
3815*795d594fSAndroid Build Coastguard Worker         num_methods_(oat_class.num_methods_) {
3816*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(bitmap_ != nullptr, oat_class.GetType() == OatClassType::kSomeCompiled);
3817*795d594fSAndroid Build Coastguard Worker   }
3818*795d594fSAndroid Build Coastguard Worker 
GetAndAdvance(uint32_t method_index)3819*795d594fSAndroid Build Coastguard Worker   const void* GetAndAdvance(uint32_t method_index) {
3820*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
3821*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(method_index, method_index_);
3822*795d594fSAndroid Build Coastguard Worker       ++method_index_;
3823*795d594fSAndroid Build Coastguard Worker     }
3824*795d594fSAndroid Build Coastguard Worker     if (current_ == nullptr) {
3825*795d594fSAndroid Build Coastguard Worker       // We may not have a valid `num_methods_` to perform the next `DCHECK()`.
3826*795d594fSAndroid Build Coastguard Worker       return nullptr;
3827*795d594fSAndroid Build Coastguard Worker     }
3828*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(method_index, num_methods_);
3829*795d594fSAndroid Build Coastguard Worker     DCHECK(begin_ != nullptr);
3830*795d594fSAndroid Build Coastguard Worker     if (bitmap_ == nullptr || BitVector::IsBitSet(bitmap_, method_index)) {
3831*795d594fSAndroid Build Coastguard Worker       DCHECK_NE(current_->code_offset_, 0u);
3832*795d594fSAndroid Build Coastguard Worker       const void* result = begin_ + current_->code_offset_;
3833*795d594fSAndroid Build Coastguard Worker       ++current_;
3834*795d594fSAndroid Build Coastguard Worker       return result;
3835*795d594fSAndroid Build Coastguard Worker     } else {
3836*795d594fSAndroid Build Coastguard Worker       return nullptr;
3837*795d594fSAndroid Build Coastguard Worker     }
3838*795d594fSAndroid Build Coastguard Worker   }
3839*795d594fSAndroid Build Coastguard Worker 
SkipAbstract(uint32_t method_index)3840*795d594fSAndroid Build Coastguard Worker   void SkipAbstract(uint32_t method_index) {
3841*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
3842*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(method_index, method_index_);
3843*795d594fSAndroid Build Coastguard Worker       ++method_index_;
3844*795d594fSAndroid Build Coastguard Worker       if (current_ != nullptr) {
3845*795d594fSAndroid Build Coastguard Worker         CHECK_LT(method_index, num_methods_);
3846*795d594fSAndroid Build Coastguard Worker         CHECK(bitmap_ != nullptr);
3847*795d594fSAndroid Build Coastguard Worker         CHECK(!BitVector::IsBitSet(bitmap_, method_index));
3848*795d594fSAndroid Build Coastguard Worker       }
3849*795d594fSAndroid Build Coastguard Worker     }
3850*795d594fSAndroid Build Coastguard Worker   }
3851*795d594fSAndroid Build Coastguard Worker 
3852*795d594fSAndroid Build Coastguard Worker  private:
3853*795d594fSAndroid Build Coastguard Worker   const uint8_t* const begin_;
3854*795d594fSAndroid Build Coastguard Worker   const uint32_t* const bitmap_;
3855*795d594fSAndroid Build Coastguard Worker   const OatMethodOffsets* current_;
3856*795d594fSAndroid Build Coastguard Worker 
3857*795d594fSAndroid Build Coastguard Worker   // Debug mode members.
3858*795d594fSAndroid Build Coastguard Worker   uint32_t method_index_;
3859*795d594fSAndroid Build Coastguard Worker   const uint32_t num_methods_;
3860*795d594fSAndroid Build Coastguard Worker };
3861*795d594fSAndroid Build Coastguard Worker 
LinkCode(ArtMethod * method,uint32_t class_def_method_index,OatClassCodeIterator * occi)3862*795d594fSAndroid Build Coastguard Worker inline void ClassLinker::LinkCode(ArtMethod* method,
3863*795d594fSAndroid Build Coastguard Worker                                   uint32_t class_def_method_index,
3864*795d594fSAndroid Build Coastguard Worker                                   /*inout*/ OatClassCodeIterator* occi) {
3865*795d594fSAndroid Build Coastguard Worker   ScopedAssertNoThreadSuspension sants(__FUNCTION__);
3866*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
3867*795d594fSAndroid Build Coastguard Worker   if (runtime->IsAotCompiler()) {
3868*795d594fSAndroid Build Coastguard Worker     // The following code only applies to a non-compiler runtime.
3869*795d594fSAndroid Build Coastguard Worker     return;
3870*795d594fSAndroid Build Coastguard Worker   }
3871*795d594fSAndroid Build Coastguard Worker 
3872*795d594fSAndroid Build Coastguard Worker   // Method shouldn't have already been linked.
3873*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(method->GetEntryPointFromQuickCompiledCode(), nullptr);
3874*795d594fSAndroid Build Coastguard Worker   DCHECK(!method->GetDeclaringClass()->IsVisiblyInitialized());  // Actually ClassStatus::Idx.
3875*795d594fSAndroid Build Coastguard Worker 
3876*795d594fSAndroid Build Coastguard Worker   if (!method->IsInvokable()) {
3877*795d594fSAndroid Build Coastguard Worker     EnsureThrowsInvocationError(this, method);
3878*795d594fSAndroid Build Coastguard Worker     occi->SkipAbstract(class_def_method_index);
3879*795d594fSAndroid Build Coastguard Worker     return;
3880*795d594fSAndroid Build Coastguard Worker   }
3881*795d594fSAndroid Build Coastguard Worker 
3882*795d594fSAndroid Build Coastguard Worker   const void* quick_code = occi->GetAndAdvance(class_def_method_index);
3883*795d594fSAndroid Build Coastguard Worker   if (method->IsNative() && quick_code == nullptr) {
3884*795d594fSAndroid Build Coastguard Worker     const void* boot_jni_stub = FindBootJniStub(method);
3885*795d594fSAndroid Build Coastguard Worker     if (boot_jni_stub != nullptr) {
3886*795d594fSAndroid Build Coastguard Worker       // Use boot JNI stub if found.
3887*795d594fSAndroid Build Coastguard Worker       quick_code = boot_jni_stub;
3888*795d594fSAndroid Build Coastguard Worker     }
3889*795d594fSAndroid Build Coastguard Worker   }
3890*795d594fSAndroid Build Coastguard Worker   runtime->GetInstrumentation()->InitializeMethodsCode(method, quick_code);
3891*795d594fSAndroid Build Coastguard Worker 
3892*795d594fSAndroid Build Coastguard Worker   if (method->IsNative()) {
3893*795d594fSAndroid Build Coastguard Worker     // Set up the dlsym lookup stub. Do not go through `UnregisterNative()`
3894*795d594fSAndroid Build Coastguard Worker     // as the extra processing for @CriticalNative is not needed yet.
3895*795d594fSAndroid Build Coastguard Worker     method->SetEntryPointFromJni(
3896*795d594fSAndroid Build Coastguard Worker         method->IsCriticalNative() ? GetJniDlsymLookupCriticalStub() : GetJniDlsymLookupStub());
3897*795d594fSAndroid Build Coastguard Worker   }
3898*795d594fSAndroid Build Coastguard Worker }
3899*795d594fSAndroid Build Coastguard Worker 
SetupClass(const DexFile & dex_file,const dex::ClassDef & dex_class_def,Handle<mirror::Class> klass,ObjPtr<mirror::ClassLoader> class_loader)3900*795d594fSAndroid Build Coastguard Worker void ClassLinker::SetupClass(const DexFile& dex_file,
3901*795d594fSAndroid Build Coastguard Worker                              const dex::ClassDef& dex_class_def,
3902*795d594fSAndroid Build Coastguard Worker                              Handle<mirror::Class> klass,
3903*795d594fSAndroid Build Coastguard Worker                              ObjPtr<mirror::ClassLoader> class_loader) {
3904*795d594fSAndroid Build Coastguard Worker   CHECK(klass != nullptr);
3905*795d594fSAndroid Build Coastguard Worker   CHECK(klass->GetDexCache() != nullptr);
3906*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(ClassStatus::kNotReady, klass->GetStatus());
3907*795d594fSAndroid Build Coastguard Worker   const char* descriptor = dex_file.GetClassDescriptor(dex_class_def);
3908*795d594fSAndroid Build Coastguard Worker   CHECK(descriptor != nullptr);
3909*795d594fSAndroid Build Coastguard Worker 
3910*795d594fSAndroid Build Coastguard Worker   klass->SetClass(GetClassRoot<mirror::Class>(this));
3911*795d594fSAndroid Build Coastguard Worker   uint32_t access_flags = dex_class_def.GetJavaAccessFlags();
3912*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(access_flags & ~kAccJavaFlagsMask, 0U);
3913*795d594fSAndroid Build Coastguard Worker   klass->SetAccessFlagsDuringLinking(access_flags);
3914*795d594fSAndroid Build Coastguard Worker   klass->SetClassLoader(class_loader);
3915*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(klass->GetPrimitiveType(), Primitive::kPrimNot);
3916*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(klass, ClassStatus::kIdx, nullptr);
3917*795d594fSAndroid Build Coastguard Worker 
3918*795d594fSAndroid Build Coastguard Worker   klass->SetDexClassDefIndex(dex_file.GetIndexForClassDef(dex_class_def));
3919*795d594fSAndroid Build Coastguard Worker   klass->SetDexTypeIndex(dex_class_def.class_idx_);
3920*795d594fSAndroid Build Coastguard Worker }
3921*795d594fSAndroid Build Coastguard Worker 
AllocArtFieldArray(Thread * self,LinearAlloc * allocator,size_t length)3922*795d594fSAndroid Build Coastguard Worker LengthPrefixedArray<ArtField>* ClassLinker::AllocArtFieldArray(Thread* self,
3923*795d594fSAndroid Build Coastguard Worker                                                                LinearAlloc* allocator,
3924*795d594fSAndroid Build Coastguard Worker                                                                size_t length) {
3925*795d594fSAndroid Build Coastguard Worker   if (length == 0) {
3926*795d594fSAndroid Build Coastguard Worker     return nullptr;
3927*795d594fSAndroid Build Coastguard Worker   }
3928*795d594fSAndroid Build Coastguard Worker   // If the ArtField alignment changes, review all uses of LengthPrefixedArray<ArtField>.
3929*795d594fSAndroid Build Coastguard Worker   static_assert(alignof(ArtField) == 4, "ArtField alignment is expected to be 4.");
3930*795d594fSAndroid Build Coastguard Worker   size_t storage_size = LengthPrefixedArray<ArtField>::ComputeSize(length);
3931*795d594fSAndroid Build Coastguard Worker   void* array_storage = allocator->Alloc(self, storage_size, LinearAllocKind::kArtFieldArray);
3932*795d594fSAndroid Build Coastguard Worker   auto* ret = new(array_storage) LengthPrefixedArray<ArtField>(length);
3933*795d594fSAndroid Build Coastguard Worker   CHECK(ret != nullptr);
3934*795d594fSAndroid Build Coastguard Worker   std::uninitialized_fill_n(&ret->At(0), length, ArtField());
3935*795d594fSAndroid Build Coastguard Worker   return ret;
3936*795d594fSAndroid Build Coastguard Worker }
3937*795d594fSAndroid Build Coastguard Worker 
AllocArtMethodArray(Thread * self,LinearAlloc * allocator,size_t length)3938*795d594fSAndroid Build Coastguard Worker LengthPrefixedArray<ArtMethod>* ClassLinker::AllocArtMethodArray(Thread* self,
3939*795d594fSAndroid Build Coastguard Worker                                                                  LinearAlloc* allocator,
3940*795d594fSAndroid Build Coastguard Worker                                                                  size_t length) {
3941*795d594fSAndroid Build Coastguard Worker   if (length == 0) {
3942*795d594fSAndroid Build Coastguard Worker     return nullptr;
3943*795d594fSAndroid Build Coastguard Worker   }
3944*795d594fSAndroid Build Coastguard Worker   const size_t method_alignment = ArtMethod::Alignment(image_pointer_size_);
3945*795d594fSAndroid Build Coastguard Worker   const size_t method_size = ArtMethod::Size(image_pointer_size_);
3946*795d594fSAndroid Build Coastguard Worker   const size_t storage_size =
3947*795d594fSAndroid Build Coastguard Worker       LengthPrefixedArray<ArtMethod>::ComputeSize(length, method_size, method_alignment);
3948*795d594fSAndroid Build Coastguard Worker   void* array_storage = allocator->Alloc(self, storage_size, LinearAllocKind::kArtMethodArray);
3949*795d594fSAndroid Build Coastguard Worker   auto* ret = new (array_storage) LengthPrefixedArray<ArtMethod>(length);
3950*795d594fSAndroid Build Coastguard Worker   CHECK(ret != nullptr);
3951*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < length; ++i) {
3952*795d594fSAndroid Build Coastguard Worker     new(reinterpret_cast<void*>(&ret->At(i, method_size, method_alignment))) ArtMethod;
3953*795d594fSAndroid Build Coastguard Worker   }
3954*795d594fSAndroid Build Coastguard Worker   return ret;
3955*795d594fSAndroid Build Coastguard Worker }
3956*795d594fSAndroid Build Coastguard Worker 
GetAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)3957*795d594fSAndroid Build Coastguard Worker LinearAlloc* ClassLinker::GetAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader) {
3958*795d594fSAndroid Build Coastguard Worker   if (class_loader == nullptr) {
3959*795d594fSAndroid Build Coastguard Worker     return Runtime::Current()->GetLinearAlloc();
3960*795d594fSAndroid Build Coastguard Worker   }
3961*795d594fSAndroid Build Coastguard Worker   LinearAlloc* allocator = class_loader->GetAllocator();
3962*795d594fSAndroid Build Coastguard Worker   DCHECK(allocator != nullptr);
3963*795d594fSAndroid Build Coastguard Worker   return allocator;
3964*795d594fSAndroid Build Coastguard Worker }
3965*795d594fSAndroid Build Coastguard Worker 
GetOrCreateAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)3966*795d594fSAndroid Build Coastguard Worker LinearAlloc* ClassLinker::GetOrCreateAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader) {
3967*795d594fSAndroid Build Coastguard Worker   if (class_loader == nullptr) {
3968*795d594fSAndroid Build Coastguard Worker     return Runtime::Current()->GetLinearAlloc();
3969*795d594fSAndroid Build Coastguard Worker   }
3970*795d594fSAndroid Build Coastguard Worker   WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
3971*795d594fSAndroid Build Coastguard Worker   LinearAlloc* allocator = class_loader->GetAllocator();
3972*795d594fSAndroid Build Coastguard Worker   if (allocator == nullptr) {
3973*795d594fSAndroid Build Coastguard Worker     RegisterClassLoader(class_loader);
3974*795d594fSAndroid Build Coastguard Worker     allocator = class_loader->GetAllocator();
3975*795d594fSAndroid Build Coastguard Worker     CHECK(allocator != nullptr);
3976*795d594fSAndroid Build Coastguard Worker   }
3977*795d594fSAndroid Build Coastguard Worker   return allocator;
3978*795d594fSAndroid Build Coastguard Worker }
3979*795d594fSAndroid Build Coastguard Worker 
3980*795d594fSAndroid Build Coastguard Worker // Helper class for iterating over method annotations, using their ordering in the dex file.
3981*795d594fSAndroid Build Coastguard Worker // Since direct and virtual methods are separated (but each section is ordered), we shall use
3982*795d594fSAndroid Build Coastguard Worker // separate iterators for loading direct and virtual methods.
3983*795d594fSAndroid Build Coastguard Worker class ClassLinker::MethodAnnotationsIterator {
3984*795d594fSAndroid Build Coastguard Worker  public:
MethodAnnotationsIterator(const DexFile & dex_file,const dex::AnnotationsDirectoryItem * annotations_dir)3985*795d594fSAndroid Build Coastguard Worker   MethodAnnotationsIterator(const DexFile& dex_file,
3986*795d594fSAndroid Build Coastguard Worker                             const dex::AnnotationsDirectoryItem* annotations_dir)
3987*795d594fSAndroid Build Coastguard Worker       : current_((annotations_dir != nullptr) ? dex_file.GetMethodAnnotations(annotations_dir)
3988*795d594fSAndroid Build Coastguard Worker                                               : nullptr),
3989*795d594fSAndroid Build Coastguard Worker         end_((annotations_dir != nullptr) ? current_ + annotations_dir->methods_size_ : nullptr) {}
3990*795d594fSAndroid Build Coastguard Worker 
AdvanceTo(uint32_t method_idx)3991*795d594fSAndroid Build Coastguard Worker   const dex::MethodAnnotationsItem* AdvanceTo(uint32_t method_idx) {
3992*795d594fSAndroid Build Coastguard Worker     while (current_ != end_ && current_->method_idx_ < method_idx) {
3993*795d594fSAndroid Build Coastguard Worker       ++current_;
3994*795d594fSAndroid Build Coastguard Worker     }
3995*795d594fSAndroid Build Coastguard Worker     return (current_ != end_ && current_->method_idx_ == method_idx) ? current_ : nullptr;
3996*795d594fSAndroid Build Coastguard Worker   }
3997*795d594fSAndroid Build Coastguard Worker 
3998*795d594fSAndroid Build Coastguard Worker  private:
3999*795d594fSAndroid Build Coastguard Worker   const dex::MethodAnnotationsItem* current_;
4000*795d594fSAndroid Build Coastguard Worker   const dex::MethodAnnotationsItem* const end_;
4001*795d594fSAndroid Build Coastguard Worker };
4002*795d594fSAndroid Build Coastguard Worker 
LoadClass(Thread * self,const DexFile & dex_file,const dex::ClassDef & dex_class_def,Handle<mirror::Class> klass)4003*795d594fSAndroid Build Coastguard Worker void ClassLinker::LoadClass(Thread* self,
4004*795d594fSAndroid Build Coastguard Worker                             const DexFile& dex_file,
4005*795d594fSAndroid Build Coastguard Worker                             const dex::ClassDef& dex_class_def,
4006*795d594fSAndroid Build Coastguard Worker                             Handle<mirror::Class> klass) {
4007*795d594fSAndroid Build Coastguard Worker   ClassAccessor accessor(dex_file,
4008*795d594fSAndroid Build Coastguard Worker                          dex_class_def,
4009*795d594fSAndroid Build Coastguard Worker                          /* parse_hiddenapi_class_data= */ klass->IsBootStrapClassLoaded());
4010*795d594fSAndroid Build Coastguard Worker   if (!accessor.HasClassData()) {
4011*795d594fSAndroid Build Coastguard Worker     return;
4012*795d594fSAndroid Build Coastguard Worker   }
4013*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
4014*795d594fSAndroid Build Coastguard Worker   {
4015*795d594fSAndroid Build Coastguard Worker     // Note: We cannot have thread suspension until the field and method arrays are setup or else
4016*795d594fSAndroid Build Coastguard Worker     // Class::VisitFieldRoots may miss some fields or methods.
4017*795d594fSAndroid Build Coastguard Worker     ScopedAssertNoThreadSuspension nts(__FUNCTION__);
4018*795d594fSAndroid Build Coastguard Worker     // Load static fields.
4019*795d594fSAndroid Build Coastguard Worker     // We allow duplicate definitions of the same field in a class_data_item
4020*795d594fSAndroid Build Coastguard Worker     // but ignore the repeated indexes here, b/21868015.
4021*795d594fSAndroid Build Coastguard Worker     LinearAlloc* const allocator = GetAllocatorForClassLoader(klass->GetClassLoader());
4022*795d594fSAndroid Build Coastguard Worker     LengthPrefixedArray<ArtField>* sfields = AllocArtFieldArray(self,
4023*795d594fSAndroid Build Coastguard Worker                                                                 allocator,
4024*795d594fSAndroid Build Coastguard Worker                                                                 accessor.NumStaticFields());
4025*795d594fSAndroid Build Coastguard Worker     LengthPrefixedArray<ArtField>* ifields = AllocArtFieldArray(self,
4026*795d594fSAndroid Build Coastguard Worker                                                                 allocator,
4027*795d594fSAndroid Build Coastguard Worker                                                                 accessor.NumInstanceFields());
4028*795d594fSAndroid Build Coastguard Worker     size_t num_sfields = 0u;
4029*795d594fSAndroid Build Coastguard Worker     size_t num_ifields = 0u;
4030*795d594fSAndroid Build Coastguard Worker     uint32_t last_static_field_idx = 0u;
4031*795d594fSAndroid Build Coastguard Worker     uint32_t last_instance_field_idx = 0u;
4032*795d594fSAndroid Build Coastguard Worker 
4033*795d594fSAndroid Build Coastguard Worker     // Methods
4034*795d594fSAndroid Build Coastguard Worker     bool has_oat_class = false;
4035*795d594fSAndroid Build Coastguard Worker     const OatFile::OatClass oat_class = (runtime->IsStarted() && !runtime->IsAotCompiler())
4036*795d594fSAndroid Build Coastguard Worker         ? OatFile::FindOatClass(dex_file, klass->GetDexClassDefIndex(), &has_oat_class)
4037*795d594fSAndroid Build Coastguard Worker         : OatFile::OatClass::Invalid();
4038*795d594fSAndroid Build Coastguard Worker     OatClassCodeIterator occi(oat_class);
4039*795d594fSAndroid Build Coastguard Worker     klass->SetMethodsPtr(
4040*795d594fSAndroid Build Coastguard Worker         AllocArtMethodArray(self, allocator, accessor.NumMethods()),
4041*795d594fSAndroid Build Coastguard Worker         accessor.NumDirectMethods(),
4042*795d594fSAndroid Build Coastguard Worker         accessor.NumVirtualMethods());
4043*795d594fSAndroid Build Coastguard Worker     size_t class_def_method_index = 0;
4044*795d594fSAndroid Build Coastguard Worker     uint32_t last_dex_method_index = dex::kDexNoIndex;
4045*795d594fSAndroid Build Coastguard Worker     size_t last_class_def_method_index = 0;
4046*795d594fSAndroid Build Coastguard Worker 
4047*795d594fSAndroid Build Coastguard Worker     // Initialize separate `MethodAnnotationsIterator`s for direct and virtual methods.
4048*795d594fSAndroid Build Coastguard Worker     MethodAnnotationsIterator mai_direct(dex_file, dex_file.GetAnnotationsDirectory(dex_class_def));
4049*795d594fSAndroid Build Coastguard Worker     MethodAnnotationsIterator mai_virtual = mai_direct;
4050*795d594fSAndroid Build Coastguard Worker 
4051*795d594fSAndroid Build Coastguard Worker     uint16_t hotness_threshold = runtime->GetJITOptions()->GetWarmupThreshold();
4052*795d594fSAndroid Build Coastguard Worker     // Use the visitor since the ranged based loops are bit slower from seeking. Seeking to the
4053*795d594fSAndroid Build Coastguard Worker     // methods needs to decode all of the fields.
4054*795d594fSAndroid Build Coastguard Worker     accessor.VisitFieldsAndMethods([&](
4055*795d594fSAndroid Build Coastguard Worker         const ClassAccessor::Field& field) REQUIRES_SHARED(Locks::mutator_lock_) {
4056*795d594fSAndroid Build Coastguard Worker           uint32_t field_idx = field.GetIndex();
4057*795d594fSAndroid Build Coastguard Worker           DCHECK_GE(field_idx, last_static_field_idx);  // Ordering enforced by DexFileVerifier.
4058*795d594fSAndroid Build Coastguard Worker           if (num_sfields == 0 || LIKELY(field_idx > last_static_field_idx)) {
4059*795d594fSAndroid Build Coastguard Worker             LoadField(field, klass, &sfields->At(num_sfields));
4060*795d594fSAndroid Build Coastguard Worker             ++num_sfields;
4061*795d594fSAndroid Build Coastguard Worker             last_static_field_idx = field_idx;
4062*795d594fSAndroid Build Coastguard Worker           }
4063*795d594fSAndroid Build Coastguard Worker         }, [&](const ClassAccessor::Field& field) REQUIRES_SHARED(Locks::mutator_lock_) {
4064*795d594fSAndroid Build Coastguard Worker           uint32_t field_idx = field.GetIndex();
4065*795d594fSAndroid Build Coastguard Worker           DCHECK_GE(field_idx, last_instance_field_idx);  // Ordering enforced by DexFileVerifier.
4066*795d594fSAndroid Build Coastguard Worker           if (num_ifields == 0 || LIKELY(field_idx > last_instance_field_idx)) {
4067*795d594fSAndroid Build Coastguard Worker             LoadField(field, klass, &ifields->At(num_ifields));
4068*795d594fSAndroid Build Coastguard Worker             ++num_ifields;
4069*795d594fSAndroid Build Coastguard Worker             last_instance_field_idx = field_idx;
4070*795d594fSAndroid Build Coastguard Worker           }
4071*795d594fSAndroid Build Coastguard Worker         }, [&](const ClassAccessor::Method& method) REQUIRES_SHARED(Locks::mutator_lock_) {
4072*795d594fSAndroid Build Coastguard Worker           ArtMethod* art_method = klass->GetDirectMethodUnchecked(class_def_method_index,
4073*795d594fSAndroid Build Coastguard Worker               image_pointer_size_);
4074*795d594fSAndroid Build Coastguard Worker           LoadMethod(dex_file, method, klass.Get(), &mai_direct, art_method);
4075*795d594fSAndroid Build Coastguard Worker           LinkCode(art_method, class_def_method_index, &occi);
4076*795d594fSAndroid Build Coastguard Worker           uint32_t it_method_index = method.GetIndex();
4077*795d594fSAndroid Build Coastguard Worker           if (last_dex_method_index == it_method_index) {
4078*795d594fSAndroid Build Coastguard Worker             // duplicate case
4079*795d594fSAndroid Build Coastguard Worker             art_method->SetMethodIndex(last_class_def_method_index);
4080*795d594fSAndroid Build Coastguard Worker           } else {
4081*795d594fSAndroid Build Coastguard Worker             art_method->SetMethodIndex(class_def_method_index);
4082*795d594fSAndroid Build Coastguard Worker             last_dex_method_index = it_method_index;
4083*795d594fSAndroid Build Coastguard Worker             last_class_def_method_index = class_def_method_index;
4084*795d594fSAndroid Build Coastguard Worker           }
4085*795d594fSAndroid Build Coastguard Worker           art_method->ResetCounter(hotness_threshold);
4086*795d594fSAndroid Build Coastguard Worker           ++class_def_method_index;
4087*795d594fSAndroid Build Coastguard Worker         }, [&](const ClassAccessor::Method& method) REQUIRES_SHARED(Locks::mutator_lock_) {
4088*795d594fSAndroid Build Coastguard Worker           ArtMethod* art_method = klass->GetVirtualMethodUnchecked(
4089*795d594fSAndroid Build Coastguard Worker               class_def_method_index - accessor.NumDirectMethods(),
4090*795d594fSAndroid Build Coastguard Worker               image_pointer_size_);
4091*795d594fSAndroid Build Coastguard Worker           art_method->ResetCounter(hotness_threshold);
4092*795d594fSAndroid Build Coastguard Worker           LoadMethod(dex_file, method, klass.Get(), &mai_virtual, art_method);
4093*795d594fSAndroid Build Coastguard Worker           LinkCode(art_method, class_def_method_index, &occi);
4094*795d594fSAndroid Build Coastguard Worker           ++class_def_method_index;
4095*795d594fSAndroid Build Coastguard Worker         });
4096*795d594fSAndroid Build Coastguard Worker 
4097*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(num_ifields + num_sfields != accessor.NumFields())) {
4098*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << "Duplicate fields in class " << klass->PrettyDescriptor()
4099*795d594fSAndroid Build Coastguard Worker           << " (unique static fields: " << num_sfields << "/" << accessor.NumStaticFields()
4100*795d594fSAndroid Build Coastguard Worker           << ", unique instance fields: " << num_ifields << "/" << accessor.NumInstanceFields()
4101*795d594fSAndroid Build Coastguard Worker           << ")";
4102*795d594fSAndroid Build Coastguard Worker       // NOTE: Not shrinking the over-allocated sfields/ifields, just setting size.
4103*795d594fSAndroid Build Coastguard Worker       if (sfields != nullptr) {
4104*795d594fSAndroid Build Coastguard Worker         sfields->SetSize(num_sfields);
4105*795d594fSAndroid Build Coastguard Worker       }
4106*795d594fSAndroid Build Coastguard Worker       if (ifields != nullptr) {
4107*795d594fSAndroid Build Coastguard Worker         ifields->SetSize(num_ifields);
4108*795d594fSAndroid Build Coastguard Worker       }
4109*795d594fSAndroid Build Coastguard Worker     }
4110*795d594fSAndroid Build Coastguard Worker     // Set the field arrays.
4111*795d594fSAndroid Build Coastguard Worker     klass->SetSFieldsPtr(sfields);
4112*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(klass->NumStaticFields(), num_sfields);
4113*795d594fSAndroid Build Coastguard Worker     klass->SetIFieldsPtr(ifields);
4114*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(klass->NumInstanceFields(), num_ifields);
4115*795d594fSAndroid Build Coastguard Worker   }
4116*795d594fSAndroid Build Coastguard Worker   // Ensure that the card is marked so that remembered sets pick up native roots.
4117*795d594fSAndroid Build Coastguard Worker   WriteBarrier::ForEveryFieldWrite(klass.Get());
4118*795d594fSAndroid Build Coastguard Worker   self->AllowThreadSuspension();
4119*795d594fSAndroid Build Coastguard Worker }
4120*795d594fSAndroid Build Coastguard Worker 
LoadField(const ClassAccessor::Field & field,Handle<mirror::Class> klass,ArtField * dst)4121*795d594fSAndroid Build Coastguard Worker void ClassLinker::LoadField(const ClassAccessor::Field& field,
4122*795d594fSAndroid Build Coastguard Worker                             Handle<mirror::Class> klass,
4123*795d594fSAndroid Build Coastguard Worker                             ArtField* dst) {
4124*795d594fSAndroid Build Coastguard Worker   const uint32_t field_idx = field.GetIndex();
4125*795d594fSAndroid Build Coastguard Worker   dst->SetDexFieldIndex(field_idx);
4126*795d594fSAndroid Build Coastguard Worker   dst->SetDeclaringClass(klass.Get());
4127*795d594fSAndroid Build Coastguard Worker 
4128*795d594fSAndroid Build Coastguard Worker   // Get access flags from the DexFile and set hiddenapi runtime access flags.
4129*795d594fSAndroid Build Coastguard Worker   dst->SetAccessFlags(field.GetAccessFlags() | hiddenapi::CreateRuntimeFlags(field));
4130*795d594fSAndroid Build Coastguard Worker }
4131*795d594fSAndroid Build Coastguard Worker 
LoadMethod(const DexFile & dex_file,const ClassAccessor::Method & method,ObjPtr<mirror::Class> klass,MethodAnnotationsIterator * mai,ArtMethod * dst)4132*795d594fSAndroid Build Coastguard Worker void ClassLinker::LoadMethod(const DexFile& dex_file,
4133*795d594fSAndroid Build Coastguard Worker                              const ClassAccessor::Method& method,
4134*795d594fSAndroid Build Coastguard Worker                              ObjPtr<mirror::Class> klass,
4135*795d594fSAndroid Build Coastguard Worker                              /*inout*/ MethodAnnotationsIterator* mai,
4136*795d594fSAndroid Build Coastguard Worker                              /*out*/ ArtMethod* dst) {
4137*795d594fSAndroid Build Coastguard Worker   ScopedAssertNoThreadSuspension sants(__FUNCTION__);
4138*795d594fSAndroid Build Coastguard Worker 
4139*795d594fSAndroid Build Coastguard Worker   const uint32_t dex_method_idx = method.GetIndex();
4140*795d594fSAndroid Build Coastguard Worker   const dex::MethodId& method_id = dex_file.GetMethodId(dex_method_idx);
4141*795d594fSAndroid Build Coastguard Worker   uint32_t name_utf16_length;
4142*795d594fSAndroid Build Coastguard Worker   const char* method_name = dex_file.GetStringDataAndUtf16Length(method_id.name_idx_,
4143*795d594fSAndroid Build Coastguard Worker                                                                  &name_utf16_length);
4144*795d594fSAndroid Build Coastguard Worker   std::string_view shorty = dex_file.GetShortyView(dex_file.GetProtoId(method_id.proto_idx_));
4145*795d594fSAndroid Build Coastguard Worker 
4146*795d594fSAndroid Build Coastguard Worker   dst->SetDexMethodIndex(dex_method_idx);
4147*795d594fSAndroid Build Coastguard Worker   dst->SetDeclaringClass(klass);
4148*795d594fSAndroid Build Coastguard Worker 
4149*795d594fSAndroid Build Coastguard Worker   // Get access flags from the DexFile and set hiddenapi runtime access flags.
4150*795d594fSAndroid Build Coastguard Worker   uint32_t access_flags = method.GetAccessFlags() | hiddenapi::CreateRuntimeFlags(method);
4151*795d594fSAndroid Build Coastguard Worker 
4152*795d594fSAndroid Build Coastguard Worker   auto has_ascii_name = [method_name, name_utf16_length](const char* ascii_name,
4153*795d594fSAndroid Build Coastguard Worker                                                          size_t length) ALWAYS_INLINE {
4154*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(strlen(ascii_name), length);
4155*795d594fSAndroid Build Coastguard Worker     return length == name_utf16_length &&
4156*795d594fSAndroid Build Coastguard Worker            method_name[length] == 0 &&  // Is `method_name` an ASCII string?
4157*795d594fSAndroid Build Coastguard Worker            memcmp(ascii_name, method_name, length) == 0;
4158*795d594fSAndroid Build Coastguard Worker   };
4159*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(has_ascii_name("finalize", sizeof("finalize") - 1u))) {
4160*795d594fSAndroid Build Coastguard Worker     // Set finalizable flag on declaring class if the method has the right signature.
4161*795d594fSAndroid Build Coastguard Worker     // When initializing without a boot image, `Object` and `Enum` shall have the finalizable
4162*795d594fSAndroid Build Coastguard Worker     // flag cleared immediately after loading these classes, see  `InitWithoutImage()`.
4163*795d594fSAndroid Build Coastguard Worker     if (shorty == "V") {
4164*795d594fSAndroid Build Coastguard Worker       klass->SetFinalizable();
4165*795d594fSAndroid Build Coastguard Worker     }
4166*795d594fSAndroid Build Coastguard Worker   } else if (method_name[0] == '<') {
4167*795d594fSAndroid Build Coastguard Worker     // Fix broken access flags for initializers. Bug 11157540.
4168*795d594fSAndroid Build Coastguard Worker     // `DexFileVerifier` rejects method names starting with '<' other than constructors.
4169*795d594fSAndroid Build Coastguard Worker     DCHECK(has_ascii_name("<init>", sizeof("<init>") - 1u) ||
4170*795d594fSAndroid Build Coastguard Worker            has_ascii_name("<clinit>", sizeof("<clinit>") - 1u)) << method_name;
4171*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY((access_flags & kAccConstructor) == 0)) {
4172*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << method_name << " didn't have expected constructor access flag in class "
4173*795d594fSAndroid Build Coastguard Worker           << klass->PrettyDescriptor() << " in dex file " << dex_file.GetLocation();
4174*795d594fSAndroid Build Coastguard Worker       access_flags |= kAccConstructor;
4175*795d594fSAndroid Build Coastguard Worker     }
4176*795d594fSAndroid Build Coastguard Worker   }
4177*795d594fSAndroid Build Coastguard Worker 
4178*795d594fSAndroid Build Coastguard Worker   access_flags |= GetNterpFastPathFlags(shorty, access_flags, kRuntimeQuickCodeISA);
4179*795d594fSAndroid Build Coastguard Worker 
4180*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY((access_flags & kAccNative) != 0u)) {
4181*795d594fSAndroid Build Coastguard Worker     // Check if the native method is annotated with @FastNative or @CriticalNative.
4182*795d594fSAndroid Build Coastguard Worker     const dex::MethodAnnotationsItem* method_annotations = mai->AdvanceTo(dex_method_idx);
4183*795d594fSAndroid Build Coastguard Worker     if (method_annotations != nullptr) {
4184*795d594fSAndroid Build Coastguard Worker       access_flags |=
4185*795d594fSAndroid Build Coastguard Worker           annotations::GetNativeMethodAnnotationAccessFlags(dex_file, *method_annotations);
4186*795d594fSAndroid Build Coastguard Worker     }
4187*795d594fSAndroid Build Coastguard Worker     dst->SetAccessFlags(access_flags);
4188*795d594fSAndroid Build Coastguard Worker     DCHECK(!dst->IsAbstract());
4189*795d594fSAndroid Build Coastguard Worker     DCHECK(!dst->HasCodeItem());
4190*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(method.GetCodeItemOffset(), 0u);
4191*795d594fSAndroid Build Coastguard Worker     dst->SetDataPtrSize(nullptr, image_pointer_size_);  // JNI stub/trampoline not linked yet.
4192*795d594fSAndroid Build Coastguard Worker   } else if ((access_flags & kAccAbstract) != 0u) {
4193*795d594fSAndroid Build Coastguard Worker     dst->SetAccessFlags(access_flags);
4194*795d594fSAndroid Build Coastguard Worker     // Must be done after SetAccessFlags since IsAbstract depends on it.
4195*795d594fSAndroid Build Coastguard Worker     DCHECK(dst->IsAbstract());
4196*795d594fSAndroid Build Coastguard Worker     if (klass->IsInterface()) {
4197*795d594fSAndroid Build Coastguard Worker       dst->CalculateAndSetImtIndex();
4198*795d594fSAndroid Build Coastguard Worker     }
4199*795d594fSAndroid Build Coastguard Worker     DCHECK(!dst->HasCodeItem());
4200*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(method.GetCodeItemOffset(), 0u);
4201*795d594fSAndroid Build Coastguard Worker     dst->SetDataPtrSize(nullptr, image_pointer_size_);  // Single implementation not set yet.
4202*795d594fSAndroid Build Coastguard Worker   } else {
4203*795d594fSAndroid Build Coastguard Worker     const dex::MethodAnnotationsItem* method_annotations = mai->AdvanceTo(dex_method_idx);
4204*795d594fSAndroid Build Coastguard Worker     if (method_annotations != nullptr &&
4205*795d594fSAndroid Build Coastguard Worker         annotations::MethodIsNeverCompile(dex_file, *method_annotations)) {
4206*795d594fSAndroid Build Coastguard Worker       access_flags |= kAccCompileDontBother;
4207*795d594fSAndroid Build Coastguard Worker     }
4208*795d594fSAndroid Build Coastguard Worker     dst->SetAccessFlags(access_flags);
4209*795d594fSAndroid Build Coastguard Worker     DCHECK(!dst->IsAbstract());
4210*795d594fSAndroid Build Coastguard Worker     DCHECK(dst->HasCodeItem());
4211*795d594fSAndroid Build Coastguard Worker     uint32_t code_item_offset = method.GetCodeItemOffset();
4212*795d594fSAndroid Build Coastguard Worker     DCHECK_NE(code_item_offset, 0u);
4213*795d594fSAndroid Build Coastguard Worker     if (Runtime::Current()->IsAotCompiler()) {
4214*795d594fSAndroid Build Coastguard Worker       dst->SetDataPtrSize(reinterpret_cast32<void*>(code_item_offset), image_pointer_size_);
4215*795d594fSAndroid Build Coastguard Worker     } else {
4216*795d594fSAndroid Build Coastguard Worker       dst->SetCodeItem(dex_file.GetCodeItem(code_item_offset), dex_file.IsCompactDexFile());
4217*795d594fSAndroid Build Coastguard Worker     }
4218*795d594fSAndroid Build Coastguard Worker   }
4219*795d594fSAndroid Build Coastguard Worker 
4220*795d594fSAndroid Build Coastguard Worker   if ((access_flags & kAccAbstract) == 0u &&
4221*795d594fSAndroid Build Coastguard Worker       Runtime::Current()->IsZygote() &&
4222*795d594fSAndroid Build Coastguard Worker       !Runtime::Current()->GetJITOptions()->GetProfileSaverOptions().GetProfileBootClassPath()) {
4223*795d594fSAndroid Build Coastguard Worker     DCHECK(!ArtMethod::IsAbstract(access_flags));
4224*795d594fSAndroid Build Coastguard Worker     DCHECK(!ArtMethod::IsIntrinsic(access_flags));
4225*795d594fSAndroid Build Coastguard Worker     dst->SetMemorySharedMethod();
4226*795d594fSAndroid Build Coastguard Worker     dst->SetHotCounter();
4227*795d594fSAndroid Build Coastguard Worker   }
4228*795d594fSAndroid Build Coastguard Worker }
4229*795d594fSAndroid Build Coastguard Worker 
AppendToBootClassPath(Thread * self,const DexFile * dex_file)4230*795d594fSAndroid Build Coastguard Worker void ClassLinker::AppendToBootClassPath(Thread* self, const DexFile* dex_file) {
4231*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> dex_cache =
4232*795d594fSAndroid Build Coastguard Worker       AllocAndInitializeDexCache(self, *dex_file, /* class_loader= */ nullptr);
4233*795d594fSAndroid Build Coastguard Worker   CHECK(dex_cache != nullptr) << "Failed to allocate dex cache for " << dex_file->GetLocation();
4234*795d594fSAndroid Build Coastguard Worker   AppendToBootClassPath(dex_file, dex_cache);
4235*795d594fSAndroid Build Coastguard Worker   WriteBarrierOnClassLoader(self, /*class_loader=*/nullptr, dex_cache);
4236*795d594fSAndroid Build Coastguard Worker }
4237*795d594fSAndroid Build Coastguard Worker 
AppendToBootClassPath(const DexFile * dex_file,ObjPtr<mirror::DexCache> dex_cache)4238*795d594fSAndroid Build Coastguard Worker void ClassLinker::AppendToBootClassPath(const DexFile* dex_file,
4239*795d594fSAndroid Build Coastguard Worker                                         ObjPtr<mirror::DexCache> dex_cache) {
4240*795d594fSAndroid Build Coastguard Worker   CHECK(dex_file != nullptr);
4241*795d594fSAndroid Build Coastguard Worker   CHECK(dex_cache != nullptr) << dex_file->GetLocation();
4242*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(dex_cache->GetDexFile(), dex_file) << dex_file->GetLocation();
4243*795d594fSAndroid Build Coastguard Worker   boot_class_path_.push_back(dex_file);
4244*795d594fSAndroid Build Coastguard Worker   WriterMutexLock mu(Thread::Current(), *Locks::dex_lock_);
4245*795d594fSAndroid Build Coastguard Worker   RegisterDexFileLocked(*dex_file, dex_cache, /* class_loader= */ nullptr);
4246*795d594fSAndroid Build Coastguard Worker }
4247*795d594fSAndroid Build Coastguard Worker 
RegisterDexFileLocked(const DexFile & dex_file,ObjPtr<mirror::DexCache> dex_cache,ObjPtr<mirror::ClassLoader> class_loader)4248*795d594fSAndroid Build Coastguard Worker void ClassLinker::RegisterDexFileLocked(const DexFile& dex_file,
4249*795d594fSAndroid Build Coastguard Worker                                         ObjPtr<mirror::DexCache> dex_cache,
4250*795d594fSAndroid Build Coastguard Worker                                         ObjPtr<mirror::ClassLoader> class_loader) {
4251*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
4252*795d594fSAndroid Build Coastguard Worker   Locks::dex_lock_->AssertExclusiveHeld(self);
4253*795d594fSAndroid Build Coastguard Worker   CHECK(dex_cache != nullptr) << dex_file.GetLocation();
4254*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(dex_cache->GetDexFile(), &dex_file) << dex_file.GetLocation();
4255*795d594fSAndroid Build Coastguard Worker   // For app images, the dex cache location may be a suffix of the dex file location since the
4256*795d594fSAndroid Build Coastguard Worker   // dex file location is an absolute path.
4257*795d594fSAndroid Build Coastguard Worker   const std::string dex_cache_location = dex_cache->GetLocation()->ToModifiedUtf8();
4258*795d594fSAndroid Build Coastguard Worker   const size_t dex_cache_length = dex_cache_location.length();
4259*795d594fSAndroid Build Coastguard Worker   CHECK_GT(dex_cache_length, 0u) << dex_file.GetLocation();
4260*795d594fSAndroid Build Coastguard Worker   std::string dex_file_location = dex_file.GetLocation();
4261*795d594fSAndroid Build Coastguard Worker   // The following paths checks don't work on preopt when using boot dex files, where the dex
4262*795d594fSAndroid Build Coastguard Worker   // cache location is the one on device, and the dex_file's location is the one on host.
4263*795d594fSAndroid Build Coastguard Worker   Runtime* runtime = Runtime::Current();
4264*795d594fSAndroid Build Coastguard Worker   if (!(runtime->IsAotCompiler() && class_loader == nullptr && !kIsTargetBuild)) {
4265*795d594fSAndroid Build Coastguard Worker     CHECK_GE(dex_file_location.length(), dex_cache_length)
4266*795d594fSAndroid Build Coastguard Worker         << dex_cache_location << " " << dex_file.GetLocation();
4267*795d594fSAndroid Build Coastguard Worker     const std::string dex_file_suffix = dex_file_location.substr(
4268*795d594fSAndroid Build Coastguard Worker         dex_file_location.length() - dex_cache_length,
4269*795d594fSAndroid Build Coastguard Worker         dex_cache_length);
4270*795d594fSAndroid Build Coastguard Worker     // Example dex_cache location is SettingsProvider.apk and
4271*795d594fSAndroid Build Coastguard Worker     // dex file location is /system/priv-app/SettingsProvider/SettingsProvider.apk
4272*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(dex_cache_location, dex_file_suffix);
4273*795d594fSAndroid Build Coastguard Worker   }
4274*795d594fSAndroid Build Coastguard Worker 
4275*795d594fSAndroid Build Coastguard Worker   // Check if we need to initialize OatFile data (.data.img.rel.ro and .bss
4276*795d594fSAndroid Build Coastguard Worker   // sections) needed for code execution and register the oat code range.
4277*795d594fSAndroid Build Coastguard Worker   const OatFile* oat_file =
4278*795d594fSAndroid Build Coastguard Worker       (dex_file.GetOatDexFile() != nullptr) ? dex_file.GetOatDexFile()->GetOatFile() : nullptr;
4279*795d594fSAndroid Build Coastguard Worker   bool initialize_oat_file_data = (oat_file != nullptr) && oat_file->IsExecutable();
4280*795d594fSAndroid Build Coastguard Worker   if (initialize_oat_file_data) {
4281*795d594fSAndroid Build Coastguard Worker     for (const auto& entry : dex_caches_) {
4282*795d594fSAndroid Build Coastguard Worker       if (!self->IsJWeakCleared(entry.second.weak_root) &&
4283*795d594fSAndroid Build Coastguard Worker           entry.first->GetOatDexFile() != nullptr &&
4284*795d594fSAndroid Build Coastguard Worker           entry.first->GetOatDexFile()->GetOatFile() == oat_file) {
4285*795d594fSAndroid Build Coastguard Worker         initialize_oat_file_data = false;  // Already initialized.
4286*795d594fSAndroid Build Coastguard Worker         break;
4287*795d594fSAndroid Build Coastguard Worker       }
4288*795d594fSAndroid Build Coastguard Worker     }
4289*795d594fSAndroid Build Coastguard Worker   }
4290*795d594fSAndroid Build Coastguard Worker   if (initialize_oat_file_data) {
4291*795d594fSAndroid Build Coastguard Worker     oat_file->InitializeRelocations();
4292*795d594fSAndroid Build Coastguard Worker     // Notify the fault handler about the new executable code range if needed.
4293*795d594fSAndroid Build Coastguard Worker     size_t exec_offset = oat_file->GetOatHeader().GetExecutableOffset();
4294*795d594fSAndroid Build Coastguard Worker     DCHECK_LE(exec_offset, oat_file->Size());
4295*795d594fSAndroid Build Coastguard Worker     size_t exec_size = oat_file->Size() - exec_offset;
4296*795d594fSAndroid Build Coastguard Worker     if (exec_size != 0u) {
4297*795d594fSAndroid Build Coastguard Worker       runtime->AddGeneratedCodeRange(oat_file->Begin() + exec_offset, exec_size);
4298*795d594fSAndroid Build Coastguard Worker     }
4299*795d594fSAndroid Build Coastguard Worker   }
4300*795d594fSAndroid Build Coastguard Worker 
4301*795d594fSAndroid Build Coastguard Worker   // Let hiddenapi assign a domain to the newly registered dex file.
4302*795d594fSAndroid Build Coastguard Worker   hiddenapi::InitializeDexFileDomain(dex_file, class_loader);
4303*795d594fSAndroid Build Coastguard Worker 
4304*795d594fSAndroid Build Coastguard Worker   jweak dex_cache_jweak = self->GetJniEnv()->GetVm()->AddWeakGlobalRef(self, dex_cache);
4305*795d594fSAndroid Build Coastguard Worker   DexCacheData data;
4306*795d594fSAndroid Build Coastguard Worker   data.weak_root = dex_cache_jweak;
4307*795d594fSAndroid Build Coastguard Worker   data.class_table = ClassTableForClassLoader(class_loader);
4308*795d594fSAndroid Build Coastguard Worker   AddNativeDebugInfoForDex(self, &dex_file);
4309*795d594fSAndroid Build Coastguard Worker   DCHECK(data.class_table != nullptr);
4310*795d594fSAndroid Build Coastguard Worker   // Make sure to hold the dex cache live in the class table. This case happens for the boot class
4311*795d594fSAndroid Build Coastguard Worker   // path dex caches without an image.
4312*795d594fSAndroid Build Coastguard Worker   data.class_table->InsertStrongRoot(dex_cache);
4313*795d594fSAndroid Build Coastguard Worker   // Make sure that the dex cache holds the classloader live.
4314*795d594fSAndroid Build Coastguard Worker   dex_cache->SetClassLoader(class_loader);
4315*795d594fSAndroid Build Coastguard Worker   if (class_loader != nullptr) {
4316*795d594fSAndroid Build Coastguard Worker     // Since we added a strong root to the class table, do the write barrier as required for
4317*795d594fSAndroid Build Coastguard Worker     // remembered sets and generational GCs.
4318*795d594fSAndroid Build Coastguard Worker     WriteBarrier::ForEveryFieldWrite(class_loader);
4319*795d594fSAndroid Build Coastguard Worker   }
4320*795d594fSAndroid Build Coastguard Worker   bool inserted = dex_caches_.emplace(&dex_file, std::move(data)).second;
4321*795d594fSAndroid Build Coastguard Worker   CHECK(inserted);
4322*795d594fSAndroid Build Coastguard Worker }
4323*795d594fSAndroid Build Coastguard Worker 
DecodeDexCacheLocked(Thread * self,const DexCacheData * data)4324*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::DexCache> ClassLinker::DecodeDexCacheLocked(Thread* self, const DexCacheData* data) {
4325*795d594fSAndroid Build Coastguard Worker   return data != nullptr
4326*795d594fSAndroid Build Coastguard Worker       ? ObjPtr<mirror::DexCache>::DownCast(self->DecodeJObject(data->weak_root))
4327*795d594fSAndroid Build Coastguard Worker       : nullptr;
4328*795d594fSAndroid Build Coastguard Worker }
4329*795d594fSAndroid Build Coastguard Worker 
IsSameClassLoader(ObjPtr<mirror::DexCache> dex_cache,const DexCacheData * data,ObjPtr<mirror::ClassLoader> class_loader)4330*795d594fSAndroid Build Coastguard Worker bool ClassLinker::IsSameClassLoader(
4331*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::DexCache> dex_cache,
4332*795d594fSAndroid Build Coastguard Worker     const DexCacheData* data,
4333*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::ClassLoader> class_loader) {
4334*795d594fSAndroid Build Coastguard Worker   CHECK(data != nullptr);
4335*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(FindDexCacheDataLocked(*dex_cache->GetDexFile()), data);
4336*795d594fSAndroid Build Coastguard Worker   return data->class_table == ClassTableForClassLoader(class_loader);
4337*795d594fSAndroid Build Coastguard Worker }
4338*795d594fSAndroid Build Coastguard Worker 
RegisterExistingDexCache(ObjPtr<mirror::DexCache> dex_cache,ObjPtr<mirror::ClassLoader> class_loader)4339*795d594fSAndroid Build Coastguard Worker void ClassLinker::RegisterExistingDexCache(ObjPtr<mirror::DexCache> dex_cache,
4340*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::ClassLoader> class_loader) {
4341*795d594fSAndroid Build Coastguard Worker   SCOPED_TRACE << __FUNCTION__ << " " << dex_cache->GetDexFile()->GetLocation();
4342*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
4343*795d594fSAndroid Build Coastguard Worker   StackHandleScope<2> hs(self);
4344*795d594fSAndroid Build Coastguard Worker   Handle<mirror::DexCache> h_dex_cache(hs.NewHandle(dex_cache));
4345*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> h_class_loader(hs.NewHandle(class_loader));
4346*795d594fSAndroid Build Coastguard Worker   const DexFile* dex_file = dex_cache->GetDexFile();
4347*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_file != nullptr) << "Attempt to register uninitialized dex_cache object!";
4348*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
4349*795d594fSAndroid Build Coastguard Worker     ReaderMutexLock mu(self, *Locks::dex_lock_);
4350*795d594fSAndroid Build Coastguard Worker     const DexCacheData* old_data = FindDexCacheDataLocked(*dex_file);
4351*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::DexCache> old_dex_cache = DecodeDexCacheLocked(self, old_data);
4352*795d594fSAndroid Build Coastguard Worker     DCHECK(old_dex_cache.IsNull()) << "Attempt to manually register a dex cache thats already "
4353*795d594fSAndroid Build Coastguard Worker                                    << "been registered on dex file " << dex_file->GetLocation();
4354*795d594fSAndroid Build Coastguard Worker   }
4355*795d594fSAndroid Build Coastguard Worker   ClassTable* table;
4356*795d594fSAndroid Build Coastguard Worker   {
4357*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
4358*795d594fSAndroid Build Coastguard Worker     table = InsertClassTableForClassLoader(h_class_loader.Get());
4359*795d594fSAndroid Build Coastguard Worker   }
4360*795d594fSAndroid Build Coastguard Worker   // Avoid a deadlock between a garbage collecting thread running a checkpoint,
4361*795d594fSAndroid Build Coastguard Worker   // a thread holding the dex lock and blocking on a condition variable regarding
4362*795d594fSAndroid Build Coastguard Worker   // weak references access, and a thread blocking on the dex lock.
4363*795d594fSAndroid Build Coastguard Worker   gc::ScopedGCCriticalSection gcs(self, gc::kGcCauseClassLinker, gc::kCollectorTypeClassLinker);
4364*795d594fSAndroid Build Coastguard Worker   WriterMutexLock mu(self, *Locks::dex_lock_);
4365*795d594fSAndroid Build Coastguard Worker   RegisterDexFileLocked(*dex_file, h_dex_cache.Get(), h_class_loader.Get());
4366*795d594fSAndroid Build Coastguard Worker   table->InsertStrongRoot(h_dex_cache.Get());
4367*795d594fSAndroid Build Coastguard Worker   if (h_class_loader.Get() != nullptr) {
4368*795d594fSAndroid Build Coastguard Worker     // Since we added a strong root to the class table, do the write barrier as required for
4369*795d594fSAndroid Build Coastguard Worker     // remembered sets and generational GCs.
4370*795d594fSAndroid Build Coastguard Worker     WriteBarrier::ForEveryFieldWrite(h_class_loader.Get());
4371*795d594fSAndroid Build Coastguard Worker   }
4372*795d594fSAndroid Build Coastguard Worker }
4373*795d594fSAndroid Build Coastguard Worker 
ThrowDexFileAlreadyRegisteredError(Thread * self,const DexFile & dex_file)4374*795d594fSAndroid Build Coastguard Worker static void ThrowDexFileAlreadyRegisteredError(Thread* self, const DexFile& dex_file)
4375*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
4376*795d594fSAndroid Build Coastguard Worker   self->ThrowNewExceptionF("Ljava/lang/InternalError;",
4377*795d594fSAndroid Build Coastguard Worker                            "Attempt to register dex file %s with multiple class loaders",
4378*795d594fSAndroid Build Coastguard Worker                            dex_file.GetLocation().c_str());
4379*795d594fSAndroid Build Coastguard Worker }
4380*795d594fSAndroid Build Coastguard Worker 
WriteBarrierOnClassLoaderLocked(ObjPtr<mirror::ClassLoader> class_loader,ObjPtr<mirror::Object> root)4381*795d594fSAndroid Build Coastguard Worker void ClassLinker::WriteBarrierOnClassLoaderLocked(ObjPtr<mirror::ClassLoader> class_loader,
4382*795d594fSAndroid Build Coastguard Worker                                                   ObjPtr<mirror::Object> root) {
4383*795d594fSAndroid Build Coastguard Worker   if (class_loader != nullptr) {
4384*795d594fSAndroid Build Coastguard Worker     // Since we added a strong root to the class table, do the write barrier as required for
4385*795d594fSAndroid Build Coastguard Worker     // remembered sets and generational GCs.
4386*795d594fSAndroid Build Coastguard Worker     WriteBarrier::ForEveryFieldWrite(class_loader);
4387*795d594fSAndroid Build Coastguard Worker   } else if (log_new_roots_) {
4388*795d594fSAndroid Build Coastguard Worker     new_roots_.push_back(GcRoot<mirror::Object>(root));
4389*795d594fSAndroid Build Coastguard Worker   }
4390*795d594fSAndroid Build Coastguard Worker }
4391*795d594fSAndroid Build Coastguard Worker 
WriteBarrierOnClassLoader(Thread * self,ObjPtr<mirror::ClassLoader> class_loader,ObjPtr<mirror::Object> root)4392*795d594fSAndroid Build Coastguard Worker void ClassLinker::WriteBarrierOnClassLoader(Thread* self,
4393*795d594fSAndroid Build Coastguard Worker                                             ObjPtr<mirror::ClassLoader> class_loader,
4394*795d594fSAndroid Build Coastguard Worker                                             ObjPtr<mirror::Object> root) {
4395*795d594fSAndroid Build Coastguard Worker   if (class_loader != nullptr) {
4396*795d594fSAndroid Build Coastguard Worker     // Since we added a strong root to the class table, do the write barrier as required for
4397*795d594fSAndroid Build Coastguard Worker     // remembered sets and generational GCs.
4398*795d594fSAndroid Build Coastguard Worker     WriteBarrier::ForEveryFieldWrite(class_loader);
4399*795d594fSAndroid Build Coastguard Worker   } else {
4400*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
4401*795d594fSAndroid Build Coastguard Worker     if (log_new_roots_) {
4402*795d594fSAndroid Build Coastguard Worker       new_roots_.push_back(GcRoot<mirror::Object>(root));
4403*795d594fSAndroid Build Coastguard Worker     }
4404*795d594fSAndroid Build Coastguard Worker   }
4405*795d594fSAndroid Build Coastguard Worker }
4406*795d594fSAndroid Build Coastguard Worker 
RegisterDexFile(const DexFile & dex_file,ObjPtr<mirror::ClassLoader> class_loader)4407*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::DexCache> ClassLinker::RegisterDexFile(const DexFile& dex_file,
4408*795d594fSAndroid Build Coastguard Worker                                                       ObjPtr<mirror::ClassLoader> class_loader) {
4409*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
4410*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> old_dex_cache;
4411*795d594fSAndroid Build Coastguard Worker   bool registered_with_another_class_loader = false;
4412*795d594fSAndroid Build Coastguard Worker   {
4413*795d594fSAndroid Build Coastguard Worker     ReaderMutexLock mu(self, *Locks::dex_lock_);
4414*795d594fSAndroid Build Coastguard Worker     const DexCacheData* old_data = FindDexCacheDataLocked(dex_file);
4415*795d594fSAndroid Build Coastguard Worker     old_dex_cache = DecodeDexCacheLocked(self, old_data);
4416*795d594fSAndroid Build Coastguard Worker     if (old_dex_cache != nullptr) {
4417*795d594fSAndroid Build Coastguard Worker       if (IsSameClassLoader(old_dex_cache, old_data, class_loader)) {
4418*795d594fSAndroid Build Coastguard Worker         return old_dex_cache;
4419*795d594fSAndroid Build Coastguard Worker       } else {
4420*795d594fSAndroid Build Coastguard Worker         // TODO This is not very clean looking. Should maybe try to make a way to request exceptions
4421*795d594fSAndroid Build Coastguard Worker         // be thrown when it's safe to do so to simplify this.
4422*795d594fSAndroid Build Coastguard Worker         registered_with_another_class_loader = true;
4423*795d594fSAndroid Build Coastguard Worker       }
4424*795d594fSAndroid Build Coastguard Worker     }
4425*795d594fSAndroid Build Coastguard Worker   }
4426*795d594fSAndroid Build Coastguard Worker   // We need to have released the dex_lock_ to allocate safely.
4427*795d594fSAndroid Build Coastguard Worker   if (registered_with_another_class_loader) {
4428*795d594fSAndroid Build Coastguard Worker     ThrowDexFileAlreadyRegisteredError(self, dex_file);
4429*795d594fSAndroid Build Coastguard Worker     return nullptr;
4430*795d594fSAndroid Build Coastguard Worker   }
4431*795d594fSAndroid Build Coastguard Worker   SCOPED_TRACE << __FUNCTION__ << " " << dex_file.GetLocation();
4432*795d594fSAndroid Build Coastguard Worker   LinearAlloc* const linear_alloc = GetOrCreateAllocatorForClassLoader(class_loader);
4433*795d594fSAndroid Build Coastguard Worker   DCHECK(linear_alloc != nullptr);
4434*795d594fSAndroid Build Coastguard Worker   ClassTable* table;
4435*795d594fSAndroid Build Coastguard Worker   {
4436*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
4437*795d594fSAndroid Build Coastguard Worker     table = InsertClassTableForClassLoader(class_loader);
4438*795d594fSAndroid Build Coastguard Worker   }
4439*795d594fSAndroid Build Coastguard Worker   // Don't alloc while holding the lock, since allocation may need to
4440*795d594fSAndroid Build Coastguard Worker   // suspend all threads and another thread may need the dex_lock_ to
4441*795d594fSAndroid Build Coastguard Worker   // get to a suspend point.
4442*795d594fSAndroid Build Coastguard Worker   StackHandleScope<3> hs(self);
4443*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> h_class_loader(hs.NewHandle(class_loader));
4444*795d594fSAndroid Build Coastguard Worker   Handle<mirror::DexCache> h_dex_cache(hs.NewHandle(AllocDexCache(self, dex_file)));
4445*795d594fSAndroid Build Coastguard Worker   {
4446*795d594fSAndroid Build Coastguard Worker     // Avoid a deadlock between a garbage collecting thread running a checkpoint,
4447*795d594fSAndroid Build Coastguard Worker     // a thread holding the dex lock and blocking on a condition variable regarding
4448*795d594fSAndroid Build Coastguard Worker     // weak references access, and a thread blocking on the dex lock.
4449*795d594fSAndroid Build Coastguard Worker     gc::ScopedGCCriticalSection gcs(self, gc::kGcCauseClassLinker, gc::kCollectorTypeClassLinker);
4450*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::dex_lock_);
4451*795d594fSAndroid Build Coastguard Worker     const DexCacheData* old_data = FindDexCacheDataLocked(dex_file);
4452*795d594fSAndroid Build Coastguard Worker     old_dex_cache = DecodeDexCacheLocked(self, old_data);
4453*795d594fSAndroid Build Coastguard Worker     if (old_dex_cache == nullptr && h_dex_cache != nullptr) {
4454*795d594fSAndroid Build Coastguard Worker       // Do Initialize while holding dex lock to make sure two threads don't call it
4455*795d594fSAndroid Build Coastguard Worker       // at the same time with the same dex cache. Since the .bss is shared this can cause failing
4456*795d594fSAndroid Build Coastguard Worker       // DCHECK that the arrays are null.
4457*795d594fSAndroid Build Coastguard Worker       h_dex_cache->Initialize(&dex_file, h_class_loader.Get());
4458*795d594fSAndroid Build Coastguard Worker       RegisterDexFileLocked(dex_file, h_dex_cache.Get(), h_class_loader.Get());
4459*795d594fSAndroid Build Coastguard Worker     }
4460*795d594fSAndroid Build Coastguard Worker     if (old_dex_cache != nullptr) {
4461*795d594fSAndroid Build Coastguard Worker       // Another thread managed to initialize the dex cache faster, so use that DexCache.
4462*795d594fSAndroid Build Coastguard Worker       // If this thread encountered OOME, ignore it.
4463*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(h_dex_cache == nullptr, self->IsExceptionPending());
4464*795d594fSAndroid Build Coastguard Worker       self->ClearException();
4465*795d594fSAndroid Build Coastguard Worker       // We cannot call EnsureSameClassLoader() or allocate an exception while holding the
4466*795d594fSAndroid Build Coastguard Worker       // dex_lock_.
4467*795d594fSAndroid Build Coastguard Worker       if (IsSameClassLoader(old_dex_cache, old_data, h_class_loader.Get())) {
4468*795d594fSAndroid Build Coastguard Worker         return old_dex_cache;
4469*795d594fSAndroid Build Coastguard Worker       } else {
4470*795d594fSAndroid Build Coastguard Worker         registered_with_another_class_loader = true;
4471*795d594fSAndroid Build Coastguard Worker       }
4472*795d594fSAndroid Build Coastguard Worker     }
4473*795d594fSAndroid Build Coastguard Worker   }
4474*795d594fSAndroid Build Coastguard Worker   if (registered_with_another_class_loader) {
4475*795d594fSAndroid Build Coastguard Worker     ThrowDexFileAlreadyRegisteredError(self, dex_file);
4476*795d594fSAndroid Build Coastguard Worker     return nullptr;
4477*795d594fSAndroid Build Coastguard Worker   }
4478*795d594fSAndroid Build Coastguard Worker   if (h_dex_cache == nullptr) {
4479*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
4480*795d594fSAndroid Build Coastguard Worker     return nullptr;
4481*795d594fSAndroid Build Coastguard Worker   }
4482*795d594fSAndroid Build Coastguard Worker   if (table->InsertStrongRoot(h_dex_cache.Get())) {
4483*795d594fSAndroid Build Coastguard Worker     WriteBarrierOnClassLoader(self, h_class_loader.Get(), h_dex_cache.Get());
4484*795d594fSAndroid Build Coastguard Worker   } else {
4485*795d594fSAndroid Build Coastguard Worker     // Write-barrier not required if strong-root isn't inserted.
4486*795d594fSAndroid Build Coastguard Worker   }
4487*795d594fSAndroid Build Coastguard Worker   VLOG(class_linker) << "Registered dex file " << dex_file.GetLocation();
4488*795d594fSAndroid Build Coastguard Worker   PaletteNotifyDexFileLoaded(dex_file.GetLocation().c_str());
4489*795d594fSAndroid Build Coastguard Worker   return h_dex_cache.Get();
4490*795d594fSAndroid Build Coastguard Worker }
4491*795d594fSAndroid Build Coastguard Worker 
IsDexFileRegistered(Thread * self,const DexFile & dex_file)4492*795d594fSAndroid Build Coastguard Worker bool ClassLinker::IsDexFileRegistered(Thread* self, const DexFile& dex_file) {
4493*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(self, *Locks::dex_lock_);
4494*795d594fSAndroid Build Coastguard Worker   return DecodeDexCacheLocked(self, FindDexCacheDataLocked(dex_file)) != nullptr;
4495*795d594fSAndroid Build Coastguard Worker }
4496*795d594fSAndroid Build Coastguard Worker 
FindDexCache(Thread * self,const DexFile & dex_file)4497*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::DexCache> ClassLinker::FindDexCache(Thread* self, const DexFile& dex_file) {
4498*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(self, *Locks::dex_lock_);
4499*795d594fSAndroid Build Coastguard Worker   const DexCacheData* dex_cache_data = FindDexCacheDataLocked(dex_file);
4500*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> dex_cache = DecodeDexCacheLocked(self, dex_cache_data);
4501*795d594fSAndroid Build Coastguard Worker   if (dex_cache != nullptr) {
4502*795d594fSAndroid Build Coastguard Worker     return dex_cache;
4503*795d594fSAndroid Build Coastguard Worker   }
4504*795d594fSAndroid Build Coastguard Worker   // Failure, dump diagnostic and abort.
4505*795d594fSAndroid Build Coastguard Worker   for (const auto& entry : dex_caches_) {
4506*795d594fSAndroid Build Coastguard Worker     const DexCacheData& data = entry.second;
4507*795d594fSAndroid Build Coastguard Worker     if (DecodeDexCacheLocked(self, &data) != nullptr) {
4508*795d594fSAndroid Build Coastguard Worker       LOG(FATAL_WITHOUT_ABORT) << "Registered dex file " << entry.first->GetLocation();
4509*795d594fSAndroid Build Coastguard Worker     }
4510*795d594fSAndroid Build Coastguard Worker   }
4511*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "Failed to find DexCache for DexFile " << dex_file.GetLocation()
4512*795d594fSAndroid Build Coastguard Worker              << " " << &dex_file;
4513*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
4514*795d594fSAndroid Build Coastguard Worker }
4515*795d594fSAndroid Build Coastguard Worker 
FindDexCache(Thread * self,const OatDexFile & oat_dex_file)4516*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::DexCache> ClassLinker::FindDexCache(Thread* self, const OatDexFile& oat_dex_file) {
4517*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(self, *Locks::dex_lock_);
4518*795d594fSAndroid Build Coastguard Worker   const DexCacheData* dex_cache_data = FindDexCacheDataLocked(oat_dex_file);
4519*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> dex_cache = DecodeDexCacheLocked(self, dex_cache_data);
4520*795d594fSAndroid Build Coastguard Worker   if (dex_cache != nullptr) {
4521*795d594fSAndroid Build Coastguard Worker     return dex_cache;
4522*795d594fSAndroid Build Coastguard Worker   }
4523*795d594fSAndroid Build Coastguard Worker   // Failure, dump diagnostic and abort.
4524*795d594fSAndroid Build Coastguard Worker   if (dex_cache_data == nullptr) {
4525*795d594fSAndroid Build Coastguard Worker     LOG(FATAL_WITHOUT_ABORT) << "NULL dex_cache_data";
4526*795d594fSAndroid Build Coastguard Worker   } else {
4527*795d594fSAndroid Build Coastguard Worker     LOG(FATAL_WITHOUT_ABORT)
4528*795d594fSAndroid Build Coastguard Worker         << "dex_cache_data=" << dex_cache_data
4529*795d594fSAndroid Build Coastguard Worker         << " weak_root=" << dex_cache_data->weak_root
4530*795d594fSAndroid Build Coastguard Worker         << " decoded_weak_root=" << self->DecodeJObject(dex_cache_data->weak_root);
4531*795d594fSAndroid Build Coastguard Worker   }
4532*795d594fSAndroid Build Coastguard Worker   for (const auto& entry : dex_caches_) {
4533*795d594fSAndroid Build Coastguard Worker     const DexCacheData& data = entry.second;
4534*795d594fSAndroid Build Coastguard Worker     if (DecodeDexCacheLocked(self, &data) != nullptr) {
4535*795d594fSAndroid Build Coastguard Worker       const OatDexFile* other_oat_dex_file = entry.first->GetOatDexFile();
4536*795d594fSAndroid Build Coastguard Worker       const OatFile* oat_file =
4537*795d594fSAndroid Build Coastguard Worker           (other_oat_dex_file == nullptr) ? nullptr : other_oat_dex_file->GetOatFile();
4538*795d594fSAndroid Build Coastguard Worker       LOG(FATAL_WITHOUT_ABORT)
4539*795d594fSAndroid Build Coastguard Worker           << "Registered dex file " << entry.first->GetLocation()
4540*795d594fSAndroid Build Coastguard Worker           << " oat_dex_file=" << other_oat_dex_file
4541*795d594fSAndroid Build Coastguard Worker           << " oat_file=" << oat_file
4542*795d594fSAndroid Build Coastguard Worker           << " oat_location=" << (oat_file == nullptr ? "null" : oat_file->GetLocation())
4543*795d594fSAndroid Build Coastguard Worker           << " dex_file=" << &entry.first
4544*795d594fSAndroid Build Coastguard Worker           << " weak_root=" << data.weak_root
4545*795d594fSAndroid Build Coastguard Worker           << " decoded_weak_root=" << self->DecodeJObject(data.weak_root)
4546*795d594fSAndroid Build Coastguard Worker           << " dex_cache_data=" << &data;
4547*795d594fSAndroid Build Coastguard Worker     }
4548*795d594fSAndroid Build Coastguard Worker   }
4549*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "Failed to find DexCache for OatDexFile "
4550*795d594fSAndroid Build Coastguard Worker              << oat_dex_file.GetDexFileLocation()
4551*795d594fSAndroid Build Coastguard Worker              << " oat_dex_file=" << &oat_dex_file
4552*795d594fSAndroid Build Coastguard Worker              << " oat_file=" << oat_dex_file.GetOatFile()
4553*795d594fSAndroid Build Coastguard Worker              << " oat_location=" << oat_dex_file.GetOatFile()->GetLocation();
4554*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
4555*795d594fSAndroid Build Coastguard Worker }
4556*795d594fSAndroid Build Coastguard Worker 
FindClassTable(Thread * self,ObjPtr<mirror::DexCache> dex_cache)4557*795d594fSAndroid Build Coastguard Worker ClassTable* ClassLinker::FindClassTable(Thread* self, ObjPtr<mirror::DexCache> dex_cache) {
4558*795d594fSAndroid Build Coastguard Worker   const DexFile* dex_file = dex_cache->GetDexFile();
4559*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_file != nullptr);
4560*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(self, *Locks::dex_lock_);
4561*795d594fSAndroid Build Coastguard Worker   auto it = dex_caches_.find(dex_file);
4562*795d594fSAndroid Build Coastguard Worker   if (it != dex_caches_.end()) {
4563*795d594fSAndroid Build Coastguard Worker     const DexCacheData& data = it->second;
4564*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::DexCache> registered_dex_cache = DecodeDexCacheLocked(self, &data);
4565*795d594fSAndroid Build Coastguard Worker     if (registered_dex_cache != nullptr) {
4566*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(registered_dex_cache, dex_cache) << dex_file->GetLocation();
4567*795d594fSAndroid Build Coastguard Worker       return data.class_table;
4568*795d594fSAndroid Build Coastguard Worker     }
4569*795d594fSAndroid Build Coastguard Worker   }
4570*795d594fSAndroid Build Coastguard Worker   return nullptr;
4571*795d594fSAndroid Build Coastguard Worker }
4572*795d594fSAndroid Build Coastguard Worker 
FindDexCacheDataLocked(const OatDexFile & oat_dex_file)4573*795d594fSAndroid Build Coastguard Worker const ClassLinker::DexCacheData* ClassLinker::FindDexCacheDataLocked(
4574*795d594fSAndroid Build Coastguard Worker     const OatDexFile& oat_dex_file) {
4575*795d594fSAndroid Build Coastguard Worker   auto it = std::find_if(dex_caches_.begin(), dex_caches_.end(), [&](const auto& entry) {
4576*795d594fSAndroid Build Coastguard Worker     return entry.first->GetOatDexFile() == &oat_dex_file;
4577*795d594fSAndroid Build Coastguard Worker   });
4578*795d594fSAndroid Build Coastguard Worker   return it != dex_caches_.end() ? &it->second : nullptr;
4579*795d594fSAndroid Build Coastguard Worker }
4580*795d594fSAndroid Build Coastguard Worker 
FindDexCacheDataLocked(const DexFile & dex_file)4581*795d594fSAndroid Build Coastguard Worker const ClassLinker::DexCacheData* ClassLinker::FindDexCacheDataLocked(const DexFile& dex_file) {
4582*795d594fSAndroid Build Coastguard Worker   auto it = dex_caches_.find(&dex_file);
4583*795d594fSAndroid Build Coastguard Worker   return it != dex_caches_.end() ? &it->second : nullptr;
4584*795d594fSAndroid Build Coastguard Worker }
4585*795d594fSAndroid Build Coastguard Worker 
CreatePrimitiveClass(Thread * self,Primitive::Type type,ClassRoot primitive_root)4586*795d594fSAndroid Build Coastguard Worker void ClassLinker::CreatePrimitiveClass(Thread* self,
4587*795d594fSAndroid Build Coastguard Worker                                        Primitive::Type type,
4588*795d594fSAndroid Build Coastguard Worker                                        ClassRoot primitive_root) {
4589*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> primitive_class =
4590*795d594fSAndroid Build Coastguard Worker       AllocClass(self, mirror::Class::PrimitiveClassSize(image_pointer_size_));
4591*795d594fSAndroid Build Coastguard Worker   CHECK(primitive_class != nullptr) << "OOM for primitive class " << type;
4592*795d594fSAndroid Build Coastguard Worker   // Do not hold lock on the primitive class object, the initialization of
4593*795d594fSAndroid Build Coastguard Worker   // primitive classes is done while the process is still single threaded.
4594*795d594fSAndroid Build Coastguard Worker   primitive_class->SetAccessFlagsDuringLinking(kAccPublic | kAccFinal | kAccAbstract);
4595*795d594fSAndroid Build Coastguard Worker   primitive_class->SetPrimitiveType(type);
4596*795d594fSAndroid Build Coastguard Worker   primitive_class->SetIfTable(GetClassRoot<mirror::Object>(this)->GetIfTable());
4597*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(primitive_class->NumMethods(), 0u);
4598*795d594fSAndroid Build Coastguard Worker   // Primitive classes are initialized during single threaded startup, so visibly initialized.
4599*795d594fSAndroid Build Coastguard Worker   primitive_class->SetStatusForPrimitiveOrArray(ClassStatus::kVisiblyInitialized);
4600*795d594fSAndroid Build Coastguard Worker   std::string_view descriptor(Primitive::Descriptor(type));
4601*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> existing = InsertClass(descriptor,
4602*795d594fSAndroid Build Coastguard Worker                                                primitive_class,
4603*795d594fSAndroid Build Coastguard Worker                                                ComputeModifiedUtf8Hash(descriptor));
4604*795d594fSAndroid Build Coastguard Worker   CHECK(existing == nullptr) << "InitPrimitiveClass(" << type << ") failed";
4605*795d594fSAndroid Build Coastguard Worker   SetClassRoot(primitive_root, primitive_class);
4606*795d594fSAndroid Build Coastguard Worker }
4607*795d594fSAndroid Build Coastguard Worker 
GetArrayIfTable()4608*795d594fSAndroid Build Coastguard Worker inline ObjPtr<mirror::IfTable> ClassLinker::GetArrayIfTable() {
4609*795d594fSAndroid Build Coastguard Worker   return GetClassRoot<mirror::ObjectArray<mirror::Object>>(this)->GetIfTable();
4610*795d594fSAndroid Build Coastguard Worker }
4611*795d594fSAndroid Build Coastguard Worker 
4612*795d594fSAndroid Build Coastguard Worker // Create an array class (i.e. the class object for the array, not the
4613*795d594fSAndroid Build Coastguard Worker // array itself).  "descriptor" looks like "[C" or "[[[[B" or
4614*795d594fSAndroid Build Coastguard Worker // "[Ljava/lang/String;".
4615*795d594fSAndroid Build Coastguard Worker //
4616*795d594fSAndroid Build Coastguard Worker // If "descriptor" refers to an array of primitives, look up the
4617*795d594fSAndroid Build Coastguard Worker // primitive type's internally-generated class object.
4618*795d594fSAndroid Build Coastguard Worker //
4619*795d594fSAndroid Build Coastguard Worker // "class_loader" is the class loader of the class that's referring to
4620*795d594fSAndroid Build Coastguard Worker // us.  It's used to ensure that we're looking for the element type in
4621*795d594fSAndroid Build Coastguard Worker // the right context.  It does NOT become the class loader for the
4622*795d594fSAndroid Build Coastguard Worker // array class; that always comes from the base element class.
4623*795d594fSAndroid Build Coastguard Worker //
4624*795d594fSAndroid Build Coastguard Worker // Returns null with an exception raised on failure.
CreateArrayClass(Thread * self,const char * descriptor,size_t descriptor_length,size_t hash,Handle<mirror::ClassLoader> class_loader)4625*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::CreateArrayClass(Thread* self,
4626*795d594fSAndroid Build Coastguard Worker                                                     const char* descriptor,
4627*795d594fSAndroid Build Coastguard Worker                                                     size_t descriptor_length,
4628*795d594fSAndroid Build Coastguard Worker                                                     size_t hash,
4629*795d594fSAndroid Build Coastguard Worker                                                     Handle<mirror::ClassLoader> class_loader) {
4630*795d594fSAndroid Build Coastguard Worker   // Identify the underlying component type
4631*795d594fSAndroid Build Coastguard Worker   CHECK_EQ('[', descriptor[0]);
4632*795d594fSAndroid Build Coastguard Worker   std::string_view sv_descriptor(descriptor, descriptor_length);
4633*795d594fSAndroid Build Coastguard Worker   StackHandleScope<2> hs(self);
4634*795d594fSAndroid Build Coastguard Worker 
4635*795d594fSAndroid Build Coastguard Worker   // This is to prevent the calls to ClassLoad and ClassPrepare which can cause java/user-supplied
4636*795d594fSAndroid Build Coastguard Worker   // code to be executed. We put it up here so we can avoid all the allocations associated with
4637*795d594fSAndroid Build Coastguard Worker   // creating the class. This can happen with (eg) jit threads.
4638*795d594fSAndroid Build Coastguard Worker   if (!self->CanLoadClasses()) {
4639*795d594fSAndroid Build Coastguard Worker     // Make sure we don't try to load anything, potentially causing an infinite loop.
4640*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Throwable> pre_allocated =
4641*795d594fSAndroid Build Coastguard Worker         Runtime::Current()->GetPreAllocatedNoClassDefFoundError();
4642*795d594fSAndroid Build Coastguard Worker     self->SetException(pre_allocated);
4643*795d594fSAndroid Build Coastguard Worker     return nullptr;
4644*795d594fSAndroid Build Coastguard Worker   }
4645*795d594fSAndroid Build Coastguard Worker 
4646*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::Class> component_type =
4647*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(FindClass(self, descriptor + 1, descriptor_length - 1, class_loader));
4648*795d594fSAndroid Build Coastguard Worker   if (component_type == nullptr) {
4649*795d594fSAndroid Build Coastguard Worker     DCHECK(self->IsExceptionPending());
4650*795d594fSAndroid Build Coastguard Worker     // We need to accept erroneous classes as component types. Under AOT, we
4651*795d594fSAndroid Build Coastguard Worker     // don't accept them as we cannot encode the erroneous class in an image.
4652*795d594fSAndroid Build Coastguard Worker     std::string_view component_descriptor = sv_descriptor.substr(1u);
4653*795d594fSAndroid Build Coastguard Worker     const size_t component_hash = ComputeModifiedUtf8Hash(component_descriptor);
4654*795d594fSAndroid Build Coastguard Worker     component_type.Assign(
4655*795d594fSAndroid Build Coastguard Worker         LookupClass(self, component_descriptor, component_hash, class_loader.Get()));
4656*795d594fSAndroid Build Coastguard Worker     if (component_type == nullptr || Runtime::Current()->IsAotCompiler()) {
4657*795d594fSAndroid Build Coastguard Worker       DCHECK(self->IsExceptionPending());
4658*795d594fSAndroid Build Coastguard Worker       return nullptr;
4659*795d594fSAndroid Build Coastguard Worker     } else {
4660*795d594fSAndroid Build Coastguard Worker       self->ClearException();
4661*795d594fSAndroid Build Coastguard Worker     }
4662*795d594fSAndroid Build Coastguard Worker   }
4663*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(component_type->IsPrimitiveVoid())) {
4664*795d594fSAndroid Build Coastguard Worker     ThrowNoClassDefFoundError("Attempt to create array of void primitive type");
4665*795d594fSAndroid Build Coastguard Worker     return nullptr;
4666*795d594fSAndroid Build Coastguard Worker   }
4667*795d594fSAndroid Build Coastguard Worker   // See if the component type is already loaded.  Array classes are
4668*795d594fSAndroid Build Coastguard Worker   // always associated with the class loader of their underlying
4669*795d594fSAndroid Build Coastguard Worker   // element type -- an array of Strings goes with the loader for
4670*795d594fSAndroid Build Coastguard Worker   // java/lang/String -- so we need to look for it there.  (The
4671*795d594fSAndroid Build Coastguard Worker   // caller should have checked for the existence of the class
4672*795d594fSAndroid Build Coastguard Worker   // before calling here, but they did so with *their* class loader,
4673*795d594fSAndroid Build Coastguard Worker   // not the component type's loader.)
4674*795d594fSAndroid Build Coastguard Worker   //
4675*795d594fSAndroid Build Coastguard Worker   // If we find it, the caller adds "loader" to the class' initiating
4676*795d594fSAndroid Build Coastguard Worker   // loader list, which should prevent us from going through this again.
4677*795d594fSAndroid Build Coastguard Worker   //
4678*795d594fSAndroid Build Coastguard Worker   // This call is unnecessary if "loader" and "component_type->GetClassLoader()"
4679*795d594fSAndroid Build Coastguard Worker   // are the same, because our caller (FindClass) just did the
4680*795d594fSAndroid Build Coastguard Worker   // lookup.  (Even if we get this wrong we still have correct behavior,
4681*795d594fSAndroid Build Coastguard Worker   // because we effectively do this lookup again when we add the new
4682*795d594fSAndroid Build Coastguard Worker   // class to the hash table --- necessary because of possible races with
4683*795d594fSAndroid Build Coastguard Worker   // other threads.)
4684*795d594fSAndroid Build Coastguard Worker   if (class_loader.Get() != component_type->GetClassLoader()) {
4685*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> new_class =
4686*795d594fSAndroid Build Coastguard Worker         LookupClass(self, sv_descriptor, hash, component_type->GetClassLoader());
4687*795d594fSAndroid Build Coastguard Worker     if (new_class != nullptr) {
4688*795d594fSAndroid Build Coastguard Worker       return new_class;
4689*795d594fSAndroid Build Coastguard Worker     }
4690*795d594fSAndroid Build Coastguard Worker   }
4691*795d594fSAndroid Build Coastguard Worker   // Core array classes, i.e. Object[], Class[], String[] and primitive
4692*795d594fSAndroid Build Coastguard Worker   // arrays, have special initialization and they should be found above.
4693*795d594fSAndroid Build Coastguard Worker   DCHECK_IMPLIES(component_type->IsObjectClass(),
4694*795d594fSAndroid Build Coastguard Worker                  // Guard from false positives for errors before setting superclass.
4695*795d594fSAndroid Build Coastguard Worker                  component_type->IsErroneousUnresolved());
4696*795d594fSAndroid Build Coastguard Worker   DCHECK(!component_type->IsStringClass());
4697*795d594fSAndroid Build Coastguard Worker   DCHECK(!component_type->IsClassClass());
4698*795d594fSAndroid Build Coastguard Worker   DCHECK(!component_type->IsPrimitive());
4699*795d594fSAndroid Build Coastguard Worker 
4700*795d594fSAndroid Build Coastguard Worker   // Fill out the fields in the Class.
4701*795d594fSAndroid Build Coastguard Worker   //
4702*795d594fSAndroid Build Coastguard Worker   // It is possible to execute some methods against arrays, because
4703*795d594fSAndroid Build Coastguard Worker   // all arrays are subclasses of java_lang_Object_, so we need to set
4704*795d594fSAndroid Build Coastguard Worker   // up a vtable.  We can just point at the one in java_lang_Object_.
4705*795d594fSAndroid Build Coastguard Worker   //
4706*795d594fSAndroid Build Coastguard Worker   // Array classes are simple enough that we don't need to do a full
4707*795d594fSAndroid Build Coastguard Worker   // link step.
4708*795d594fSAndroid Build Coastguard Worker   size_t array_class_size = mirror::Array::ClassSize(image_pointer_size_);
4709*795d594fSAndroid Build Coastguard Worker   auto visitor = [this, array_class_size, component_type](ObjPtr<mirror::Object> obj,
4710*795d594fSAndroid Build Coastguard Worker                                                           size_t usable_size)
4711*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
4712*795d594fSAndroid Build Coastguard Worker     ScopedAssertNoTransactionChecks santc("CreateArrayClass");
4713*795d594fSAndroid Build Coastguard Worker     mirror::Class::InitializeClassVisitor init_class(array_class_size);
4714*795d594fSAndroid Build Coastguard Worker     init_class(obj, usable_size);
4715*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass = ObjPtr<mirror::Class>::DownCast(obj);
4716*795d594fSAndroid Build Coastguard Worker     klass->SetComponentType(component_type.Get());
4717*795d594fSAndroid Build Coastguard Worker     // Do not hold lock for initialization, the fence issued after the visitor
4718*795d594fSAndroid Build Coastguard Worker     // returns ensures memory visibility together with the implicit consume
4719*795d594fSAndroid Build Coastguard Worker     // semantics (for all supported architectures) for any thread that loads
4720*795d594fSAndroid Build Coastguard Worker     // the array class reference from any memory locations afterwards.
4721*795d594fSAndroid Build Coastguard Worker     FinishArrayClassSetup(klass);
4722*795d594fSAndroid Build Coastguard Worker   };
4723*795d594fSAndroid Build Coastguard Worker   auto new_class = hs.NewHandle<mirror::Class>(
4724*795d594fSAndroid Build Coastguard Worker       AllocClass(self, GetClassRoot<mirror::Class>(this), array_class_size, visitor));
4725*795d594fSAndroid Build Coastguard Worker   if (new_class == nullptr) {
4726*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
4727*795d594fSAndroid Build Coastguard Worker     return nullptr;
4728*795d594fSAndroid Build Coastguard Worker   }
4729*795d594fSAndroid Build Coastguard Worker 
4730*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> existing = InsertClass(sv_descriptor, new_class.Get(), hash);
4731*795d594fSAndroid Build Coastguard Worker   if (existing == nullptr) {
4732*795d594fSAndroid Build Coastguard Worker     // We postpone ClassLoad and ClassPrepare events to this point in time to avoid
4733*795d594fSAndroid Build Coastguard Worker     // duplicate events in case of races. Array classes don't really follow dedicated
4734*795d594fSAndroid Build Coastguard Worker     // load and prepare, anyways.
4735*795d594fSAndroid Build Coastguard Worker     Runtime::Current()->GetRuntimeCallbacks()->ClassLoad(new_class);
4736*795d594fSAndroid Build Coastguard Worker     Runtime::Current()->GetRuntimeCallbacks()->ClassPrepare(new_class, new_class);
4737*795d594fSAndroid Build Coastguard Worker 
4738*795d594fSAndroid Build Coastguard Worker     jit::Jit::NewTypeLoadedIfUsingJit(new_class.Get());
4739*795d594fSAndroid Build Coastguard Worker     return new_class.Get();
4740*795d594fSAndroid Build Coastguard Worker   }
4741*795d594fSAndroid Build Coastguard Worker   // Another thread must have loaded the class after we
4742*795d594fSAndroid Build Coastguard Worker   // started but before we finished.  Abandon what we've
4743*795d594fSAndroid Build Coastguard Worker   // done.
4744*795d594fSAndroid Build Coastguard Worker   //
4745*795d594fSAndroid Build Coastguard Worker   // (Yes, this happens.)
4746*795d594fSAndroid Build Coastguard Worker 
4747*795d594fSAndroid Build Coastguard Worker   return existing;
4748*795d594fSAndroid Build Coastguard Worker }
4749*795d594fSAndroid Build Coastguard Worker 
LookupPrimitiveClass(char type)4750*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::LookupPrimitiveClass(char type) {
4751*795d594fSAndroid Build Coastguard Worker   ClassRoot class_root;
4752*795d594fSAndroid Build Coastguard Worker   switch (type) {
4753*795d594fSAndroid Build Coastguard Worker     case 'B': class_root = ClassRoot::kPrimitiveByte; break;
4754*795d594fSAndroid Build Coastguard Worker     case 'C': class_root = ClassRoot::kPrimitiveChar; break;
4755*795d594fSAndroid Build Coastguard Worker     case 'D': class_root = ClassRoot::kPrimitiveDouble; break;
4756*795d594fSAndroid Build Coastguard Worker     case 'F': class_root = ClassRoot::kPrimitiveFloat; break;
4757*795d594fSAndroid Build Coastguard Worker     case 'I': class_root = ClassRoot::kPrimitiveInt; break;
4758*795d594fSAndroid Build Coastguard Worker     case 'J': class_root = ClassRoot::kPrimitiveLong; break;
4759*795d594fSAndroid Build Coastguard Worker     case 'S': class_root = ClassRoot::kPrimitiveShort; break;
4760*795d594fSAndroid Build Coastguard Worker     case 'Z': class_root = ClassRoot::kPrimitiveBoolean; break;
4761*795d594fSAndroid Build Coastguard Worker     case 'V': class_root = ClassRoot::kPrimitiveVoid; break;
4762*795d594fSAndroid Build Coastguard Worker     default:
4763*795d594fSAndroid Build Coastguard Worker       return nullptr;
4764*795d594fSAndroid Build Coastguard Worker   }
4765*795d594fSAndroid Build Coastguard Worker   return GetClassRoot(class_root, this);
4766*795d594fSAndroid Build Coastguard Worker }
4767*795d594fSAndroid Build Coastguard Worker 
FindPrimitiveClass(char type)4768*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::FindPrimitiveClass(char type) {
4769*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> result = LookupPrimitiveClass(type);
4770*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(result == nullptr)) {
4771*795d594fSAndroid Build Coastguard Worker     std::string printable_type(PrintableChar(type));
4772*795d594fSAndroid Build Coastguard Worker     ThrowNoClassDefFoundError("Not a primitive type: %s", printable_type.c_str());
4773*795d594fSAndroid Build Coastguard Worker   }
4774*795d594fSAndroid Build Coastguard Worker   return result;
4775*795d594fSAndroid Build Coastguard Worker }
4776*795d594fSAndroid Build Coastguard Worker 
InsertClass(std::string_view descriptor,ObjPtr<mirror::Class> klass,size_t hash)4777*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::InsertClass(std::string_view descriptor,
4778*795d594fSAndroid Build Coastguard Worker                                                ObjPtr<mirror::Class> klass,
4779*795d594fSAndroid Build Coastguard Worker                                                size_t hash) {
4780*795d594fSAndroid Build Coastguard Worker   DCHECK(Thread::Current()->CanLoadClasses());
4781*795d594fSAndroid Build Coastguard Worker   if (VLOG_IS_ON(class_linker)) {
4782*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::DexCache> dex_cache = klass->GetDexCache();
4783*795d594fSAndroid Build Coastguard Worker     std::string source;
4784*795d594fSAndroid Build Coastguard Worker     if (dex_cache != nullptr) {
4785*795d594fSAndroid Build Coastguard Worker       source += " from ";
4786*795d594fSAndroid Build Coastguard Worker       source += dex_cache->GetLocation()->ToModifiedUtf8();
4787*795d594fSAndroid Build Coastguard Worker     }
4788*795d594fSAndroid Build Coastguard Worker     LOG(INFO) << "Loaded class " << descriptor << source;
4789*795d594fSAndroid Build Coastguard Worker   }
4790*795d594fSAndroid Build Coastguard Worker   {
4791*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
4792*795d594fSAndroid Build Coastguard Worker     const ObjPtr<mirror::ClassLoader> class_loader = klass->GetClassLoader();
4793*795d594fSAndroid Build Coastguard Worker     ClassTable* const class_table = InsertClassTableForClassLoader(class_loader);
4794*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> existing = class_table->Lookup(descriptor, hash);
4795*795d594fSAndroid Build Coastguard Worker     if (existing != nullptr) {
4796*795d594fSAndroid Build Coastguard Worker       return existing;
4797*795d594fSAndroid Build Coastguard Worker     }
4798*795d594fSAndroid Build Coastguard Worker     VerifyObject(klass);
4799*795d594fSAndroid Build Coastguard Worker     class_table->InsertWithHash(klass, hash);
4800*795d594fSAndroid Build Coastguard Worker     WriteBarrierOnClassLoaderLocked(class_loader, klass);
4801*795d594fSAndroid Build Coastguard Worker   }
4802*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
4803*795d594fSAndroid Build Coastguard Worker     // Test that copied methods correctly can find their holder.
4804*795d594fSAndroid Build Coastguard Worker     for (ArtMethod& method : klass->GetCopiedMethods(image_pointer_size_)) {
4805*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(GetHoldingClassOfCopiedMethod(&method), klass);
4806*795d594fSAndroid Build Coastguard Worker     }
4807*795d594fSAndroid Build Coastguard Worker   }
4808*795d594fSAndroid Build Coastguard Worker   return nullptr;
4809*795d594fSAndroid Build Coastguard Worker }
4810*795d594fSAndroid Build Coastguard Worker 
WriteBarrierForBootOatFileBssRoots(const OatFile * oat_file)4811*795d594fSAndroid Build Coastguard Worker void ClassLinker::WriteBarrierForBootOatFileBssRoots(const OatFile* oat_file) {
4812*795d594fSAndroid Build Coastguard Worker   WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
4813*795d594fSAndroid Build Coastguard Worker   DCHECK(!oat_file->GetBssGcRoots().empty()) << oat_file->GetLocation();
4814*795d594fSAndroid Build Coastguard Worker   if (log_new_roots_ && !ContainsElement(new_bss_roots_boot_oat_files_, oat_file)) {
4815*795d594fSAndroid Build Coastguard Worker     new_bss_roots_boot_oat_files_.push_back(oat_file);
4816*795d594fSAndroid Build Coastguard Worker   }
4817*795d594fSAndroid Build Coastguard Worker }
4818*795d594fSAndroid Build Coastguard Worker 
4819*795d594fSAndroid Build Coastguard Worker // TODO This should really be in mirror::Class.
UpdateClassMethods(ObjPtr<mirror::Class> klass,LengthPrefixedArray<ArtMethod> * new_methods)4820*795d594fSAndroid Build Coastguard Worker void ClassLinker::UpdateClassMethods(ObjPtr<mirror::Class> klass,
4821*795d594fSAndroid Build Coastguard Worker                                      LengthPrefixedArray<ArtMethod>* new_methods) {
4822*795d594fSAndroid Build Coastguard Worker   klass->SetMethodsPtrUnchecked(new_methods,
4823*795d594fSAndroid Build Coastguard Worker                                 klass->NumDirectMethods(),
4824*795d594fSAndroid Build Coastguard Worker                                 klass->NumDeclaredVirtualMethods());
4825*795d594fSAndroid Build Coastguard Worker   // Need to mark the card so that the remembered sets and mod union tables get updated.
4826*795d594fSAndroid Build Coastguard Worker   WriteBarrier::ForEveryFieldWrite(klass);
4827*795d594fSAndroid Build Coastguard Worker }
4828*795d594fSAndroid Build Coastguard Worker 
LookupClass(Thread * self,std::string_view descriptor,ObjPtr<mirror::ClassLoader> class_loader)4829*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::LookupClass(Thread* self,
4830*795d594fSAndroid Build Coastguard Worker                                                std::string_view descriptor,
4831*795d594fSAndroid Build Coastguard Worker                                                ObjPtr<mirror::ClassLoader> class_loader) {
4832*795d594fSAndroid Build Coastguard Worker   return LookupClass(self, descriptor, ComputeModifiedUtf8Hash(descriptor), class_loader);
4833*795d594fSAndroid Build Coastguard Worker }
4834*795d594fSAndroid Build Coastguard Worker 
LookupClass(Thread * self,std::string_view descriptor,size_t hash,ObjPtr<mirror::ClassLoader> class_loader)4835*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::LookupClass(Thread* self,
4836*795d594fSAndroid Build Coastguard Worker                                                std::string_view descriptor,
4837*795d594fSAndroid Build Coastguard Worker                                                size_t hash,
4838*795d594fSAndroid Build Coastguard Worker                                                ObjPtr<mirror::ClassLoader> class_loader) {
4839*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_);
4840*795d594fSAndroid Build Coastguard Worker   ClassTable* const class_table = ClassTableForClassLoader(class_loader);
4841*795d594fSAndroid Build Coastguard Worker   if (class_table != nullptr) {
4842*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> result = class_table->Lookup(descriptor, hash);
4843*795d594fSAndroid Build Coastguard Worker     if (result != nullptr) {
4844*795d594fSAndroid Build Coastguard Worker       return result;
4845*795d594fSAndroid Build Coastguard Worker     }
4846*795d594fSAndroid Build Coastguard Worker   }
4847*795d594fSAndroid Build Coastguard Worker   return nullptr;
4848*795d594fSAndroid Build Coastguard Worker }
4849*795d594fSAndroid Build Coastguard Worker 
4850*795d594fSAndroid Build Coastguard Worker class MoveClassTableToPreZygoteVisitor : public ClassLoaderVisitor {
4851*795d594fSAndroid Build Coastguard Worker  public:
MoveClassTableToPreZygoteVisitor()4852*795d594fSAndroid Build Coastguard Worker   MoveClassTableToPreZygoteVisitor() {}
4853*795d594fSAndroid Build Coastguard Worker 
Visit(ObjPtr<mirror::ClassLoader> class_loader)4854*795d594fSAndroid Build Coastguard Worker   void Visit(ObjPtr<mirror::ClassLoader> class_loader)
4855*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::classlinker_classes_lock_)
4856*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) override {
4857*795d594fSAndroid Build Coastguard Worker     ClassTable* const class_table = class_loader->GetClassTable();
4858*795d594fSAndroid Build Coastguard Worker     if (class_table != nullptr) {
4859*795d594fSAndroid Build Coastguard Worker       class_table->FreezeSnapshot();
4860*795d594fSAndroid Build Coastguard Worker     }
4861*795d594fSAndroid Build Coastguard Worker   }
4862*795d594fSAndroid Build Coastguard Worker };
4863*795d594fSAndroid Build Coastguard Worker 
MoveClassTableToPreZygote()4864*795d594fSAndroid Build Coastguard Worker void ClassLinker::MoveClassTableToPreZygote() {
4865*795d594fSAndroid Build Coastguard Worker   WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
4866*795d594fSAndroid Build Coastguard Worker   boot_class_table_->FreezeSnapshot();
4867*795d594fSAndroid Build Coastguard Worker   MoveClassTableToPreZygoteVisitor visitor;
4868*795d594fSAndroid Build Coastguard Worker   VisitClassLoaders(&visitor);
4869*795d594fSAndroid Build Coastguard Worker }
4870*795d594fSAndroid Build Coastguard Worker 
AttemptSupertypeVerification(Thread * self,verifier::VerifierDeps * verifier_deps,Handle<mirror::Class> klass,Handle<mirror::Class> supertype)4871*795d594fSAndroid Build Coastguard Worker bool ClassLinker::AttemptSupertypeVerification(Thread* self,
4872*795d594fSAndroid Build Coastguard Worker                                                verifier::VerifierDeps* verifier_deps,
4873*795d594fSAndroid Build Coastguard Worker                                                Handle<mirror::Class> klass,
4874*795d594fSAndroid Build Coastguard Worker                                                Handle<mirror::Class> supertype) {
4875*795d594fSAndroid Build Coastguard Worker   DCHECK(self != nullptr);
4876*795d594fSAndroid Build Coastguard Worker   DCHECK(klass != nullptr);
4877*795d594fSAndroid Build Coastguard Worker   DCHECK(supertype != nullptr);
4878*795d594fSAndroid Build Coastguard Worker 
4879*795d594fSAndroid Build Coastguard Worker   if (!supertype->IsVerified() && !supertype->IsErroneous()) {
4880*795d594fSAndroid Build Coastguard Worker     VerifyClass(self, verifier_deps, supertype);
4881*795d594fSAndroid Build Coastguard Worker   }
4882*795d594fSAndroid Build Coastguard Worker 
4883*795d594fSAndroid Build Coastguard Worker   if (supertype->IsVerified()
4884*795d594fSAndroid Build Coastguard Worker       || supertype->ShouldVerifyAtRuntime()
4885*795d594fSAndroid Build Coastguard Worker       || supertype->IsVerifiedNeedsAccessChecks()) {
4886*795d594fSAndroid Build Coastguard Worker     // The supertype is either verified, or we soft failed at AOT time.
4887*795d594fSAndroid Build Coastguard Worker     DCHECK(supertype->IsVerified() || Runtime::Current()->IsAotCompiler());
4888*795d594fSAndroid Build Coastguard Worker     return true;
4889*795d594fSAndroid Build Coastguard Worker   }
4890*795d594fSAndroid Build Coastguard Worker   // If we got this far then we have a hard failure.
4891*795d594fSAndroid Build Coastguard Worker   std::string error_msg =
4892*795d594fSAndroid Build Coastguard Worker       StringPrintf("Rejecting class %s that attempts to sub-type erroneous class %s",
4893*795d594fSAndroid Build Coastguard Worker                    klass->PrettyDescriptor().c_str(),
4894*795d594fSAndroid Build Coastguard Worker                    supertype->PrettyDescriptor().c_str());
4895*795d594fSAndroid Build Coastguard Worker   LOG(WARNING) << error_msg  << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8();
4896*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(self);
4897*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Throwable> cause(hs.NewHandle(self->GetException()));
4898*795d594fSAndroid Build Coastguard Worker   if (cause != nullptr) {
4899*795d594fSAndroid Build Coastguard Worker     // Set during VerifyClass call (if at all).
4900*795d594fSAndroid Build Coastguard Worker     self->ClearException();
4901*795d594fSAndroid Build Coastguard Worker   }
4902*795d594fSAndroid Build Coastguard Worker   // Change into a verify error.
4903*795d594fSAndroid Build Coastguard Worker   ThrowVerifyError(klass.Get(), "%s", error_msg.c_str());
4904*795d594fSAndroid Build Coastguard Worker   if (cause != nullptr) {
4905*795d594fSAndroid Build Coastguard Worker     self->GetException()->SetCause(cause.Get());
4906*795d594fSAndroid Build Coastguard Worker   }
4907*795d594fSAndroid Build Coastguard Worker   ClassReference ref(klass->GetDexCache()->GetDexFile(), klass->GetDexClassDefIndex());
4908*795d594fSAndroid Build Coastguard Worker   if (Runtime::Current()->IsAotCompiler()) {
4909*795d594fSAndroid Build Coastguard Worker     Runtime::Current()->GetCompilerCallbacks()->ClassRejected(ref);
4910*795d594fSAndroid Build Coastguard Worker   }
4911*795d594fSAndroid Build Coastguard Worker   // Need to grab the lock to change status.
4912*795d594fSAndroid Build Coastguard Worker   ObjectLock<mirror::Class> super_lock(self, klass);
4913*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(klass, ClassStatus::kErrorResolved, self);
4914*795d594fSAndroid Build Coastguard Worker   return false;
4915*795d594fSAndroid Build Coastguard Worker }
4916*795d594fSAndroid Build Coastguard Worker 
VerifyClass(Thread * self,verifier::VerifierDeps * verifier_deps,Handle<mirror::Class> klass,verifier::HardFailLogMode log_level)4917*795d594fSAndroid Build Coastguard Worker verifier::FailureKind ClassLinker::VerifyClass(Thread* self,
4918*795d594fSAndroid Build Coastguard Worker                                                verifier::VerifierDeps* verifier_deps,
4919*795d594fSAndroid Build Coastguard Worker                                                Handle<mirror::Class> klass,
4920*795d594fSAndroid Build Coastguard Worker                                                verifier::HardFailLogMode log_level) {
4921*795d594fSAndroid Build Coastguard Worker   {
4922*795d594fSAndroid Build Coastguard Worker     // TODO: assert that the monitor on the Class is held
4923*795d594fSAndroid Build Coastguard Worker     ObjectLock<mirror::Class> lock(self, klass);
4924*795d594fSAndroid Build Coastguard Worker 
4925*795d594fSAndroid Build Coastguard Worker     // Is somebody verifying this now?
4926*795d594fSAndroid Build Coastguard Worker     ClassStatus old_status = klass->GetStatus();
4927*795d594fSAndroid Build Coastguard Worker     while (old_status == ClassStatus::kVerifying) {
4928*795d594fSAndroid Build Coastguard Worker       lock.WaitIgnoringInterrupts();
4929*795d594fSAndroid Build Coastguard Worker       // WaitIgnoringInterrupts can still receive an interrupt and return early, in this
4930*795d594fSAndroid Build Coastguard Worker       // case we may see the same status again. b/62912904. This is why the check is
4931*795d594fSAndroid Build Coastguard Worker       // greater or equal.
4932*795d594fSAndroid Build Coastguard Worker       CHECK(klass->IsErroneous() || (klass->GetStatus() >= old_status))
4933*795d594fSAndroid Build Coastguard Worker           << "Class '" << klass->PrettyClass()
4934*795d594fSAndroid Build Coastguard Worker           << "' performed an illegal verification state transition from " << old_status
4935*795d594fSAndroid Build Coastguard Worker           << " to " << klass->GetStatus();
4936*795d594fSAndroid Build Coastguard Worker       old_status = klass->GetStatus();
4937*795d594fSAndroid Build Coastguard Worker     }
4938*795d594fSAndroid Build Coastguard Worker 
4939*795d594fSAndroid Build Coastguard Worker     // The class might already be erroneous, for example at compile time if we attempted to verify
4940*795d594fSAndroid Build Coastguard Worker     // this class as a parent to another.
4941*795d594fSAndroid Build Coastguard Worker     if (klass->IsErroneous()) {
4942*795d594fSAndroid Build Coastguard Worker       ThrowEarlierClassFailure(klass.Get());
4943*795d594fSAndroid Build Coastguard Worker       return verifier::FailureKind::kHardFailure;
4944*795d594fSAndroid Build Coastguard Worker     }
4945*795d594fSAndroid Build Coastguard Worker 
4946*795d594fSAndroid Build Coastguard Worker     // Don't attempt to re-verify if already verified.
4947*795d594fSAndroid Build Coastguard Worker     if (klass->IsVerified()) {
4948*795d594fSAndroid Build Coastguard Worker       if (verifier_deps != nullptr &&
4949*795d594fSAndroid Build Coastguard Worker           verifier_deps->ContainsDexFile(klass->GetDexFile()) &&
4950*795d594fSAndroid Build Coastguard Worker           !verifier_deps->HasRecordedVerifiedStatus(klass->GetDexFile(), *klass->GetClassDef()) &&
4951*795d594fSAndroid Build Coastguard Worker           !Runtime::Current()->IsAotCompiler()) {
4952*795d594fSAndroid Build Coastguard Worker         // If the klass is verified, but `verifier_deps` did not record it, this
4953*795d594fSAndroid Build Coastguard Worker         // means we are running background verification of a secondary dex file.
4954*795d594fSAndroid Build Coastguard Worker         // Re-run the verifier to populate `verifier_deps`.
4955*795d594fSAndroid Build Coastguard Worker         // No need to run the verification when running on the AOT Compiler, as
4956*795d594fSAndroid Build Coastguard Worker         // the driver handles those multithreaded cases already.
4957*795d594fSAndroid Build Coastguard Worker         std::string error_msg;
4958*795d594fSAndroid Build Coastguard Worker         verifier::FailureKind failure =
4959*795d594fSAndroid Build Coastguard Worker             PerformClassVerification(self, verifier_deps, klass, log_level, &error_msg);
4960*795d594fSAndroid Build Coastguard Worker         // We could have soft failures, so just check that we don't have a hard
4961*795d594fSAndroid Build Coastguard Worker         // failure.
4962*795d594fSAndroid Build Coastguard Worker         DCHECK_NE(failure, verifier::FailureKind::kHardFailure) << error_msg;
4963*795d594fSAndroid Build Coastguard Worker       }
4964*795d594fSAndroid Build Coastguard Worker       return verifier::FailureKind::kNoFailure;
4965*795d594fSAndroid Build Coastguard Worker     }
4966*795d594fSAndroid Build Coastguard Worker 
4967*795d594fSAndroid Build Coastguard Worker     if (klass->IsVerifiedNeedsAccessChecks()) {
4968*795d594fSAndroid Build Coastguard Worker       if (!Runtime::Current()->IsAotCompiler()) {
4969*795d594fSAndroid Build Coastguard Worker         // Mark the class as having a verification attempt to avoid re-running
4970*795d594fSAndroid Build Coastguard Worker         // the verifier.
4971*795d594fSAndroid Build Coastguard Worker         mirror::Class::SetStatus(klass, ClassStatus::kVerified, self);
4972*795d594fSAndroid Build Coastguard Worker       }
4973*795d594fSAndroid Build Coastguard Worker       return verifier::FailureKind::kAccessChecksFailure;
4974*795d594fSAndroid Build Coastguard Worker     }
4975*795d594fSAndroid Build Coastguard Worker 
4976*795d594fSAndroid Build Coastguard Worker     // For AOT, don't attempt to re-verify if we have already found we should
4977*795d594fSAndroid Build Coastguard Worker     // verify at runtime.
4978*795d594fSAndroid Build Coastguard Worker     if (klass->ShouldVerifyAtRuntime()) {
4979*795d594fSAndroid Build Coastguard Worker       CHECK(Runtime::Current()->IsAotCompiler());
4980*795d594fSAndroid Build Coastguard Worker       return verifier::FailureKind::kSoftFailure;
4981*795d594fSAndroid Build Coastguard Worker     }
4982*795d594fSAndroid Build Coastguard Worker 
4983*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(klass->GetStatus(), ClassStatus::kResolved);
4984*795d594fSAndroid Build Coastguard Worker     mirror::Class::SetStatus(klass, ClassStatus::kVerifying, self);
4985*795d594fSAndroid Build Coastguard Worker 
4986*795d594fSAndroid Build Coastguard Worker     // Skip verification if disabled.
4987*795d594fSAndroid Build Coastguard Worker     if (!Runtime::Current()->IsVerificationEnabled()) {
4988*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kVerified, self);
4989*795d594fSAndroid Build Coastguard Worker       UpdateClassAfterVerification(klass, image_pointer_size_, verifier::FailureKind::kNoFailure);
4990*795d594fSAndroid Build Coastguard Worker       return verifier::FailureKind::kNoFailure;
4991*795d594fSAndroid Build Coastguard Worker     }
4992*795d594fSAndroid Build Coastguard Worker   }
4993*795d594fSAndroid Build Coastguard Worker 
4994*795d594fSAndroid Build Coastguard Worker   VLOG(class_linker) << "Beginning verification for class: "
4995*795d594fSAndroid Build Coastguard Worker                      << klass->PrettyDescriptor()
4996*795d594fSAndroid Build Coastguard Worker                      << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8();
4997*795d594fSAndroid Build Coastguard Worker 
4998*795d594fSAndroid Build Coastguard Worker   // Verify super class.
4999*795d594fSAndroid Build Coastguard Worker   StackHandleScope<2> hs(self);
5000*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::Class> supertype(hs.NewHandle(klass->GetSuperClass()));
5001*795d594fSAndroid Build Coastguard Worker   // If we have a superclass and we get a hard verification failure we can return immediately.
5002*795d594fSAndroid Build Coastguard Worker   if (supertype != nullptr &&
5003*795d594fSAndroid Build Coastguard Worker       !AttemptSupertypeVerification(self, verifier_deps, klass, supertype)) {
5004*795d594fSAndroid Build Coastguard Worker     CHECK(self->IsExceptionPending()) << "Verification error should be pending.";
5005*795d594fSAndroid Build Coastguard Worker     return verifier::FailureKind::kHardFailure;
5006*795d594fSAndroid Build Coastguard Worker   }
5007*795d594fSAndroid Build Coastguard Worker 
5008*795d594fSAndroid Build Coastguard Worker   // Verify all default super-interfaces.
5009*795d594fSAndroid Build Coastguard Worker   //
5010*795d594fSAndroid Build Coastguard Worker   // (1) Don't bother if the superclass has already had a soft verification failure.
5011*795d594fSAndroid Build Coastguard Worker   //
5012*795d594fSAndroid Build Coastguard Worker   // (2) Interfaces shouldn't bother to do this recursive verification because they cannot cause
5013*795d594fSAndroid Build Coastguard Worker   //     recursive initialization by themselves. This is because when an interface is initialized
5014*795d594fSAndroid Build Coastguard Worker   //     directly it must not initialize its superinterfaces. We are allowed to verify regardless
5015*795d594fSAndroid Build Coastguard Worker   //     but choose not to for an optimization. If the interfaces is being verified due to a class
5016*795d594fSAndroid Build Coastguard Worker   //     initialization (which would need all the default interfaces to be verified) the class code
5017*795d594fSAndroid Build Coastguard Worker   //     will trigger the recursive verification anyway.
5018*795d594fSAndroid Build Coastguard Worker   if ((supertype == nullptr || supertype->IsVerified())  // See (1)
5019*795d594fSAndroid Build Coastguard Worker       && !klass->IsInterface()) {                              // See (2)
5020*795d594fSAndroid Build Coastguard Worker     int32_t iftable_count = klass->GetIfTableCount();
5021*795d594fSAndroid Build Coastguard Worker     MutableHandle<mirror::Class> iface(hs.NewHandle<mirror::Class>(nullptr));
5022*795d594fSAndroid Build Coastguard Worker     // Loop through all interfaces this class has defined. It doesn't matter the order.
5023*795d594fSAndroid Build Coastguard Worker     for (int32_t i = 0; i < iftable_count; i++) {
5024*795d594fSAndroid Build Coastguard Worker       iface.Assign(klass->GetIfTable()->GetInterface(i));
5025*795d594fSAndroid Build Coastguard Worker       DCHECK(iface != nullptr);
5026*795d594fSAndroid Build Coastguard Worker       // We only care if we have default interfaces and can skip if we are already verified...
5027*795d594fSAndroid Build Coastguard Worker       if (LIKELY(!iface->HasDefaultMethods() || iface->IsVerified())) {
5028*795d594fSAndroid Build Coastguard Worker         continue;
5029*795d594fSAndroid Build Coastguard Worker       } else if (UNLIKELY(!AttemptSupertypeVerification(self, verifier_deps, klass, iface))) {
5030*795d594fSAndroid Build Coastguard Worker         // We had a hard failure while verifying this interface. Just return immediately.
5031*795d594fSAndroid Build Coastguard Worker         CHECK(self->IsExceptionPending()) << "Verification error should be pending.";
5032*795d594fSAndroid Build Coastguard Worker         return verifier::FailureKind::kHardFailure;
5033*795d594fSAndroid Build Coastguard Worker       } else if (UNLIKELY(!iface->IsVerified())) {
5034*795d594fSAndroid Build Coastguard Worker         // We softly failed to verify the iface. Stop checking and clean up.
5035*795d594fSAndroid Build Coastguard Worker         // Put the iface into the supertype handle so we know what caused us to fail.
5036*795d594fSAndroid Build Coastguard Worker         supertype.Assign(iface.Get());
5037*795d594fSAndroid Build Coastguard Worker         break;
5038*795d594fSAndroid Build Coastguard Worker       }
5039*795d594fSAndroid Build Coastguard Worker     }
5040*795d594fSAndroid Build Coastguard Worker   }
5041*795d594fSAndroid Build Coastguard Worker 
5042*795d594fSAndroid Build Coastguard Worker   // At this point if verification failed, then supertype is the "first" supertype that failed
5043*795d594fSAndroid Build Coastguard Worker   // verification (without a specific order). If verification succeeded, then supertype is either
5044*795d594fSAndroid Build Coastguard Worker   // null or the original superclass of klass and is verified.
5045*795d594fSAndroid Build Coastguard Worker   DCHECK(supertype == nullptr ||
5046*795d594fSAndroid Build Coastguard Worker          supertype.Get() == klass->GetSuperClass() ||
5047*795d594fSAndroid Build Coastguard Worker          !supertype->IsVerified());
5048*795d594fSAndroid Build Coastguard Worker 
5049*795d594fSAndroid Build Coastguard Worker   // Try to use verification information from the oat file, otherwise do runtime verification.
5050*795d594fSAndroid Build Coastguard Worker   const DexFile& dex_file = *klass->GetDexCache()->GetDexFile();
5051*795d594fSAndroid Build Coastguard Worker   ClassStatus oat_file_class_status(ClassStatus::kNotReady);
5052*795d594fSAndroid Build Coastguard Worker   bool preverified = VerifyClassUsingOatFile(self, dex_file, klass, oat_file_class_status);
5053*795d594fSAndroid Build Coastguard Worker 
5054*795d594fSAndroid Build Coastguard Worker   VLOG(class_linker) << "Class preverified status for class "
5055*795d594fSAndroid Build Coastguard Worker                      << klass->PrettyDescriptor()
5056*795d594fSAndroid Build Coastguard Worker                      << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8()
5057*795d594fSAndroid Build Coastguard Worker                      << ": "
5058*795d594fSAndroid Build Coastguard Worker                      << preverified
5059*795d594fSAndroid Build Coastguard Worker                      << " (" << oat_file_class_status << ")";
5060*795d594fSAndroid Build Coastguard Worker 
5061*795d594fSAndroid Build Coastguard Worker   // If the oat file says the class had an error, re-run the verifier. That way we will either:
5062*795d594fSAndroid Build Coastguard Worker   // 1) Be successful at runtime, or
5063*795d594fSAndroid Build Coastguard Worker   // 2) Get a precise error message.
5064*795d594fSAndroid Build Coastguard Worker   DCHECK_IMPLIES(mirror::Class::IsErroneous(oat_file_class_status), !preverified);
5065*795d594fSAndroid Build Coastguard Worker 
5066*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
5067*795d594fSAndroid Build Coastguard Worker   verifier::FailureKind verifier_failure = verifier::FailureKind::kNoFailure;
5068*795d594fSAndroid Build Coastguard Worker   if (!preverified) {
5069*795d594fSAndroid Build Coastguard Worker     verifier_failure = PerformClassVerification(self, verifier_deps, klass, log_level, &error_msg);
5070*795d594fSAndroid Build Coastguard Worker   } else if (oat_file_class_status == ClassStatus::kVerifiedNeedsAccessChecks) {
5071*795d594fSAndroid Build Coastguard Worker     verifier_failure = verifier::FailureKind::kAccessChecksFailure;
5072*795d594fSAndroid Build Coastguard Worker   }
5073*795d594fSAndroid Build Coastguard Worker 
5074*795d594fSAndroid Build Coastguard Worker   // Verification is done, grab the lock again.
5075*795d594fSAndroid Build Coastguard Worker   ObjectLock<mirror::Class> lock(self, klass);
5076*795d594fSAndroid Build Coastguard Worker   self->AssertNoPendingException();
5077*795d594fSAndroid Build Coastguard Worker 
5078*795d594fSAndroid Build Coastguard Worker   if (verifier_failure == verifier::FailureKind::kHardFailure) {
5079*795d594fSAndroid Build Coastguard Worker     VLOG(verifier) << "Verification failed on class " << klass->PrettyDescriptor()
5080*795d594fSAndroid Build Coastguard Worker                   << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8()
5081*795d594fSAndroid Build Coastguard Worker                   << " because: " << error_msg;
5082*795d594fSAndroid Build Coastguard Worker     ThrowVerifyError(klass.Get(), "%s", error_msg.c_str());
5083*795d594fSAndroid Build Coastguard Worker     mirror::Class::SetStatus(klass, ClassStatus::kErrorResolved, self);
5084*795d594fSAndroid Build Coastguard Worker     return verifier_failure;
5085*795d594fSAndroid Build Coastguard Worker   }
5086*795d594fSAndroid Build Coastguard Worker 
5087*795d594fSAndroid Build Coastguard Worker   // Make sure all classes referenced by catch blocks are resolved.
5088*795d594fSAndroid Build Coastguard Worker   ResolveClassExceptionHandlerTypes(klass);
5089*795d594fSAndroid Build Coastguard Worker 
5090*795d594fSAndroid Build Coastguard Worker   if (Runtime::Current()->IsAotCompiler()) {
5091*795d594fSAndroid Build Coastguard Worker     if (supertype != nullptr && supertype->ShouldVerifyAtRuntime()) {
5092*795d594fSAndroid Build Coastguard Worker       // Regardless of our own verification result, we need to verify the class
5093*795d594fSAndroid Build Coastguard Worker       // at runtime if the super class is not verified. This is required in case
5094*795d594fSAndroid Build Coastguard Worker       // we generate an app/boot image.
5095*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kRetryVerificationAtRuntime, self);
5096*795d594fSAndroid Build Coastguard Worker     } else if (verifier_failure == verifier::FailureKind::kNoFailure) {
5097*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kVerified, self);
5098*795d594fSAndroid Build Coastguard Worker     } else if (verifier_failure == verifier::FailureKind::kSoftFailure ||
5099*795d594fSAndroid Build Coastguard Worker                verifier_failure == verifier::FailureKind::kTypeChecksFailure) {
5100*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kRetryVerificationAtRuntime, self);
5101*795d594fSAndroid Build Coastguard Worker     } else {
5102*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kVerifiedNeedsAccessChecks, self);
5103*795d594fSAndroid Build Coastguard Worker     }
5104*795d594fSAndroid Build Coastguard Worker     // Notify the compiler about the verification status, in case the class
5105*795d594fSAndroid Build Coastguard Worker     // was verified implicitly (eg super class of a compiled class). When the
5106*795d594fSAndroid Build Coastguard Worker     // compiler unloads dex file after compilation, we still want to keep
5107*795d594fSAndroid Build Coastguard Worker     // verification states.
5108*795d594fSAndroid Build Coastguard Worker     Runtime::Current()->GetCompilerCallbacks()->UpdateClassState(
5109*795d594fSAndroid Build Coastguard Worker         ClassReference(&klass->GetDexFile(), klass->GetDexClassDefIndex()), klass->GetStatus());
5110*795d594fSAndroid Build Coastguard Worker   } else {
5111*795d594fSAndroid Build Coastguard Worker     mirror::Class::SetStatus(klass, ClassStatus::kVerified, self);
5112*795d594fSAndroid Build Coastguard Worker   }
5113*795d594fSAndroid Build Coastguard Worker 
5114*795d594fSAndroid Build Coastguard Worker   UpdateClassAfterVerification(klass, image_pointer_size_, verifier_failure);
5115*795d594fSAndroid Build Coastguard Worker   return verifier_failure;
5116*795d594fSAndroid Build Coastguard Worker }
5117*795d594fSAndroid Build Coastguard Worker 
PerformClassVerification(Thread * self,verifier::VerifierDeps * verifier_deps,Handle<mirror::Class> klass,verifier::HardFailLogMode log_level,std::string * error_msg)5118*795d594fSAndroid Build Coastguard Worker verifier::FailureKind ClassLinker::PerformClassVerification(Thread* self,
5119*795d594fSAndroid Build Coastguard Worker                                                             verifier::VerifierDeps* verifier_deps,
5120*795d594fSAndroid Build Coastguard Worker                                                             Handle<mirror::Class> klass,
5121*795d594fSAndroid Build Coastguard Worker                                                             verifier::HardFailLogMode log_level,
5122*795d594fSAndroid Build Coastguard Worker                                                             std::string* error_msg) {
5123*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
5124*795d594fSAndroid Build Coastguard Worker   StackHandleScope<2> hs(self);
5125*795d594fSAndroid Build Coastguard Worker   Handle<mirror::DexCache> dex_cache(hs.NewHandle(klass->GetDexCache()));
5126*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader(hs.NewHandle(klass->GetClassLoader()));
5127*795d594fSAndroid Build Coastguard Worker   return verifier::ClassVerifier::VerifyClass(self,
5128*795d594fSAndroid Build Coastguard Worker                                               verifier_deps,
5129*795d594fSAndroid Build Coastguard Worker                                               dex_cache->GetDexFile(),
5130*795d594fSAndroid Build Coastguard Worker                                               klass,
5131*795d594fSAndroid Build Coastguard Worker                                               dex_cache,
5132*795d594fSAndroid Build Coastguard Worker                                               class_loader,
5133*795d594fSAndroid Build Coastguard Worker                                               *klass->GetClassDef(),
5134*795d594fSAndroid Build Coastguard Worker                                               runtime->GetCompilerCallbacks(),
5135*795d594fSAndroid Build Coastguard Worker                                               log_level,
5136*795d594fSAndroid Build Coastguard Worker                                               Runtime::Current()->GetTargetSdkVersion(),
5137*795d594fSAndroid Build Coastguard Worker                                               error_msg);
5138*795d594fSAndroid Build Coastguard Worker }
5139*795d594fSAndroid Build Coastguard Worker 
VerifyClassUsingOatFile(Thread * self,const DexFile & dex_file,Handle<mirror::Class> klass,ClassStatus & oat_file_class_status)5140*795d594fSAndroid Build Coastguard Worker bool ClassLinker::VerifyClassUsingOatFile(Thread* self,
5141*795d594fSAndroid Build Coastguard Worker                                           const DexFile& dex_file,
5142*795d594fSAndroid Build Coastguard Worker                                           Handle<mirror::Class> klass,
5143*795d594fSAndroid Build Coastguard Worker                                           ClassStatus& oat_file_class_status) {
5144*795d594fSAndroid Build Coastguard Worker   // If we're compiling, we can only verify the class using the oat file if
5145*795d594fSAndroid Build Coastguard Worker   // we are not compiling the image or if the class we're verifying is not part of
5146*795d594fSAndroid Build Coastguard Worker   // the compilation unit (app - dependencies). We will let the compiler callback
5147*795d594fSAndroid Build Coastguard Worker   // tell us about the latter.
5148*795d594fSAndroid Build Coastguard Worker   if (Runtime::Current()->IsAotCompiler()) {
5149*795d594fSAndroid Build Coastguard Worker     CompilerCallbacks* callbacks = Runtime::Current()->GetCompilerCallbacks();
5150*795d594fSAndroid Build Coastguard Worker     // We are compiling an app (not the image).
5151*795d594fSAndroid Build Coastguard Worker     if (!callbacks->CanUseOatStatusForVerification(klass.Get())) {
5152*795d594fSAndroid Build Coastguard Worker       return false;
5153*795d594fSAndroid Build Coastguard Worker     }
5154*795d594fSAndroid Build Coastguard Worker   }
5155*795d594fSAndroid Build Coastguard Worker 
5156*795d594fSAndroid Build Coastguard Worker   const OatDexFile* oat_dex_file = dex_file.GetOatDexFile();
5157*795d594fSAndroid Build Coastguard Worker   // In case we run without an image there won't be a backing oat file.
5158*795d594fSAndroid Build Coastguard Worker   if (oat_dex_file == nullptr || oat_dex_file->GetOatFile() == nullptr) {
5159*795d594fSAndroid Build Coastguard Worker     return false;
5160*795d594fSAndroid Build Coastguard Worker   }
5161*795d594fSAndroid Build Coastguard Worker 
5162*795d594fSAndroid Build Coastguard Worker   uint16_t class_def_index = klass->GetDexClassDefIndex();
5163*795d594fSAndroid Build Coastguard Worker   oat_file_class_status = oat_dex_file->GetOatClass(class_def_index).GetStatus();
5164*795d594fSAndroid Build Coastguard Worker   if (oat_file_class_status >= ClassStatus::kVerified) {
5165*795d594fSAndroid Build Coastguard Worker     return true;
5166*795d594fSAndroid Build Coastguard Worker   }
5167*795d594fSAndroid Build Coastguard Worker   if (oat_file_class_status >= ClassStatus::kVerifiedNeedsAccessChecks) {
5168*795d594fSAndroid Build Coastguard Worker     // We return that the class has already been verified, and the caller should
5169*795d594fSAndroid Build Coastguard Worker     // check the class status to ensure we run with access checks.
5170*795d594fSAndroid Build Coastguard Worker     return true;
5171*795d594fSAndroid Build Coastguard Worker   }
5172*795d594fSAndroid Build Coastguard Worker 
5173*795d594fSAndroid Build Coastguard Worker   // Check the class status with the vdex file.
5174*795d594fSAndroid Build Coastguard Worker   const OatFile* oat_file = oat_dex_file->GetOatFile();
5175*795d594fSAndroid Build Coastguard Worker   if (oat_file != nullptr) {
5176*795d594fSAndroid Build Coastguard Worker     ClassStatus vdex_status = oat_file->GetVdexFile()->ComputeClassStatus(self, klass);
5177*795d594fSAndroid Build Coastguard Worker     if (vdex_status >= ClassStatus::kVerifiedNeedsAccessChecks) {
5178*795d594fSAndroid Build Coastguard Worker       VLOG(verifier) << "Vdex verification success for " << klass->PrettyClass();
5179*795d594fSAndroid Build Coastguard Worker       oat_file_class_status = vdex_status;
5180*795d594fSAndroid Build Coastguard Worker       return true;
5181*795d594fSAndroid Build Coastguard Worker     }
5182*795d594fSAndroid Build Coastguard Worker   }
5183*795d594fSAndroid Build Coastguard Worker 
5184*795d594fSAndroid Build Coastguard Worker   // If we only verified a subset of the classes at compile time, we can end up with classes that
5185*795d594fSAndroid Build Coastguard Worker   // were resolved by the verifier.
5186*795d594fSAndroid Build Coastguard Worker   if (oat_file_class_status == ClassStatus::kResolved) {
5187*795d594fSAndroid Build Coastguard Worker     return false;
5188*795d594fSAndroid Build Coastguard Worker   }
5189*795d594fSAndroid Build Coastguard Worker   // We never expect a .oat file to have kRetryVerificationAtRuntime statuses.
5190*795d594fSAndroid Build Coastguard Worker   CHECK_NE(oat_file_class_status, ClassStatus::kRetryVerificationAtRuntime)
5191*795d594fSAndroid Build Coastguard Worker       << klass->PrettyClass() << " " << dex_file.GetLocation();
5192*795d594fSAndroid Build Coastguard Worker 
5193*795d594fSAndroid Build Coastguard Worker   if (mirror::Class::IsErroneous(oat_file_class_status)) {
5194*795d594fSAndroid Build Coastguard Worker     // Compile time verification failed with a hard error. We'll re-run
5195*795d594fSAndroid Build Coastguard Worker     // verification, which might be successful at runtime.
5196*795d594fSAndroid Build Coastguard Worker     return false;
5197*795d594fSAndroid Build Coastguard Worker   }
5198*795d594fSAndroid Build Coastguard Worker   if (oat_file_class_status == ClassStatus::kNotReady) {
5199*795d594fSAndroid Build Coastguard Worker     // Status is uninitialized if we couldn't determine the status at compile time, for example,
5200*795d594fSAndroid Build Coastguard Worker     // not loading the class.
5201*795d594fSAndroid Build Coastguard Worker     // TODO: when the verifier doesn't rely on Class-es failing to resolve/load the type hierarchy
5202*795d594fSAndroid Build Coastguard Worker     // isn't a problem and this case shouldn't occur
5203*795d594fSAndroid Build Coastguard Worker     return false;
5204*795d594fSAndroid Build Coastguard Worker   }
5205*795d594fSAndroid Build Coastguard Worker   std::string temp;
5206*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "Unexpected class status: " << oat_file_class_status
5207*795d594fSAndroid Build Coastguard Worker              << " " << dex_file.GetLocation() << " " << klass->PrettyClass() << " "
5208*795d594fSAndroid Build Coastguard Worker              << klass->GetDescriptor(&temp);
5209*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
5210*795d594fSAndroid Build Coastguard Worker }
5211*795d594fSAndroid Build Coastguard Worker 
ResolveClassExceptionHandlerTypes(Handle<mirror::Class> klass)5212*795d594fSAndroid Build Coastguard Worker void ClassLinker::ResolveClassExceptionHandlerTypes(Handle<mirror::Class> klass) {
5213*795d594fSAndroid Build Coastguard Worker   for (ArtMethod& method : klass->GetMethods(image_pointer_size_)) {
5214*795d594fSAndroid Build Coastguard Worker     ResolveMethodExceptionHandlerTypes(&method);
5215*795d594fSAndroid Build Coastguard Worker   }
5216*795d594fSAndroid Build Coastguard Worker }
5217*795d594fSAndroid Build Coastguard Worker 
ResolveMethodExceptionHandlerTypes(ArtMethod * method)5218*795d594fSAndroid Build Coastguard Worker void ClassLinker::ResolveMethodExceptionHandlerTypes(ArtMethod* method) {
5219*795d594fSAndroid Build Coastguard Worker   // similar to DexVerifier::ScanTryCatchBlocks and dex2oat's ResolveExceptionsForMethod.
5220*795d594fSAndroid Build Coastguard Worker   CodeItemDataAccessor accessor(method->DexInstructionData());
5221*795d594fSAndroid Build Coastguard Worker   if (!accessor.HasCodeItem()) {
5222*795d594fSAndroid Build Coastguard Worker     return;  // native or abstract method
5223*795d594fSAndroid Build Coastguard Worker   }
5224*795d594fSAndroid Build Coastguard Worker   if (accessor.TriesSize() == 0) {
5225*795d594fSAndroid Build Coastguard Worker     return;  // nothing to process
5226*795d594fSAndroid Build Coastguard Worker   }
5227*795d594fSAndroid Build Coastguard Worker   const uint8_t* handlers_ptr = accessor.GetCatchHandlerData(0);
5228*795d594fSAndroid Build Coastguard Worker   CHECK(method->GetDexFile()->IsInDataSection(handlers_ptr))
5229*795d594fSAndroid Build Coastguard Worker       << method->PrettyMethod()
5230*795d594fSAndroid Build Coastguard Worker       << "@" << method->GetDexFile()->GetLocation()
5231*795d594fSAndroid Build Coastguard Worker       << "@" << reinterpret_cast<const void*>(handlers_ptr)
5232*795d594fSAndroid Build Coastguard Worker       << " is_compact_dex=" << method->GetDexFile()->IsCompactDexFile();
5233*795d594fSAndroid Build Coastguard Worker 
5234*795d594fSAndroid Build Coastguard Worker   uint32_t handlers_size = DecodeUnsignedLeb128(&handlers_ptr);
5235*795d594fSAndroid Build Coastguard Worker   for (uint32_t idx = 0; idx < handlers_size; idx++) {
5236*795d594fSAndroid Build Coastguard Worker     CatchHandlerIterator iterator(handlers_ptr);
5237*795d594fSAndroid Build Coastguard Worker     for (; iterator.HasNext(); iterator.Next()) {
5238*795d594fSAndroid Build Coastguard Worker       // Ensure exception types are resolved so that they don't need resolution to be delivered,
5239*795d594fSAndroid Build Coastguard Worker       // unresolved exception types will be ignored by exception delivery
5240*795d594fSAndroid Build Coastguard Worker       if (iterator.GetHandlerTypeIndex().IsValid()) {
5241*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::Class> exception_type = ResolveType(iterator.GetHandlerTypeIndex(), method);
5242*795d594fSAndroid Build Coastguard Worker         if (exception_type == nullptr) {
5243*795d594fSAndroid Build Coastguard Worker           DCHECK(Thread::Current()->IsExceptionPending());
5244*795d594fSAndroid Build Coastguard Worker           Thread::Current()->ClearException();
5245*795d594fSAndroid Build Coastguard Worker         }
5246*795d594fSAndroid Build Coastguard Worker       }
5247*795d594fSAndroid Build Coastguard Worker     }
5248*795d594fSAndroid Build Coastguard Worker     handlers_ptr = iterator.EndDataPointer();
5249*795d594fSAndroid Build Coastguard Worker   }
5250*795d594fSAndroid Build Coastguard Worker }
5251*795d594fSAndroid Build Coastguard Worker 
CreateProxyClass(ScopedObjectAccessAlreadyRunnable & soa,jstring name,jobjectArray interfaces,jobject loader,jobjectArray methods,jobjectArray throws)5252*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa,
5253*795d594fSAndroid Build Coastguard Worker                                                     jstring name,
5254*795d594fSAndroid Build Coastguard Worker                                                     jobjectArray interfaces,
5255*795d594fSAndroid Build Coastguard Worker                                                     jobject loader,
5256*795d594fSAndroid Build Coastguard Worker                                                     jobjectArray methods,
5257*795d594fSAndroid Build Coastguard Worker                                                     jobjectArray throws) {
5258*795d594fSAndroid Build Coastguard Worker   Thread* self = soa.Self();
5259*795d594fSAndroid Build Coastguard Worker 
5260*795d594fSAndroid Build Coastguard Worker   // This is to prevent the calls to ClassLoad and ClassPrepare which can cause java/user-supplied
5261*795d594fSAndroid Build Coastguard Worker   // code to be executed. We put it up here so we can avoid all the allocations associated with
5262*795d594fSAndroid Build Coastguard Worker   // creating the class. This can happen with (eg) jit-threads.
5263*795d594fSAndroid Build Coastguard Worker   if (!self->CanLoadClasses()) {
5264*795d594fSAndroid Build Coastguard Worker     // Make sure we don't try to load anything, potentially causing an infinite loop.
5265*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Throwable> pre_allocated =
5266*795d594fSAndroid Build Coastguard Worker         Runtime::Current()->GetPreAllocatedNoClassDefFoundError();
5267*795d594fSAndroid Build Coastguard Worker     self->SetException(pre_allocated);
5268*795d594fSAndroid Build Coastguard Worker     return nullptr;
5269*795d594fSAndroid Build Coastguard Worker   }
5270*795d594fSAndroid Build Coastguard Worker 
5271*795d594fSAndroid Build Coastguard Worker   StackHandleScope<12> hs(self);
5272*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::Class> temp_klass(hs.NewHandle(
5273*795d594fSAndroid Build Coastguard Worker       AllocClass(self, GetClassRoot<mirror::Class>(this), sizeof(mirror::Class))));
5274*795d594fSAndroid Build Coastguard Worker   if (temp_klass == nullptr) {
5275*795d594fSAndroid Build Coastguard Worker     CHECK(self->IsExceptionPending());  // OOME.
5276*795d594fSAndroid Build Coastguard Worker     return nullptr;
5277*795d594fSAndroid Build Coastguard Worker   }
5278*795d594fSAndroid Build Coastguard Worker   DCHECK(temp_klass->GetClass() != nullptr);
5279*795d594fSAndroid Build Coastguard Worker   temp_klass->SetObjectSize(sizeof(mirror::Proxy));
5280*795d594fSAndroid Build Coastguard Worker   // Set the class access flags incl. VerificationAttempted, so we do not try to set the flag on
5281*795d594fSAndroid Build Coastguard Worker   // the methods.
5282*795d594fSAndroid Build Coastguard Worker   temp_klass->SetAccessFlagsDuringLinking(kAccClassIsProxy | kAccPublic | kAccFinal);
5283*795d594fSAndroid Build Coastguard Worker   temp_klass->SetClassLoader(soa.Decode<mirror::ClassLoader>(loader));
5284*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(temp_klass->GetPrimitiveType(), Primitive::kPrimNot);
5285*795d594fSAndroid Build Coastguard Worker   temp_klass->SetName(soa.Decode<mirror::String>(name));
5286*795d594fSAndroid Build Coastguard Worker   temp_klass->SetDexCache(GetClassRoot<mirror::Proxy>(this)->GetDexCache());
5287*795d594fSAndroid Build Coastguard Worker   // Object has an empty iftable, copy it for that reason.
5288*795d594fSAndroid Build Coastguard Worker   temp_klass->SetIfTable(GetClassRoot<mirror::Object>(this)->GetIfTable());
5289*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(temp_klass, ClassStatus::kIdx, self);
5290*795d594fSAndroid Build Coastguard Worker   std::string descriptor;
5291*795d594fSAndroid Build Coastguard Worker   const char* raw_descriptor = temp_klass->GetDescriptor(&descriptor);
5292*795d594fSAndroid Build Coastguard Worker   DCHECK(raw_descriptor == descriptor.c_str());
5293*795d594fSAndroid Build Coastguard Worker   const size_t hash = ComputeModifiedUtf8Hash(descriptor);
5294*795d594fSAndroid Build Coastguard Worker 
5295*795d594fSAndroid Build Coastguard Worker   // Needs to be before we insert the class so that the allocator field is set.
5296*795d594fSAndroid Build Coastguard Worker   LinearAlloc* const allocator = GetOrCreateAllocatorForClassLoader(temp_klass->GetClassLoader());
5297*795d594fSAndroid Build Coastguard Worker 
5298*795d594fSAndroid Build Coastguard Worker   // Insert the class before loading the fields as the field roots
5299*795d594fSAndroid Build Coastguard Worker   // (ArtField::declaring_class_) are only visited from the class
5300*795d594fSAndroid Build Coastguard Worker   // table. There can't be any suspend points between inserting the
5301*795d594fSAndroid Build Coastguard Worker   // class and setting the field arrays below.
5302*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> existing = InsertClass(descriptor, temp_klass.Get(), hash);
5303*795d594fSAndroid Build Coastguard Worker   CHECK(existing == nullptr);
5304*795d594fSAndroid Build Coastguard Worker 
5305*795d594fSAndroid Build Coastguard Worker   // Instance fields are inherited, but we add a couple of static fields...
5306*795d594fSAndroid Build Coastguard Worker   const size_t num_fields = 2;
5307*795d594fSAndroid Build Coastguard Worker   LengthPrefixedArray<ArtField>* sfields = AllocArtFieldArray(self, allocator, num_fields);
5308*795d594fSAndroid Build Coastguard Worker   temp_klass->SetSFieldsPtr(sfields);
5309*795d594fSAndroid Build Coastguard Worker 
5310*795d594fSAndroid Build Coastguard Worker   // 1. Create a static field 'interfaces' that holds the _declared_ interfaces implemented by
5311*795d594fSAndroid Build Coastguard Worker   // our proxy, so Class.getInterfaces doesn't return the flattened set.
5312*795d594fSAndroid Build Coastguard Worker   ArtField& interfaces_sfield = sfields->At(0);
5313*795d594fSAndroid Build Coastguard Worker   interfaces_sfield.SetDexFieldIndex(0);
5314*795d594fSAndroid Build Coastguard Worker   interfaces_sfield.SetDeclaringClass(temp_klass.Get());
5315*795d594fSAndroid Build Coastguard Worker   interfaces_sfield.SetAccessFlags(kAccStatic | kAccPublic | kAccFinal);
5316*795d594fSAndroid Build Coastguard Worker 
5317*795d594fSAndroid Build Coastguard Worker   // 2. Create a static field 'throws' that holds exceptions thrown by our methods.
5318*795d594fSAndroid Build Coastguard Worker   ArtField& throws_sfield = sfields->At(1);
5319*795d594fSAndroid Build Coastguard Worker   throws_sfield.SetDexFieldIndex(1);
5320*795d594fSAndroid Build Coastguard Worker   throws_sfield.SetDeclaringClass(temp_klass.Get());
5321*795d594fSAndroid Build Coastguard Worker   throws_sfield.SetAccessFlags(kAccStatic | kAccPublic | kAccFinal);
5322*795d594fSAndroid Build Coastguard Worker 
5323*795d594fSAndroid Build Coastguard Worker   // Proxies have 1 direct method, the constructor
5324*795d594fSAndroid Build Coastguard Worker   const size_t num_direct_methods = 1;
5325*795d594fSAndroid Build Coastguard Worker 
5326*795d594fSAndroid Build Coastguard Worker   // The array we get passed contains all methods, including private and static
5327*795d594fSAndroid Build Coastguard Worker   // ones that aren't proxied. We need to filter those out since only interface
5328*795d594fSAndroid Build Coastguard Worker   // methods (non-private & virtual) are actually proxied.
5329*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::Method>> h_methods =
5330*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(soa.Decode<mirror::ObjectArray<mirror::Method>>(methods));
5331*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(h_methods->GetClass(), GetClassRoot<mirror::ObjectArray<mirror::Method>>())
5332*795d594fSAndroid Build Coastguard Worker       << mirror::Class::PrettyClass(h_methods->GetClass());
5333*795d594fSAndroid Build Coastguard Worker   // List of the actual virtual methods this class will have.
5334*795d594fSAndroid Build Coastguard Worker   std::vector<ArtMethod*> proxied_methods;
5335*795d594fSAndroid Build Coastguard Worker   std::vector<size_t> proxied_throws_idx;
5336*795d594fSAndroid Build Coastguard Worker   proxied_methods.reserve(h_methods->GetLength());
5337*795d594fSAndroid Build Coastguard Worker   proxied_throws_idx.reserve(h_methods->GetLength());
5338*795d594fSAndroid Build Coastguard Worker   // Filter out to only the non-private virtual methods.
5339*795d594fSAndroid Build Coastguard Worker   for (auto [mirror, idx] : ZipCount(h_methods.Iterate<mirror::Method>())) {
5340*795d594fSAndroid Build Coastguard Worker     ArtMethod* m = mirror->GetArtMethod();
5341*795d594fSAndroid Build Coastguard Worker     if (!m->IsPrivate() && !m->IsStatic()) {
5342*795d594fSAndroid Build Coastguard Worker       proxied_methods.push_back(m);
5343*795d594fSAndroid Build Coastguard Worker       proxied_throws_idx.push_back(idx);
5344*795d594fSAndroid Build Coastguard Worker     }
5345*795d594fSAndroid Build Coastguard Worker   }
5346*795d594fSAndroid Build Coastguard Worker   const size_t num_virtual_methods = proxied_methods.size();
5347*795d594fSAndroid Build Coastguard Worker   // We also need to filter out the 'throws'. The 'throws' are a Class[][] that
5348*795d594fSAndroid Build Coastguard Worker   // contains an array of all the classes each function is declared to throw.
5349*795d594fSAndroid Build Coastguard Worker   // This is used to wrap unexpected exceptions in a
5350*795d594fSAndroid Build Coastguard Worker   // UndeclaredThrowableException exception. This array is in the same order as
5351*795d594fSAndroid Build Coastguard Worker   // the methods array and like the methods array must be filtered to remove any
5352*795d594fSAndroid Build Coastguard Worker   // non-proxied methods.
5353*795d594fSAndroid Build Coastguard Worker   const bool has_filtered_methods =
5354*795d594fSAndroid Build Coastguard Worker       static_cast<int32_t>(num_virtual_methods) != h_methods->GetLength();
5355*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::ObjectArray<mirror::ObjectArray<mirror::Class>>> original_proxied_throws(
5356*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(soa.Decode<mirror::ObjectArray<mirror::ObjectArray<mirror::Class>>>(throws)));
5357*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::ObjectArray<mirror::ObjectArray<mirror::Class>>> proxied_throws(
5358*795d594fSAndroid Build Coastguard Worker       hs.NewHandle<mirror::ObjectArray<mirror::ObjectArray<mirror::Class>>>(
5359*795d594fSAndroid Build Coastguard Worker           (has_filtered_methods)
5360*795d594fSAndroid Build Coastguard Worker               ? mirror::ObjectArray<mirror::ObjectArray<mirror::Class>>::Alloc(
5361*795d594fSAndroid Build Coastguard Worker                     self, original_proxied_throws->GetClass(), num_virtual_methods)
5362*795d594fSAndroid Build Coastguard Worker               : original_proxied_throws.Get()));
5363*795d594fSAndroid Build Coastguard Worker   if (proxied_throws.IsNull() && !original_proxied_throws.IsNull()) {
5364*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
5365*795d594fSAndroid Build Coastguard Worker     return nullptr;
5366*795d594fSAndroid Build Coastguard Worker   }
5367*795d594fSAndroid Build Coastguard Worker   if (has_filtered_methods) {
5368*795d594fSAndroid Build Coastguard Worker     for (auto [orig_idx, new_idx] : ZipCount(MakeIterationRange(proxied_throws_idx))) {
5369*795d594fSAndroid Build Coastguard Worker       DCHECK_LE(new_idx, orig_idx);
5370*795d594fSAndroid Build Coastguard Worker       proxied_throws->Set(new_idx, original_proxied_throws->Get(orig_idx));
5371*795d594fSAndroid Build Coastguard Worker     }
5372*795d594fSAndroid Build Coastguard Worker   }
5373*795d594fSAndroid Build Coastguard Worker 
5374*795d594fSAndroid Build Coastguard Worker   // Create the methods array.
5375*795d594fSAndroid Build Coastguard Worker   LengthPrefixedArray<ArtMethod>* proxy_class_methods = AllocArtMethodArray(
5376*795d594fSAndroid Build Coastguard Worker         self, allocator, num_direct_methods + num_virtual_methods);
5377*795d594fSAndroid Build Coastguard Worker   // Currently AllocArtMethodArray cannot return null, but the OOM logic is left there in case we
5378*795d594fSAndroid Build Coastguard Worker   // want to throw OOM in the future.
5379*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(proxy_class_methods == nullptr)) {
5380*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
5381*795d594fSAndroid Build Coastguard Worker     return nullptr;
5382*795d594fSAndroid Build Coastguard Worker   }
5383*795d594fSAndroid Build Coastguard Worker   temp_klass->SetMethodsPtr(proxy_class_methods, num_direct_methods, num_virtual_methods);
5384*795d594fSAndroid Build Coastguard Worker 
5385*795d594fSAndroid Build Coastguard Worker   // Create the single direct method.
5386*795d594fSAndroid Build Coastguard Worker   CreateProxyConstructor(temp_klass, temp_klass->GetDirectMethodUnchecked(0, image_pointer_size_));
5387*795d594fSAndroid Build Coastguard Worker 
5388*795d594fSAndroid Build Coastguard Worker   // Create virtual method using specified prototypes.
5389*795d594fSAndroid Build Coastguard Worker   // TODO These should really use the iterators.
5390*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < num_virtual_methods; ++i) {
5391*795d594fSAndroid Build Coastguard Worker     auto* virtual_method = temp_klass->GetVirtualMethodUnchecked(i, image_pointer_size_);
5392*795d594fSAndroid Build Coastguard Worker     auto* prototype = proxied_methods[i];
5393*795d594fSAndroid Build Coastguard Worker     CreateProxyMethod(temp_klass, prototype, virtual_method);
5394*795d594fSAndroid Build Coastguard Worker     DCHECK(virtual_method->GetDeclaringClass() != nullptr);
5395*795d594fSAndroid Build Coastguard Worker     DCHECK(prototype->GetDeclaringClass() != nullptr);
5396*795d594fSAndroid Build Coastguard Worker   }
5397*795d594fSAndroid Build Coastguard Worker 
5398*795d594fSAndroid Build Coastguard Worker   // The super class is java.lang.reflect.Proxy
5399*795d594fSAndroid Build Coastguard Worker   temp_klass->SetSuperClass(GetClassRoot<mirror::Proxy>(this));
5400*795d594fSAndroid Build Coastguard Worker   // Now effectively in the loaded state.
5401*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(temp_klass, ClassStatus::kLoaded, self);
5402*795d594fSAndroid Build Coastguard Worker   self->AssertNoPendingException();
5403*795d594fSAndroid Build Coastguard Worker 
5404*795d594fSAndroid Build Coastguard Worker   // At this point the class is loaded. Publish a ClassLoad event.
5405*795d594fSAndroid Build Coastguard Worker   // Note: this may be a temporary class. It is a listener's responsibility to handle this.
5406*795d594fSAndroid Build Coastguard Worker   Runtime::Current()->GetRuntimeCallbacks()->ClassLoad(temp_klass);
5407*795d594fSAndroid Build Coastguard Worker 
5408*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::Class> klass = hs.NewHandle<mirror::Class>(nullptr);
5409*795d594fSAndroid Build Coastguard Worker   {
5410*795d594fSAndroid Build Coastguard Worker     // Must hold lock on object when resolved.
5411*795d594fSAndroid Build Coastguard Worker     ObjectLock<mirror::Class> resolution_lock(self, temp_klass);
5412*795d594fSAndroid Build Coastguard Worker     // Link the fields and virtual methods, creating vtable and iftables.
5413*795d594fSAndroid Build Coastguard Worker     // The new class will replace the old one in the class table.
5414*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ObjectArray<mirror::Class>> h_interfaces(
5415*795d594fSAndroid Build Coastguard Worker         hs.NewHandle(soa.Decode<mirror::ObjectArray<mirror::Class>>(interfaces)));
5416*795d594fSAndroid Build Coastguard Worker     if (!LinkClass(self, descriptor.c_str(), temp_klass, h_interfaces, &klass)) {
5417*795d594fSAndroid Build Coastguard Worker       if (!temp_klass->IsErroneous()) {
5418*795d594fSAndroid Build Coastguard Worker         mirror::Class::SetStatus(temp_klass, ClassStatus::kErrorUnresolved, self);
5419*795d594fSAndroid Build Coastguard Worker       }
5420*795d594fSAndroid Build Coastguard Worker       return nullptr;
5421*795d594fSAndroid Build Coastguard Worker     }
5422*795d594fSAndroid Build Coastguard Worker   }
5423*795d594fSAndroid Build Coastguard Worker   CHECK(temp_klass->IsRetired());
5424*795d594fSAndroid Build Coastguard Worker   CHECK_NE(temp_klass.Get(), klass.Get());
5425*795d594fSAndroid Build Coastguard Worker 
5426*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(interfaces_sfield.GetDeclaringClass(), klass.Get());
5427*795d594fSAndroid Build Coastguard Worker   interfaces_sfield.SetObject<false>(
5428*795d594fSAndroid Build Coastguard Worker       klass.Get(),
5429*795d594fSAndroid Build Coastguard Worker       soa.Decode<mirror::ObjectArray<mirror::Class>>(interfaces));
5430*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(throws_sfield.GetDeclaringClass(), klass.Get());
5431*795d594fSAndroid Build Coastguard Worker   throws_sfield.SetObject<false>(
5432*795d594fSAndroid Build Coastguard Worker       klass.Get(),
5433*795d594fSAndroid Build Coastguard Worker       proxied_throws.Get());
5434*795d594fSAndroid Build Coastguard Worker 
5435*795d594fSAndroid Build Coastguard Worker   Runtime::Current()->GetRuntimeCallbacks()->ClassPrepare(temp_klass, klass);
5436*795d594fSAndroid Build Coastguard Worker 
5437*795d594fSAndroid Build Coastguard Worker   // SubtypeCheckInfo::Initialized must happen-before any new-instance for that type.
5438*795d594fSAndroid Build Coastguard Worker   // See also ClassLinker::EnsureInitialized().
5439*795d594fSAndroid Build Coastguard Worker   if (kBitstringSubtypeCheckEnabled) {
5440*795d594fSAndroid Build Coastguard Worker     MutexLock subtype_check_lock(Thread::Current(), *Locks::subtype_check_lock_);
5441*795d594fSAndroid Build Coastguard Worker     SubtypeCheck<ObjPtr<mirror::Class>>::EnsureInitialized(klass.Get());
5442*795d594fSAndroid Build Coastguard Worker     // TODO: Avoid taking subtype_check_lock_ if SubtypeCheck for j.l.r.Proxy is already assigned.
5443*795d594fSAndroid Build Coastguard Worker   }
5444*795d594fSAndroid Build Coastguard Worker 
5445*795d594fSAndroid Build Coastguard Worker   VisiblyInitializedCallback* callback = nullptr;
5446*795d594fSAndroid Build Coastguard Worker   {
5447*795d594fSAndroid Build Coastguard Worker     // Lock on klass is released. Lock new class object.
5448*795d594fSAndroid Build Coastguard Worker     ObjectLock<mirror::Class> initialization_lock(self, klass);
5449*795d594fSAndroid Build Coastguard Worker     // Conservatively go through the ClassStatus::kInitialized state.
5450*795d594fSAndroid Build Coastguard Worker     callback = MarkClassInitialized(self, klass);
5451*795d594fSAndroid Build Coastguard Worker   }
5452*795d594fSAndroid Build Coastguard Worker   if (callback != nullptr) {
5453*795d594fSAndroid Build Coastguard Worker     callback->MakeVisible(self);
5454*795d594fSAndroid Build Coastguard Worker   }
5455*795d594fSAndroid Build Coastguard Worker 
5456*795d594fSAndroid Build Coastguard Worker   // Consistency checks.
5457*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
5458*795d594fSAndroid Build Coastguard Worker     CHECK(klass->GetIFieldsPtr() == nullptr);
5459*795d594fSAndroid Build Coastguard Worker     CheckProxyConstructor(klass->GetDirectMethod(0, image_pointer_size_));
5460*795d594fSAndroid Build Coastguard Worker 
5461*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < num_virtual_methods; ++i) {
5462*795d594fSAndroid Build Coastguard Worker       auto* virtual_method = klass->GetVirtualMethodUnchecked(i, image_pointer_size_);
5463*795d594fSAndroid Build Coastguard Worker       CheckProxyMethod(virtual_method, proxied_methods[i]);
5464*795d594fSAndroid Build Coastguard Worker     }
5465*795d594fSAndroid Build Coastguard Worker 
5466*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs2(self);
5467*795d594fSAndroid Build Coastguard Worker     Handle<mirror::String> decoded_name = hs2.NewHandle(soa.Decode<mirror::String>(name));
5468*795d594fSAndroid Build Coastguard Worker     std::string interfaces_field_name(StringPrintf("java.lang.Class[] %s.interfaces",
5469*795d594fSAndroid Build Coastguard Worker                                                    decoded_name->ToModifiedUtf8().c_str()));
5470*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(ArtField::PrettyField(klass->GetStaticField(0)), interfaces_field_name);
5471*795d594fSAndroid Build Coastguard Worker 
5472*795d594fSAndroid Build Coastguard Worker     std::string throws_field_name(StringPrintf("java.lang.Class[][] %s.throws",
5473*795d594fSAndroid Build Coastguard Worker                                                decoded_name->ToModifiedUtf8().c_str()));
5474*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(ArtField::PrettyField(klass->GetStaticField(1)), throws_field_name);
5475*795d594fSAndroid Build Coastguard Worker 
5476*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(klass.Get()->GetProxyInterfaces(),
5477*795d594fSAndroid Build Coastguard Worker              soa.Decode<mirror::ObjectArray<mirror::Class>>(interfaces));
5478*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(klass.Get()->GetProxyThrows(),
5479*795d594fSAndroid Build Coastguard Worker              proxied_throws.Get());
5480*795d594fSAndroid Build Coastguard Worker   }
5481*795d594fSAndroid Build Coastguard Worker   return klass.Get();
5482*795d594fSAndroid Build Coastguard Worker }
5483*795d594fSAndroid Build Coastguard Worker 
CreateProxyConstructor(Handle<mirror::Class> klass,ArtMethod * out)5484*795d594fSAndroid Build Coastguard Worker void ClassLinker::CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out) {
5485*795d594fSAndroid Build Coastguard Worker   // Create constructor for Proxy that must initialize the method.
5486*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> proxy_class = GetClassRoot<mirror::Proxy>(this);
5487*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(proxy_class->NumDirectMethods(), 21u);
5488*795d594fSAndroid Build Coastguard Worker 
5489*795d594fSAndroid Build Coastguard Worker   // Find the <init>(InvocationHandler)V method. The exact method offset varies depending
5490*795d594fSAndroid Build Coastguard Worker   // on which front-end compiler was used to build the libcore DEX files.
5491*795d594fSAndroid Build Coastguard Worker   ArtMethod* proxy_constructor = WellKnownClasses::java_lang_reflect_Proxy_init;
5492*795d594fSAndroid Build Coastguard Worker   DCHECK(proxy_constructor != nullptr)
5493*795d594fSAndroid Build Coastguard Worker       << "Could not find <init> method in java.lang.reflect.Proxy";
5494*795d594fSAndroid Build Coastguard Worker 
5495*795d594fSAndroid Build Coastguard Worker   // Clone the existing constructor of Proxy (our constructor would just invoke it so steal its
5496*795d594fSAndroid Build Coastguard Worker   // code_ too)
5497*795d594fSAndroid Build Coastguard Worker   DCHECK(out != nullptr);
5498*795d594fSAndroid Build Coastguard Worker   out->CopyFrom(proxy_constructor, image_pointer_size_);
5499*795d594fSAndroid Build Coastguard Worker   // Make this constructor public and fix the class to be our Proxy version.
5500*795d594fSAndroid Build Coastguard Worker   // Mark kAccCompileDontBother so that we don't take JIT samples for the method. b/62349349
5501*795d594fSAndroid Build Coastguard Worker   // Note that the compiler calls a ResolveMethod() overload that does not handle a Proxy referrer.
5502*795d594fSAndroid Build Coastguard Worker   out->SetAccessFlags((out->GetAccessFlags() & ~kAccProtected) |
5503*795d594fSAndroid Build Coastguard Worker                       kAccPublic |
5504*795d594fSAndroid Build Coastguard Worker                       kAccCompileDontBother);
5505*795d594fSAndroid Build Coastguard Worker   out->SetDeclaringClass(klass.Get());
5506*795d594fSAndroid Build Coastguard Worker 
5507*795d594fSAndroid Build Coastguard Worker   // Set the original constructor method.
5508*795d594fSAndroid Build Coastguard Worker   out->SetDataPtrSize(proxy_constructor, image_pointer_size_);
5509*795d594fSAndroid Build Coastguard Worker }
5510*795d594fSAndroid Build Coastguard Worker 
CheckProxyConstructor(ArtMethod * constructor) const5511*795d594fSAndroid Build Coastguard Worker void ClassLinker::CheckProxyConstructor(ArtMethod* constructor) const {
5512*795d594fSAndroid Build Coastguard Worker   CHECK(constructor->IsConstructor());
5513*795d594fSAndroid Build Coastguard Worker   auto* np = constructor->GetInterfaceMethodIfProxy(image_pointer_size_);
5514*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(np->GetName(), "<init>");
5515*795d594fSAndroid Build Coastguard Worker   CHECK_STREQ(np->GetSignature().ToString().c_str(), "(Ljava/lang/reflect/InvocationHandler;)V");
5516*795d594fSAndroid Build Coastguard Worker   DCHECK(constructor->IsPublic());
5517*795d594fSAndroid Build Coastguard Worker }
5518*795d594fSAndroid Build Coastguard Worker 
CreateProxyMethod(Handle<mirror::Class> klass,ArtMethod * prototype,ArtMethod * out)5519*795d594fSAndroid Build Coastguard Worker void ClassLinker::CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype,
5520*795d594fSAndroid Build Coastguard Worker                                     ArtMethod* out) {
5521*795d594fSAndroid Build Coastguard Worker   // We steal everything from the prototype (such as DexCache, invoke stub, etc.) then specialize
5522*795d594fSAndroid Build Coastguard Worker   // as necessary
5523*795d594fSAndroid Build Coastguard Worker   DCHECK(out != nullptr);
5524*795d594fSAndroid Build Coastguard Worker   out->CopyFrom(prototype, image_pointer_size_);
5525*795d594fSAndroid Build Coastguard Worker 
5526*795d594fSAndroid Build Coastguard Worker   // Set class to be the concrete proxy class.
5527*795d594fSAndroid Build Coastguard Worker   out->SetDeclaringClass(klass.Get());
5528*795d594fSAndroid Build Coastguard Worker   // Clear the abstract and default flags to ensure that defaults aren't picked in
5529*795d594fSAndroid Build Coastguard Worker   // preference to the invocation handler.
5530*795d594fSAndroid Build Coastguard Worker   const uint32_t kRemoveFlags = kAccAbstract | kAccDefault;
5531*795d594fSAndroid Build Coastguard Worker   static_assert((kAccDefault & kAccIntrinsicBits) != 0);
5532*795d594fSAndroid Build Coastguard Worker   DCHECK(!out->IsIntrinsic()) << "Removing kAccDefault from an intrinsic would be a mistake as it "
5533*795d594fSAndroid Build Coastguard Worker                               << "overlaps with kAccIntrinsicBits.";
5534*795d594fSAndroid Build Coastguard Worker   // Make the method final.
5535*795d594fSAndroid Build Coastguard Worker   // Mark kAccCompileDontBother so that we don't take JIT samples for the method. b/62349349
5536*795d594fSAndroid Build Coastguard Worker   const uint32_t kAddFlags = kAccFinal | kAccCompileDontBother;
5537*795d594fSAndroid Build Coastguard Worker   out->SetAccessFlags((out->GetAccessFlags() & ~kRemoveFlags) | kAddFlags);
5538*795d594fSAndroid Build Coastguard Worker 
5539*795d594fSAndroid Build Coastguard Worker   // Set the original interface method.
5540*795d594fSAndroid Build Coastguard Worker   out->SetDataPtrSize(prototype, image_pointer_size_);
5541*795d594fSAndroid Build Coastguard Worker 
5542*795d594fSAndroid Build Coastguard Worker   // At runtime the method looks like a reference and argument saving method, clone the code
5543*795d594fSAndroid Build Coastguard Worker   // related parameters from this method.
5544*795d594fSAndroid Build Coastguard Worker   out->SetEntryPointFromQuickCompiledCode(GetQuickProxyInvokeHandler());
5545*795d594fSAndroid Build Coastguard Worker }
5546*795d594fSAndroid Build Coastguard Worker 
CheckProxyMethod(ArtMethod * method,ArtMethod * prototype) const5547*795d594fSAndroid Build Coastguard Worker void ClassLinker::CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const {
5548*795d594fSAndroid Build Coastguard Worker   // Basic consistency checks.
5549*795d594fSAndroid Build Coastguard Worker   CHECK(!prototype->IsFinal());
5550*795d594fSAndroid Build Coastguard Worker   CHECK(method->IsFinal());
5551*795d594fSAndroid Build Coastguard Worker   CHECK(method->IsInvokable());
5552*795d594fSAndroid Build Coastguard Worker 
5553*795d594fSAndroid Build Coastguard Worker   // The proxy method doesn't have its own dex cache or dex file and so it steals those of its
5554*795d594fSAndroid Build Coastguard Worker   // interface prototype. The exception to this are Constructors and the Class of the Proxy itself.
5555*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(prototype->GetDexMethodIndex(), method->GetDexMethodIndex());
5556*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(prototype, method->GetInterfaceMethodIfProxy(image_pointer_size_));
5557*795d594fSAndroid Build Coastguard Worker }
5558*795d594fSAndroid Build Coastguard Worker 
CanWeInitializeClass(ObjPtr<mirror::Class> klass,bool can_init_statics,bool can_init_parents)5559*795d594fSAndroid Build Coastguard Worker bool ClassLinker::CanWeInitializeClass(ObjPtr<mirror::Class> klass,
5560*795d594fSAndroid Build Coastguard Worker                                        bool can_init_statics,
5561*795d594fSAndroid Build Coastguard Worker                                        bool can_init_parents) {
5562*795d594fSAndroid Build Coastguard Worker   if (can_init_statics && can_init_parents) {
5563*795d594fSAndroid Build Coastguard Worker     return true;
5564*795d594fSAndroid Build Coastguard Worker   }
5565*795d594fSAndroid Build Coastguard Worker   DCHECK(Runtime::Current()->IsAotCompiler());
5566*795d594fSAndroid Build Coastguard Worker 
5567*795d594fSAndroid Build Coastguard Worker   // We currently don't support initializing at AOT time classes that need access
5568*795d594fSAndroid Build Coastguard Worker   // checks.
5569*795d594fSAndroid Build Coastguard Worker   if (klass->IsVerifiedNeedsAccessChecks()) {
5570*795d594fSAndroid Build Coastguard Worker     return false;
5571*795d594fSAndroid Build Coastguard Worker   }
5572*795d594fSAndroid Build Coastguard Worker   if (!can_init_statics) {
5573*795d594fSAndroid Build Coastguard Worker     // Check if there's a class initializer.
5574*795d594fSAndroid Build Coastguard Worker     ArtMethod* clinit = klass->FindClassInitializer(image_pointer_size_);
5575*795d594fSAndroid Build Coastguard Worker     if (clinit != nullptr) {
5576*795d594fSAndroid Build Coastguard Worker       return false;
5577*795d594fSAndroid Build Coastguard Worker     }
5578*795d594fSAndroid Build Coastguard Worker     // Check if there are encoded static values needing initialization.
5579*795d594fSAndroid Build Coastguard Worker     if (klass->NumStaticFields() != 0) {
5580*795d594fSAndroid Build Coastguard Worker       const dex::ClassDef* dex_class_def = klass->GetClassDef();
5581*795d594fSAndroid Build Coastguard Worker       DCHECK(dex_class_def != nullptr);
5582*795d594fSAndroid Build Coastguard Worker       if (dex_class_def->static_values_off_ != 0) {
5583*795d594fSAndroid Build Coastguard Worker         return false;
5584*795d594fSAndroid Build Coastguard Worker       }
5585*795d594fSAndroid Build Coastguard Worker     }
5586*795d594fSAndroid Build Coastguard Worker   }
5587*795d594fSAndroid Build Coastguard Worker   // If we are a class we need to initialize all interfaces with default methods when we are
5588*795d594fSAndroid Build Coastguard Worker   // initialized. Check all of them.
5589*795d594fSAndroid Build Coastguard Worker   if (!klass->IsInterface()) {
5590*795d594fSAndroid Build Coastguard Worker     size_t num_interfaces = klass->GetIfTableCount();
5591*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < num_interfaces; i++) {
5592*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> iface = klass->GetIfTable()->GetInterface(i);
5593*795d594fSAndroid Build Coastguard Worker       if (iface->HasDefaultMethods() && !iface->IsInitialized()) {
5594*795d594fSAndroid Build Coastguard Worker         if (!can_init_parents || !CanWeInitializeClass(iface, can_init_statics, can_init_parents)) {
5595*795d594fSAndroid Build Coastguard Worker           return false;
5596*795d594fSAndroid Build Coastguard Worker         }
5597*795d594fSAndroid Build Coastguard Worker       }
5598*795d594fSAndroid Build Coastguard Worker     }
5599*795d594fSAndroid Build Coastguard Worker   }
5600*795d594fSAndroid Build Coastguard Worker   if (klass->IsInterface() || !klass->HasSuperClass()) {
5601*795d594fSAndroid Build Coastguard Worker     return true;
5602*795d594fSAndroid Build Coastguard Worker   }
5603*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
5604*795d594fSAndroid Build Coastguard Worker   if (super_class->IsInitialized()) {
5605*795d594fSAndroid Build Coastguard Worker     return true;
5606*795d594fSAndroid Build Coastguard Worker   }
5607*795d594fSAndroid Build Coastguard Worker   return can_init_parents && CanWeInitializeClass(super_class, can_init_statics, can_init_parents);
5608*795d594fSAndroid Build Coastguard Worker }
5609*795d594fSAndroid Build Coastguard Worker 
InitializeClass(Thread * self,Handle<mirror::Class> klass,bool can_init_statics,bool can_init_parents)5610*795d594fSAndroid Build Coastguard Worker bool ClassLinker::InitializeClass(Thread* self,
5611*795d594fSAndroid Build Coastguard Worker                                   Handle<mirror::Class> klass,
5612*795d594fSAndroid Build Coastguard Worker                                   bool can_init_statics,
5613*795d594fSAndroid Build Coastguard Worker                                   bool can_init_parents) {
5614*795d594fSAndroid Build Coastguard Worker   // see JLS 3rd edition, 12.4.2 "Detailed Initialization Procedure" for the locking protocol
5615*795d594fSAndroid Build Coastguard Worker 
5616*795d594fSAndroid Build Coastguard Worker   // Are we already initialized and therefore done?
5617*795d594fSAndroid Build Coastguard Worker   // Note: we differ from the JLS here as we don't do this under the lock, this is benign as
5618*795d594fSAndroid Build Coastguard Worker   // an initialized class will never change its state.
5619*795d594fSAndroid Build Coastguard Worker   if (klass->IsInitialized()) {
5620*795d594fSAndroid Build Coastguard Worker     return true;
5621*795d594fSAndroid Build Coastguard Worker   }
5622*795d594fSAndroid Build Coastguard Worker 
5623*795d594fSAndroid Build Coastguard Worker   // Fast fail if initialization requires a full runtime. Not part of the JLS.
5624*795d594fSAndroid Build Coastguard Worker   if (!CanWeInitializeClass(klass.Get(), can_init_statics, can_init_parents)) {
5625*795d594fSAndroid Build Coastguard Worker     return false;
5626*795d594fSAndroid Build Coastguard Worker   }
5627*795d594fSAndroid Build Coastguard Worker 
5628*795d594fSAndroid Build Coastguard Worker   self->AllowThreadSuspension();
5629*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
5630*795d594fSAndroid Build Coastguard Worker   const bool stats_enabled = runtime->HasStatsEnabled();
5631*795d594fSAndroid Build Coastguard Worker   uint64_t t0;
5632*795d594fSAndroid Build Coastguard Worker   {
5633*795d594fSAndroid Build Coastguard Worker     ObjectLock<mirror::Class> lock(self, klass);
5634*795d594fSAndroid Build Coastguard Worker 
5635*795d594fSAndroid Build Coastguard Worker     // Re-check under the lock in case another thread initialized ahead of us.
5636*795d594fSAndroid Build Coastguard Worker     if (klass->IsInitialized()) {
5637*795d594fSAndroid Build Coastguard Worker       return true;
5638*795d594fSAndroid Build Coastguard Worker     }
5639*795d594fSAndroid Build Coastguard Worker 
5640*795d594fSAndroid Build Coastguard Worker     // Was the class already found to be erroneous? Done under the lock to match the JLS.
5641*795d594fSAndroid Build Coastguard Worker     if (klass->IsErroneous()) {
5642*795d594fSAndroid Build Coastguard Worker       ThrowEarlierClassFailure(klass.Get(), true, /* log= */ true);
5643*795d594fSAndroid Build Coastguard Worker       VlogClassInitializationFailure(klass);
5644*795d594fSAndroid Build Coastguard Worker       return false;
5645*795d594fSAndroid Build Coastguard Worker     }
5646*795d594fSAndroid Build Coastguard Worker 
5647*795d594fSAndroid Build Coastguard Worker     CHECK(klass->IsResolved() && !klass->IsErroneousResolved())
5648*795d594fSAndroid Build Coastguard Worker         << klass->PrettyClass() << ": state=" << klass->GetStatus();
5649*795d594fSAndroid Build Coastguard Worker 
5650*795d594fSAndroid Build Coastguard Worker     if (!klass->IsVerified()) {
5651*795d594fSAndroid Build Coastguard Worker       VerifyClass(self, /*verifier_deps= */ nullptr, klass);
5652*795d594fSAndroid Build Coastguard Worker       if (!klass->IsVerified()) {
5653*795d594fSAndroid Build Coastguard Worker         // We failed to verify, expect either the klass to be erroneous or verification failed at
5654*795d594fSAndroid Build Coastguard Worker         // compile time.
5655*795d594fSAndroid Build Coastguard Worker         if (klass->IsErroneous()) {
5656*795d594fSAndroid Build Coastguard Worker           // The class is erroneous. This may be a verifier error, or another thread attempted
5657*795d594fSAndroid Build Coastguard Worker           // verification and/or initialization and failed. We can distinguish those cases by
5658*795d594fSAndroid Build Coastguard Worker           // whether an exception is already pending.
5659*795d594fSAndroid Build Coastguard Worker           if (self->IsExceptionPending()) {
5660*795d594fSAndroid Build Coastguard Worker             // Check that it's a VerifyError.
5661*795d594fSAndroid Build Coastguard Worker             DCHECK(IsVerifyError(self->GetException()));
5662*795d594fSAndroid Build Coastguard Worker           } else {
5663*795d594fSAndroid Build Coastguard Worker             // Check that another thread attempted initialization.
5664*795d594fSAndroid Build Coastguard Worker             DCHECK_NE(0, klass->GetClinitThreadId());
5665*795d594fSAndroid Build Coastguard Worker             DCHECK_NE(self->GetTid(), klass->GetClinitThreadId());
5666*795d594fSAndroid Build Coastguard Worker             // Need to rethrow the previous failure now.
5667*795d594fSAndroid Build Coastguard Worker             ThrowEarlierClassFailure(klass.Get(), true);
5668*795d594fSAndroid Build Coastguard Worker           }
5669*795d594fSAndroid Build Coastguard Worker           VlogClassInitializationFailure(klass);
5670*795d594fSAndroid Build Coastguard Worker         } else {
5671*795d594fSAndroid Build Coastguard Worker           CHECK(Runtime::Current()->IsAotCompiler());
5672*795d594fSAndroid Build Coastguard Worker           CHECK(klass->ShouldVerifyAtRuntime() || klass->IsVerifiedNeedsAccessChecks());
5673*795d594fSAndroid Build Coastguard Worker           self->AssertNoPendingException();
5674*795d594fSAndroid Build Coastguard Worker           self->SetException(Runtime::Current()->GetPreAllocatedNoClassDefFoundError());
5675*795d594fSAndroid Build Coastguard Worker         }
5676*795d594fSAndroid Build Coastguard Worker         self->AssertPendingException();
5677*795d594fSAndroid Build Coastguard Worker         return false;
5678*795d594fSAndroid Build Coastguard Worker       } else {
5679*795d594fSAndroid Build Coastguard Worker         self->AssertNoPendingException();
5680*795d594fSAndroid Build Coastguard Worker       }
5681*795d594fSAndroid Build Coastguard Worker 
5682*795d594fSAndroid Build Coastguard Worker       // A separate thread could have moved us all the way to initialized. A "simple" example
5683*795d594fSAndroid Build Coastguard Worker       // involves a subclass of the current class being initialized at the same time (which
5684*795d594fSAndroid Build Coastguard Worker       // will implicitly initialize the superclass, if scheduled that way). b/28254258
5685*795d594fSAndroid Build Coastguard Worker       DCHECK(!klass->IsErroneous()) << klass->GetStatus();
5686*795d594fSAndroid Build Coastguard Worker       if (klass->IsInitialized()) {
5687*795d594fSAndroid Build Coastguard Worker         return true;
5688*795d594fSAndroid Build Coastguard Worker       }
5689*795d594fSAndroid Build Coastguard Worker     }
5690*795d594fSAndroid Build Coastguard Worker 
5691*795d594fSAndroid Build Coastguard Worker     // If the class is ClassStatus::kInitializing, either this thread is
5692*795d594fSAndroid Build Coastguard Worker     // initializing higher up the stack or another thread has beat us
5693*795d594fSAndroid Build Coastguard Worker     // to initializing and we need to wait. Either way, this
5694*795d594fSAndroid Build Coastguard Worker     // invocation of InitializeClass will not be responsible for
5695*795d594fSAndroid Build Coastguard Worker     // running <clinit> and will return.
5696*795d594fSAndroid Build Coastguard Worker     if (klass->GetStatus() == ClassStatus::kInitializing) {
5697*795d594fSAndroid Build Coastguard Worker       // Could have got an exception during verification.
5698*795d594fSAndroid Build Coastguard Worker       if (self->IsExceptionPending()) {
5699*795d594fSAndroid Build Coastguard Worker         VlogClassInitializationFailure(klass);
5700*795d594fSAndroid Build Coastguard Worker         return false;
5701*795d594fSAndroid Build Coastguard Worker       }
5702*795d594fSAndroid Build Coastguard Worker       // We caught somebody else in the act; was it us?
5703*795d594fSAndroid Build Coastguard Worker       if (klass->GetClinitThreadId() == self->GetTid()) {
5704*795d594fSAndroid Build Coastguard Worker         // Yes. That's fine. Return so we can continue initializing.
5705*795d594fSAndroid Build Coastguard Worker         return true;
5706*795d594fSAndroid Build Coastguard Worker       }
5707*795d594fSAndroid Build Coastguard Worker       // No. That's fine. Wait for another thread to finish initializing.
5708*795d594fSAndroid Build Coastguard Worker       return WaitForInitializeClass(klass, self, lock);
5709*795d594fSAndroid Build Coastguard Worker     }
5710*795d594fSAndroid Build Coastguard Worker 
5711*795d594fSAndroid Build Coastguard Worker     // Try to get the oat class's status for this class if the oat file is present. The compiler
5712*795d594fSAndroid Build Coastguard Worker     // tries to validate superclass descriptors, and writes the result into the oat file.
5713*795d594fSAndroid Build Coastguard Worker     // Runtime correctness is guaranteed by classpath checks done on loading. If the classpath
5714*795d594fSAndroid Build Coastguard Worker     // is different at runtime than it was at compile time, the oat file is rejected. So if the
5715*795d594fSAndroid Build Coastguard Worker     // oat file is present, the classpaths must match, and the runtime time check can be skipped.
5716*795d594fSAndroid Build Coastguard Worker     bool has_oat_class = false;
5717*795d594fSAndroid Build Coastguard Worker     const OatFile::OatClass oat_class = (runtime->IsStarted() && !runtime->IsAotCompiler())
5718*795d594fSAndroid Build Coastguard Worker         ? OatFile::FindOatClass(klass->GetDexFile(), klass->GetDexClassDefIndex(), &has_oat_class)
5719*795d594fSAndroid Build Coastguard Worker         : OatFile::OatClass::Invalid();
5720*795d594fSAndroid Build Coastguard Worker     if (oat_class.GetStatus() < ClassStatus::kSuperclassValidated &&
5721*795d594fSAndroid Build Coastguard Worker         !ValidateSuperClassDescriptors(klass)) {
5722*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kErrorResolved, self);
5723*795d594fSAndroid Build Coastguard Worker       return false;
5724*795d594fSAndroid Build Coastguard Worker     }
5725*795d594fSAndroid Build Coastguard Worker     self->AllowThreadSuspension();
5726*795d594fSAndroid Build Coastguard Worker 
5727*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(klass->GetStatus(), ClassStatus::kVerified) << klass->PrettyClass()
5728*795d594fSAndroid Build Coastguard Worker         << " self.tid=" << self->GetTid() << " clinit.tid=" << klass->GetClinitThreadId();
5729*795d594fSAndroid Build Coastguard Worker 
5730*795d594fSAndroid Build Coastguard Worker     // From here out other threads may observe that we're initializing and so changes of state
5731*795d594fSAndroid Build Coastguard Worker     // require the a notification.
5732*795d594fSAndroid Build Coastguard Worker     klass->SetClinitThreadId(self->GetTid());
5733*795d594fSAndroid Build Coastguard Worker     mirror::Class::SetStatus(klass, ClassStatus::kInitializing, self);
5734*795d594fSAndroid Build Coastguard Worker 
5735*795d594fSAndroid Build Coastguard Worker     t0 = stats_enabled ? NanoTime() : 0u;
5736*795d594fSAndroid Build Coastguard Worker   }
5737*795d594fSAndroid Build Coastguard Worker 
5738*795d594fSAndroid Build Coastguard Worker   uint64_t t_sub = 0;
5739*795d594fSAndroid Build Coastguard Worker 
5740*795d594fSAndroid Build Coastguard Worker   // Initialize super classes, must be done while initializing for the JLS.
5741*795d594fSAndroid Build Coastguard Worker   if (!klass->IsInterface() && klass->HasSuperClass()) {
5742*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
5743*795d594fSAndroid Build Coastguard Worker     if (!super_class->IsInitialized()) {
5744*795d594fSAndroid Build Coastguard Worker       CHECK(!super_class->IsInterface());
5745*795d594fSAndroid Build Coastguard Worker       CHECK(can_init_parents);
5746*795d594fSAndroid Build Coastguard Worker       StackHandleScope<1> hs(self);
5747*795d594fSAndroid Build Coastguard Worker       Handle<mirror::Class> handle_scope_super(hs.NewHandle(super_class));
5748*795d594fSAndroid Build Coastguard Worker       uint64_t super_t0 = stats_enabled ? NanoTime() : 0u;
5749*795d594fSAndroid Build Coastguard Worker       bool super_initialized = InitializeClass(self, handle_scope_super, can_init_statics, true);
5750*795d594fSAndroid Build Coastguard Worker       uint64_t super_t1 = stats_enabled ? NanoTime() : 0u;
5751*795d594fSAndroid Build Coastguard Worker       if (!super_initialized) {
5752*795d594fSAndroid Build Coastguard Worker         // The super class was verified ahead of entering initializing, we should only be here if
5753*795d594fSAndroid Build Coastguard Worker         // the super class became erroneous due to initialization.
5754*795d594fSAndroid Build Coastguard Worker         // For the case of aot compiler, the super class might also be initializing but we don't
5755*795d594fSAndroid Build Coastguard Worker         // want to process circular dependencies in pre-compile.
5756*795d594fSAndroid Build Coastguard Worker         CHECK(self->IsExceptionPending())
5757*795d594fSAndroid Build Coastguard Worker             << "Super class initialization failed for "
5758*795d594fSAndroid Build Coastguard Worker             << handle_scope_super->PrettyDescriptor()
5759*795d594fSAndroid Build Coastguard Worker             << " that has unexpected status " << handle_scope_super->GetStatus()
5760*795d594fSAndroid Build Coastguard Worker             << "\nPending exception:\n"
5761*795d594fSAndroid Build Coastguard Worker             << (self->GetException() != nullptr ? self->GetException()->Dump() : "");
5762*795d594fSAndroid Build Coastguard Worker         ObjectLock<mirror::Class> lock(self, klass);
5763*795d594fSAndroid Build Coastguard Worker         // Initialization failed because the super-class is erroneous.
5764*795d594fSAndroid Build Coastguard Worker         mirror::Class::SetStatus(klass, ClassStatus::kErrorResolved, self);
5765*795d594fSAndroid Build Coastguard Worker         return false;
5766*795d594fSAndroid Build Coastguard Worker       }
5767*795d594fSAndroid Build Coastguard Worker       t_sub = super_t1 - super_t0;
5768*795d594fSAndroid Build Coastguard Worker     }
5769*795d594fSAndroid Build Coastguard Worker   }
5770*795d594fSAndroid Build Coastguard Worker 
5771*795d594fSAndroid Build Coastguard Worker   if (!klass->IsInterface()) {
5772*795d594fSAndroid Build Coastguard Worker     // Initialize interfaces with default methods for the JLS.
5773*795d594fSAndroid Build Coastguard Worker     size_t num_direct_interfaces = klass->NumDirectInterfaces();
5774*795d594fSAndroid Build Coastguard Worker     // Only setup the (expensive) handle scope if we actually need to.
5775*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(num_direct_interfaces > 0)) {
5776*795d594fSAndroid Build Coastguard Worker       StackHandleScope<1> hs_iface(self);
5777*795d594fSAndroid Build Coastguard Worker       MutableHandle<mirror::Class> handle_scope_iface(hs_iface.NewHandle<mirror::Class>(nullptr));
5778*795d594fSAndroid Build Coastguard Worker       for (size_t i = 0; i < num_direct_interfaces; i++) {
5779*795d594fSAndroid Build Coastguard Worker         handle_scope_iface.Assign(klass->GetDirectInterface(i));
5780*795d594fSAndroid Build Coastguard Worker         CHECK(handle_scope_iface != nullptr) << klass->PrettyDescriptor() << " iface #" << i;
5781*795d594fSAndroid Build Coastguard Worker         CHECK(handle_scope_iface->IsInterface());
5782*795d594fSAndroid Build Coastguard Worker         if (handle_scope_iface->HasBeenRecursivelyInitialized()) {
5783*795d594fSAndroid Build Coastguard Worker           // We have already done this for this interface. Skip it.
5784*795d594fSAndroid Build Coastguard Worker           continue;
5785*795d594fSAndroid Build Coastguard Worker         }
5786*795d594fSAndroid Build Coastguard Worker         // We cannot just call initialize class directly because we need to ensure that ALL
5787*795d594fSAndroid Build Coastguard Worker         // interfaces with default methods are initialized. Non-default interface initialization
5788*795d594fSAndroid Build Coastguard Worker         // will not affect other non-default super-interfaces.
5789*795d594fSAndroid Build Coastguard Worker         // This is not very precise, misses all walking.
5790*795d594fSAndroid Build Coastguard Worker         uint64_t inf_t0 = stats_enabled ? NanoTime() : 0u;
5791*795d594fSAndroid Build Coastguard Worker         bool iface_initialized = InitializeDefaultInterfaceRecursive(self,
5792*795d594fSAndroid Build Coastguard Worker                                                                      handle_scope_iface,
5793*795d594fSAndroid Build Coastguard Worker                                                                      can_init_statics,
5794*795d594fSAndroid Build Coastguard Worker                                                                      can_init_parents);
5795*795d594fSAndroid Build Coastguard Worker         uint64_t inf_t1 = stats_enabled ? NanoTime() : 0u;
5796*795d594fSAndroid Build Coastguard Worker         if (!iface_initialized) {
5797*795d594fSAndroid Build Coastguard Worker           ObjectLock<mirror::Class> lock(self, klass);
5798*795d594fSAndroid Build Coastguard Worker           // Initialization failed because one of our interfaces with default methods is erroneous.
5799*795d594fSAndroid Build Coastguard Worker           mirror::Class::SetStatus(klass, ClassStatus::kErrorResolved, self);
5800*795d594fSAndroid Build Coastguard Worker           return false;
5801*795d594fSAndroid Build Coastguard Worker         }
5802*795d594fSAndroid Build Coastguard Worker         t_sub += inf_t1 - inf_t0;
5803*795d594fSAndroid Build Coastguard Worker       }
5804*795d594fSAndroid Build Coastguard Worker     }
5805*795d594fSAndroid Build Coastguard Worker   }
5806*795d594fSAndroid Build Coastguard Worker 
5807*795d594fSAndroid Build Coastguard Worker   const size_t num_static_fields = klass->NumStaticFields();
5808*795d594fSAndroid Build Coastguard Worker   if (num_static_fields > 0) {
5809*795d594fSAndroid Build Coastguard Worker     const dex::ClassDef* dex_class_def = klass->GetClassDef();
5810*795d594fSAndroid Build Coastguard Worker     CHECK(dex_class_def != nullptr);
5811*795d594fSAndroid Build Coastguard Worker     StackHandleScope<3> hs(self);
5812*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ClassLoader> class_loader(hs.NewHandle(klass->GetClassLoader()));
5813*795d594fSAndroid Build Coastguard Worker     Handle<mirror::DexCache> dex_cache(hs.NewHandle(klass->GetDexCache()));
5814*795d594fSAndroid Build Coastguard Worker 
5815*795d594fSAndroid Build Coastguard Worker     // Eagerly fill in static fields so that the we don't have to do as many expensive
5816*795d594fSAndroid Build Coastguard Worker     // Class::FindStaticField in ResolveField.
5817*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < num_static_fields; ++i) {
5818*795d594fSAndroid Build Coastguard Worker       ArtField* field = klass->GetStaticField(i);
5819*795d594fSAndroid Build Coastguard Worker       const uint32_t field_idx = field->GetDexFieldIndex();
5820*795d594fSAndroid Build Coastguard Worker       ArtField* resolved_field = dex_cache->GetResolvedField(field_idx);
5821*795d594fSAndroid Build Coastguard Worker       if (resolved_field == nullptr) {
5822*795d594fSAndroid Build Coastguard Worker         // Populating cache of a dex file which defines `klass` should always be allowed.
5823*795d594fSAndroid Build Coastguard Worker         DCHECK(!hiddenapi::ShouldDenyAccessToMember(
5824*795d594fSAndroid Build Coastguard Worker             field,
5825*795d594fSAndroid Build Coastguard Worker             hiddenapi::AccessContext(class_loader.Get(), dex_cache.Get()),
5826*795d594fSAndroid Build Coastguard Worker             hiddenapi::AccessMethod::kNone));
5827*795d594fSAndroid Build Coastguard Worker         dex_cache->SetResolvedField(field_idx, field);
5828*795d594fSAndroid Build Coastguard Worker       } else {
5829*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(field, resolved_field);
5830*795d594fSAndroid Build Coastguard Worker       }
5831*795d594fSAndroid Build Coastguard Worker     }
5832*795d594fSAndroid Build Coastguard Worker 
5833*795d594fSAndroid Build Coastguard Worker     annotations::RuntimeEncodedStaticFieldValueIterator value_it(dex_cache,
5834*795d594fSAndroid Build Coastguard Worker                                                                  class_loader,
5835*795d594fSAndroid Build Coastguard Worker                                                                  this,
5836*795d594fSAndroid Build Coastguard Worker                                                                  *dex_class_def);
5837*795d594fSAndroid Build Coastguard Worker     const DexFile& dex_file = *dex_cache->GetDexFile();
5838*795d594fSAndroid Build Coastguard Worker 
5839*795d594fSAndroid Build Coastguard Worker     if (value_it.HasNext()) {
5840*795d594fSAndroid Build Coastguard Worker       ClassAccessor accessor(dex_file, *dex_class_def);
5841*795d594fSAndroid Build Coastguard Worker       CHECK(can_init_statics);
5842*795d594fSAndroid Build Coastguard Worker       for (const ClassAccessor::Field& field : accessor.GetStaticFields()) {
5843*795d594fSAndroid Build Coastguard Worker         if (!value_it.HasNext()) {
5844*795d594fSAndroid Build Coastguard Worker           break;
5845*795d594fSAndroid Build Coastguard Worker         }
5846*795d594fSAndroid Build Coastguard Worker         ArtField* art_field = ResolveField(field.GetIndex(),
5847*795d594fSAndroid Build Coastguard Worker                                            dex_cache,
5848*795d594fSAndroid Build Coastguard Worker                                            class_loader,
5849*795d594fSAndroid Build Coastguard Worker                                            /* is_static= */ true);
5850*795d594fSAndroid Build Coastguard Worker         if (Runtime::Current()->IsActiveTransaction()) {
5851*795d594fSAndroid Build Coastguard Worker           value_it.ReadValueToField<true>(art_field);
5852*795d594fSAndroid Build Coastguard Worker         } else {
5853*795d594fSAndroid Build Coastguard Worker           value_it.ReadValueToField<false>(art_field);
5854*795d594fSAndroid Build Coastguard Worker         }
5855*795d594fSAndroid Build Coastguard Worker         if (self->IsExceptionPending()) {
5856*795d594fSAndroid Build Coastguard Worker           break;
5857*795d594fSAndroid Build Coastguard Worker         }
5858*795d594fSAndroid Build Coastguard Worker         value_it.Next();
5859*795d594fSAndroid Build Coastguard Worker       }
5860*795d594fSAndroid Build Coastguard Worker       DCHECK(self->IsExceptionPending() || !value_it.HasNext());
5861*795d594fSAndroid Build Coastguard Worker     }
5862*795d594fSAndroid Build Coastguard Worker   }
5863*795d594fSAndroid Build Coastguard Worker 
5864*795d594fSAndroid Build Coastguard Worker 
5865*795d594fSAndroid Build Coastguard Worker   if (!self->IsExceptionPending()) {
5866*795d594fSAndroid Build Coastguard Worker     ArtMethod* clinit = klass->FindClassInitializer(image_pointer_size_);
5867*795d594fSAndroid Build Coastguard Worker     if (clinit != nullptr) {
5868*795d594fSAndroid Build Coastguard Worker       CHECK(can_init_statics);
5869*795d594fSAndroid Build Coastguard Worker       JValue result;
5870*795d594fSAndroid Build Coastguard Worker       clinit->Invoke(self, nullptr, 0, &result, "V");
5871*795d594fSAndroid Build Coastguard Worker     }
5872*795d594fSAndroid Build Coastguard Worker   }
5873*795d594fSAndroid Build Coastguard Worker   self->AllowThreadSuspension();
5874*795d594fSAndroid Build Coastguard Worker   uint64_t t1 = stats_enabled ? NanoTime() : 0u;
5875*795d594fSAndroid Build Coastguard Worker 
5876*795d594fSAndroid Build Coastguard Worker   VisiblyInitializedCallback* callback = nullptr;
5877*795d594fSAndroid Build Coastguard Worker   bool success = true;
5878*795d594fSAndroid Build Coastguard Worker   {
5879*795d594fSAndroid Build Coastguard Worker     ObjectLock<mirror::Class> lock(self, klass);
5880*795d594fSAndroid Build Coastguard Worker 
5881*795d594fSAndroid Build Coastguard Worker     if (self->IsExceptionPending()) {
5882*795d594fSAndroid Build Coastguard Worker       WrapExceptionInInitializer(klass);
5883*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kErrorResolved, self);
5884*795d594fSAndroid Build Coastguard Worker       success = false;
5885*795d594fSAndroid Build Coastguard Worker     } else if (Runtime::Current()->IsActiveTransaction() && IsTransactionAborted()) {
5886*795d594fSAndroid Build Coastguard Worker       // The exception thrown when the transaction aborted has been caught and cleared
5887*795d594fSAndroid Build Coastguard Worker       // so we need to throw it again now.
5888*795d594fSAndroid Build Coastguard Worker       VLOG(compiler) << "Return from class initializer of "
5889*795d594fSAndroid Build Coastguard Worker                      << mirror::Class::PrettyDescriptor(klass.Get())
5890*795d594fSAndroid Build Coastguard Worker                      << " without exception while transaction was aborted: re-throw it now.";
5891*795d594fSAndroid Build Coastguard Worker       ThrowTransactionAbortError(self);
5892*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kErrorResolved, self);
5893*795d594fSAndroid Build Coastguard Worker       success = false;
5894*795d594fSAndroid Build Coastguard Worker     } else {
5895*795d594fSAndroid Build Coastguard Worker       if (stats_enabled) {
5896*795d594fSAndroid Build Coastguard Worker         RuntimeStats* global_stats = runtime->GetStats();
5897*795d594fSAndroid Build Coastguard Worker         RuntimeStats* thread_stats = self->GetStats();
5898*795d594fSAndroid Build Coastguard Worker         ++global_stats->class_init_count;
5899*795d594fSAndroid Build Coastguard Worker         ++thread_stats->class_init_count;
5900*795d594fSAndroid Build Coastguard Worker         global_stats->class_init_time_ns += (t1 - t0 - t_sub);
5901*795d594fSAndroid Build Coastguard Worker         thread_stats->class_init_time_ns += (t1 - t0 - t_sub);
5902*795d594fSAndroid Build Coastguard Worker       }
5903*795d594fSAndroid Build Coastguard Worker       // Set the class as initialized except if failed to initialize static fields.
5904*795d594fSAndroid Build Coastguard Worker       callback = MarkClassInitialized(self, klass);
5905*795d594fSAndroid Build Coastguard Worker       if (VLOG_IS_ON(class_linker)) {
5906*795d594fSAndroid Build Coastguard Worker         std::string temp;
5907*795d594fSAndroid Build Coastguard Worker         LOG(INFO) << "Initialized class " << klass->GetDescriptor(&temp) << " from " <<
5908*795d594fSAndroid Build Coastguard Worker             klass->GetLocation();
5909*795d594fSAndroid Build Coastguard Worker       }
5910*795d594fSAndroid Build Coastguard Worker     }
5911*795d594fSAndroid Build Coastguard Worker   }
5912*795d594fSAndroid Build Coastguard Worker   if (callback != nullptr) {
5913*795d594fSAndroid Build Coastguard Worker     callback->MakeVisible(self);
5914*795d594fSAndroid Build Coastguard Worker   }
5915*795d594fSAndroid Build Coastguard Worker   return success;
5916*795d594fSAndroid Build Coastguard Worker }
5917*795d594fSAndroid Build Coastguard Worker 
5918*795d594fSAndroid Build Coastguard Worker // We recursively run down the tree of interfaces. We need to do this in the order they are declared
5919*795d594fSAndroid Build Coastguard Worker // and perform the initialization only on those interfaces that contain default methods.
InitializeDefaultInterfaceRecursive(Thread * self,Handle<mirror::Class> iface,bool can_init_statics,bool can_init_parents)5920*795d594fSAndroid Build Coastguard Worker bool ClassLinker::InitializeDefaultInterfaceRecursive(Thread* self,
5921*795d594fSAndroid Build Coastguard Worker                                                       Handle<mirror::Class> iface,
5922*795d594fSAndroid Build Coastguard Worker                                                       bool can_init_statics,
5923*795d594fSAndroid Build Coastguard Worker                                                       bool can_init_parents) {
5924*795d594fSAndroid Build Coastguard Worker   CHECK(iface->IsInterface());
5925*795d594fSAndroid Build Coastguard Worker   size_t num_direct_ifaces = iface->NumDirectInterfaces();
5926*795d594fSAndroid Build Coastguard Worker   // Only create the (expensive) handle scope if we need it.
5927*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(num_direct_ifaces > 0)) {
5928*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
5929*795d594fSAndroid Build Coastguard Worker     MutableHandle<mirror::Class> handle_super_iface(hs.NewHandle<mirror::Class>(nullptr));
5930*795d594fSAndroid Build Coastguard Worker     // First we initialize all of iface's super-interfaces recursively.
5931*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < num_direct_ifaces; i++) {
5932*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> super_iface = iface->GetDirectInterface(i);
5933*795d594fSAndroid Build Coastguard Worker       CHECK(super_iface != nullptr) << iface->PrettyDescriptor() << " iface #" << i;
5934*795d594fSAndroid Build Coastguard Worker       if (!super_iface->HasBeenRecursivelyInitialized()) {
5935*795d594fSAndroid Build Coastguard Worker         // Recursive step
5936*795d594fSAndroid Build Coastguard Worker         handle_super_iface.Assign(super_iface);
5937*795d594fSAndroid Build Coastguard Worker         if (!InitializeDefaultInterfaceRecursive(self,
5938*795d594fSAndroid Build Coastguard Worker                                                  handle_super_iface,
5939*795d594fSAndroid Build Coastguard Worker                                                  can_init_statics,
5940*795d594fSAndroid Build Coastguard Worker                                                  can_init_parents)) {
5941*795d594fSAndroid Build Coastguard Worker           return false;
5942*795d594fSAndroid Build Coastguard Worker         }
5943*795d594fSAndroid Build Coastguard Worker       }
5944*795d594fSAndroid Build Coastguard Worker     }
5945*795d594fSAndroid Build Coastguard Worker   }
5946*795d594fSAndroid Build Coastguard Worker 
5947*795d594fSAndroid Build Coastguard Worker   bool result = true;
5948*795d594fSAndroid Build Coastguard Worker   // Then we initialize 'iface' if it has default methods. We do not need to (and in fact must not)
5949*795d594fSAndroid Build Coastguard Worker   // initialize if we don't have default methods.
5950*795d594fSAndroid Build Coastguard Worker   if (iface->HasDefaultMethods()) {
5951*795d594fSAndroid Build Coastguard Worker     result = EnsureInitialized(self, iface, can_init_statics, can_init_parents);
5952*795d594fSAndroid Build Coastguard Worker   }
5953*795d594fSAndroid Build Coastguard Worker 
5954*795d594fSAndroid Build Coastguard Worker   // Mark that this interface has undergone recursive default interface initialization so we know we
5955*795d594fSAndroid Build Coastguard Worker   // can skip it on any later class initializations. We do this even if we are not a default
5956*795d594fSAndroid Build Coastguard Worker   // interface since we can still avoid the traversal. This is purely a performance optimization.
5957*795d594fSAndroid Build Coastguard Worker   if (result) {
5958*795d594fSAndroid Build Coastguard Worker     // TODO This should be done in a better way
5959*795d594fSAndroid Build Coastguard Worker     // Note: Use a try-lock to avoid blocking when someone else is holding the lock on this
5960*795d594fSAndroid Build Coastguard Worker     //       interface. It is bad (Java) style, but not impossible. Marking the recursive
5961*795d594fSAndroid Build Coastguard Worker     //       initialization is a performance optimization (to avoid another idempotent visit
5962*795d594fSAndroid Build Coastguard Worker     //       for other implementing classes/interfaces), and can be revisited later.
5963*795d594fSAndroid Build Coastguard Worker     ObjectTryLock<mirror::Class> lock(self, iface);
5964*795d594fSAndroid Build Coastguard Worker     if (lock.Acquired()) {
5965*795d594fSAndroid Build Coastguard Worker       iface->SetRecursivelyInitialized();
5966*795d594fSAndroid Build Coastguard Worker     }
5967*795d594fSAndroid Build Coastguard Worker   }
5968*795d594fSAndroid Build Coastguard Worker   return result;
5969*795d594fSAndroid Build Coastguard Worker }
5970*795d594fSAndroid Build Coastguard Worker 
WaitForInitializeClass(Handle<mirror::Class> klass,Thread * self,ObjectLock<mirror::Class> & lock)5971*795d594fSAndroid Build Coastguard Worker bool ClassLinker::WaitForInitializeClass(Handle<mirror::Class> klass,
5972*795d594fSAndroid Build Coastguard Worker                                          Thread* self,
5973*795d594fSAndroid Build Coastguard Worker                                          ObjectLock<mirror::Class>& lock)
5974*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
5975*795d594fSAndroid Build Coastguard Worker   while (true) {
5976*795d594fSAndroid Build Coastguard Worker     self->AssertNoPendingException();
5977*795d594fSAndroid Build Coastguard Worker     CHECK(!klass->IsInitialized());
5978*795d594fSAndroid Build Coastguard Worker     lock.WaitIgnoringInterrupts();
5979*795d594fSAndroid Build Coastguard Worker 
5980*795d594fSAndroid Build Coastguard Worker     // When we wake up, repeat the test for init-in-progress.  If
5981*795d594fSAndroid Build Coastguard Worker     // there's an exception pending (only possible if
5982*795d594fSAndroid Build Coastguard Worker     // we were not using WaitIgnoringInterrupts), bail out.
5983*795d594fSAndroid Build Coastguard Worker     if (self->IsExceptionPending()) {
5984*795d594fSAndroid Build Coastguard Worker       WrapExceptionInInitializer(klass);
5985*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kErrorResolved, self);
5986*795d594fSAndroid Build Coastguard Worker       return false;
5987*795d594fSAndroid Build Coastguard Worker     }
5988*795d594fSAndroid Build Coastguard Worker     // Spurious wakeup? Go back to waiting.
5989*795d594fSAndroid Build Coastguard Worker     if (klass->GetStatus() == ClassStatus::kInitializing) {
5990*795d594fSAndroid Build Coastguard Worker       continue;
5991*795d594fSAndroid Build Coastguard Worker     }
5992*795d594fSAndroid Build Coastguard Worker     if (klass->GetStatus() == ClassStatus::kVerified &&
5993*795d594fSAndroid Build Coastguard Worker         Runtime::Current()->IsAotCompiler()) {
5994*795d594fSAndroid Build Coastguard Worker       // Compile time initialization failed.
5995*795d594fSAndroid Build Coastguard Worker       return false;
5996*795d594fSAndroid Build Coastguard Worker     }
5997*795d594fSAndroid Build Coastguard Worker     if (klass->IsErroneous()) {
5998*795d594fSAndroid Build Coastguard Worker       // The caller wants an exception, but it was thrown in a
5999*795d594fSAndroid Build Coastguard Worker       // different thread.  Synthesize one here.
6000*795d594fSAndroid Build Coastguard Worker       ThrowNoClassDefFoundError("<clinit> failed for class %s; see exception in other thread",
6001*795d594fSAndroid Build Coastguard Worker                                 klass->PrettyDescriptor().c_str());
6002*795d594fSAndroid Build Coastguard Worker       VlogClassInitializationFailure(klass);
6003*795d594fSAndroid Build Coastguard Worker       return false;
6004*795d594fSAndroid Build Coastguard Worker     }
6005*795d594fSAndroid Build Coastguard Worker     if (klass->IsInitialized()) {
6006*795d594fSAndroid Build Coastguard Worker       return true;
6007*795d594fSAndroid Build Coastguard Worker     }
6008*795d594fSAndroid Build Coastguard Worker     LOG(FATAL) << "Unexpected class status. " << klass->PrettyClass() << " is "
6009*795d594fSAndroid Build Coastguard Worker         << klass->GetStatus();
6010*795d594fSAndroid Build Coastguard Worker   }
6011*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
6012*795d594fSAndroid Build Coastguard Worker }
6013*795d594fSAndroid Build Coastguard Worker 
ThrowSignatureCheckResolveReturnTypeException(Handle<mirror::Class> klass,Handle<mirror::Class> super_klass,ArtMethod * method,ArtMethod * m)6014*795d594fSAndroid Build Coastguard Worker static void ThrowSignatureCheckResolveReturnTypeException(Handle<mirror::Class> klass,
6015*795d594fSAndroid Build Coastguard Worker                                                           Handle<mirror::Class> super_klass,
6016*795d594fSAndroid Build Coastguard Worker                                                           ArtMethod* method,
6017*795d594fSAndroid Build Coastguard Worker                                                           ArtMethod* m)
6018*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
6019*795d594fSAndroid Build Coastguard Worker   DCHECK(Thread::Current()->IsExceptionPending());
6020*795d594fSAndroid Build Coastguard Worker   DCHECK(!m->IsProxyMethod());
6021*795d594fSAndroid Build Coastguard Worker   const DexFile* dex_file = m->GetDexFile();
6022*795d594fSAndroid Build Coastguard Worker   const dex::MethodId& method_id = dex_file->GetMethodId(m->GetDexMethodIndex());
6023*795d594fSAndroid Build Coastguard Worker   const dex::ProtoId& proto_id = dex_file->GetMethodPrototype(method_id);
6024*795d594fSAndroid Build Coastguard Worker   dex::TypeIndex return_type_idx = proto_id.return_type_idx_;
6025*795d594fSAndroid Build Coastguard Worker   std::string return_type = dex_file->PrettyType(return_type_idx);
6026*795d594fSAndroid Build Coastguard Worker   std::string class_loader = mirror::Object::PrettyTypeOf(m->GetDeclaringClass()->GetClassLoader());
6027*795d594fSAndroid Build Coastguard Worker   ThrowWrappedLinkageError(klass.Get(),
6028*795d594fSAndroid Build Coastguard Worker                            "While checking class %s method %s signature against %s %s: "
6029*795d594fSAndroid Build Coastguard Worker                            "Failed to resolve return type %s with %s",
6030*795d594fSAndroid Build Coastguard Worker                            mirror::Class::PrettyDescriptor(klass.Get()).c_str(),
6031*795d594fSAndroid Build Coastguard Worker                            ArtMethod::PrettyMethod(method).c_str(),
6032*795d594fSAndroid Build Coastguard Worker                            super_klass->IsInterface() ? "interface" : "superclass",
6033*795d594fSAndroid Build Coastguard Worker                            mirror::Class::PrettyDescriptor(super_klass.Get()).c_str(),
6034*795d594fSAndroid Build Coastguard Worker                            return_type.c_str(), class_loader.c_str());
6035*795d594fSAndroid Build Coastguard Worker }
6036*795d594fSAndroid Build Coastguard Worker 
ThrowSignatureCheckResolveArgException(Handle<mirror::Class> klass,Handle<mirror::Class> super_klass,ArtMethod * method,ArtMethod * m,uint32_t index,dex::TypeIndex arg_type_idx)6037*795d594fSAndroid Build Coastguard Worker static void ThrowSignatureCheckResolveArgException(Handle<mirror::Class> klass,
6038*795d594fSAndroid Build Coastguard Worker                                                    Handle<mirror::Class> super_klass,
6039*795d594fSAndroid Build Coastguard Worker                                                    ArtMethod* method,
6040*795d594fSAndroid Build Coastguard Worker                                                    ArtMethod* m,
6041*795d594fSAndroid Build Coastguard Worker                                                    uint32_t index,
6042*795d594fSAndroid Build Coastguard Worker                                                    dex::TypeIndex arg_type_idx)
6043*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
6044*795d594fSAndroid Build Coastguard Worker   DCHECK(Thread::Current()->IsExceptionPending());
6045*795d594fSAndroid Build Coastguard Worker   DCHECK(!m->IsProxyMethod());
6046*795d594fSAndroid Build Coastguard Worker   const DexFile* dex_file = m->GetDexFile();
6047*795d594fSAndroid Build Coastguard Worker   std::string arg_type = dex_file->PrettyType(arg_type_idx);
6048*795d594fSAndroid Build Coastguard Worker   std::string class_loader = mirror::Object::PrettyTypeOf(m->GetDeclaringClass()->GetClassLoader());
6049*795d594fSAndroid Build Coastguard Worker   ThrowWrappedLinkageError(klass.Get(),
6050*795d594fSAndroid Build Coastguard Worker                            "While checking class %s method %s signature against %s %s: "
6051*795d594fSAndroid Build Coastguard Worker                            "Failed to resolve arg %u type %s with %s",
6052*795d594fSAndroid Build Coastguard Worker                            mirror::Class::PrettyDescriptor(klass.Get()).c_str(),
6053*795d594fSAndroid Build Coastguard Worker                            ArtMethod::PrettyMethod(method).c_str(),
6054*795d594fSAndroid Build Coastguard Worker                            super_klass->IsInterface() ? "interface" : "superclass",
6055*795d594fSAndroid Build Coastguard Worker                            mirror::Class::PrettyDescriptor(super_klass.Get()).c_str(),
6056*795d594fSAndroid Build Coastguard Worker                            index, arg_type.c_str(), class_loader.c_str());
6057*795d594fSAndroid Build Coastguard Worker }
6058*795d594fSAndroid Build Coastguard Worker 
ThrowSignatureMismatch(Handle<mirror::Class> klass,Handle<mirror::Class> super_klass,ArtMethod * method,const std::string & error_msg)6059*795d594fSAndroid Build Coastguard Worker static void ThrowSignatureMismatch(Handle<mirror::Class> klass,
6060*795d594fSAndroid Build Coastguard Worker                                    Handle<mirror::Class> super_klass,
6061*795d594fSAndroid Build Coastguard Worker                                    ArtMethod* method,
6062*795d594fSAndroid Build Coastguard Worker                                    const std::string& error_msg)
6063*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
6064*795d594fSAndroid Build Coastguard Worker   ThrowLinkageError(klass.Get(),
6065*795d594fSAndroid Build Coastguard Worker                     "Class %s method %s resolves differently in %s %s: %s",
6066*795d594fSAndroid Build Coastguard Worker                     mirror::Class::PrettyDescriptor(klass.Get()).c_str(),
6067*795d594fSAndroid Build Coastguard Worker                     ArtMethod::PrettyMethod(method).c_str(),
6068*795d594fSAndroid Build Coastguard Worker                     super_klass->IsInterface() ? "interface" : "superclass",
6069*795d594fSAndroid Build Coastguard Worker                     mirror::Class::PrettyDescriptor(super_klass.Get()).c_str(),
6070*795d594fSAndroid Build Coastguard Worker                     error_msg.c_str());
6071*795d594fSAndroid Build Coastguard Worker }
6072*795d594fSAndroid Build Coastguard Worker 
HasSameSignatureWithDifferentClassLoaders(Thread * self,Handle<mirror::Class> klass,Handle<mirror::Class> super_klass,ArtMethod * method1,ArtMethod * method2)6073*795d594fSAndroid Build Coastguard Worker static bool HasSameSignatureWithDifferentClassLoaders(Thread* self,
6074*795d594fSAndroid Build Coastguard Worker                                                       Handle<mirror::Class> klass,
6075*795d594fSAndroid Build Coastguard Worker                                                       Handle<mirror::Class> super_klass,
6076*795d594fSAndroid Build Coastguard Worker                                                       ArtMethod* method1,
6077*795d594fSAndroid Build Coastguard Worker                                                       ArtMethod* method2)
6078*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
6079*795d594fSAndroid Build Coastguard Worker   {
6080*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
6081*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> return_type(hs.NewHandle(method1->ResolveReturnType()));
6082*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(return_type == nullptr)) {
6083*795d594fSAndroid Build Coastguard Worker       ThrowSignatureCheckResolveReturnTypeException(klass, super_klass, method1, method1);
6084*795d594fSAndroid Build Coastguard Worker       return false;
6085*795d594fSAndroid Build Coastguard Worker     }
6086*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> other_return_type = method2->ResolveReturnType();
6087*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(other_return_type == nullptr)) {
6088*795d594fSAndroid Build Coastguard Worker       ThrowSignatureCheckResolveReturnTypeException(klass, super_klass, method1, method2);
6089*795d594fSAndroid Build Coastguard Worker       return false;
6090*795d594fSAndroid Build Coastguard Worker     }
6091*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(other_return_type != return_type.Get())) {
6092*795d594fSAndroid Build Coastguard Worker       ThrowSignatureMismatch(klass, super_klass, method1,
6093*795d594fSAndroid Build Coastguard Worker                              StringPrintf("Return types mismatch: %s(%p) vs %s(%p)",
6094*795d594fSAndroid Build Coastguard Worker                                           return_type->PrettyClassAndClassLoader().c_str(),
6095*795d594fSAndroid Build Coastguard Worker                                           return_type.Get(),
6096*795d594fSAndroid Build Coastguard Worker                                           other_return_type->PrettyClassAndClassLoader().c_str(),
6097*795d594fSAndroid Build Coastguard Worker                                           other_return_type.Ptr()));
6098*795d594fSAndroid Build Coastguard Worker       return false;
6099*795d594fSAndroid Build Coastguard Worker     }
6100*795d594fSAndroid Build Coastguard Worker   }
6101*795d594fSAndroid Build Coastguard Worker   const dex::TypeList* types1 = method1->GetParameterTypeList();
6102*795d594fSAndroid Build Coastguard Worker   const dex::TypeList* types2 = method2->GetParameterTypeList();
6103*795d594fSAndroid Build Coastguard Worker   if (types1 == nullptr) {
6104*795d594fSAndroid Build Coastguard Worker     if (types2 != nullptr && types2->Size() != 0) {
6105*795d594fSAndroid Build Coastguard Worker       ThrowSignatureMismatch(klass, super_klass, method1,
6106*795d594fSAndroid Build Coastguard Worker                              StringPrintf("Type list mismatch with %s",
6107*795d594fSAndroid Build Coastguard Worker                                           method2->PrettyMethod(true).c_str()));
6108*795d594fSAndroid Build Coastguard Worker       return false;
6109*795d594fSAndroid Build Coastguard Worker     }
6110*795d594fSAndroid Build Coastguard Worker     return true;
6111*795d594fSAndroid Build Coastguard Worker   } else if (UNLIKELY(types2 == nullptr)) {
6112*795d594fSAndroid Build Coastguard Worker     if (types1->Size() != 0) {
6113*795d594fSAndroid Build Coastguard Worker       ThrowSignatureMismatch(klass, super_klass, method1,
6114*795d594fSAndroid Build Coastguard Worker                              StringPrintf("Type list mismatch with %s",
6115*795d594fSAndroid Build Coastguard Worker                                           method2->PrettyMethod(true).c_str()));
6116*795d594fSAndroid Build Coastguard Worker       return false;
6117*795d594fSAndroid Build Coastguard Worker     }
6118*795d594fSAndroid Build Coastguard Worker     return true;
6119*795d594fSAndroid Build Coastguard Worker   }
6120*795d594fSAndroid Build Coastguard Worker   uint32_t num_types = types1->Size();
6121*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(num_types != types2->Size())) {
6122*795d594fSAndroid Build Coastguard Worker     ThrowSignatureMismatch(klass, super_klass, method1,
6123*795d594fSAndroid Build Coastguard Worker                            StringPrintf("Type list mismatch with %s",
6124*795d594fSAndroid Build Coastguard Worker                                         method2->PrettyMethod(true).c_str()));
6125*795d594fSAndroid Build Coastguard Worker     return false;
6126*795d594fSAndroid Build Coastguard Worker   }
6127*795d594fSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < num_types; ++i) {
6128*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
6129*795d594fSAndroid Build Coastguard Worker     dex::TypeIndex param_type_idx = types1->GetTypeItem(i).type_idx_;
6130*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> param_type(hs.NewHandle(
6131*795d594fSAndroid Build Coastguard Worker         method1->ResolveClassFromTypeIndex(param_type_idx)));
6132*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(param_type == nullptr)) {
6133*795d594fSAndroid Build Coastguard Worker       ThrowSignatureCheckResolveArgException(klass, super_klass, method1,
6134*795d594fSAndroid Build Coastguard Worker                                              method1, i, param_type_idx);
6135*795d594fSAndroid Build Coastguard Worker       return false;
6136*795d594fSAndroid Build Coastguard Worker     }
6137*795d594fSAndroid Build Coastguard Worker     dex::TypeIndex other_param_type_idx = types2->GetTypeItem(i).type_idx_;
6138*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> other_param_type =
6139*795d594fSAndroid Build Coastguard Worker         method2->ResolveClassFromTypeIndex(other_param_type_idx);
6140*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(other_param_type == nullptr)) {
6141*795d594fSAndroid Build Coastguard Worker       ThrowSignatureCheckResolveArgException(klass, super_klass, method1,
6142*795d594fSAndroid Build Coastguard Worker                                              method2, i, other_param_type_idx);
6143*795d594fSAndroid Build Coastguard Worker       return false;
6144*795d594fSAndroid Build Coastguard Worker     }
6145*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(param_type.Get() != other_param_type)) {
6146*795d594fSAndroid Build Coastguard Worker       ThrowSignatureMismatch(klass, super_klass, method1,
6147*795d594fSAndroid Build Coastguard Worker                              StringPrintf("Parameter %u type mismatch: %s(%p) vs %s(%p)",
6148*795d594fSAndroid Build Coastguard Worker                                           i,
6149*795d594fSAndroid Build Coastguard Worker                                           param_type->PrettyClassAndClassLoader().c_str(),
6150*795d594fSAndroid Build Coastguard Worker                                           param_type.Get(),
6151*795d594fSAndroid Build Coastguard Worker                                           other_param_type->PrettyClassAndClassLoader().c_str(),
6152*795d594fSAndroid Build Coastguard Worker                                           other_param_type.Ptr()));
6153*795d594fSAndroid Build Coastguard Worker       return false;
6154*795d594fSAndroid Build Coastguard Worker     }
6155*795d594fSAndroid Build Coastguard Worker   }
6156*795d594fSAndroid Build Coastguard Worker   return true;
6157*795d594fSAndroid Build Coastguard Worker }
6158*795d594fSAndroid Build Coastguard Worker 
6159*795d594fSAndroid Build Coastguard Worker 
ValidateSuperClassDescriptors(Handle<mirror::Class> klass)6160*795d594fSAndroid Build Coastguard Worker bool ClassLinker::ValidateSuperClassDescriptors(Handle<mirror::Class> klass) {
6161*795d594fSAndroid Build Coastguard Worker   if (klass->IsInterface()) {
6162*795d594fSAndroid Build Coastguard Worker     return true;
6163*795d594fSAndroid Build Coastguard Worker   }
6164*795d594fSAndroid Build Coastguard Worker   // Begin with the methods local to the superclass.
6165*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
6166*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(self);
6167*795d594fSAndroid Build Coastguard Worker   MutableHandle<mirror::Class> super_klass(hs.NewHandle<mirror::Class>(nullptr));
6168*795d594fSAndroid Build Coastguard Worker   if (klass->HasSuperClass() &&
6169*795d594fSAndroid Build Coastguard Worker       klass->GetClassLoader() != klass->GetSuperClass()->GetClassLoader()) {
6170*795d594fSAndroid Build Coastguard Worker     super_klass.Assign(klass->GetSuperClass());
6171*795d594fSAndroid Build Coastguard Worker     for (int i = klass->GetSuperClass()->GetVTableLength() - 1; i >= 0; --i) {
6172*795d594fSAndroid Build Coastguard Worker       auto* m = klass->GetVTableEntry(i, image_pointer_size_);
6173*795d594fSAndroid Build Coastguard Worker       auto* super_m = klass->GetSuperClass()->GetVTableEntry(i, image_pointer_size_);
6174*795d594fSAndroid Build Coastguard Worker       if (m != super_m) {
6175*795d594fSAndroid Build Coastguard Worker         if (UNLIKELY(!HasSameSignatureWithDifferentClassLoaders(self,
6176*795d594fSAndroid Build Coastguard Worker                                                                 klass,
6177*795d594fSAndroid Build Coastguard Worker                                                                 super_klass,
6178*795d594fSAndroid Build Coastguard Worker                                                                 m,
6179*795d594fSAndroid Build Coastguard Worker                                                                 super_m))) {
6180*795d594fSAndroid Build Coastguard Worker           self->AssertPendingException();
6181*795d594fSAndroid Build Coastguard Worker           return false;
6182*795d594fSAndroid Build Coastguard Worker         }
6183*795d594fSAndroid Build Coastguard Worker       }
6184*795d594fSAndroid Build Coastguard Worker     }
6185*795d594fSAndroid Build Coastguard Worker   }
6186*795d594fSAndroid Build Coastguard Worker   for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) {
6187*795d594fSAndroid Build Coastguard Worker     super_klass.Assign(klass->GetIfTable()->GetInterface(i));
6188*795d594fSAndroid Build Coastguard Worker     if (klass->GetClassLoader() != super_klass->GetClassLoader()) {
6189*795d594fSAndroid Build Coastguard Worker       uint32_t num_methods = super_klass->NumVirtualMethods();
6190*795d594fSAndroid Build Coastguard Worker       for (uint32_t j = 0; j < num_methods; ++j) {
6191*795d594fSAndroid Build Coastguard Worker         auto* m = klass->GetIfTable()->GetMethodArray(i)->GetElementPtrSize<ArtMethod*>(
6192*795d594fSAndroid Build Coastguard Worker             j, image_pointer_size_);
6193*795d594fSAndroid Build Coastguard Worker         auto* super_m = super_klass->GetVirtualMethod(j, image_pointer_size_);
6194*795d594fSAndroid Build Coastguard Worker         if (m != super_m) {
6195*795d594fSAndroid Build Coastguard Worker           if (UNLIKELY(!HasSameSignatureWithDifferentClassLoaders(self,
6196*795d594fSAndroid Build Coastguard Worker                                                                   klass,
6197*795d594fSAndroid Build Coastguard Worker                                                                   super_klass,
6198*795d594fSAndroid Build Coastguard Worker                                                                   m,
6199*795d594fSAndroid Build Coastguard Worker                                                                   super_m))) {
6200*795d594fSAndroid Build Coastguard Worker             self->AssertPendingException();
6201*795d594fSAndroid Build Coastguard Worker             return false;
6202*795d594fSAndroid Build Coastguard Worker           }
6203*795d594fSAndroid Build Coastguard Worker         }
6204*795d594fSAndroid Build Coastguard Worker       }
6205*795d594fSAndroid Build Coastguard Worker     }
6206*795d594fSAndroid Build Coastguard Worker   }
6207*795d594fSAndroid Build Coastguard Worker   return true;
6208*795d594fSAndroid Build Coastguard Worker }
6209*795d594fSAndroid Build Coastguard Worker 
EnsureInitialized(Thread * self,Handle<mirror::Class> c,bool can_init_fields,bool can_init_parents)6210*795d594fSAndroid Build Coastguard Worker bool ClassLinker::EnsureInitialized(Thread* self,
6211*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::Class> c,
6212*795d594fSAndroid Build Coastguard Worker                                     bool can_init_fields,
6213*795d594fSAndroid Build Coastguard Worker                                     bool can_init_parents) {
6214*795d594fSAndroid Build Coastguard Worker   DCHECK(c != nullptr);
6215*795d594fSAndroid Build Coastguard Worker 
6216*795d594fSAndroid Build Coastguard Worker   if (c->IsInitialized()) {
6217*795d594fSAndroid Build Coastguard Worker     // If we've seen an initialized but not visibly initialized class
6218*795d594fSAndroid Build Coastguard Worker     // many times, request visible initialization.
6219*795d594fSAndroid Build Coastguard Worker     if (kRuntimeISA == InstructionSet::kX86 || kRuntimeISA == InstructionSet::kX86_64) {
6220*795d594fSAndroid Build Coastguard Worker       // Thanks to the x86 memory model classes skip the initialized status.
6221*795d594fSAndroid Build Coastguard Worker       DCHECK(c->IsVisiblyInitialized());
6222*795d594fSAndroid Build Coastguard Worker     } else if (UNLIKELY(!c->IsVisiblyInitialized())) {
6223*795d594fSAndroid Build Coastguard Worker       if (self->IncrementMakeVisiblyInitializedCounter()) {
6224*795d594fSAndroid Build Coastguard Worker         MakeInitializedClassesVisiblyInitialized(self, /*wait=*/ false);
6225*795d594fSAndroid Build Coastguard Worker       }
6226*795d594fSAndroid Build Coastguard Worker     }
6227*795d594fSAndroid Build Coastguard Worker     return true;
6228*795d594fSAndroid Build Coastguard Worker   }
6229*795d594fSAndroid Build Coastguard Worker   // SubtypeCheckInfo::Initialized must happen-before any new-instance for that type.
6230*795d594fSAndroid Build Coastguard Worker   //
6231*795d594fSAndroid Build Coastguard Worker   // Ensure the bitstring is initialized before any of the class initialization
6232*795d594fSAndroid Build Coastguard Worker   // logic occurs. Once a class initializer starts running, objects can
6233*795d594fSAndroid Build Coastguard Worker   // escape into the heap and use the subtype checking code.
6234*795d594fSAndroid Build Coastguard Worker   //
6235*795d594fSAndroid Build Coastguard Worker   // Note: A class whose SubtypeCheckInfo is at least Initialized means it
6236*795d594fSAndroid Build Coastguard Worker   // can be used as a source for the IsSubClass check, and that all ancestors
6237*795d594fSAndroid Build Coastguard Worker   // of the class are Assigned (can be used as a target for IsSubClass check)
6238*795d594fSAndroid Build Coastguard Worker   // or Overflowed (can be used as a source for IsSubClass check).
6239*795d594fSAndroid Build Coastguard Worker   if (kBitstringSubtypeCheckEnabled) {
6240*795d594fSAndroid Build Coastguard Worker     MutexLock subtype_check_lock(Thread::Current(), *Locks::subtype_check_lock_);
6241*795d594fSAndroid Build Coastguard Worker     SubtypeCheck<ObjPtr<mirror::Class>>::EnsureInitialized(c.Get());
6242*795d594fSAndroid Build Coastguard Worker     // TODO: Avoid taking subtype_check_lock_ if SubtypeCheck is already initialized.
6243*795d594fSAndroid Build Coastguard Worker   }
6244*795d594fSAndroid Build Coastguard Worker   const bool success = InitializeClass(self, c, can_init_fields, can_init_parents);
6245*795d594fSAndroid Build Coastguard Worker   if (!success) {
6246*795d594fSAndroid Build Coastguard Worker     if (can_init_fields && can_init_parents) {
6247*795d594fSAndroid Build Coastguard Worker       CHECK(self->IsExceptionPending()) << c->PrettyClass();
6248*795d594fSAndroid Build Coastguard Worker     } else {
6249*795d594fSAndroid Build Coastguard Worker       // There may or may not be an exception pending. If there is, clear it.
6250*795d594fSAndroid Build Coastguard Worker       // We propagate the exception only if we can initialize fields and parents.
6251*795d594fSAndroid Build Coastguard Worker       self->ClearException();
6252*795d594fSAndroid Build Coastguard Worker     }
6253*795d594fSAndroid Build Coastguard Worker   } else {
6254*795d594fSAndroid Build Coastguard Worker     self->AssertNoPendingException();
6255*795d594fSAndroid Build Coastguard Worker   }
6256*795d594fSAndroid Build Coastguard Worker   return success;
6257*795d594fSAndroid Build Coastguard Worker }
6258*795d594fSAndroid Build Coastguard Worker 
FixupTemporaryDeclaringClass(ObjPtr<mirror::Class> temp_class,ObjPtr<mirror::Class> new_class)6259*795d594fSAndroid Build Coastguard Worker void ClassLinker::FixupTemporaryDeclaringClass(ObjPtr<mirror::Class> temp_class,
6260*795d594fSAndroid Build Coastguard Worker                                                ObjPtr<mirror::Class> new_class) {
6261*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(temp_class->NumInstanceFields(), 0u);
6262*795d594fSAndroid Build Coastguard Worker   for (ArtField& field : new_class->GetIFields()) {
6263*795d594fSAndroid Build Coastguard Worker     if (field.GetDeclaringClass() == temp_class) {
6264*795d594fSAndroid Build Coastguard Worker       field.SetDeclaringClass(new_class);
6265*795d594fSAndroid Build Coastguard Worker     }
6266*795d594fSAndroid Build Coastguard Worker   }
6267*795d594fSAndroid Build Coastguard Worker 
6268*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(temp_class->NumStaticFields(), 0u);
6269*795d594fSAndroid Build Coastguard Worker   for (ArtField& field : new_class->GetSFields()) {
6270*795d594fSAndroid Build Coastguard Worker     if (field.GetDeclaringClass() == temp_class) {
6271*795d594fSAndroid Build Coastguard Worker       field.SetDeclaringClass(new_class);
6272*795d594fSAndroid Build Coastguard Worker     }
6273*795d594fSAndroid Build Coastguard Worker   }
6274*795d594fSAndroid Build Coastguard Worker 
6275*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(temp_class->NumDirectMethods(), 0u);
6276*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(temp_class->NumVirtualMethods(), 0u);
6277*795d594fSAndroid Build Coastguard Worker   for (auto& method : new_class->GetMethods(image_pointer_size_)) {
6278*795d594fSAndroid Build Coastguard Worker     if (method.GetDeclaringClass() == temp_class) {
6279*795d594fSAndroid Build Coastguard Worker       method.SetDeclaringClass(new_class);
6280*795d594fSAndroid Build Coastguard Worker     }
6281*795d594fSAndroid Build Coastguard Worker   }
6282*795d594fSAndroid Build Coastguard Worker 
6283*795d594fSAndroid Build Coastguard Worker   // Make sure the remembered set and mod-union tables know that we updated some of the native
6284*795d594fSAndroid Build Coastguard Worker   // roots.
6285*795d594fSAndroid Build Coastguard Worker   WriteBarrier::ForEveryFieldWrite(new_class);
6286*795d594fSAndroid Build Coastguard Worker }
6287*795d594fSAndroid Build Coastguard Worker 
RegisterClassLoader(ObjPtr<mirror::ClassLoader> class_loader)6288*795d594fSAndroid Build Coastguard Worker void ClassLinker::RegisterClassLoader(ObjPtr<mirror::ClassLoader> class_loader) {
6289*795d594fSAndroid Build Coastguard Worker   CHECK(class_loader->GetAllocator() == nullptr);
6290*795d594fSAndroid Build Coastguard Worker   CHECK(class_loader->GetClassTable() == nullptr);
6291*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
6292*795d594fSAndroid Build Coastguard Worker   ClassLoaderData data;
6293*795d594fSAndroid Build Coastguard Worker   data.weak_root = self->GetJniEnv()->GetVm()->AddWeakGlobalRef(self, class_loader);
6294*795d594fSAndroid Build Coastguard Worker   // Create and set the class table.
6295*795d594fSAndroid Build Coastguard Worker   data.class_table = new ClassTable;
6296*795d594fSAndroid Build Coastguard Worker   class_loader->SetClassTable(data.class_table);
6297*795d594fSAndroid Build Coastguard Worker   // Create and set the linear allocator.
6298*795d594fSAndroid Build Coastguard Worker   data.allocator = Runtime::Current()->CreateLinearAlloc();
6299*795d594fSAndroid Build Coastguard Worker   class_loader->SetAllocator(data.allocator);
6300*795d594fSAndroid Build Coastguard Worker   // Add to the list so that we know to free the data later.
6301*795d594fSAndroid Build Coastguard Worker   class_loaders_.push_back(data);
6302*795d594fSAndroid Build Coastguard Worker }
6303*795d594fSAndroid Build Coastguard Worker 
InsertClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)6304*795d594fSAndroid Build Coastguard Worker ClassTable* ClassLinker::InsertClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader) {
6305*795d594fSAndroid Build Coastguard Worker   if (class_loader == nullptr) {
6306*795d594fSAndroid Build Coastguard Worker     return boot_class_table_.get();
6307*795d594fSAndroid Build Coastguard Worker   }
6308*795d594fSAndroid Build Coastguard Worker   ClassTable* class_table = class_loader->GetClassTable();
6309*795d594fSAndroid Build Coastguard Worker   if (class_table == nullptr) {
6310*795d594fSAndroid Build Coastguard Worker     RegisterClassLoader(class_loader);
6311*795d594fSAndroid Build Coastguard Worker     class_table = class_loader->GetClassTable();
6312*795d594fSAndroid Build Coastguard Worker     DCHECK(class_table != nullptr);
6313*795d594fSAndroid Build Coastguard Worker   }
6314*795d594fSAndroid Build Coastguard Worker   return class_table;
6315*795d594fSAndroid Build Coastguard Worker }
6316*795d594fSAndroid Build Coastguard Worker 
ClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)6317*795d594fSAndroid Build Coastguard Worker ClassTable* ClassLinker::ClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader) {
6318*795d594fSAndroid Build Coastguard Worker   return class_loader == nullptr ? boot_class_table_.get() : class_loader->GetClassTable();
6319*795d594fSAndroid Build Coastguard Worker }
6320*795d594fSAndroid Build Coastguard Worker 
LinkClass(Thread * self,const char * descriptor,Handle<mirror::Class> klass,Handle<mirror::ObjectArray<mirror::Class>> interfaces,MutableHandle<mirror::Class> * h_new_class_out)6321*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkClass(Thread* self,
6322*795d594fSAndroid Build Coastguard Worker                             const char* descriptor,
6323*795d594fSAndroid Build Coastguard Worker                             Handle<mirror::Class> klass,
6324*795d594fSAndroid Build Coastguard Worker                             Handle<mirror::ObjectArray<mirror::Class>> interfaces,
6325*795d594fSAndroid Build Coastguard Worker                             MutableHandle<mirror::Class>* h_new_class_out) {
6326*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(ClassStatus::kLoaded, klass->GetStatus());
6327*795d594fSAndroid Build Coastguard Worker 
6328*795d594fSAndroid Build Coastguard Worker   if (!LinkSuperClass(klass)) {
6329*795d594fSAndroid Build Coastguard Worker     return false;
6330*795d594fSAndroid Build Coastguard Worker   }
6331*795d594fSAndroid Build Coastguard Worker   ArtMethod* imt_data[ImTable::kSize];
6332*795d594fSAndroid Build Coastguard Worker   // If there are any new conflicts compared to super class.
6333*795d594fSAndroid Build Coastguard Worker   bool new_conflict = false;
6334*795d594fSAndroid Build Coastguard Worker   std::fill_n(imt_data, arraysize(imt_data), Runtime::Current()->GetImtUnimplementedMethod());
6335*795d594fSAndroid Build Coastguard Worker   if (!LinkMethods(self, klass, interfaces, &new_conflict, imt_data)) {
6336*795d594fSAndroid Build Coastguard Worker     return false;
6337*795d594fSAndroid Build Coastguard Worker   }
6338*795d594fSAndroid Build Coastguard Worker   if (!LinkInstanceFields(self, klass)) {
6339*795d594fSAndroid Build Coastguard Worker     return false;
6340*795d594fSAndroid Build Coastguard Worker   }
6341*795d594fSAndroid Build Coastguard Worker   size_t class_size;
6342*795d594fSAndroid Build Coastguard Worker   if (!LinkStaticFields(self, klass, &class_size)) {
6343*795d594fSAndroid Build Coastguard Worker     return false;
6344*795d594fSAndroid Build Coastguard Worker   }
6345*795d594fSAndroid Build Coastguard Worker   class_size =
6346*795d594fSAndroid Build Coastguard Worker       mirror::Class::AdjustClassSizeForReferenceOffsetBitmapDuringLinking(klass.Get(), class_size);
6347*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(ClassStatus::kLoaded, klass->GetStatus());
6348*795d594fSAndroid Build Coastguard Worker 
6349*795d594fSAndroid Build Coastguard Worker   ImTable* imt = nullptr;
6350*795d594fSAndroid Build Coastguard Worker   if (klass->ShouldHaveImt()) {
6351*795d594fSAndroid Build Coastguard Worker     // If there are any new conflicts compared to the super class we can not make a copy. There
6352*795d594fSAndroid Build Coastguard Worker     // can be cases where both will have a conflict method at the same slot without having the same
6353*795d594fSAndroid Build Coastguard Worker     // set of conflicts. In this case, we can not share the IMT since the conflict table slow path
6354*795d594fSAndroid Build Coastguard Worker     // will possibly create a table that is incorrect for either of the classes.
6355*795d594fSAndroid Build Coastguard Worker     // Same IMT with new_conflict does not happen very often.
6356*795d594fSAndroid Build Coastguard Worker     if (!new_conflict) {
6357*795d594fSAndroid Build Coastguard Worker       ImTable* super_imt = klass->FindSuperImt(image_pointer_size_);
6358*795d594fSAndroid Build Coastguard Worker       if (super_imt != nullptr) {
6359*795d594fSAndroid Build Coastguard Worker         bool imt_equals = true;
6360*795d594fSAndroid Build Coastguard Worker         for (size_t i = 0; i < ImTable::kSize && imt_equals; ++i) {
6361*795d594fSAndroid Build Coastguard Worker           imt_equals = imt_equals && (super_imt->Get(i, image_pointer_size_) == imt_data[i]);
6362*795d594fSAndroid Build Coastguard Worker         }
6363*795d594fSAndroid Build Coastguard Worker         if (imt_equals) {
6364*795d594fSAndroid Build Coastguard Worker           imt = super_imt;
6365*795d594fSAndroid Build Coastguard Worker         }
6366*795d594fSAndroid Build Coastguard Worker       }
6367*795d594fSAndroid Build Coastguard Worker     }
6368*795d594fSAndroid Build Coastguard Worker     if (imt == nullptr) {
6369*795d594fSAndroid Build Coastguard Worker       LinearAlloc* allocator = GetAllocatorForClassLoader(klass->GetClassLoader());
6370*795d594fSAndroid Build Coastguard Worker       imt = reinterpret_cast<ImTable*>(
6371*795d594fSAndroid Build Coastguard Worker           allocator->Alloc(self,
6372*795d594fSAndroid Build Coastguard Worker                            ImTable::SizeInBytes(image_pointer_size_),
6373*795d594fSAndroid Build Coastguard Worker                            LinearAllocKind::kNoGCRoots));
6374*795d594fSAndroid Build Coastguard Worker       if (imt == nullptr) {
6375*795d594fSAndroid Build Coastguard Worker         return false;
6376*795d594fSAndroid Build Coastguard Worker       }
6377*795d594fSAndroid Build Coastguard Worker       imt->Populate(imt_data, image_pointer_size_);
6378*795d594fSAndroid Build Coastguard Worker     }
6379*795d594fSAndroid Build Coastguard Worker   }
6380*795d594fSAndroid Build Coastguard Worker 
6381*795d594fSAndroid Build Coastguard Worker   if (!klass->IsTemp() || (!init_done_ && klass->GetClassSize() == class_size)) {
6382*795d594fSAndroid Build Coastguard Worker     // We don't need to retire this class as it has no embedded tables or it was created the
6383*795d594fSAndroid Build Coastguard Worker     // correct size during class linker initialization.
6384*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(klass->GetClassSize(), class_size) << klass->PrettyDescriptor();
6385*795d594fSAndroid Build Coastguard Worker 
6386*795d594fSAndroid Build Coastguard Worker     if (klass->ShouldHaveEmbeddedVTable()) {
6387*795d594fSAndroid Build Coastguard Worker       klass->PopulateEmbeddedVTable(image_pointer_size_);
6388*795d594fSAndroid Build Coastguard Worker       klass->PopulateReferenceOffsetBitmap();
6389*795d594fSAndroid Build Coastguard Worker     }
6390*795d594fSAndroid Build Coastguard Worker     if (klass->ShouldHaveImt()) {
6391*795d594fSAndroid Build Coastguard Worker       klass->SetImt(imt, image_pointer_size_);
6392*795d594fSAndroid Build Coastguard Worker     }
6393*795d594fSAndroid Build Coastguard Worker 
6394*795d594fSAndroid Build Coastguard Worker     // Update CHA info based on whether we override methods.
6395*795d594fSAndroid Build Coastguard Worker     // Have to do this before setting the class as resolved which allows
6396*795d594fSAndroid Build Coastguard Worker     // instantiation of klass.
6397*795d594fSAndroid Build Coastguard Worker     if (LIKELY(descriptor != nullptr) && cha_ != nullptr) {
6398*795d594fSAndroid Build Coastguard Worker       cha_->UpdateAfterLoadingOf(klass);
6399*795d594fSAndroid Build Coastguard Worker     }
6400*795d594fSAndroid Build Coastguard Worker 
6401*795d594fSAndroid Build Coastguard Worker     // This will notify waiters on klass that saw the not yet resolved
6402*795d594fSAndroid Build Coastguard Worker     // class in the class_table_ during EnsureResolved.
6403*795d594fSAndroid Build Coastguard Worker     mirror::Class::SetStatus(klass, ClassStatus::kResolved, self);
6404*795d594fSAndroid Build Coastguard Worker     h_new_class_out->Assign(klass.Get());
6405*795d594fSAndroid Build Coastguard Worker   } else {
6406*795d594fSAndroid Build Coastguard Worker     CHECK(!klass->IsResolved());
6407*795d594fSAndroid Build Coastguard Worker     // Retire the temporary class and create the correctly sized resolved class.
6408*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
6409*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> h_new_class =
6410*795d594fSAndroid Build Coastguard Worker         hs.NewHandle(mirror::Class::CopyOf(klass, self, class_size, imt, image_pointer_size_));
6411*795d594fSAndroid Build Coastguard Worker     // Set arrays to null since we don't want to have multiple classes with the same ArtField or
6412*795d594fSAndroid Build Coastguard Worker     // ArtMethod array pointers. If this occurs, it causes bugs in remembered sets since the GC
6413*795d594fSAndroid Build Coastguard Worker     // may not see any references to the target space and clean the card for a class if another
6414*795d594fSAndroid Build Coastguard Worker     // class had the same array pointer.
6415*795d594fSAndroid Build Coastguard Worker     klass->SetMethodsPtrUnchecked(nullptr, 0, 0);
6416*795d594fSAndroid Build Coastguard Worker     klass->SetSFieldsPtrUnchecked(nullptr);
6417*795d594fSAndroid Build Coastguard Worker     klass->SetIFieldsPtrUnchecked(nullptr);
6418*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(h_new_class == nullptr)) {
6419*795d594fSAndroid Build Coastguard Worker       self->AssertPendingOOMException();
6420*795d594fSAndroid Build Coastguard Worker       mirror::Class::SetStatus(klass, ClassStatus::kErrorUnresolved, self);
6421*795d594fSAndroid Build Coastguard Worker       return false;
6422*795d594fSAndroid Build Coastguard Worker     }
6423*795d594fSAndroid Build Coastguard Worker 
6424*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(h_new_class->GetClassSize(), class_size);
6425*795d594fSAndroid Build Coastguard Worker     ObjectLock<mirror::Class> lock(self, h_new_class);
6426*795d594fSAndroid Build Coastguard Worker     FixupTemporaryDeclaringClass(klass.Get(), h_new_class.Get());
6427*795d594fSAndroid Build Coastguard Worker 
6428*795d594fSAndroid Build Coastguard Worker     if (LIKELY(descriptor != nullptr)) {
6429*795d594fSAndroid Build Coastguard Worker       WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
6430*795d594fSAndroid Build Coastguard Worker       const ObjPtr<mirror::ClassLoader> class_loader = h_new_class.Get()->GetClassLoader();
6431*795d594fSAndroid Build Coastguard Worker       ClassTable* const table = InsertClassTableForClassLoader(class_loader);
6432*795d594fSAndroid Build Coastguard Worker       const ObjPtr<mirror::Class> existing =
6433*795d594fSAndroid Build Coastguard Worker           table->UpdateClass(h_new_class.Get(), ComputeModifiedUtf8Hash(descriptor));
6434*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(existing, klass.Get());
6435*795d594fSAndroid Build Coastguard Worker       WriteBarrierOnClassLoaderLocked(class_loader, h_new_class.Get());
6436*795d594fSAndroid Build Coastguard Worker     }
6437*795d594fSAndroid Build Coastguard Worker 
6438*795d594fSAndroid Build Coastguard Worker     // Update CHA info based on whether we override methods.
6439*795d594fSAndroid Build Coastguard Worker     // Have to do this before setting the class as resolved which allows
6440*795d594fSAndroid Build Coastguard Worker     // instantiation of klass.
6441*795d594fSAndroid Build Coastguard Worker     if (LIKELY(descriptor != nullptr) && cha_ != nullptr) {
6442*795d594fSAndroid Build Coastguard Worker       cha_->UpdateAfterLoadingOf(h_new_class);
6443*795d594fSAndroid Build Coastguard Worker     }
6444*795d594fSAndroid Build Coastguard Worker 
6445*795d594fSAndroid Build Coastguard Worker     // This will notify waiters on temp class that saw the not yet resolved class in the
6446*795d594fSAndroid Build Coastguard Worker     // class_table_ during EnsureResolved.
6447*795d594fSAndroid Build Coastguard Worker     mirror::Class::SetStatus(klass, ClassStatus::kRetired, self);
6448*795d594fSAndroid Build Coastguard Worker 
6449*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(h_new_class->GetStatus(), ClassStatus::kResolving);
6450*795d594fSAndroid Build Coastguard Worker     // This will notify waiters on new_class that saw the not yet resolved
6451*795d594fSAndroid Build Coastguard Worker     // class in the class_table_ during EnsureResolved.
6452*795d594fSAndroid Build Coastguard Worker     mirror::Class::SetStatus(h_new_class, ClassStatus::kResolved, self);
6453*795d594fSAndroid Build Coastguard Worker     // Return the new class.
6454*795d594fSAndroid Build Coastguard Worker     h_new_class_out->Assign(h_new_class.Get());
6455*795d594fSAndroid Build Coastguard Worker   }
6456*795d594fSAndroid Build Coastguard Worker   return true;
6457*795d594fSAndroid Build Coastguard Worker }
6458*795d594fSAndroid Build Coastguard Worker 
LoadSuperAndInterfaces(Handle<mirror::Class> klass,const DexFile & dex_file)6459*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file) {
6460*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(ClassStatus::kIdx, klass->GetStatus());
6461*795d594fSAndroid Build Coastguard Worker   const dex::ClassDef& class_def = dex_file.GetClassDef(klass->GetDexClassDefIndex());
6462*795d594fSAndroid Build Coastguard Worker   dex::TypeIndex super_class_idx = class_def.superclass_idx_;
6463*795d594fSAndroid Build Coastguard Worker   if (super_class_idx.IsValid()) {
6464*795d594fSAndroid Build Coastguard Worker     // Check that a class does not inherit from itself directly.
6465*795d594fSAndroid Build Coastguard Worker     //
6466*795d594fSAndroid Build Coastguard Worker     // TODO: This is a cheap check to detect the straightforward case
6467*795d594fSAndroid Build Coastguard Worker     // of a class extending itself (b/28685551), but we should do a
6468*795d594fSAndroid Build Coastguard Worker     // proper cycle detection on loaded classes, to detect all cases
6469*795d594fSAndroid Build Coastguard Worker     // of class circularity errors (b/28830038).
6470*795d594fSAndroid Build Coastguard Worker     if (super_class_idx == class_def.class_idx_) {
6471*795d594fSAndroid Build Coastguard Worker       ThrowClassCircularityError(klass.Get(),
6472*795d594fSAndroid Build Coastguard Worker                                  "Class %s extends itself",
6473*795d594fSAndroid Build Coastguard Worker                                  klass->PrettyDescriptor().c_str());
6474*795d594fSAndroid Build Coastguard Worker       return false;
6475*795d594fSAndroid Build Coastguard Worker     }
6476*795d594fSAndroid Build Coastguard Worker 
6477*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> super_class = ResolveType(super_class_idx, klass.Get());
6478*795d594fSAndroid Build Coastguard Worker     if (super_class == nullptr) {
6479*795d594fSAndroid Build Coastguard Worker       DCHECK(Thread::Current()->IsExceptionPending());
6480*795d594fSAndroid Build Coastguard Worker       return false;
6481*795d594fSAndroid Build Coastguard Worker     }
6482*795d594fSAndroid Build Coastguard Worker     // Verify
6483*795d594fSAndroid Build Coastguard Worker     if (!klass->CanAccess(super_class)) {
6484*795d594fSAndroid Build Coastguard Worker       ThrowIllegalAccessError(klass.Get(), "Class %s extended by class %s is inaccessible",
6485*795d594fSAndroid Build Coastguard Worker                               super_class->PrettyDescriptor().c_str(),
6486*795d594fSAndroid Build Coastguard Worker                               klass->PrettyDescriptor().c_str());
6487*795d594fSAndroid Build Coastguard Worker       return false;
6488*795d594fSAndroid Build Coastguard Worker     }
6489*795d594fSAndroid Build Coastguard Worker     CHECK(super_class->IsResolved());
6490*795d594fSAndroid Build Coastguard Worker     klass->SetSuperClass(super_class);
6491*795d594fSAndroid Build Coastguard Worker   }
6492*795d594fSAndroid Build Coastguard Worker   const dex::TypeList* interfaces = dex_file.GetInterfacesList(class_def);
6493*795d594fSAndroid Build Coastguard Worker   if (interfaces != nullptr) {
6494*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < interfaces->Size(); i++) {
6495*795d594fSAndroid Build Coastguard Worker       dex::TypeIndex idx = interfaces->GetTypeItem(i).type_idx_;
6496*795d594fSAndroid Build Coastguard Worker       if (idx.IsValid()) {
6497*795d594fSAndroid Build Coastguard Worker         // Check that a class does not implement itself directly.
6498*795d594fSAndroid Build Coastguard Worker         //
6499*795d594fSAndroid Build Coastguard Worker         // TODO: This is a cheap check to detect the straightforward case of a class implementing
6500*795d594fSAndroid Build Coastguard Worker         // itself, but we should do a proper cycle detection on loaded classes, to detect all cases
6501*795d594fSAndroid Build Coastguard Worker         // of class circularity errors. See b/28685551, b/28830038, and b/301108855
6502*795d594fSAndroid Build Coastguard Worker         if (idx == class_def.class_idx_) {
6503*795d594fSAndroid Build Coastguard Worker           ThrowClassCircularityError(
6504*795d594fSAndroid Build Coastguard Worker               klass.Get(), "Class %s implements itself", klass->PrettyDescriptor().c_str());
6505*795d594fSAndroid Build Coastguard Worker           return false;
6506*795d594fSAndroid Build Coastguard Worker         }
6507*795d594fSAndroid Build Coastguard Worker       }
6508*795d594fSAndroid Build Coastguard Worker 
6509*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> interface = ResolveType(idx, klass.Get());
6510*795d594fSAndroid Build Coastguard Worker       if (interface == nullptr) {
6511*795d594fSAndroid Build Coastguard Worker         DCHECK(Thread::Current()->IsExceptionPending());
6512*795d594fSAndroid Build Coastguard Worker         return false;
6513*795d594fSAndroid Build Coastguard Worker       }
6514*795d594fSAndroid Build Coastguard Worker       // Verify
6515*795d594fSAndroid Build Coastguard Worker       if (!klass->CanAccess(interface)) {
6516*795d594fSAndroid Build Coastguard Worker         // TODO: the RI seemed to ignore this in my testing.
6517*795d594fSAndroid Build Coastguard Worker         ThrowIllegalAccessError(klass.Get(),
6518*795d594fSAndroid Build Coastguard Worker                                 "Interface %s implemented by class %s is inaccessible",
6519*795d594fSAndroid Build Coastguard Worker                                 interface->PrettyDescriptor().c_str(),
6520*795d594fSAndroid Build Coastguard Worker                                 klass->PrettyDescriptor().c_str());
6521*795d594fSAndroid Build Coastguard Worker         return false;
6522*795d594fSAndroid Build Coastguard Worker       }
6523*795d594fSAndroid Build Coastguard Worker     }
6524*795d594fSAndroid Build Coastguard Worker   }
6525*795d594fSAndroid Build Coastguard Worker   // Mark the class as loaded.
6526*795d594fSAndroid Build Coastguard Worker   mirror::Class::SetStatus(klass, ClassStatus::kLoaded, nullptr);
6527*795d594fSAndroid Build Coastguard Worker   return true;
6528*795d594fSAndroid Build Coastguard Worker }
6529*795d594fSAndroid Build Coastguard Worker 
LinkSuperClass(Handle<mirror::Class> klass)6530*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkSuperClass(Handle<mirror::Class> klass) {
6531*795d594fSAndroid Build Coastguard Worker   CHECK(!klass->IsPrimitive());
6532*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> super = klass->GetSuperClass();
6533*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> object_class = GetClassRoot<mirror::Object>(this);
6534*795d594fSAndroid Build Coastguard Worker   if (klass.Get() == object_class) {
6535*795d594fSAndroid Build Coastguard Worker     if (super != nullptr) {
6536*795d594fSAndroid Build Coastguard Worker       ThrowClassFormatError(klass.Get(), "java.lang.Object must not have a superclass");
6537*795d594fSAndroid Build Coastguard Worker       return false;
6538*795d594fSAndroid Build Coastguard Worker     }
6539*795d594fSAndroid Build Coastguard Worker     return true;
6540*795d594fSAndroid Build Coastguard Worker   }
6541*795d594fSAndroid Build Coastguard Worker   if (super == nullptr) {
6542*795d594fSAndroid Build Coastguard Worker     ThrowLinkageError(klass.Get(), "No superclass defined for class %s",
6543*795d594fSAndroid Build Coastguard Worker                       klass->PrettyDescriptor().c_str());
6544*795d594fSAndroid Build Coastguard Worker     return false;
6545*795d594fSAndroid Build Coastguard Worker   }
6546*795d594fSAndroid Build Coastguard Worker   // Verify
6547*795d594fSAndroid Build Coastguard Worker   if (klass->IsInterface() && super != object_class) {
6548*795d594fSAndroid Build Coastguard Worker     ThrowClassFormatError(klass.Get(), "Interfaces must have java.lang.Object as superclass");
6549*795d594fSAndroid Build Coastguard Worker     return false;
6550*795d594fSAndroid Build Coastguard Worker   }
6551*795d594fSAndroid Build Coastguard Worker   if (super->IsFinal()) {
6552*795d594fSAndroid Build Coastguard Worker     ThrowVerifyError(klass.Get(),
6553*795d594fSAndroid Build Coastguard Worker                      "Superclass %s of %s is declared final",
6554*795d594fSAndroid Build Coastguard Worker                      super->PrettyDescriptor().c_str(),
6555*795d594fSAndroid Build Coastguard Worker                      klass->PrettyDescriptor().c_str());
6556*795d594fSAndroid Build Coastguard Worker     return false;
6557*795d594fSAndroid Build Coastguard Worker   }
6558*795d594fSAndroid Build Coastguard Worker   if (super->IsInterface()) {
6559*795d594fSAndroid Build Coastguard Worker     ThrowIncompatibleClassChangeError(klass.Get(),
6560*795d594fSAndroid Build Coastguard Worker                                       "Superclass %s of %s is an interface",
6561*795d594fSAndroid Build Coastguard Worker                                       super->PrettyDescriptor().c_str(),
6562*795d594fSAndroid Build Coastguard Worker                                       klass->PrettyDescriptor().c_str());
6563*795d594fSAndroid Build Coastguard Worker     return false;
6564*795d594fSAndroid Build Coastguard Worker   }
6565*795d594fSAndroid Build Coastguard Worker   if (!klass->CanAccess(super)) {
6566*795d594fSAndroid Build Coastguard Worker     ThrowIllegalAccessError(klass.Get(), "Superclass %s is inaccessible to class %s",
6567*795d594fSAndroid Build Coastguard Worker                             super->PrettyDescriptor().c_str(),
6568*795d594fSAndroid Build Coastguard Worker                             klass->PrettyDescriptor().c_str());
6569*795d594fSAndroid Build Coastguard Worker     return false;
6570*795d594fSAndroid Build Coastguard Worker   }
6571*795d594fSAndroid Build Coastguard Worker   if (!VerifyRecordClass(klass, super)) {
6572*795d594fSAndroid Build Coastguard Worker     DCHECK(Thread::Current()->IsExceptionPending());
6573*795d594fSAndroid Build Coastguard Worker     return false;
6574*795d594fSAndroid Build Coastguard Worker   }
6575*795d594fSAndroid Build Coastguard Worker 
6576*795d594fSAndroid Build Coastguard Worker   // Inherit kAccClassIsFinalizable from the superclass in case this
6577*795d594fSAndroid Build Coastguard Worker   // class doesn't override finalize.
6578*795d594fSAndroid Build Coastguard Worker   if (super->IsFinalizable()) {
6579*795d594fSAndroid Build Coastguard Worker     klass->SetFinalizable();
6580*795d594fSAndroid Build Coastguard Worker   }
6581*795d594fSAndroid Build Coastguard Worker 
6582*795d594fSAndroid Build Coastguard Worker   // Inherit class loader flag form super class.
6583*795d594fSAndroid Build Coastguard Worker   if (super->IsClassLoaderClass()) {
6584*795d594fSAndroid Build Coastguard Worker     klass->SetClassLoaderClass();
6585*795d594fSAndroid Build Coastguard Worker   }
6586*795d594fSAndroid Build Coastguard Worker 
6587*795d594fSAndroid Build Coastguard Worker   // Inherit reference flags (if any) from the superclass.
6588*795d594fSAndroid Build Coastguard Worker   uint32_t reference_flags = (super->GetClassFlags() & mirror::kClassFlagReference);
6589*795d594fSAndroid Build Coastguard Worker   if (reference_flags != 0) {
6590*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(klass->GetClassFlags(), 0u);
6591*795d594fSAndroid Build Coastguard Worker     klass->SetClassFlags(klass->GetClassFlags() | reference_flags);
6592*795d594fSAndroid Build Coastguard Worker   }
6593*795d594fSAndroid Build Coastguard Worker   // Disallow custom direct subclasses of java.lang.ref.Reference.
6594*795d594fSAndroid Build Coastguard Worker   if (init_done_ && super == GetClassRoot<mirror::Reference>(this)) {
6595*795d594fSAndroid Build Coastguard Worker     ThrowLinkageError(klass.Get(),
6596*795d594fSAndroid Build Coastguard Worker                       "Class %s attempts to subclass java.lang.ref.Reference, which is not allowed",
6597*795d594fSAndroid Build Coastguard Worker                       klass->PrettyDescriptor().c_str());
6598*795d594fSAndroid Build Coastguard Worker     return false;
6599*795d594fSAndroid Build Coastguard Worker   }
6600*795d594fSAndroid Build Coastguard Worker 
6601*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
6602*795d594fSAndroid Build Coastguard Worker     // Ensure super classes are fully resolved prior to resolving fields..
6603*795d594fSAndroid Build Coastguard Worker     while (super != nullptr) {
6604*795d594fSAndroid Build Coastguard Worker       CHECK(super->IsResolved());
6605*795d594fSAndroid Build Coastguard Worker       super = super->GetSuperClass();
6606*795d594fSAndroid Build Coastguard Worker     }
6607*795d594fSAndroid Build Coastguard Worker   }
6608*795d594fSAndroid Build Coastguard Worker   return true;
6609*795d594fSAndroid Build Coastguard Worker }
6610*795d594fSAndroid Build Coastguard Worker 
6611*795d594fSAndroid Build Coastguard Worker // Comparator for name and signature of a method, used in finding overriding methods. Implementation
6612*795d594fSAndroid Build Coastguard Worker // avoids the use of handles, if it didn't then rather than compare dex files we could compare dex
6613*795d594fSAndroid Build Coastguard Worker // caches in the implementation below.
6614*795d594fSAndroid Build Coastguard Worker class MethodNameAndSignatureComparator final : public ValueObject {
6615*795d594fSAndroid Build Coastguard Worker  public:
6616*795d594fSAndroid Build Coastguard Worker   explicit MethodNameAndSignatureComparator(ArtMethod* method)
REQUIRES_SHARED(Locks::mutator_lock_)6617*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) :
6618*795d594fSAndroid Build Coastguard Worker       dex_file_(method->GetDexFile()), mid_(&dex_file_->GetMethodId(method->GetDexMethodIndex())),
6619*795d594fSAndroid Build Coastguard Worker       name_view_() {
6620*795d594fSAndroid Build Coastguard Worker     DCHECK(!method->IsProxyMethod()) << method->PrettyMethod();
6621*795d594fSAndroid Build Coastguard Worker   }
6622*795d594fSAndroid Build Coastguard Worker 
GetNameView()6623*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE std::string_view GetNameView() {
6624*795d594fSAndroid Build Coastguard Worker     if (name_view_.empty()) {
6625*795d594fSAndroid Build Coastguard Worker       name_view_ = dex_file_->GetStringView(mid_->name_idx_);
6626*795d594fSAndroid Build Coastguard Worker     }
6627*795d594fSAndroid Build Coastguard Worker     return name_view_;
6628*795d594fSAndroid Build Coastguard Worker   }
6629*795d594fSAndroid Build Coastguard Worker 
HasSameNameAndSignature(ArtMethod * other)6630*795d594fSAndroid Build Coastguard Worker   bool HasSameNameAndSignature(ArtMethod* other)
6631*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
6632*795d594fSAndroid Build Coastguard Worker     DCHECK(!other->IsProxyMethod()) << other->PrettyMethod();
6633*795d594fSAndroid Build Coastguard Worker     const DexFile* other_dex_file = other->GetDexFile();
6634*795d594fSAndroid Build Coastguard Worker     const dex::MethodId& other_mid = other_dex_file->GetMethodId(other->GetDexMethodIndex());
6635*795d594fSAndroid Build Coastguard Worker     if (dex_file_ == other_dex_file) {
6636*795d594fSAndroid Build Coastguard Worker       return mid_->name_idx_ == other_mid.name_idx_ && mid_->proto_idx_ == other_mid.proto_idx_;
6637*795d594fSAndroid Build Coastguard Worker     }
6638*795d594fSAndroid Build Coastguard Worker     return GetNameView() == other_dex_file->GetStringView(other_mid.name_idx_) &&
6639*795d594fSAndroid Build Coastguard Worker            dex_file_->GetMethodSignature(*mid_) == other_dex_file->GetMethodSignature(other_mid);
6640*795d594fSAndroid Build Coastguard Worker   }
6641*795d594fSAndroid Build Coastguard Worker 
6642*795d594fSAndroid Build Coastguard Worker  private:
6643*795d594fSAndroid Build Coastguard Worker   // Dex file for the method to compare against.
6644*795d594fSAndroid Build Coastguard Worker   const DexFile* const dex_file_;
6645*795d594fSAndroid Build Coastguard Worker   // MethodId for the method to compare against.
6646*795d594fSAndroid Build Coastguard Worker   const dex::MethodId* const mid_;
6647*795d594fSAndroid Build Coastguard Worker   // Lazily computed name from the dex file's strings.
6648*795d594fSAndroid Build Coastguard Worker   std::string_view name_view_;
6649*795d594fSAndroid Build Coastguard Worker };
6650*795d594fSAndroid Build Coastguard Worker 
GetImtOwner(ObjPtr<mirror::Class> klass)6651*795d594fSAndroid Build Coastguard Worker static ObjPtr<mirror::Class> GetImtOwner(ObjPtr<mirror::Class> klass)
6652*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
6653*795d594fSAndroid Build Coastguard Worker   ImTable* imt = klass->GetImt(kRuntimePointerSize);
6654*795d594fSAndroid Build Coastguard Worker   DCHECK(imt != nullptr);
6655*795d594fSAndroid Build Coastguard Worker   while (klass->HasSuperClass()) {
6656*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
6657*795d594fSAndroid Build Coastguard Worker     // Abstract classes cannot have IMTs, so we skip them.
6658*795d594fSAndroid Build Coastguard Worker     while (super_class->IsAbstract()) {
6659*795d594fSAndroid Build Coastguard Worker       DCHECK(super_class->HasSuperClass());
6660*795d594fSAndroid Build Coastguard Worker       super_class = super_class->GetSuperClass();
6661*795d594fSAndroid Build Coastguard Worker     }
6662*795d594fSAndroid Build Coastguard Worker     DCHECK(super_class->ShouldHaveImt());
6663*795d594fSAndroid Build Coastguard Worker     if (imt != super_class->GetImt(kRuntimePointerSize)) {
6664*795d594fSAndroid Build Coastguard Worker       // IMT not shared with the super class, return the current class.
6665*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(klass->GetImt(kRuntimePointerSize), imt) << klass->PrettyClass();
6666*795d594fSAndroid Build Coastguard Worker       return klass;
6667*795d594fSAndroid Build Coastguard Worker     }
6668*795d594fSAndroid Build Coastguard Worker     klass = super_class;
6669*795d594fSAndroid Build Coastguard Worker   }
6670*795d594fSAndroid Build Coastguard Worker   return nullptr;
6671*795d594fSAndroid Build Coastguard Worker }
6672*795d594fSAndroid Build Coastguard Worker 
AddMethodToConflictTable(ObjPtr<mirror::Class> klass,ArtMethod * conflict_method,ArtMethod * interface_method,ArtMethod * method)6673*795d594fSAndroid Build Coastguard Worker ArtMethod* ClassLinker::AddMethodToConflictTable(ObjPtr<mirror::Class> klass,
6674*795d594fSAndroid Build Coastguard Worker                                                  ArtMethod* conflict_method,
6675*795d594fSAndroid Build Coastguard Worker                                                  ArtMethod* interface_method,
6676*795d594fSAndroid Build Coastguard Worker                                                  ArtMethod* method) {
6677*795d594fSAndroid Build Coastguard Worker   ImtConflictTable* current_table = conflict_method->GetImtConflictTable(kRuntimePointerSize);
6678*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
6679*795d594fSAndroid Build Coastguard Worker 
6680*795d594fSAndroid Build Coastguard Worker   // The IMT may be shared with a super class, in which case we need to use that
6681*795d594fSAndroid Build Coastguard Worker   // super class's `LinearAlloc`. The conflict itself should be limited to
6682*795d594fSAndroid Build Coastguard Worker   // methods at or higher up the chain of the IMT owner, otherwise class
6683*795d594fSAndroid Build Coastguard Worker   // linker would have created a different IMT.
6684*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> imt_owner = GetImtOwner(klass);
6685*795d594fSAndroid Build Coastguard Worker   DCHECK(imt_owner != nullptr);
6686*795d594fSAndroid Build Coastguard Worker 
6687*795d594fSAndroid Build Coastguard Worker   LinearAlloc* linear_alloc = GetAllocatorForClassLoader(imt_owner->GetClassLoader());
6688*795d594fSAndroid Build Coastguard Worker   // If the imt owner is in an image, the imt is also there and not in the
6689*795d594fSAndroid Build Coastguard Worker   // linear alloc.
6690*795d594fSAndroid Build Coastguard Worker   DCHECK_IMPLIES(runtime->GetHeap()->FindSpaceFromObject(imt_owner, /*fail_ok=*/true) == nullptr,
6691*795d594fSAndroid Build Coastguard Worker                  linear_alloc->Contains(klass->GetImt(kRuntimePointerSize)));
6692*795d594fSAndroid Build Coastguard Worker 
6693*795d594fSAndroid Build Coastguard Worker   // Create a new entry if the existing one is the shared conflict method.
6694*795d594fSAndroid Build Coastguard Worker   ArtMethod* new_conflict_method = (conflict_method == runtime->GetImtConflictMethod())
6695*795d594fSAndroid Build Coastguard Worker       ? runtime->CreateImtConflictMethod(linear_alloc)
6696*795d594fSAndroid Build Coastguard Worker       : conflict_method;
6697*795d594fSAndroid Build Coastguard Worker 
6698*795d594fSAndroid Build Coastguard Worker   // Allocate a new table. Note that we will leak this table at the next conflict,
6699*795d594fSAndroid Build Coastguard Worker   // but that's a tradeoff compared to making the table fixed size.
6700*795d594fSAndroid Build Coastguard Worker   void* data = linear_alloc->Alloc(
6701*795d594fSAndroid Build Coastguard Worker       Thread::Current(),
6702*795d594fSAndroid Build Coastguard Worker       ImtConflictTable::ComputeSizeWithOneMoreEntry(current_table, image_pointer_size_),
6703*795d594fSAndroid Build Coastguard Worker       LinearAllocKind::kNoGCRoots);
6704*795d594fSAndroid Build Coastguard Worker   if (data == nullptr) {
6705*795d594fSAndroid Build Coastguard Worker     LOG(ERROR) << "Failed to allocate conflict table";
6706*795d594fSAndroid Build Coastguard Worker     return conflict_method;
6707*795d594fSAndroid Build Coastguard Worker   }
6708*795d594fSAndroid Build Coastguard Worker   ImtConflictTable* new_table = new (data) ImtConflictTable(current_table,
6709*795d594fSAndroid Build Coastguard Worker                                                             interface_method,
6710*795d594fSAndroid Build Coastguard Worker                                                             method,
6711*795d594fSAndroid Build Coastguard Worker                                                             image_pointer_size_);
6712*795d594fSAndroid Build Coastguard Worker 
6713*795d594fSAndroid Build Coastguard Worker   // Do a fence to ensure threads see the data in the table before it is assigned
6714*795d594fSAndroid Build Coastguard Worker   // to the conflict method.
6715*795d594fSAndroid Build Coastguard Worker   // Note that there is a race in the presence of multiple threads and we may leak
6716*795d594fSAndroid Build Coastguard Worker   // memory from the LinearAlloc, but that's a tradeoff compared to using
6717*795d594fSAndroid Build Coastguard Worker   // atomic operations.
6718*795d594fSAndroid Build Coastguard Worker   std::atomic_thread_fence(std::memory_order_release);
6719*795d594fSAndroid Build Coastguard Worker   new_conflict_method->SetImtConflictTable(new_table, image_pointer_size_);
6720*795d594fSAndroid Build Coastguard Worker   return new_conflict_method;
6721*795d594fSAndroid Build Coastguard Worker }
6722*795d594fSAndroid Build Coastguard Worker 
SetIMTRef(ArtMethod * unimplemented_method,ArtMethod * imt_conflict_method,ArtMethod * current_method,bool * new_conflict,ArtMethod ** imt_ref)6723*795d594fSAndroid Build Coastguard Worker void ClassLinker::SetIMTRef(ArtMethod* unimplemented_method,
6724*795d594fSAndroid Build Coastguard Worker                             ArtMethod* imt_conflict_method,
6725*795d594fSAndroid Build Coastguard Worker                             ArtMethod* current_method,
6726*795d594fSAndroid Build Coastguard Worker                             /*out*/bool* new_conflict,
6727*795d594fSAndroid Build Coastguard Worker                             /*out*/ArtMethod** imt_ref) {
6728*795d594fSAndroid Build Coastguard Worker   // Place method in imt if entry is empty, place conflict otherwise.
6729*795d594fSAndroid Build Coastguard Worker   if (*imt_ref == unimplemented_method) {
6730*795d594fSAndroid Build Coastguard Worker     *imt_ref = current_method;
6731*795d594fSAndroid Build Coastguard Worker   } else if (!(*imt_ref)->IsRuntimeMethod()) {
6732*795d594fSAndroid Build Coastguard Worker     // If we are not a conflict and we have the same signature and name as the imt
6733*795d594fSAndroid Build Coastguard Worker     // entry, it must be that we overwrote a superclass vtable entry.
6734*795d594fSAndroid Build Coastguard Worker     // Note that we have checked IsRuntimeMethod, as there may be multiple different
6735*795d594fSAndroid Build Coastguard Worker     // conflict methods.
6736*795d594fSAndroid Build Coastguard Worker     MethodNameAndSignatureComparator imt_comparator(
6737*795d594fSAndroid Build Coastguard Worker         (*imt_ref)->GetInterfaceMethodIfProxy(image_pointer_size_));
6738*795d594fSAndroid Build Coastguard Worker     if (imt_comparator.HasSameNameAndSignature(
6739*795d594fSAndroid Build Coastguard Worker           current_method->GetInterfaceMethodIfProxy(image_pointer_size_))) {
6740*795d594fSAndroid Build Coastguard Worker       *imt_ref = current_method;
6741*795d594fSAndroid Build Coastguard Worker     } else {
6742*795d594fSAndroid Build Coastguard Worker       *imt_ref = imt_conflict_method;
6743*795d594fSAndroid Build Coastguard Worker       *new_conflict = true;
6744*795d594fSAndroid Build Coastguard Worker     }
6745*795d594fSAndroid Build Coastguard Worker   } else {
6746*795d594fSAndroid Build Coastguard Worker     // Place the default conflict method. Note that there may be an existing conflict
6747*795d594fSAndroid Build Coastguard Worker     // method in the IMT, but it could be one tailored to the super class, with a
6748*795d594fSAndroid Build Coastguard Worker     // specific ImtConflictTable.
6749*795d594fSAndroid Build Coastguard Worker     *imt_ref = imt_conflict_method;
6750*795d594fSAndroid Build Coastguard Worker     *new_conflict = true;
6751*795d594fSAndroid Build Coastguard Worker   }
6752*795d594fSAndroid Build Coastguard Worker }
6753*795d594fSAndroid Build Coastguard Worker 
FillIMTAndConflictTables(ObjPtr<mirror::Class> klass)6754*795d594fSAndroid Build Coastguard Worker void ClassLinker::FillIMTAndConflictTables(ObjPtr<mirror::Class> klass) {
6755*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->ShouldHaveImt()) << klass->PrettyClass();
6756*795d594fSAndroid Build Coastguard Worker   DCHECK(!klass->IsTemp()) << klass->PrettyClass();
6757*795d594fSAndroid Build Coastguard Worker   ArtMethod* imt_data[ImTable::kSize];
6758*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
6759*795d594fSAndroid Build Coastguard Worker   ArtMethod* const unimplemented_method = runtime->GetImtUnimplementedMethod();
6760*795d594fSAndroid Build Coastguard Worker   ArtMethod* const conflict_method = runtime->GetImtConflictMethod();
6761*795d594fSAndroid Build Coastguard Worker   std::fill_n(imt_data, arraysize(imt_data), unimplemented_method);
6762*795d594fSAndroid Build Coastguard Worker   if (klass->GetIfTable() != nullptr) {
6763*795d594fSAndroid Build Coastguard Worker     bool new_conflict = false;
6764*795d594fSAndroid Build Coastguard Worker     FillIMTFromIfTable(klass->GetIfTable(),
6765*795d594fSAndroid Build Coastguard Worker                        unimplemented_method,
6766*795d594fSAndroid Build Coastguard Worker                        conflict_method,
6767*795d594fSAndroid Build Coastguard Worker                        klass,
6768*795d594fSAndroid Build Coastguard Worker                        /*create_conflict_tables=*/true,
6769*795d594fSAndroid Build Coastguard Worker                        /*ignore_copied_methods=*/false,
6770*795d594fSAndroid Build Coastguard Worker                        &new_conflict,
6771*795d594fSAndroid Build Coastguard Worker                        &imt_data[0]);
6772*795d594fSAndroid Build Coastguard Worker   }
6773*795d594fSAndroid Build Coastguard Worker   // Compare the IMT with the super class including the conflict methods. If they are equivalent,
6774*795d594fSAndroid Build Coastguard Worker   // we can just use the same pointer.
6775*795d594fSAndroid Build Coastguard Worker   ImTable* imt = nullptr;
6776*795d594fSAndroid Build Coastguard Worker   ImTable* super_imt = klass->FindSuperImt(image_pointer_size_);
6777*795d594fSAndroid Build Coastguard Worker   if (super_imt != nullptr) {
6778*795d594fSAndroid Build Coastguard Worker     bool same = true;
6779*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; same && i < ImTable::kSize; ++i) {
6780*795d594fSAndroid Build Coastguard Worker       ArtMethod* method = imt_data[i];
6781*795d594fSAndroid Build Coastguard Worker       ArtMethod* super_method = super_imt->Get(i, image_pointer_size_);
6782*795d594fSAndroid Build Coastguard Worker       if (method != super_method) {
6783*795d594fSAndroid Build Coastguard Worker         bool is_conflict_table = method->IsRuntimeMethod() &&
6784*795d594fSAndroid Build Coastguard Worker                                  method != unimplemented_method &&
6785*795d594fSAndroid Build Coastguard Worker                                  method != conflict_method;
6786*795d594fSAndroid Build Coastguard Worker         // Verify conflict contents.
6787*795d594fSAndroid Build Coastguard Worker         bool super_conflict_table = super_method->IsRuntimeMethod() &&
6788*795d594fSAndroid Build Coastguard Worker                                     super_method != unimplemented_method &&
6789*795d594fSAndroid Build Coastguard Worker                                     super_method != conflict_method;
6790*795d594fSAndroid Build Coastguard Worker         if (!is_conflict_table || !super_conflict_table) {
6791*795d594fSAndroid Build Coastguard Worker           same = false;
6792*795d594fSAndroid Build Coastguard Worker         } else {
6793*795d594fSAndroid Build Coastguard Worker           ImtConflictTable* table1 = method->GetImtConflictTable(image_pointer_size_);
6794*795d594fSAndroid Build Coastguard Worker           ImtConflictTable* table2 = super_method->GetImtConflictTable(image_pointer_size_);
6795*795d594fSAndroid Build Coastguard Worker           same = same && table1->Equals(table2, image_pointer_size_);
6796*795d594fSAndroid Build Coastguard Worker         }
6797*795d594fSAndroid Build Coastguard Worker       }
6798*795d594fSAndroid Build Coastguard Worker     }
6799*795d594fSAndroid Build Coastguard Worker     if (same) {
6800*795d594fSAndroid Build Coastguard Worker       imt = super_imt;
6801*795d594fSAndroid Build Coastguard Worker     }
6802*795d594fSAndroid Build Coastguard Worker   }
6803*795d594fSAndroid Build Coastguard Worker   if (imt == nullptr) {
6804*795d594fSAndroid Build Coastguard Worker     imt = klass->GetImt(image_pointer_size_);
6805*795d594fSAndroid Build Coastguard Worker     DCHECK(imt != nullptr);
6806*795d594fSAndroid Build Coastguard Worker     DCHECK_NE(imt, super_imt);
6807*795d594fSAndroid Build Coastguard Worker     imt->Populate(imt_data, image_pointer_size_);
6808*795d594fSAndroid Build Coastguard Worker   } else {
6809*795d594fSAndroid Build Coastguard Worker     klass->SetImt(imt, image_pointer_size_);
6810*795d594fSAndroid Build Coastguard Worker   }
6811*795d594fSAndroid Build Coastguard Worker }
6812*795d594fSAndroid Build Coastguard Worker 
CreateImtConflictTable(size_t count,LinearAlloc * linear_alloc,PointerSize image_pointer_size)6813*795d594fSAndroid Build Coastguard Worker ImtConflictTable* ClassLinker::CreateImtConflictTable(size_t count,
6814*795d594fSAndroid Build Coastguard Worker                                                       LinearAlloc* linear_alloc,
6815*795d594fSAndroid Build Coastguard Worker                                                       PointerSize image_pointer_size) {
6816*795d594fSAndroid Build Coastguard Worker   void* data = linear_alloc->Alloc(Thread::Current(),
6817*795d594fSAndroid Build Coastguard Worker                                    ImtConflictTable::ComputeSize(count, image_pointer_size),
6818*795d594fSAndroid Build Coastguard Worker                                    LinearAllocKind::kNoGCRoots);
6819*795d594fSAndroid Build Coastguard Worker   return (data != nullptr) ? new (data) ImtConflictTable(count, image_pointer_size) : nullptr;
6820*795d594fSAndroid Build Coastguard Worker }
6821*795d594fSAndroid Build Coastguard Worker 
CreateImtConflictTable(size_t count,LinearAlloc * linear_alloc)6822*795d594fSAndroid Build Coastguard Worker ImtConflictTable* ClassLinker::CreateImtConflictTable(size_t count, LinearAlloc* linear_alloc) {
6823*795d594fSAndroid Build Coastguard Worker   return CreateImtConflictTable(count, linear_alloc, image_pointer_size_);
6824*795d594fSAndroid Build Coastguard Worker }
6825*795d594fSAndroid Build Coastguard Worker 
FillIMTFromIfTable(ObjPtr<mirror::IfTable> if_table,ArtMethod * unimplemented_method,ArtMethod * imt_conflict_method,ObjPtr<mirror::Class> klass,bool create_conflict_tables,bool ignore_copied_methods,bool * new_conflict,ArtMethod ** imt)6826*795d594fSAndroid Build Coastguard Worker void ClassLinker::FillIMTFromIfTable(ObjPtr<mirror::IfTable> if_table,
6827*795d594fSAndroid Build Coastguard Worker                                      ArtMethod* unimplemented_method,
6828*795d594fSAndroid Build Coastguard Worker                                      ArtMethod* imt_conflict_method,
6829*795d594fSAndroid Build Coastguard Worker                                      ObjPtr<mirror::Class> klass,
6830*795d594fSAndroid Build Coastguard Worker                                      bool create_conflict_tables,
6831*795d594fSAndroid Build Coastguard Worker                                      bool ignore_copied_methods,
6832*795d594fSAndroid Build Coastguard Worker                                      /*out*/bool* new_conflict,
6833*795d594fSAndroid Build Coastguard Worker                                      /*out*/ArtMethod** imt) {
6834*795d594fSAndroid Build Coastguard Worker   uint32_t conflict_counts[ImTable::kSize] = {};
6835*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0, length = if_table->Count(); i < length; ++i) {
6836*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> interface = if_table->GetInterface(i);
6837*795d594fSAndroid Build Coastguard Worker     const size_t num_virtuals = interface->NumVirtualMethods();
6838*795d594fSAndroid Build Coastguard Worker     const size_t method_array_count = if_table->GetMethodArrayCount(i);
6839*795d594fSAndroid Build Coastguard Worker     // Virtual methods can be larger than the if table methods if there are default methods.
6840*795d594fSAndroid Build Coastguard Worker     DCHECK_GE(num_virtuals, method_array_count);
6841*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
6842*795d594fSAndroid Build Coastguard Worker       if (klass->IsInterface()) {
6843*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(method_array_count, 0u);
6844*795d594fSAndroid Build Coastguard Worker       } else {
6845*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(interface->NumDeclaredVirtualMethods(), method_array_count);
6846*795d594fSAndroid Build Coastguard Worker       }
6847*795d594fSAndroid Build Coastguard Worker     }
6848*795d594fSAndroid Build Coastguard Worker     if (method_array_count == 0) {
6849*795d594fSAndroid Build Coastguard Worker       continue;
6850*795d594fSAndroid Build Coastguard Worker     }
6851*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::PointerArray> method_array = if_table->GetMethodArray(i);
6852*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < method_array_count; ++j) {
6853*795d594fSAndroid Build Coastguard Worker       ArtMethod* implementation_method =
6854*795d594fSAndroid Build Coastguard Worker           method_array->GetElementPtrSize<ArtMethod*>(j, image_pointer_size_);
6855*795d594fSAndroid Build Coastguard Worker       if (ignore_copied_methods && implementation_method->IsCopied()) {
6856*795d594fSAndroid Build Coastguard Worker         continue;
6857*795d594fSAndroid Build Coastguard Worker       }
6858*795d594fSAndroid Build Coastguard Worker       DCHECK(implementation_method != nullptr);
6859*795d594fSAndroid Build Coastguard Worker       // Miranda methods cannot be used to implement an interface method, but they are safe to put
6860*795d594fSAndroid Build Coastguard Worker       // in the IMT since their entrypoint is the interface trampoline. If we put any copied methods
6861*795d594fSAndroid Build Coastguard Worker       // or interface methods in the IMT here they will not create extra conflicts since we compare
6862*795d594fSAndroid Build Coastguard Worker       // names and signatures in SetIMTRef.
6863*795d594fSAndroid Build Coastguard Worker       ArtMethod* interface_method = interface->GetVirtualMethod(j, image_pointer_size_);
6864*795d594fSAndroid Build Coastguard Worker       const uint32_t imt_index = interface_method->GetImtIndex();
6865*795d594fSAndroid Build Coastguard Worker 
6866*795d594fSAndroid Build Coastguard Worker       // There is only any conflicts if all of the interface methods for an IMT slot don't have
6867*795d594fSAndroid Build Coastguard Worker       // the same implementation method, keep track of this to avoid creating a conflict table in
6868*795d594fSAndroid Build Coastguard Worker       // this case.
6869*795d594fSAndroid Build Coastguard Worker 
6870*795d594fSAndroid Build Coastguard Worker       // Conflict table size for each IMT slot.
6871*795d594fSAndroid Build Coastguard Worker       ++conflict_counts[imt_index];
6872*795d594fSAndroid Build Coastguard Worker 
6873*795d594fSAndroid Build Coastguard Worker       SetIMTRef(unimplemented_method,
6874*795d594fSAndroid Build Coastguard Worker                 imt_conflict_method,
6875*795d594fSAndroid Build Coastguard Worker                 implementation_method,
6876*795d594fSAndroid Build Coastguard Worker                 /*out*/new_conflict,
6877*795d594fSAndroid Build Coastguard Worker                 /*out*/&imt[imt_index]);
6878*795d594fSAndroid Build Coastguard Worker     }
6879*795d594fSAndroid Build Coastguard Worker   }
6880*795d594fSAndroid Build Coastguard Worker 
6881*795d594fSAndroid Build Coastguard Worker   if (create_conflict_tables) {
6882*795d594fSAndroid Build Coastguard Worker     // Create the conflict tables.
6883*795d594fSAndroid Build Coastguard Worker     LinearAlloc* linear_alloc = GetAllocatorForClassLoader(klass->GetClassLoader());
6884*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < ImTable::kSize; ++i) {
6885*795d594fSAndroid Build Coastguard Worker       size_t conflicts = conflict_counts[i];
6886*795d594fSAndroid Build Coastguard Worker       if (imt[i] == imt_conflict_method) {
6887*795d594fSAndroid Build Coastguard Worker         ImtConflictTable* new_table = CreateImtConflictTable(conflicts, linear_alloc);
6888*795d594fSAndroid Build Coastguard Worker         if (new_table != nullptr) {
6889*795d594fSAndroid Build Coastguard Worker           ArtMethod* new_conflict_method =
6890*795d594fSAndroid Build Coastguard Worker               Runtime::Current()->CreateImtConflictMethod(linear_alloc);
6891*795d594fSAndroid Build Coastguard Worker           new_conflict_method->SetImtConflictTable(new_table, image_pointer_size_);
6892*795d594fSAndroid Build Coastguard Worker           imt[i] = new_conflict_method;
6893*795d594fSAndroid Build Coastguard Worker         } else {
6894*795d594fSAndroid Build Coastguard Worker           LOG(ERROR) << "Failed to allocate conflict table";
6895*795d594fSAndroid Build Coastguard Worker           imt[i] = imt_conflict_method;
6896*795d594fSAndroid Build Coastguard Worker         }
6897*795d594fSAndroid Build Coastguard Worker       } else {
6898*795d594fSAndroid Build Coastguard Worker         DCHECK_NE(imt[i], imt_conflict_method);
6899*795d594fSAndroid Build Coastguard Worker       }
6900*795d594fSAndroid Build Coastguard Worker     }
6901*795d594fSAndroid Build Coastguard Worker 
6902*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0, length = if_table->Count(); i < length; ++i) {
6903*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> interface = if_table->GetInterface(i);
6904*795d594fSAndroid Build Coastguard Worker       const size_t method_array_count = if_table->GetMethodArrayCount(i);
6905*795d594fSAndroid Build Coastguard Worker       // Virtual methods can be larger than the if table methods if there are default methods.
6906*795d594fSAndroid Build Coastguard Worker       if (method_array_count == 0) {
6907*795d594fSAndroid Build Coastguard Worker         continue;
6908*795d594fSAndroid Build Coastguard Worker       }
6909*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::PointerArray> method_array = if_table->GetMethodArray(i);
6910*795d594fSAndroid Build Coastguard Worker       for (size_t j = 0; j < method_array_count; ++j) {
6911*795d594fSAndroid Build Coastguard Worker         ArtMethod* implementation_method =
6912*795d594fSAndroid Build Coastguard Worker             method_array->GetElementPtrSize<ArtMethod*>(j, image_pointer_size_);
6913*795d594fSAndroid Build Coastguard Worker         if (ignore_copied_methods && implementation_method->IsCopied()) {
6914*795d594fSAndroid Build Coastguard Worker           continue;
6915*795d594fSAndroid Build Coastguard Worker         }
6916*795d594fSAndroid Build Coastguard Worker         DCHECK(implementation_method != nullptr);
6917*795d594fSAndroid Build Coastguard Worker         ArtMethod* interface_method = interface->GetVirtualMethod(j, image_pointer_size_);
6918*795d594fSAndroid Build Coastguard Worker         const uint32_t imt_index = interface_method->GetImtIndex();
6919*795d594fSAndroid Build Coastguard Worker         if (!imt[imt_index]->IsRuntimeMethod() ||
6920*795d594fSAndroid Build Coastguard Worker             imt[imt_index] == unimplemented_method ||
6921*795d594fSAndroid Build Coastguard Worker             imt[imt_index] == imt_conflict_method) {
6922*795d594fSAndroid Build Coastguard Worker           continue;
6923*795d594fSAndroid Build Coastguard Worker         }
6924*795d594fSAndroid Build Coastguard Worker         ImtConflictTable* table = imt[imt_index]->GetImtConflictTable(image_pointer_size_);
6925*795d594fSAndroid Build Coastguard Worker         const size_t num_entries = table->NumEntries(image_pointer_size_);
6926*795d594fSAndroid Build Coastguard Worker         table->SetInterfaceMethod(num_entries, image_pointer_size_, interface_method);
6927*795d594fSAndroid Build Coastguard Worker         table->SetImplementationMethod(num_entries, image_pointer_size_, implementation_method);
6928*795d594fSAndroid Build Coastguard Worker       }
6929*795d594fSAndroid Build Coastguard Worker     }
6930*795d594fSAndroid Build Coastguard Worker   }
6931*795d594fSAndroid Build Coastguard Worker }
6932*795d594fSAndroid Build Coastguard Worker 
6933*795d594fSAndroid Build Coastguard Worker namespace {
6934*795d594fSAndroid Build Coastguard Worker 
6935*795d594fSAndroid Build Coastguard Worker // Simple helper function that checks that no subtypes of 'val' are contained within the 'classes'
6936*795d594fSAndroid Build Coastguard Worker // set.
NotSubinterfaceOfAny(const ScopedArenaHashSet<mirror::Class * > & classes,ObjPtr<mirror::Class> val)6937*795d594fSAndroid Build Coastguard Worker static bool NotSubinterfaceOfAny(
6938*795d594fSAndroid Build Coastguard Worker     const ScopedArenaHashSet<mirror::Class*>& classes,
6939*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> val)
6940*795d594fSAndroid Build Coastguard Worker     REQUIRES(Roles::uninterruptible_)
6941*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
6942*795d594fSAndroid Build Coastguard Worker   DCHECK(val != nullptr);
6943*795d594fSAndroid Build Coastguard Worker   for (ObjPtr<mirror::Class> c : classes) {
6944*795d594fSAndroid Build Coastguard Worker     if (val->IsAssignableFrom(c)) {
6945*795d594fSAndroid Build Coastguard Worker       return false;
6946*795d594fSAndroid Build Coastguard Worker     }
6947*795d594fSAndroid Build Coastguard Worker   }
6948*795d594fSAndroid Build Coastguard Worker   return true;
6949*795d594fSAndroid Build Coastguard Worker }
6950*795d594fSAndroid Build Coastguard Worker 
6951*795d594fSAndroid Build Coastguard Worker // We record new interfaces by the index of the direct interface and the index in the
6952*795d594fSAndroid Build Coastguard Worker // direct interface's `IfTable`, or `dex::kDexNoIndex` if it's the direct interface itself.
6953*795d594fSAndroid Build Coastguard Worker struct NewInterfaceReference {
6954*795d594fSAndroid Build Coastguard Worker   uint32_t direct_interface_index;
6955*795d594fSAndroid Build Coastguard Worker   uint32_t direct_interface_iftable_index;
6956*795d594fSAndroid Build Coastguard Worker };
6957*795d594fSAndroid Build Coastguard Worker 
6958*795d594fSAndroid Build Coastguard Worker class ProxyInterfacesAccessor {
6959*795d594fSAndroid Build Coastguard Worker  public:
6960*795d594fSAndroid Build Coastguard Worker   explicit ProxyInterfacesAccessor(Handle<mirror::ObjectArray<mirror::Class>> interfaces)
REQUIRES_SHARED(Locks::mutator_lock_)6961*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
6962*795d594fSAndroid Build Coastguard Worker       : interfaces_(interfaces) {}
6963*795d594fSAndroid Build Coastguard Worker 
GetLength()6964*795d594fSAndroid Build Coastguard Worker   size_t GetLength() REQUIRES_SHARED(Locks::mutator_lock_) {
6965*795d594fSAndroid Build Coastguard Worker     return interfaces_->GetLength();
6966*795d594fSAndroid Build Coastguard Worker   }
6967*795d594fSAndroid Build Coastguard Worker 
GetInterface(size_t index)6968*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> GetInterface(size_t index) REQUIRES_SHARED(Locks::mutator_lock_) {
6969*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(index, GetLength());
6970*795d594fSAndroid Build Coastguard Worker     return interfaces_->GetWithoutChecks(index);
6971*795d594fSAndroid Build Coastguard Worker   }
6972*795d594fSAndroid Build Coastguard Worker 
6973*795d594fSAndroid Build Coastguard Worker  private:
6974*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::Class>> interfaces_;
6975*795d594fSAndroid Build Coastguard Worker };
6976*795d594fSAndroid Build Coastguard Worker 
6977*795d594fSAndroid Build Coastguard Worker class NonProxyInterfacesAccessor {
6978*795d594fSAndroid Build Coastguard Worker  public:
NonProxyInterfacesAccessor(ClassLinker * class_linker,Handle<mirror::Class> klass)6979*795d594fSAndroid Build Coastguard Worker   NonProxyInterfacesAccessor(ClassLinker* class_linker, Handle<mirror::Class> klass)
6980*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
6981*795d594fSAndroid Build Coastguard Worker       : interfaces_(klass->GetInterfaceTypeList()),
6982*795d594fSAndroid Build Coastguard Worker         class_linker_(class_linker),
6983*795d594fSAndroid Build Coastguard Worker         klass_(klass) {
6984*795d594fSAndroid Build Coastguard Worker     DCHECK(!klass->IsProxyClass());
6985*795d594fSAndroid Build Coastguard Worker   }
6986*795d594fSAndroid Build Coastguard Worker 
GetLength()6987*795d594fSAndroid Build Coastguard Worker   size_t GetLength() REQUIRES_SHARED(Locks::mutator_lock_) {
6988*795d594fSAndroid Build Coastguard Worker     return (interfaces_ != nullptr) ? interfaces_->Size() : 0u;
6989*795d594fSAndroid Build Coastguard Worker   }
6990*795d594fSAndroid Build Coastguard Worker 
GetInterface(size_t index)6991*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> GetInterface(size_t index) REQUIRES_SHARED(Locks::mutator_lock_) {
6992*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(index, GetLength());
6993*795d594fSAndroid Build Coastguard Worker     dex::TypeIndex type_index = interfaces_->GetTypeItem(index).type_idx_;
6994*795d594fSAndroid Build Coastguard Worker     return class_linker_->LookupResolvedType(type_index, klass_.Get());
6995*795d594fSAndroid Build Coastguard Worker   }
6996*795d594fSAndroid Build Coastguard Worker 
6997*795d594fSAndroid Build Coastguard Worker  private:
6998*795d594fSAndroid Build Coastguard Worker   const dex::TypeList* interfaces_;
6999*795d594fSAndroid Build Coastguard Worker   ClassLinker* class_linker_;
7000*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> klass_;
7001*795d594fSAndroid Build Coastguard Worker };
7002*795d594fSAndroid Build Coastguard Worker 
7003*795d594fSAndroid Build Coastguard Worker // Finds new interfaces to add to the interface table in addition to superclass interfaces.
7004*795d594fSAndroid Build Coastguard Worker //
7005*795d594fSAndroid Build Coastguard Worker // Interfaces in the interface table must satisfy the following constraint:
7006*795d594fSAndroid Build Coastguard Worker //     all I, J: Interface | I <: J implies J precedes I
7007*795d594fSAndroid Build Coastguard Worker // (note A <: B means that A is a subtype of B). We order this backwards so that we do not need
7008*795d594fSAndroid Build Coastguard Worker // to reorder superclass interfaces when new interfaces are added in subclass's interface tables.
7009*795d594fSAndroid Build Coastguard Worker //
7010*795d594fSAndroid Build Coastguard Worker // This function returns a list of references for all interfaces in the transitive
7011*795d594fSAndroid Build Coastguard Worker // closure of the direct interfaces that are not in the superclass interfaces.
7012*795d594fSAndroid Build Coastguard Worker // The entries in the list are ordered to satisfy the interface table ordering
7013*795d594fSAndroid Build Coastguard Worker // constraint and therefore the interface table formed by appending them to the
7014*795d594fSAndroid Build Coastguard Worker // superclass interface table shall also satisfy that constraint.
7015*795d594fSAndroid Build Coastguard Worker template <typename InterfaceAccessor>
7016*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
FindNewIfTableInterfaces(ObjPtr<mirror::IfTable> super_iftable,size_t super_ifcount,ScopedArenaAllocator * allocator,InterfaceAccessor && interfaces,ArrayRef<NewInterfaceReference> initial_storage,ScopedArenaVector<NewInterfaceReference> * supplemental_storage)7017*795d594fSAndroid Build Coastguard Worker static ArrayRef<const NewInterfaceReference> FindNewIfTableInterfaces(
7018*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::IfTable> super_iftable,
7019*795d594fSAndroid Build Coastguard Worker     size_t super_ifcount,
7020*795d594fSAndroid Build Coastguard Worker     ScopedArenaAllocator* allocator,
7021*795d594fSAndroid Build Coastguard Worker     InterfaceAccessor&& interfaces,
7022*795d594fSAndroid Build Coastguard Worker     ArrayRef<NewInterfaceReference> initial_storage,
7023*795d594fSAndroid Build Coastguard Worker     /*out*/ScopedArenaVector<NewInterfaceReference>* supplemental_storage)
7024*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
7025*795d594fSAndroid Build Coastguard Worker   ScopedAssertNoThreadSuspension nts(__FUNCTION__);
7026*795d594fSAndroid Build Coastguard Worker 
7027*795d594fSAndroid Build Coastguard Worker   // This is the set of all classes already in the iftable. Used to make checking
7028*795d594fSAndroid Build Coastguard Worker   // if a class has already been added quicker.
7029*795d594fSAndroid Build Coastguard Worker   constexpr size_t kBufferSize = 32;  // 256 bytes on 64-bit architectures.
7030*795d594fSAndroid Build Coastguard Worker   mirror::Class* buffer[kBufferSize];
7031*795d594fSAndroid Build Coastguard Worker   ScopedArenaHashSet<mirror::Class*> classes_in_iftable(buffer, kBufferSize, allocator->Adapter());
7032*795d594fSAndroid Build Coastguard Worker   // The first super_ifcount elements are from the superclass. We note that they are already added.
7033*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < super_ifcount; i++) {
7034*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> iface = super_iftable->GetInterface(i);
7035*795d594fSAndroid Build Coastguard Worker     DCHECK(NotSubinterfaceOfAny(classes_in_iftable, iface)) << "Bad ordering.";
7036*795d594fSAndroid Build Coastguard Worker     classes_in_iftable.Put(iface.Ptr());
7037*795d594fSAndroid Build Coastguard Worker   }
7038*795d594fSAndroid Build Coastguard Worker 
7039*795d594fSAndroid Build Coastguard Worker   ArrayRef<NewInterfaceReference> current_storage = initial_storage;
7040*795d594fSAndroid Build Coastguard Worker   DCHECK_NE(current_storage.size(), 0u);
7041*795d594fSAndroid Build Coastguard Worker   size_t num_new_interfaces = 0u;
7042*795d594fSAndroid Build Coastguard Worker   auto insert_reference = [&](uint32_t direct_interface_index,
7043*795d594fSAndroid Build Coastguard Worker                               uint32_t direct_interface_iface_index) {
7044*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(num_new_interfaces == current_storage.size())) {
7045*795d594fSAndroid Build Coastguard Worker       bool copy = current_storage.data() != supplemental_storage->data();
7046*795d594fSAndroid Build Coastguard Worker       supplemental_storage->resize(2u * num_new_interfaces);
7047*795d594fSAndroid Build Coastguard Worker       if (copy) {
7048*795d594fSAndroid Build Coastguard Worker         std::copy_n(current_storage.data(), num_new_interfaces, supplemental_storage->data());
7049*795d594fSAndroid Build Coastguard Worker       }
7050*795d594fSAndroid Build Coastguard Worker       current_storage = ArrayRef<NewInterfaceReference>(*supplemental_storage);
7051*795d594fSAndroid Build Coastguard Worker     }
7052*795d594fSAndroid Build Coastguard Worker     current_storage[num_new_interfaces] = {direct_interface_index, direct_interface_iface_index};
7053*795d594fSAndroid Build Coastguard Worker     ++num_new_interfaces;
7054*795d594fSAndroid Build Coastguard Worker   };
7055*795d594fSAndroid Build Coastguard Worker 
7056*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0, num_interfaces = interfaces.GetLength(); i != num_interfaces; ++i) {
7057*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> interface = interfaces.GetInterface(i);
7058*795d594fSAndroid Build Coastguard Worker 
7059*795d594fSAndroid Build Coastguard Worker     // Let us call the first filled_ifcount elements of iftable the current-iface-list.
7060*795d594fSAndroid Build Coastguard Worker     // At this point in the loop current-iface-list has the invariant that:
7061*795d594fSAndroid Build Coastguard Worker     //    for every pair of interfaces I,J within it:
7062*795d594fSAndroid Build Coastguard Worker     //      if index_of(I) < index_of(J) then I is not a subtype of J
7063*795d594fSAndroid Build Coastguard Worker 
7064*795d594fSAndroid Build Coastguard Worker     // If we have already seen this element then all of its super-interfaces must already be in the
7065*795d594fSAndroid Build Coastguard Worker     // current-iface-list so we can skip adding it.
7066*795d594fSAndroid Build Coastguard Worker     if (classes_in_iftable.find(interface.Ptr()) == classes_in_iftable.end()) {
7067*795d594fSAndroid Build Coastguard Worker       // We haven't seen this interface so add all of its super-interfaces onto the
7068*795d594fSAndroid Build Coastguard Worker       // current-iface-list, skipping those already on it.
7069*795d594fSAndroid Build Coastguard Worker       int32_t ifcount = interface->GetIfTableCount();
7070*795d594fSAndroid Build Coastguard Worker       for (int32_t j = 0; j < ifcount; j++) {
7071*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::Class> super_interface = interface->GetIfTable()->GetInterface(j);
7072*795d594fSAndroid Build Coastguard Worker         if (classes_in_iftable.find(super_interface.Ptr()) == classes_in_iftable.end()) {
7073*795d594fSAndroid Build Coastguard Worker           DCHECK(NotSubinterfaceOfAny(classes_in_iftable, super_interface)) << "Bad ordering.";
7074*795d594fSAndroid Build Coastguard Worker           classes_in_iftable.Put(super_interface.Ptr());
7075*795d594fSAndroid Build Coastguard Worker           insert_reference(i, j);
7076*795d594fSAndroid Build Coastguard Worker         }
7077*795d594fSAndroid Build Coastguard Worker       }
7078*795d594fSAndroid Build Coastguard Worker       // Add this interface reference after all of its super-interfaces.
7079*795d594fSAndroid Build Coastguard Worker       DCHECK(NotSubinterfaceOfAny(classes_in_iftable, interface)) << "Bad ordering";
7080*795d594fSAndroid Build Coastguard Worker       classes_in_iftable.Put(interface.Ptr());
7081*795d594fSAndroid Build Coastguard Worker       insert_reference(i, dex::kDexNoIndex);
7082*795d594fSAndroid Build Coastguard Worker     } else if (kIsDebugBuild) {
7083*795d594fSAndroid Build Coastguard Worker       // Check all super-interfaces are already in the list.
7084*795d594fSAndroid Build Coastguard Worker       int32_t ifcount = interface->GetIfTableCount();
7085*795d594fSAndroid Build Coastguard Worker       for (int32_t j = 0; j < ifcount; j++) {
7086*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::Class> super_interface = interface->GetIfTable()->GetInterface(j);
7087*795d594fSAndroid Build Coastguard Worker         DCHECK(classes_in_iftable.find(super_interface.Ptr()) != classes_in_iftable.end())
7088*795d594fSAndroid Build Coastguard Worker             << "Iftable does not contain " << mirror::Class::PrettyClass(super_interface)
7089*795d594fSAndroid Build Coastguard Worker             << ", a superinterface of " << interface->PrettyClass();
7090*795d594fSAndroid Build Coastguard Worker       }
7091*795d594fSAndroid Build Coastguard Worker     }
7092*795d594fSAndroid Build Coastguard Worker   }
7093*795d594fSAndroid Build Coastguard Worker   return ArrayRef<const NewInterfaceReference>(current_storage.data(), num_new_interfaces);
7094*795d594fSAndroid Build Coastguard Worker }
7095*795d594fSAndroid Build Coastguard Worker 
7096*795d594fSAndroid Build Coastguard Worker template <typename InterfaceAccessor>
SetupInterfaceLookupTable(Thread * self,Handle<mirror::Class> klass,ScopedArenaAllocator * allocator,InterfaceAccessor && interfaces)7097*795d594fSAndroid Build Coastguard Worker static ObjPtr<mirror::IfTable> SetupInterfaceLookupTable(
7098*795d594fSAndroid Build Coastguard Worker     Thread* self,
7099*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> klass,
7100*795d594fSAndroid Build Coastguard Worker     ScopedArenaAllocator* allocator,
7101*795d594fSAndroid Build Coastguard Worker     InterfaceAccessor&& interfaces)
7102*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
7103*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->HasSuperClass());
7104*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::IfTable> super_iftable = klass->GetSuperClass()->GetIfTable();
7105*795d594fSAndroid Build Coastguard Worker   DCHECK(super_iftable != nullptr);
7106*795d594fSAndroid Build Coastguard Worker   const size_t num_interfaces = interfaces.GetLength();
7107*795d594fSAndroid Build Coastguard Worker 
7108*795d594fSAndroid Build Coastguard Worker   // If there are no new interfaces, return the interface table from superclass.
7109*795d594fSAndroid Build Coastguard Worker   // If any implementation methods are overridden, we shall copy the table and
7110*795d594fSAndroid Build Coastguard Worker   // the method arrays that contain any differences (copy-on-write).
7111*795d594fSAndroid Build Coastguard Worker   if (num_interfaces == 0) {
7112*795d594fSAndroid Build Coastguard Worker     return super_iftable;
7113*795d594fSAndroid Build Coastguard Worker   }
7114*795d594fSAndroid Build Coastguard Worker 
7115*795d594fSAndroid Build Coastguard Worker   // Check that every class being implemented is an interface.
7116*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i != num_interfaces; ++i) {
7117*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> interface = interfaces.GetInterface(i);
7118*795d594fSAndroid Build Coastguard Worker     DCHECK(interface != nullptr);
7119*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(!interface->IsInterface())) {
7120*795d594fSAndroid Build Coastguard Worker       ThrowIncompatibleClassChangeError(klass.Get(),
7121*795d594fSAndroid Build Coastguard Worker                                         "Class %s implements non-interface class %s",
7122*795d594fSAndroid Build Coastguard Worker                                         klass->PrettyDescriptor().c_str(),
7123*795d594fSAndroid Build Coastguard Worker                                         interface->PrettyDescriptor().c_str());
7124*795d594fSAndroid Build Coastguard Worker       return nullptr;
7125*795d594fSAndroid Build Coastguard Worker     }
7126*795d594fSAndroid Build Coastguard Worker   }
7127*795d594fSAndroid Build Coastguard Worker 
7128*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kMaxStackReferences = 16;
7129*795d594fSAndroid Build Coastguard Worker   NewInterfaceReference initial_storage[kMaxStackReferences];
7130*795d594fSAndroid Build Coastguard Worker   ScopedArenaVector<NewInterfaceReference> supplemental_storage(allocator->Adapter());
7131*795d594fSAndroid Build Coastguard Worker   const size_t super_ifcount = super_iftable->Count();
7132*795d594fSAndroid Build Coastguard Worker   ArrayRef<const NewInterfaceReference> new_interface_references =
7133*795d594fSAndroid Build Coastguard Worker       FindNewIfTableInterfaces(
7134*795d594fSAndroid Build Coastguard Worker           super_iftable,
7135*795d594fSAndroid Build Coastguard Worker           super_ifcount,
7136*795d594fSAndroid Build Coastguard Worker           allocator,
7137*795d594fSAndroid Build Coastguard Worker           interfaces,
7138*795d594fSAndroid Build Coastguard Worker           ArrayRef<NewInterfaceReference>(initial_storage),
7139*795d594fSAndroid Build Coastguard Worker           &supplemental_storage);
7140*795d594fSAndroid Build Coastguard Worker 
7141*795d594fSAndroid Build Coastguard Worker   // If all declared interfaces were already present in superclass interface table,
7142*795d594fSAndroid Build Coastguard Worker   // return the interface table from superclass. See above.
7143*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(new_interface_references.empty())) {
7144*795d594fSAndroid Build Coastguard Worker     return super_iftable;
7145*795d594fSAndroid Build Coastguard Worker   }
7146*795d594fSAndroid Build Coastguard Worker 
7147*795d594fSAndroid Build Coastguard Worker   // Create the interface table.
7148*795d594fSAndroid Build Coastguard Worker   size_t ifcount = super_ifcount + new_interface_references.size();
7149*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::IfTable> iftable = AllocIfTable(self, ifcount, super_iftable->GetClass());
7150*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(iftable == nullptr)) {
7151*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
7152*795d594fSAndroid Build Coastguard Worker     return nullptr;
7153*795d594fSAndroid Build Coastguard Worker   }
7154*795d594fSAndroid Build Coastguard Worker   // Fill in table with superclass's iftable.
7155*795d594fSAndroid Build Coastguard Worker   if (super_ifcount != 0) {
7156*795d594fSAndroid Build Coastguard Worker     // Reload `super_iftable` as it may have been clobbered by the allocation.
7157*795d594fSAndroid Build Coastguard Worker     super_iftable = klass->GetSuperClass()->GetIfTable();
7158*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i != super_ifcount; i++) {
7159*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> super_interface = super_iftable->GetInterface(i);
7160*795d594fSAndroid Build Coastguard Worker       DCHECK(super_interface != nullptr);
7161*795d594fSAndroid Build Coastguard Worker       iftable->SetInterface(i, super_interface);
7162*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::PointerArray> method_array = super_iftable->GetMethodArrayOrNull(i);
7163*795d594fSAndroid Build Coastguard Worker       if (method_array != nullptr) {
7164*795d594fSAndroid Build Coastguard Worker         iftable->SetMethodArray(i, method_array);
7165*795d594fSAndroid Build Coastguard Worker       }
7166*795d594fSAndroid Build Coastguard Worker     }
7167*795d594fSAndroid Build Coastguard Worker   }
7168*795d594fSAndroid Build Coastguard Worker   // Fill in the table with additional interfaces.
7169*795d594fSAndroid Build Coastguard Worker   size_t current_index = super_ifcount;
7170*795d594fSAndroid Build Coastguard Worker   for (NewInterfaceReference ref : new_interface_references) {
7171*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> direct_interface = interfaces.GetInterface(ref.direct_interface_index);
7172*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> new_interface = (ref.direct_interface_iftable_index != dex::kDexNoIndex)
7173*795d594fSAndroid Build Coastguard Worker         ? direct_interface->GetIfTable()->GetInterface(ref.direct_interface_iftable_index)
7174*795d594fSAndroid Build Coastguard Worker         : direct_interface;
7175*795d594fSAndroid Build Coastguard Worker     iftable->SetInterface(current_index, new_interface);
7176*795d594fSAndroid Build Coastguard Worker     ++current_index;
7177*795d594fSAndroid Build Coastguard Worker   }
7178*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(current_index, ifcount);
7179*795d594fSAndroid Build Coastguard Worker 
7180*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
7181*795d594fSAndroid Build Coastguard Worker     // Check that the iftable is ordered correctly.
7182*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < ifcount; i++) {
7183*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> if_a = iftable->GetInterface(i);
7184*795d594fSAndroid Build Coastguard Worker       for (size_t j = i + 1; j < ifcount; j++) {
7185*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::Class> if_b = iftable->GetInterface(j);
7186*795d594fSAndroid Build Coastguard Worker         // !(if_a <: if_b)
7187*795d594fSAndroid Build Coastguard Worker         CHECK(!if_b->IsAssignableFrom(if_a))
7188*795d594fSAndroid Build Coastguard Worker             << "Bad interface order: " << mirror::Class::PrettyClass(if_a) << " (index " << i
7189*795d594fSAndroid Build Coastguard Worker             << ") extends "
7190*795d594fSAndroid Build Coastguard Worker             << if_b->PrettyClass() << " (index " << j << ") and so should be after it in the "
7191*795d594fSAndroid Build Coastguard Worker             << "interface list.";
7192*795d594fSAndroid Build Coastguard Worker       }
7193*795d594fSAndroid Build Coastguard Worker     }
7194*795d594fSAndroid Build Coastguard Worker   }
7195*795d594fSAndroid Build Coastguard Worker 
7196*795d594fSAndroid Build Coastguard Worker   return iftable;
7197*795d594fSAndroid Build Coastguard Worker }
7198*795d594fSAndroid Build Coastguard Worker 
7199*795d594fSAndroid Build Coastguard Worker // Check that all vtable entries are present in this class's virtuals or are the same as a
7200*795d594fSAndroid Build Coastguard Worker // superclasses vtable entry.
CheckClassOwnsVTableEntries(Thread * self,Handle<mirror::Class> klass,PointerSize pointer_size)7201*795d594fSAndroid Build Coastguard Worker void CheckClassOwnsVTableEntries(Thread* self,
7202*795d594fSAndroid Build Coastguard Worker                                  Handle<mirror::Class> klass,
7203*795d594fSAndroid Build Coastguard Worker                                  PointerSize pointer_size)
7204*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
7205*795d594fSAndroid Build Coastguard Worker   StackHandleScope<2> hs(self);
7206*795d594fSAndroid Build Coastguard Worker   Handle<mirror::PointerArray> check_vtable(hs.NewHandle(klass->GetVTableDuringLinking()));
7207*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> super_temp = (klass->HasSuperClass()) ? klass->GetSuperClass() : nullptr;
7208*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> superclass(hs.NewHandle(super_temp));
7209*795d594fSAndroid Build Coastguard Worker   int32_t super_vtable_length = (superclass != nullptr) ? superclass->GetVTableLength() : 0;
7210*795d594fSAndroid Build Coastguard Worker   for (int32_t i = 0; i < check_vtable->GetLength(); ++i) {
7211*795d594fSAndroid Build Coastguard Worker     ArtMethod* m = check_vtable->GetElementPtrSize<ArtMethod*>(i, pointer_size);
7212*795d594fSAndroid Build Coastguard Worker     CHECK(m != nullptr);
7213*795d594fSAndroid Build Coastguard Worker 
7214*795d594fSAndroid Build Coastguard Worker     if (m->GetMethodIndexDuringLinking() != i) {
7215*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << m->PrettyMethod()
7216*795d594fSAndroid Build Coastguard Worker                    << " has an unexpected method index for its spot in the vtable for class"
7217*795d594fSAndroid Build Coastguard Worker                    << klass->PrettyClass();
7218*795d594fSAndroid Build Coastguard Worker     }
7219*795d594fSAndroid Build Coastguard Worker     ArraySlice<ArtMethod> virtuals = klass->GetVirtualMethodsSliceUnchecked(pointer_size);
7220*795d594fSAndroid Build Coastguard Worker     auto is_same_method = [m] (const ArtMethod& meth) {
7221*795d594fSAndroid Build Coastguard Worker       return &meth == m;
7222*795d594fSAndroid Build Coastguard Worker     };
7223*795d594fSAndroid Build Coastguard Worker     if (!((super_vtable_length > i && superclass->GetVTableEntry(i, pointer_size) == m) ||
7224*795d594fSAndroid Build Coastguard Worker           std::find_if(virtuals.begin(), virtuals.end(), is_same_method) != virtuals.end())) {
7225*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << m->PrettyMethod() << " does not seem to be owned by current class "
7226*795d594fSAndroid Build Coastguard Worker                    << klass->PrettyClass() << " or any of its superclasses!";
7227*795d594fSAndroid Build Coastguard Worker     }
7228*795d594fSAndroid Build Coastguard Worker   }
7229*795d594fSAndroid Build Coastguard Worker }
7230*795d594fSAndroid Build Coastguard Worker 
7231*795d594fSAndroid Build Coastguard Worker // Check to make sure the vtable does not have duplicates. Duplicates could cause problems when a
7232*795d594fSAndroid Build Coastguard Worker // method is overridden in a subclass.
7233*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
CheckVTableHasNoDuplicates(Thread * self,Handle<mirror::Class> klass)7234*795d594fSAndroid Build Coastguard Worker void CheckVTableHasNoDuplicates(Thread* self, Handle<mirror::Class> klass)
7235*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
7236*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(self);
7237*795d594fSAndroid Build Coastguard Worker   Handle<mirror::PointerArray> vtable(hs.NewHandle(klass->GetVTableDuringLinking()));
7238*795d594fSAndroid Build Coastguard Worker   int32_t num_entries = vtable->GetLength();
7239*795d594fSAndroid Build Coastguard Worker 
7240*795d594fSAndroid Build Coastguard Worker   // Observations:
7241*795d594fSAndroid Build Coastguard Worker   //   * The older implementation was O(n^2) and got too expensive for apps with larger classes.
7242*795d594fSAndroid Build Coastguard Worker   //   * Many classes do not override Object functions (e.g., equals/hashCode/toString). Thus,
7243*795d594fSAndroid Build Coastguard Worker   //     for many classes outside of libcore a cross-dexfile check has to be run anyways.
7244*795d594fSAndroid Build Coastguard Worker   //   * In the cross-dexfile case, with the O(n^2), in the best case O(n) cross checks would have
7245*795d594fSAndroid Build Coastguard Worker   //     to be done. It is thus OK in a single-pass algorithm to read all data, anyways.
7246*795d594fSAndroid Build Coastguard Worker   //   * The single-pass algorithm will trade memory for speed, but that is OK.
7247*795d594fSAndroid Build Coastguard Worker 
7248*795d594fSAndroid Build Coastguard Worker   CHECK_GT(num_entries, 0);
7249*795d594fSAndroid Build Coastguard Worker 
7250*795d594fSAndroid Build Coastguard Worker   auto log_fn = [&vtable, &klass](int32_t i, int32_t j) REQUIRES_SHARED(Locks::mutator_lock_) {
7251*795d594fSAndroid Build Coastguard Worker     ArtMethod* m1 = vtable->GetElementPtrSize<ArtMethod*, kPointerSize>(i);
7252*795d594fSAndroid Build Coastguard Worker     ArtMethod* m2 = vtable->GetElementPtrSize<ArtMethod*, kPointerSize>(j);
7253*795d594fSAndroid Build Coastguard Worker     LOG(WARNING) << "vtable entries " << i << " and " << j << " are identical for "
7254*795d594fSAndroid Build Coastguard Worker                  << klass->PrettyClass() << " in method " << m1->PrettyMethod()
7255*795d594fSAndroid Build Coastguard Worker                 << " (0x" << std::hex << reinterpret_cast<uintptr_t>(m2) << ") and "
7256*795d594fSAndroid Build Coastguard Worker                 << m2->PrettyMethod() << "  (0x" << std::hex
7257*795d594fSAndroid Build Coastguard Worker                 << reinterpret_cast<uintptr_t>(m2) << ")";
7258*795d594fSAndroid Build Coastguard Worker   };
7259*795d594fSAndroid Build Coastguard Worker   struct BaseHashType {
7260*795d594fSAndroid Build Coastguard Worker     static size_t HashCombine(size_t seed, size_t val) {
7261*795d594fSAndroid Build Coastguard Worker       return seed ^ (val + 0x9e3779b9 + (seed << 6) + (seed >> 2));
7262*795d594fSAndroid Build Coastguard Worker     }
7263*795d594fSAndroid Build Coastguard Worker   };
7264*795d594fSAndroid Build Coastguard Worker 
7265*795d594fSAndroid Build Coastguard Worker   // Check assuming all entries come from the same dex file.
7266*795d594fSAndroid Build Coastguard Worker   {
7267*795d594fSAndroid Build Coastguard Worker     // Find the first interesting method and its dex file.
7268*795d594fSAndroid Build Coastguard Worker     int32_t start = 0;
7269*795d594fSAndroid Build Coastguard Worker     for (; start < num_entries; ++start) {
7270*795d594fSAndroid Build Coastguard Worker       ArtMethod* vtable_entry = vtable->GetElementPtrSize<ArtMethod*, kPointerSize>(start);
7271*795d594fSAndroid Build Coastguard Worker       // Don't bother if we cannot 'see' the vtable entry (i.e. it is a package-private member
7272*795d594fSAndroid Build Coastguard Worker       // maybe).
7273*795d594fSAndroid Build Coastguard Worker       if (!klass->CanAccessMember(vtable_entry->GetDeclaringClass(),
7274*795d594fSAndroid Build Coastguard Worker                                   vtable_entry->GetAccessFlags())) {
7275*795d594fSAndroid Build Coastguard Worker         continue;
7276*795d594fSAndroid Build Coastguard Worker       }
7277*795d594fSAndroid Build Coastguard Worker       break;
7278*795d594fSAndroid Build Coastguard Worker     }
7279*795d594fSAndroid Build Coastguard Worker     if (start == num_entries) {
7280*795d594fSAndroid Build Coastguard Worker       return;
7281*795d594fSAndroid Build Coastguard Worker     }
7282*795d594fSAndroid Build Coastguard Worker     const DexFile* dex_file =
7283*795d594fSAndroid Build Coastguard Worker         vtable->GetElementPtrSize<ArtMethod*, kPointerSize>(start)->
7284*795d594fSAndroid Build Coastguard Worker             GetInterfaceMethodIfProxy(kPointerSize)->GetDexFile();
7285*795d594fSAndroid Build Coastguard Worker 
7286*795d594fSAndroid Build Coastguard Worker     // Helper function to avoid logging if we have to run the cross-file checks.
7287*795d594fSAndroid Build Coastguard Worker     auto check_fn = [&](bool log_warn) REQUIRES_SHARED(Locks::mutator_lock_) {
7288*795d594fSAndroid Build Coastguard Worker       // Use a map to store seen entries, as the storage space is too large for a bitvector.
7289*795d594fSAndroid Build Coastguard Worker       using PairType = std::pair<uint32_t, uint16_t>;
7290*795d594fSAndroid Build Coastguard Worker       struct PairHash : BaseHashType {
7291*795d594fSAndroid Build Coastguard Worker         size_t operator()(const PairType& key) const {
7292*795d594fSAndroid Build Coastguard Worker           return BaseHashType::HashCombine(BaseHashType::HashCombine(0, key.first), key.second);
7293*795d594fSAndroid Build Coastguard Worker         }
7294*795d594fSAndroid Build Coastguard Worker       };
7295*795d594fSAndroid Build Coastguard Worker       HashMap<PairType, int32_t, DefaultMapEmptyFn<PairType, int32_t>, PairHash> seen;
7296*795d594fSAndroid Build Coastguard Worker       seen.reserve(2 * num_entries);
7297*795d594fSAndroid Build Coastguard Worker       bool need_slow_path = false;
7298*795d594fSAndroid Build Coastguard Worker       bool found_dup = false;
7299*795d594fSAndroid Build Coastguard Worker       for (int i = start; i < num_entries; ++i) {
7300*795d594fSAndroid Build Coastguard Worker         // Can use Unchecked here as the start loop already ensured that the arrays are correct
7301*795d594fSAndroid Build Coastguard Worker         // wrt/ kPointerSize.
7302*795d594fSAndroid Build Coastguard Worker         ArtMethod* vtable_entry = vtable->GetElementPtrSizeUnchecked<ArtMethod*, kPointerSize>(i);
7303*795d594fSAndroid Build Coastguard Worker         if (!klass->CanAccessMember(vtable_entry->GetDeclaringClass(),
7304*795d594fSAndroid Build Coastguard Worker                                     vtable_entry->GetAccessFlags())) {
7305*795d594fSAndroid Build Coastguard Worker           continue;
7306*795d594fSAndroid Build Coastguard Worker         }
7307*795d594fSAndroid Build Coastguard Worker         ArtMethod* m = vtable_entry->GetInterfaceMethodIfProxy(kPointerSize);
7308*795d594fSAndroid Build Coastguard Worker         if (dex_file != m->GetDexFile()) {
7309*795d594fSAndroid Build Coastguard Worker           need_slow_path = true;
7310*795d594fSAndroid Build Coastguard Worker           break;
7311*795d594fSAndroid Build Coastguard Worker         }
7312*795d594fSAndroid Build Coastguard Worker         const dex::MethodId* m_mid = &dex_file->GetMethodId(m->GetDexMethodIndex());
7313*795d594fSAndroid Build Coastguard Worker         PairType pair = std::make_pair(m_mid->name_idx_.index_, m_mid->proto_idx_.index_);
7314*795d594fSAndroid Build Coastguard Worker         auto it = seen.find(pair);
7315*795d594fSAndroid Build Coastguard Worker         if (it != seen.end()) {
7316*795d594fSAndroid Build Coastguard Worker           found_dup = true;
7317*795d594fSAndroid Build Coastguard Worker           if (log_warn) {
7318*795d594fSAndroid Build Coastguard Worker             log_fn(it->second, i);
7319*795d594fSAndroid Build Coastguard Worker           }
7320*795d594fSAndroid Build Coastguard Worker         } else {
7321*795d594fSAndroid Build Coastguard Worker           seen.insert(std::make_pair(pair, i));
7322*795d594fSAndroid Build Coastguard Worker         }
7323*795d594fSAndroid Build Coastguard Worker       }
7324*795d594fSAndroid Build Coastguard Worker       return std::make_pair(need_slow_path, found_dup);
7325*795d594fSAndroid Build Coastguard Worker     };
7326*795d594fSAndroid Build Coastguard Worker     std::pair<bool, bool> result = check_fn(/* log_warn= */ false);
7327*795d594fSAndroid Build Coastguard Worker     if (!result.first) {
7328*795d594fSAndroid Build Coastguard Worker       if (result.second) {
7329*795d594fSAndroid Build Coastguard Worker         check_fn(/* log_warn= */ true);
7330*795d594fSAndroid Build Coastguard Worker       }
7331*795d594fSAndroid Build Coastguard Worker       return;
7332*795d594fSAndroid Build Coastguard Worker     }
7333*795d594fSAndroid Build Coastguard Worker   }
7334*795d594fSAndroid Build Coastguard Worker 
7335*795d594fSAndroid Build Coastguard Worker   // Need to check across dex files.
7336*795d594fSAndroid Build Coastguard Worker   struct Entry {
7337*795d594fSAndroid Build Coastguard Worker     size_t cached_hash = 0;
7338*795d594fSAndroid Build Coastguard Worker     uint32_t name_len = 0;
7339*795d594fSAndroid Build Coastguard Worker     const char* name = nullptr;
7340*795d594fSAndroid Build Coastguard Worker     Signature signature = Signature::NoSignature();
7341*795d594fSAndroid Build Coastguard Worker 
7342*795d594fSAndroid Build Coastguard Worker     Entry() = default;
7343*795d594fSAndroid Build Coastguard Worker     Entry(const Entry& other) = default;
7344*795d594fSAndroid Build Coastguard Worker     Entry& operator=(const Entry& other) = default;
7345*795d594fSAndroid Build Coastguard Worker 
7346*795d594fSAndroid Build Coastguard Worker     Entry(const DexFile* dex_file, const dex::MethodId& mid)
7347*795d594fSAndroid Build Coastguard Worker         : name_len(0),  // Explicit to enforce ordering with -Werror,-Wreorder-ctor.
7348*795d594fSAndroid Build Coastguard Worker           // This call writes `name_len` and it is therefore necessary that the
7349*795d594fSAndroid Build Coastguard Worker           // initializer for `name_len` comes before it, otherwise the value
7350*795d594fSAndroid Build Coastguard Worker           // from the call would be overwritten by that initializer.
7351*795d594fSAndroid Build Coastguard Worker           name(dex_file->GetStringDataAndUtf16Length(mid.name_idx_, &name_len)),
7352*795d594fSAndroid Build Coastguard Worker           signature(dex_file->GetMethodSignature(mid)) {
7353*795d594fSAndroid Build Coastguard Worker       // The `name_len` has been initialized to the UTF16 length. Calculate length in bytes.
7354*795d594fSAndroid Build Coastguard Worker       if (name[name_len] != 0) {
7355*795d594fSAndroid Build Coastguard Worker         name_len += strlen(name + name_len);
7356*795d594fSAndroid Build Coastguard Worker       }
7357*795d594fSAndroid Build Coastguard Worker     }
7358*795d594fSAndroid Build Coastguard Worker 
7359*795d594fSAndroid Build Coastguard Worker     bool operator==(const Entry& other) const {
7360*795d594fSAndroid Build Coastguard Worker       return name_len == other.name_len &&
7361*795d594fSAndroid Build Coastguard Worker              memcmp(name, other.name, name_len) == 0 &&
7362*795d594fSAndroid Build Coastguard Worker              signature == other.signature;
7363*795d594fSAndroid Build Coastguard Worker     }
7364*795d594fSAndroid Build Coastguard Worker   };
7365*795d594fSAndroid Build Coastguard Worker   struct EntryHash {
7366*795d594fSAndroid Build Coastguard Worker     size_t operator()(const Entry& key) const {
7367*795d594fSAndroid Build Coastguard Worker       return key.cached_hash;
7368*795d594fSAndroid Build Coastguard Worker     }
7369*795d594fSAndroid Build Coastguard Worker   };
7370*795d594fSAndroid Build Coastguard Worker   HashMap<Entry, int32_t, DefaultMapEmptyFn<Entry, int32_t>, EntryHash> map;
7371*795d594fSAndroid Build Coastguard Worker   for (int32_t i = 0; i < num_entries; ++i) {
7372*795d594fSAndroid Build Coastguard Worker     // Can use Unchecked here as the first loop already ensured that the arrays are correct
7373*795d594fSAndroid Build Coastguard Worker     // wrt/ kPointerSize.
7374*795d594fSAndroid Build Coastguard Worker     ArtMethod* vtable_entry = vtable->GetElementPtrSizeUnchecked<ArtMethod*, kPointerSize>(i);
7375*795d594fSAndroid Build Coastguard Worker     // Don't bother if we cannot 'see' the vtable entry (i.e. it is a package-private member
7376*795d594fSAndroid Build Coastguard Worker     // maybe).
7377*795d594fSAndroid Build Coastguard Worker     if (!klass->CanAccessMember(vtable_entry->GetDeclaringClass(),
7378*795d594fSAndroid Build Coastguard Worker                                 vtable_entry->GetAccessFlags())) {
7379*795d594fSAndroid Build Coastguard Worker       continue;
7380*795d594fSAndroid Build Coastguard Worker     }
7381*795d594fSAndroid Build Coastguard Worker     ArtMethod* m = vtable_entry->GetInterfaceMethodIfProxy(kPointerSize);
7382*795d594fSAndroid Build Coastguard Worker     const DexFile* dex_file = m->GetDexFile();
7383*795d594fSAndroid Build Coastguard Worker     const dex::MethodId& mid = dex_file->GetMethodId(m->GetDexMethodIndex());
7384*795d594fSAndroid Build Coastguard Worker 
7385*795d594fSAndroid Build Coastguard Worker     Entry e(dex_file, mid);
7386*795d594fSAndroid Build Coastguard Worker 
7387*795d594fSAndroid Build Coastguard Worker     size_t string_hash = std::hash<std::string_view>()(std::string_view(e.name, e.name_len));
7388*795d594fSAndroid Build Coastguard Worker     size_t sig_hash = std::hash<std::string>()(e.signature.ToString());
7389*795d594fSAndroid Build Coastguard Worker     e.cached_hash = BaseHashType::HashCombine(BaseHashType::HashCombine(0u, string_hash),
7390*795d594fSAndroid Build Coastguard Worker                                               sig_hash);
7391*795d594fSAndroid Build Coastguard Worker 
7392*795d594fSAndroid Build Coastguard Worker     auto it = map.find(e);
7393*795d594fSAndroid Build Coastguard Worker     if (it != map.end()) {
7394*795d594fSAndroid Build Coastguard Worker       log_fn(it->second, i);
7395*795d594fSAndroid Build Coastguard Worker     } else {
7396*795d594fSAndroid Build Coastguard Worker       map.insert(std::make_pair(e, i));
7397*795d594fSAndroid Build Coastguard Worker     }
7398*795d594fSAndroid Build Coastguard Worker   }
7399*795d594fSAndroid Build Coastguard Worker }
7400*795d594fSAndroid Build Coastguard Worker 
CheckVTableHasNoDuplicates(Thread * self,Handle<mirror::Class> klass,PointerSize pointer_size)7401*795d594fSAndroid Build Coastguard Worker void CheckVTableHasNoDuplicates(Thread* self,
7402*795d594fSAndroid Build Coastguard Worker                                 Handle<mirror::Class> klass,
7403*795d594fSAndroid Build Coastguard Worker                                 PointerSize pointer_size)
7404*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
7405*795d594fSAndroid Build Coastguard Worker   switch (pointer_size) {
7406*795d594fSAndroid Build Coastguard Worker     case PointerSize::k64:
7407*795d594fSAndroid Build Coastguard Worker       CheckVTableHasNoDuplicates<PointerSize::k64>(self, klass);
7408*795d594fSAndroid Build Coastguard Worker       break;
7409*795d594fSAndroid Build Coastguard Worker     case PointerSize::k32:
7410*795d594fSAndroid Build Coastguard Worker       CheckVTableHasNoDuplicates<PointerSize::k32>(self, klass);
7411*795d594fSAndroid Build Coastguard Worker       break;
7412*795d594fSAndroid Build Coastguard Worker   }
7413*795d594fSAndroid Build Coastguard Worker }
7414*795d594fSAndroid Build Coastguard Worker 
CheckVTable(Thread * self,Handle<mirror::Class> klass,PointerSize pointer_size)7415*795d594fSAndroid Build Coastguard Worker static void CheckVTable(Thread* self, Handle<mirror::Class> klass, PointerSize pointer_size)
7416*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
7417*795d594fSAndroid Build Coastguard Worker   CheckClassOwnsVTableEntries(self, klass, pointer_size);
7418*795d594fSAndroid Build Coastguard Worker   CheckVTableHasNoDuplicates(self, klass, pointer_size);
7419*795d594fSAndroid Build Coastguard Worker }
7420*795d594fSAndroid Build Coastguard Worker 
7421*795d594fSAndroid Build Coastguard Worker }  // namespace
7422*795d594fSAndroid Build Coastguard Worker 
7423*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
7424*795d594fSAndroid Build Coastguard Worker class ClassLinker::LinkMethodsHelper {
7425*795d594fSAndroid Build Coastguard Worker  public:
LinkMethodsHelper(ClassLinker * class_linker,Handle<mirror::Class> klass,Thread * self,Runtime * runtime)7426*795d594fSAndroid Build Coastguard Worker   LinkMethodsHelper(ClassLinker* class_linker,
7427*795d594fSAndroid Build Coastguard Worker                     Handle<mirror::Class> klass,
7428*795d594fSAndroid Build Coastguard Worker                     Thread* self,
7429*795d594fSAndroid Build Coastguard Worker                     Runtime* runtime)
7430*795d594fSAndroid Build Coastguard Worker       : class_linker_(class_linker),
7431*795d594fSAndroid Build Coastguard Worker         klass_(klass),
7432*795d594fSAndroid Build Coastguard Worker         self_(self),
7433*795d594fSAndroid Build Coastguard Worker         runtime_(runtime),
7434*795d594fSAndroid Build Coastguard Worker         stack_(runtime->GetArenaPool()),
7435*795d594fSAndroid Build Coastguard Worker         allocator_(&stack_),
7436*795d594fSAndroid Build Coastguard Worker         copied_method_records_(copied_method_records_initial_buffer_,
7437*795d594fSAndroid Build Coastguard Worker                                kCopiedMethodRecordInitialBufferSize,
7438*795d594fSAndroid Build Coastguard Worker                                allocator_.Adapter()),
7439*795d594fSAndroid Build Coastguard Worker         num_new_copied_methods_(0u) {
7440*795d594fSAndroid Build Coastguard Worker   }
7441*795d594fSAndroid Build Coastguard Worker 
7442*795d594fSAndroid Build Coastguard Worker   // Links the virtual and interface methods for the given class.
7443*795d594fSAndroid Build Coastguard Worker   //
7444*795d594fSAndroid Build Coastguard Worker   // Arguments:
7445*795d594fSAndroid Build Coastguard Worker   // * self - The current thread.
7446*795d594fSAndroid Build Coastguard Worker   // * klass - class, whose vtable will be filled in.
7447*795d594fSAndroid Build Coastguard Worker   // * interfaces - implemented interfaces for a proxy class, otherwise null.
7448*795d594fSAndroid Build Coastguard Worker   // * out_new_conflict - whether there is a new conflict compared to the superclass.
7449*795d594fSAndroid Build Coastguard Worker   // * out_imt - interface method table to fill.
7450*795d594fSAndroid Build Coastguard Worker   bool LinkMethods(
7451*795d594fSAndroid Build Coastguard Worker       Thread* self,
7452*795d594fSAndroid Build Coastguard Worker       Handle<mirror::Class> klass,
7453*795d594fSAndroid Build Coastguard Worker       Handle<mirror::ObjectArray<mirror::Class>> interfaces,
7454*795d594fSAndroid Build Coastguard Worker       bool* out_new_conflict,
7455*795d594fSAndroid Build Coastguard Worker       ArtMethod** out_imt)
7456*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
7457*795d594fSAndroid Build Coastguard Worker 
7458*795d594fSAndroid Build Coastguard Worker  private:
7459*795d594fSAndroid Build Coastguard Worker   // Allocate a pointer array.
7460*795d594fSAndroid Build Coastguard Worker   static ObjPtr<mirror::PointerArray> AllocPointerArray(Thread* self, size_t length)
7461*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
7462*795d594fSAndroid Build Coastguard Worker 
7463*795d594fSAndroid Build Coastguard Worker   // Allocate method arrays for interfaces.
7464*795d594fSAndroid Build Coastguard Worker   bool AllocateIfTableMethodArrays(Thread* self,
7465*795d594fSAndroid Build Coastguard Worker                                    Handle<mirror::Class> klass,
7466*795d594fSAndroid Build Coastguard Worker                                    Handle<mirror::IfTable> iftable)
7467*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
7468*795d594fSAndroid Build Coastguard Worker 
7469*795d594fSAndroid Build Coastguard Worker   // Assign vtable indexes to declared virtual methods for a non-interface class other
7470*795d594fSAndroid Build Coastguard Worker   // than `java.lang.Object`. Returns the number of vtable entries on success, 0 on failure.
7471*795d594fSAndroid Build Coastguard Worker   // This function also assigns vtable indexes for interface methods in new interfaces
7472*795d594fSAndroid Build Coastguard Worker   // and records data for copied methods which shall be referenced by the vtable.
7473*795d594fSAndroid Build Coastguard Worker   size_t AssignVTableIndexes(ObjPtr<mirror::Class> klass,
7474*795d594fSAndroid Build Coastguard Worker                              ObjPtr<mirror::Class> super_class,
7475*795d594fSAndroid Build Coastguard Worker                              bool is_super_abstract,
7476*795d594fSAndroid Build Coastguard Worker                              size_t num_virtual_methods,
7477*795d594fSAndroid Build Coastguard Worker                              ObjPtr<mirror::IfTable> iftable)
7478*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
7479*795d594fSAndroid Build Coastguard Worker 
7480*795d594fSAndroid Build Coastguard Worker   bool FindCopiedMethodsForInterface(ObjPtr<mirror::Class> klass,
7481*795d594fSAndroid Build Coastguard Worker                                      size_t num_virtual_methods,
7482*795d594fSAndroid Build Coastguard Worker                                      ObjPtr<mirror::IfTable> iftable)
7483*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
7484*795d594fSAndroid Build Coastguard Worker 
7485*795d594fSAndroid Build Coastguard Worker   bool LinkJavaLangObjectMethods(Thread* self, Handle<mirror::Class> klass)
7486*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
7487*795d594fSAndroid Build Coastguard Worker 
7488*795d594fSAndroid Build Coastguard Worker   void ReallocMethods(ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_);
7489*795d594fSAndroid Build Coastguard Worker   bool FinalizeIfTable(Handle<mirror::Class> klass,
7490*795d594fSAndroid Build Coastguard Worker                        MutableHandle<mirror::IfTable> iftable,
7491*795d594fSAndroid Build Coastguard Worker                        Handle<mirror::PointerArray> vtable,
7492*795d594fSAndroid Build Coastguard Worker                        bool is_klass_abstract,
7493*795d594fSAndroid Build Coastguard Worker                        bool is_super_abstract,
7494*795d594fSAndroid Build Coastguard Worker                        bool* out_new_conflict,
7495*795d594fSAndroid Build Coastguard Worker                        ArtMethod** out_imt)
7496*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
7497*795d594fSAndroid Build Coastguard Worker 
ClobberOldMethods(LengthPrefixedArray<ArtMethod> * old_methods,LengthPrefixedArray<ArtMethod> * methods)7498*795d594fSAndroid Build Coastguard Worker   void ClobberOldMethods(LengthPrefixedArray<ArtMethod>* old_methods,
7499*795d594fSAndroid Build Coastguard Worker                          LengthPrefixedArray<ArtMethod>* methods) {
7500*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild && old_methods != nullptr) {
7501*795d594fSAndroid Build Coastguard Worker       CHECK(methods != nullptr);
7502*795d594fSAndroid Build Coastguard Worker       // Put some random garbage in old methods to help find stale pointers.
7503*795d594fSAndroid Build Coastguard Worker       if (methods != old_methods) {
7504*795d594fSAndroid Build Coastguard Worker         // Need to make sure the GC is not running since it could be scanning the methods we are
7505*795d594fSAndroid Build Coastguard Worker         // about to overwrite.
7506*795d594fSAndroid Build Coastguard Worker         ScopedThreadStateChange tsc(self_, ThreadState::kSuspended);
7507*795d594fSAndroid Build Coastguard Worker         gc::ScopedGCCriticalSection gcs(self_,
7508*795d594fSAndroid Build Coastguard Worker                                         gc::kGcCauseClassLinker,
7509*795d594fSAndroid Build Coastguard Worker                                         gc::kCollectorTypeClassLinker);
7510*795d594fSAndroid Build Coastguard Worker         const size_t old_size = LengthPrefixedArray<ArtMethod>::ComputeSize(old_methods->size(),
7511*795d594fSAndroid Build Coastguard Worker                                                                             kMethodSize,
7512*795d594fSAndroid Build Coastguard Worker                                                                             kMethodAlignment);
7513*795d594fSAndroid Build Coastguard Worker         memset(old_methods, 0xFEu, old_size);
7514*795d594fSAndroid Build Coastguard Worker         // Set size to 0 to avoid visiting declaring classes.
7515*795d594fSAndroid Build Coastguard Worker         if (gUseUserfaultfd) {
7516*795d594fSAndroid Build Coastguard Worker           old_methods->SetSize(0);
7517*795d594fSAndroid Build Coastguard Worker         }
7518*795d594fSAndroid Build Coastguard Worker       }
7519*795d594fSAndroid Build Coastguard Worker     }
7520*795d594fSAndroid Build Coastguard Worker   }
7521*795d594fSAndroid Build Coastguard Worker 
7522*795d594fSAndroid Build Coastguard Worker   NO_INLINE
LogNewVirtuals(LengthPrefixedArray<ArtMethod> * methods) const7523*795d594fSAndroid Build Coastguard Worker   void LogNewVirtuals(LengthPrefixedArray<ArtMethod>* methods) const
7524*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
7525*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass = klass_.Get();
7526*795d594fSAndroid Build Coastguard Worker     size_t num_new_copied_methods = num_new_copied_methods_;
7527*795d594fSAndroid Build Coastguard Worker     size_t old_method_count = methods->size() - num_new_copied_methods;
7528*795d594fSAndroid Build Coastguard Worker     size_t super_vtable_length = klass->GetSuperClass()->GetVTableLength();
7529*795d594fSAndroid Build Coastguard Worker     size_t num_miranda_methods = 0u;
7530*795d594fSAndroid Build Coastguard Worker     size_t num_overriding_default_methods = 0u;
7531*795d594fSAndroid Build Coastguard Worker     size_t num_default_methods = 0u;
7532*795d594fSAndroid Build Coastguard Worker     size_t num_overriding_default_conflict_methods = 0u;
7533*795d594fSAndroid Build Coastguard Worker     size_t num_default_conflict_methods = 0u;
7534*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i != num_new_copied_methods; ++i) {
7535*795d594fSAndroid Build Coastguard Worker       ArtMethod& m = methods->At(old_method_count + i, kMethodSize, kMethodAlignment);
7536*795d594fSAndroid Build Coastguard Worker       if (m.IsDefault()) {
7537*795d594fSAndroid Build Coastguard Worker         if (m.GetMethodIndexDuringLinking() < super_vtable_length) {
7538*795d594fSAndroid Build Coastguard Worker           ++num_overriding_default_methods;
7539*795d594fSAndroid Build Coastguard Worker         } else {
7540*795d594fSAndroid Build Coastguard Worker           ++num_default_methods;
7541*795d594fSAndroid Build Coastguard Worker         }
7542*795d594fSAndroid Build Coastguard Worker       } else if (m.IsDefaultConflicting()) {
7543*795d594fSAndroid Build Coastguard Worker         if (m.GetMethodIndexDuringLinking() < super_vtable_length) {
7544*795d594fSAndroid Build Coastguard Worker           ++num_overriding_default_conflict_methods;
7545*795d594fSAndroid Build Coastguard Worker         } else {
7546*795d594fSAndroid Build Coastguard Worker           ++num_default_conflict_methods;
7547*795d594fSAndroid Build Coastguard Worker         }
7548*795d594fSAndroid Build Coastguard Worker       } else {
7549*795d594fSAndroid Build Coastguard Worker         DCHECK(m.IsMiranda());
7550*795d594fSAndroid Build Coastguard Worker         ++num_miranda_methods;
7551*795d594fSAndroid Build Coastguard Worker       }
7552*795d594fSAndroid Build Coastguard Worker     }
7553*795d594fSAndroid Build Coastguard Worker     VLOG(class_linker) << klass->PrettyClass() << ": miranda_methods=" << num_miranda_methods
7554*795d594fSAndroid Build Coastguard Worker                        << " default_methods=" << num_default_methods
7555*795d594fSAndroid Build Coastguard Worker                        << " overriding_default_methods=" << num_overriding_default_methods
7556*795d594fSAndroid Build Coastguard Worker                        << " default_conflict_methods=" << num_default_conflict_methods
7557*795d594fSAndroid Build Coastguard Worker                        << " overriding_default_conflict_methods="
7558*795d594fSAndroid Build Coastguard Worker                        << num_overriding_default_conflict_methods;
7559*795d594fSAndroid Build Coastguard Worker   }
7560*795d594fSAndroid Build Coastguard Worker 
7561*795d594fSAndroid Build Coastguard Worker   class MethodIndexEmptyFn {
7562*795d594fSAndroid Build Coastguard Worker    public:
MakeEmpty(uint32_t & item) const7563*795d594fSAndroid Build Coastguard Worker     void MakeEmpty(uint32_t& item) const {
7564*795d594fSAndroid Build Coastguard Worker       item = dex::kDexNoIndex;
7565*795d594fSAndroid Build Coastguard Worker     }
IsEmpty(const uint32_t & item) const7566*795d594fSAndroid Build Coastguard Worker     bool IsEmpty(const uint32_t& item) const {
7567*795d594fSAndroid Build Coastguard Worker       return item == dex::kDexNoIndex;
7568*795d594fSAndroid Build Coastguard Worker     }
7569*795d594fSAndroid Build Coastguard Worker   };
7570*795d594fSAndroid Build Coastguard Worker 
7571*795d594fSAndroid Build Coastguard Worker   class VTableIndexCheckerDebug {
7572*795d594fSAndroid Build Coastguard Worker    protected:
VTableIndexCheckerDebug(size_t vtable_length)7573*795d594fSAndroid Build Coastguard Worker     explicit VTableIndexCheckerDebug(size_t vtable_length)
7574*795d594fSAndroid Build Coastguard Worker         : vtable_length_(vtable_length) {}
7575*795d594fSAndroid Build Coastguard Worker 
CheckIndex(uint32_t index) const7576*795d594fSAndroid Build Coastguard Worker     void CheckIndex(uint32_t index) const {
7577*795d594fSAndroid Build Coastguard Worker       CHECK_LT(index, vtable_length_);
7578*795d594fSAndroid Build Coastguard Worker     }
7579*795d594fSAndroid Build Coastguard Worker 
7580*795d594fSAndroid Build Coastguard Worker    private:
7581*795d594fSAndroid Build Coastguard Worker     uint32_t vtable_length_;
7582*795d594fSAndroid Build Coastguard Worker   };
7583*795d594fSAndroid Build Coastguard Worker 
7584*795d594fSAndroid Build Coastguard Worker   class VTableIndexCheckerRelease {
7585*795d594fSAndroid Build Coastguard Worker    protected:
VTableIndexCheckerRelease(size_t vtable_length)7586*795d594fSAndroid Build Coastguard Worker     explicit VTableIndexCheckerRelease([[maybe_unused]] size_t vtable_length) {}
CheckIndex(uint32_t index) const7587*795d594fSAndroid Build Coastguard Worker     void CheckIndex([[maybe_unused]] uint32_t index) const {}
7588*795d594fSAndroid Build Coastguard Worker   };
7589*795d594fSAndroid Build Coastguard Worker 
7590*795d594fSAndroid Build Coastguard Worker   using VTableIndexChecker =
7591*795d594fSAndroid Build Coastguard Worker       std::conditional_t<kIsDebugBuild, VTableIndexCheckerDebug, VTableIndexCheckerRelease>;
7592*795d594fSAndroid Build Coastguard Worker 
7593*795d594fSAndroid Build Coastguard Worker   class VTableAccessor : private VTableIndexChecker {
7594*795d594fSAndroid Build Coastguard Worker    public:
VTableAccessor(uint8_t * raw_vtable,size_t vtable_length)7595*795d594fSAndroid Build Coastguard Worker     VTableAccessor(uint8_t* raw_vtable, size_t vtable_length)
7596*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_)
7597*795d594fSAndroid Build Coastguard Worker         : VTableIndexChecker(vtable_length),
7598*795d594fSAndroid Build Coastguard Worker           raw_vtable_(raw_vtable) {}
7599*795d594fSAndroid Build Coastguard Worker 
GetVTableEntry(uint32_t index) const7600*795d594fSAndroid Build Coastguard Worker     ArtMethod* GetVTableEntry(uint32_t index) const REQUIRES_SHARED(Locks::mutator_lock_) {
7601*795d594fSAndroid Build Coastguard Worker       this->CheckIndex(index);
7602*795d594fSAndroid Build Coastguard Worker       uint8_t* entry = raw_vtable_ + static_cast<size_t>(kPointerSize) * index;
7603*795d594fSAndroid Build Coastguard Worker       if (kPointerSize == PointerSize::k64) {
7604*795d594fSAndroid Build Coastguard Worker         return reinterpret_cast64<ArtMethod*>(*reinterpret_cast<uint64_t*>(entry));
7605*795d594fSAndroid Build Coastguard Worker       } else {
7606*795d594fSAndroid Build Coastguard Worker         return reinterpret_cast32<ArtMethod*>(*reinterpret_cast<uint32_t*>(entry));
7607*795d594fSAndroid Build Coastguard Worker       }
7608*795d594fSAndroid Build Coastguard Worker     }
7609*795d594fSAndroid Build Coastguard Worker 
7610*795d594fSAndroid Build Coastguard Worker    private:
7611*795d594fSAndroid Build Coastguard Worker     uint8_t* raw_vtable_;
7612*795d594fSAndroid Build Coastguard Worker   };
7613*795d594fSAndroid Build Coastguard Worker 
7614*795d594fSAndroid Build Coastguard Worker   class VTableSignatureHash {
7615*795d594fSAndroid Build Coastguard Worker    public:
7616*795d594fSAndroid Build Coastguard Worker     explicit VTableSignatureHash(VTableAccessor accessor)
REQUIRES_SHARED(Locks::mutator_lock_)7617*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_)
7618*795d594fSAndroid Build Coastguard Worker         : accessor_(accessor) {}
7619*795d594fSAndroid Build Coastguard Worker 
7620*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(ArtMethod * method) const7621*795d594fSAndroid Build Coastguard Worker     size_t operator()(ArtMethod* method) const NO_THREAD_SAFETY_ANALYSIS {
7622*795d594fSAndroid Build Coastguard Worker       return ComputeMethodHash(method);
7623*795d594fSAndroid Build Coastguard Worker     }
7624*795d594fSAndroid Build Coastguard Worker 
7625*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(uint32_t index) const7626*795d594fSAndroid Build Coastguard Worker     size_t operator()(uint32_t index) const NO_THREAD_SAFETY_ANALYSIS {
7627*795d594fSAndroid Build Coastguard Worker       return ComputeMethodHash(accessor_.GetVTableEntry(index));
7628*795d594fSAndroid Build Coastguard Worker     }
7629*795d594fSAndroid Build Coastguard Worker 
7630*795d594fSAndroid Build Coastguard Worker    private:
7631*795d594fSAndroid Build Coastguard Worker     VTableAccessor accessor_;
7632*795d594fSAndroid Build Coastguard Worker   };
7633*795d594fSAndroid Build Coastguard Worker 
7634*795d594fSAndroid Build Coastguard Worker   class VTableSignatureEqual {
7635*795d594fSAndroid Build Coastguard Worker    public:
7636*795d594fSAndroid Build Coastguard Worker     explicit VTableSignatureEqual(VTableAccessor accessor)
REQUIRES_SHARED(Locks::mutator_lock_)7637*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_)
7638*795d594fSAndroid Build Coastguard Worker         : accessor_(accessor) {}
7639*795d594fSAndroid Build Coastguard Worker 
7640*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(uint32_t lhs_index,ArtMethod * rhs) const7641*795d594fSAndroid Build Coastguard Worker     bool operator()(uint32_t lhs_index, ArtMethod* rhs) const NO_THREAD_SAFETY_ANALYSIS {
7642*795d594fSAndroid Build Coastguard Worker       return MethodSignatureEquals(accessor_.GetVTableEntry(lhs_index), rhs);
7643*795d594fSAndroid Build Coastguard Worker     }
7644*795d594fSAndroid Build Coastguard Worker 
7645*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(uint32_t lhs_index,uint32_t rhs_index) const7646*795d594fSAndroid Build Coastguard Worker     bool operator()(uint32_t lhs_index, uint32_t rhs_index) const NO_THREAD_SAFETY_ANALYSIS {
7647*795d594fSAndroid Build Coastguard Worker       return (*this)(lhs_index, accessor_.GetVTableEntry(rhs_index));
7648*795d594fSAndroid Build Coastguard Worker     }
7649*795d594fSAndroid Build Coastguard Worker 
7650*795d594fSAndroid Build Coastguard Worker    private:
7651*795d594fSAndroid Build Coastguard Worker     VTableAccessor accessor_;
7652*795d594fSAndroid Build Coastguard Worker   };
7653*795d594fSAndroid Build Coastguard Worker 
7654*795d594fSAndroid Build Coastguard Worker   using VTableSignatureSet =
7655*795d594fSAndroid Build Coastguard Worker       ScopedArenaHashSet<uint32_t, MethodIndexEmptyFn, VTableSignatureHash, VTableSignatureEqual>;
7656*795d594fSAndroid Build Coastguard Worker 
7657*795d594fSAndroid Build Coastguard Worker   class DeclaredVirtualSignatureHash {
7658*795d594fSAndroid Build Coastguard Worker    public:
7659*795d594fSAndroid Build Coastguard Worker     explicit DeclaredVirtualSignatureHash(ObjPtr<mirror::Class> klass)
REQUIRES_SHARED(Locks::mutator_lock_)7660*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_)
7661*795d594fSAndroid Build Coastguard Worker         : klass_(klass) {}
7662*795d594fSAndroid Build Coastguard Worker 
7663*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(ArtMethod * method) const7664*795d594fSAndroid Build Coastguard Worker     size_t operator()(ArtMethod* method) const NO_THREAD_SAFETY_ANALYSIS {
7665*795d594fSAndroid Build Coastguard Worker       return ComputeMethodHash(method);
7666*795d594fSAndroid Build Coastguard Worker     }
7667*795d594fSAndroid Build Coastguard Worker 
7668*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(uint32_t index) const7669*795d594fSAndroid Build Coastguard Worker     size_t operator()(uint32_t index) const NO_THREAD_SAFETY_ANALYSIS {
7670*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(index, klass_->NumDeclaredVirtualMethods());
7671*795d594fSAndroid Build Coastguard Worker       ArtMethod* method = klass_->GetVirtualMethodDuringLinking(index, kPointerSize);
7672*795d594fSAndroid Build Coastguard Worker       return ComputeMethodHash(method->GetInterfaceMethodIfProxy(kPointerSize));
7673*795d594fSAndroid Build Coastguard Worker     }
7674*795d594fSAndroid Build Coastguard Worker 
7675*795d594fSAndroid Build Coastguard Worker    private:
7676*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass_;
7677*795d594fSAndroid Build Coastguard Worker   };
7678*795d594fSAndroid Build Coastguard Worker 
7679*795d594fSAndroid Build Coastguard Worker   class DeclaredVirtualSignatureEqual {
7680*795d594fSAndroid Build Coastguard Worker    public:
7681*795d594fSAndroid Build Coastguard Worker     explicit DeclaredVirtualSignatureEqual(ObjPtr<mirror::Class> klass)
REQUIRES_SHARED(Locks::mutator_lock_)7682*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_)
7683*795d594fSAndroid Build Coastguard Worker         : klass_(klass) {}
7684*795d594fSAndroid Build Coastguard Worker 
7685*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(uint32_t lhs_index,ArtMethod * rhs) const7686*795d594fSAndroid Build Coastguard Worker     bool operator()(uint32_t lhs_index, ArtMethod* rhs) const NO_THREAD_SAFETY_ANALYSIS {
7687*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(lhs_index, klass_->NumDeclaredVirtualMethods());
7688*795d594fSAndroid Build Coastguard Worker       ArtMethod* lhs = klass_->GetVirtualMethodDuringLinking(lhs_index, kPointerSize);
7689*795d594fSAndroid Build Coastguard Worker       return MethodSignatureEquals(lhs->GetInterfaceMethodIfProxy(kPointerSize), rhs);
7690*795d594fSAndroid Build Coastguard Worker     }
7691*795d594fSAndroid Build Coastguard Worker 
7692*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(uint32_t lhs_index,uint32_t rhs_index) const7693*795d594fSAndroid Build Coastguard Worker     bool operator()(uint32_t lhs_index, uint32_t rhs_index) const NO_THREAD_SAFETY_ANALYSIS {
7694*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(lhs_index, klass_->NumDeclaredVirtualMethods());
7695*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(rhs_index, klass_->NumDeclaredVirtualMethods());
7696*795d594fSAndroid Build Coastguard Worker       return lhs_index == rhs_index;
7697*795d594fSAndroid Build Coastguard Worker     }
7698*795d594fSAndroid Build Coastguard Worker 
7699*795d594fSAndroid Build Coastguard Worker    private:
7700*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass_;
7701*795d594fSAndroid Build Coastguard Worker   };
7702*795d594fSAndroid Build Coastguard Worker 
7703*795d594fSAndroid Build Coastguard Worker   using DeclaredVirtualSignatureSet = ScopedArenaHashSet<uint32_t,
7704*795d594fSAndroid Build Coastguard Worker                                                          MethodIndexEmptyFn,
7705*795d594fSAndroid Build Coastguard Worker                                                          DeclaredVirtualSignatureHash,
7706*795d594fSAndroid Build Coastguard Worker                                                          DeclaredVirtualSignatureEqual>;
7707*795d594fSAndroid Build Coastguard Worker 
7708*795d594fSAndroid Build Coastguard Worker   // Helper class to keep records for determining the correct copied method to create.
7709*795d594fSAndroid Build Coastguard Worker   class CopiedMethodRecord {
7710*795d594fSAndroid Build Coastguard Worker    public:
7711*795d594fSAndroid Build Coastguard Worker     enum class State : uint32_t {
7712*795d594fSAndroid Build Coastguard Worker       // Note: The `*Single` values are used when we know that there is only one interface
7713*795d594fSAndroid Build Coastguard Worker       // method with the given signature that's not masked; that method is the main method.
7714*795d594fSAndroid Build Coastguard Worker       // We use this knowledge for faster masking check, otherwise we need to search for
7715*795d594fSAndroid Build Coastguard Worker       // a masking method through methods of all interfaces that could potentially mask it.
7716*795d594fSAndroid Build Coastguard Worker       kAbstractSingle,
7717*795d594fSAndroid Build Coastguard Worker       kDefaultSingle,
7718*795d594fSAndroid Build Coastguard Worker       kAbstract,
7719*795d594fSAndroid Build Coastguard Worker       kDefault,
7720*795d594fSAndroid Build Coastguard Worker       kDefaultConflict,
7721*795d594fSAndroid Build Coastguard Worker       kUseSuperMethod,
7722*795d594fSAndroid Build Coastguard Worker     };
7723*795d594fSAndroid Build Coastguard Worker 
CopiedMethodRecord()7724*795d594fSAndroid Build Coastguard Worker     CopiedMethodRecord()
7725*795d594fSAndroid Build Coastguard Worker         : main_method_(nullptr),
7726*795d594fSAndroid Build Coastguard Worker           method_index_(0u),
7727*795d594fSAndroid Build Coastguard Worker           state_(State::kAbstractSingle) {}
7728*795d594fSAndroid Build Coastguard Worker 
CopiedMethodRecord(ArtMethod * main_method,size_t vtable_index)7729*795d594fSAndroid Build Coastguard Worker     CopiedMethodRecord(ArtMethod* main_method, size_t vtable_index)
7730*795d594fSAndroid Build Coastguard Worker         : main_method_(main_method),
7731*795d594fSAndroid Build Coastguard Worker           method_index_(vtable_index),
7732*795d594fSAndroid Build Coastguard Worker           state_(State::kAbstractSingle) {}
7733*795d594fSAndroid Build Coastguard Worker 
7734*795d594fSAndroid Build Coastguard Worker     // Set main method. The new main method must be more specific implementation.
SetMainMethod(ArtMethod * main_method)7735*795d594fSAndroid Build Coastguard Worker     void SetMainMethod(ArtMethod* main_method) {
7736*795d594fSAndroid Build Coastguard Worker       DCHECK(main_method_ != nullptr);
7737*795d594fSAndroid Build Coastguard Worker       main_method_ = main_method;
7738*795d594fSAndroid Build Coastguard Worker     }
7739*795d594fSAndroid Build Coastguard Worker 
7740*795d594fSAndroid Build Coastguard Worker     // The main method is the first encountered default method if any,
7741*795d594fSAndroid Build Coastguard Worker     // otherwise the first encountered abstract method.
GetMainMethod() const7742*795d594fSAndroid Build Coastguard Worker     ArtMethod* GetMainMethod() const {
7743*795d594fSAndroid Build Coastguard Worker       return main_method_;
7744*795d594fSAndroid Build Coastguard Worker     }
7745*795d594fSAndroid Build Coastguard Worker 
SetMethodIndex(size_t method_index)7746*795d594fSAndroid Build Coastguard Worker     void SetMethodIndex(size_t method_index) {
7747*795d594fSAndroid Build Coastguard Worker       DCHECK_NE(method_index, dex::kDexNoIndex);
7748*795d594fSAndroid Build Coastguard Worker       method_index_ = method_index;
7749*795d594fSAndroid Build Coastguard Worker     }
7750*795d594fSAndroid Build Coastguard Worker 
GetMethodIndex() const7751*795d594fSAndroid Build Coastguard Worker     size_t GetMethodIndex() const {
7752*795d594fSAndroid Build Coastguard Worker       DCHECK_NE(method_index_, dex::kDexNoIndex);
7753*795d594fSAndroid Build Coastguard Worker       return method_index_;
7754*795d594fSAndroid Build Coastguard Worker     }
7755*795d594fSAndroid Build Coastguard Worker 
SetState(State state)7756*795d594fSAndroid Build Coastguard Worker     void SetState(State state) {
7757*795d594fSAndroid Build Coastguard Worker       state_ = state;
7758*795d594fSAndroid Build Coastguard Worker     }
7759*795d594fSAndroid Build Coastguard Worker 
GetState() const7760*795d594fSAndroid Build Coastguard Worker     State GetState() const {
7761*795d594fSAndroid Build Coastguard Worker       return state_;
7762*795d594fSAndroid Build Coastguard Worker     }
7763*795d594fSAndroid Build Coastguard Worker 
7764*795d594fSAndroid Build Coastguard Worker     ALWAYS_INLINE
UpdateStateForInterface(ObjPtr<mirror::Class> iface,ArtMethod * interface_method,ObjPtr<mirror::IfTable> iftable,size_t ifcount,size_t index)7765*795d594fSAndroid Build Coastguard Worker     void UpdateStateForInterface(ObjPtr<mirror::Class> iface,
7766*795d594fSAndroid Build Coastguard Worker                                  ArtMethod* interface_method,
7767*795d594fSAndroid Build Coastguard Worker                                  ObjPtr<mirror::IfTable> iftable,
7768*795d594fSAndroid Build Coastguard Worker                                  size_t ifcount,
7769*795d594fSAndroid Build Coastguard Worker                                  size_t index)
7770*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
7771*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(ifcount, iftable->Count());
7772*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(index, ifcount);
7773*795d594fSAndroid Build Coastguard Worker       DCHECK(iface == interface_method->GetDeclaringClass());
7774*795d594fSAndroid Build Coastguard Worker       DCHECK(iface == iftable->GetInterface(index));
7775*795d594fSAndroid Build Coastguard Worker       DCHECK(interface_method->IsDefault());
7776*795d594fSAndroid Build Coastguard Worker       if (GetState() != State::kDefaultConflict) {
7777*795d594fSAndroid Build Coastguard Worker         DCHECK(GetState() == State::kDefault);
7778*795d594fSAndroid Build Coastguard Worker         // We do not record all overriding methods, so we need to walk over all
7779*795d594fSAndroid Build Coastguard Worker         // interfaces that could mask the `interface_method`.
7780*795d594fSAndroid Build Coastguard Worker         if (ContainsOverridingMethodOf(iftable, index + 1, ifcount, iface, interface_method)) {
7781*795d594fSAndroid Build Coastguard Worker           return;  // Found an overriding method that masks `interface_method`.
7782*795d594fSAndroid Build Coastguard Worker         }
7783*795d594fSAndroid Build Coastguard Worker         // We have a new default method that's not masked by any other method.
7784*795d594fSAndroid Build Coastguard Worker         SetState(State::kDefaultConflict);
7785*795d594fSAndroid Build Coastguard Worker       }
7786*795d594fSAndroid Build Coastguard Worker     }
7787*795d594fSAndroid Build Coastguard Worker 
7788*795d594fSAndroid Build Coastguard Worker     ALWAYS_INLINE
UpdateState(ObjPtr<mirror::Class> iface,ArtMethod * interface_method,size_t vtable_index,ObjPtr<mirror::IfTable> iftable,size_t ifcount,size_t index)7789*795d594fSAndroid Build Coastguard Worker     void UpdateState(ObjPtr<mirror::Class> iface,
7790*795d594fSAndroid Build Coastguard Worker                      ArtMethod* interface_method,
7791*795d594fSAndroid Build Coastguard Worker                      size_t vtable_index,
7792*795d594fSAndroid Build Coastguard Worker                      ObjPtr<mirror::IfTable> iftable,
7793*795d594fSAndroid Build Coastguard Worker                      size_t ifcount,
7794*795d594fSAndroid Build Coastguard Worker                      size_t index)
7795*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
7796*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(ifcount, iftable->Count());
7797*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(index, ifcount);
7798*795d594fSAndroid Build Coastguard Worker       if (kIsDebugBuild) {
7799*795d594fSAndroid Build Coastguard Worker         if (interface_method->IsCopied()) {
7800*795d594fSAndroid Build Coastguard Worker           // Called from `FinalizeState()` for a default method from superclass.
7801*795d594fSAndroid Build Coastguard Worker           // The `index` points to the last interface inherited from the superclass
7802*795d594fSAndroid Build Coastguard Worker           // as we need to search only the new interfaces for masking methods.
7803*795d594fSAndroid Build Coastguard Worker           DCHECK(interface_method->IsDefault());
7804*795d594fSAndroid Build Coastguard Worker         } else {
7805*795d594fSAndroid Build Coastguard Worker           DCHECK(iface == interface_method->GetDeclaringClass());
7806*795d594fSAndroid Build Coastguard Worker           DCHECK(iface == iftable->GetInterface(index));
7807*795d594fSAndroid Build Coastguard Worker         }
7808*795d594fSAndroid Build Coastguard Worker       }
7809*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(vtable_index, method_index_);
7810*795d594fSAndroid Build Coastguard Worker       auto slow_is_masked = [=]() REQUIRES_SHARED(Locks::mutator_lock_) {
7811*795d594fSAndroid Build Coastguard Worker         return ContainsImplementingMethod(iftable, index + 1, ifcount, iface, vtable_index);
7812*795d594fSAndroid Build Coastguard Worker       };
7813*795d594fSAndroid Build Coastguard Worker       UpdateStateImpl(iface, interface_method, slow_is_masked);
7814*795d594fSAndroid Build Coastguard Worker     }
7815*795d594fSAndroid Build Coastguard Worker 
7816*795d594fSAndroid Build Coastguard Worker     ALWAYS_INLINE
FinalizeState(ArtMethod * super_method,size_t vtable_index,ObjPtr<mirror::IfTable> iftable,size_t ifcount,ObjPtr<mirror::IfTable> super_iftable,size_t super_ifcount)7817*795d594fSAndroid Build Coastguard Worker     void FinalizeState(ArtMethod* super_method,
7818*795d594fSAndroid Build Coastguard Worker                        size_t vtable_index,
7819*795d594fSAndroid Build Coastguard Worker                        ObjPtr<mirror::IfTable> iftable,
7820*795d594fSAndroid Build Coastguard Worker                        size_t ifcount,
7821*795d594fSAndroid Build Coastguard Worker                        ObjPtr<mirror::IfTable> super_iftable,
7822*795d594fSAndroid Build Coastguard Worker                        size_t super_ifcount)
7823*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
7824*795d594fSAndroid Build Coastguard Worker       DCHECK(super_method->IsCopied());
7825*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(vtable_index, method_index_);
7826*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(vtable_index, super_method->GetMethodIndex());
7827*795d594fSAndroid Build Coastguard Worker       DCHECK_NE(super_ifcount, 0u);
7828*795d594fSAndroid Build Coastguard Worker       if (super_method->IsDefault()) {
7829*795d594fSAndroid Build Coastguard Worker         if (UNLIKELY(super_method->IsDefaultConflicting())) {
7830*795d594fSAndroid Build Coastguard Worker           // Some of the default methods that contributed to the conflict in the superclass
7831*795d594fSAndroid Build Coastguard Worker           // may be masked by new interfaces. Walk over all the interfaces and update state
7832*795d594fSAndroid Build Coastguard Worker           // as long as the current state is not `kDefaultConflict`.
7833*795d594fSAndroid Build Coastguard Worker           size_t i = super_ifcount;
7834*795d594fSAndroid Build Coastguard Worker           while (GetState() != State::kDefaultConflict && i != 0u) {
7835*795d594fSAndroid Build Coastguard Worker             --i;
7836*795d594fSAndroid Build Coastguard Worker             ObjPtr<mirror::Class> iface = iftable->GetInterface(i);
7837*795d594fSAndroid Build Coastguard Worker             DCHECK(iface == super_iftable->GetInterface(i));
7838*795d594fSAndroid Build Coastguard Worker             auto [found, index] =
7839*795d594fSAndroid Build Coastguard Worker                 MethodArrayContains(super_iftable->GetMethodArrayOrNull(i), super_method);
7840*795d594fSAndroid Build Coastguard Worker             if (found) {
7841*795d594fSAndroid Build Coastguard Worker               ArtMethod* interface_method = iface->GetVirtualMethod(index, kPointerSize);
7842*795d594fSAndroid Build Coastguard Worker               auto slow_is_masked = [=]() REQUIRES_SHARED(Locks::mutator_lock_) {
7843*795d594fSAndroid Build Coastguard Worker                 // Note: The `iftable` has method arrays in range [super_ifcount, ifcount) filled
7844*795d594fSAndroid Build Coastguard Worker                 // with vtable indexes but the range [0, super_ifcount) is empty, so we need to
7845*795d594fSAndroid Build Coastguard Worker                 // use the `super_iftable` filled with implementation methods for that range.
7846*795d594fSAndroid Build Coastguard Worker                 return ContainsImplementingMethod(
7847*795d594fSAndroid Build Coastguard Worker                            super_iftable, i + 1u, super_ifcount, iface, super_method) ||
7848*795d594fSAndroid Build Coastguard Worker                        ContainsImplementingMethod(
7849*795d594fSAndroid Build Coastguard Worker                            iftable, super_ifcount, ifcount, iface, vtable_index);
7850*795d594fSAndroid Build Coastguard Worker               };
7851*795d594fSAndroid Build Coastguard Worker               UpdateStateImpl(iface, interface_method, slow_is_masked);
7852*795d594fSAndroid Build Coastguard Worker             }
7853*795d594fSAndroid Build Coastguard Worker           }
7854*795d594fSAndroid Build Coastguard Worker           if (GetState() == State::kDefaultConflict) {
7855*795d594fSAndroid Build Coastguard Worker             SetState(State::kUseSuperMethod);
7856*795d594fSAndroid Build Coastguard Worker           }
7857*795d594fSAndroid Build Coastguard Worker         } else {
7858*795d594fSAndroid Build Coastguard Worker           // There was exactly one default method in superclass interfaces that was
7859*795d594fSAndroid Build Coastguard Worker           // not masked by subinterfaces. Use `UpdateState()` to process it and pass
7860*795d594fSAndroid Build Coastguard Worker           // `super_ifcount - 1` as index for checking if it's been masked by new interfaces.
7861*795d594fSAndroid Build Coastguard Worker           ObjPtr<mirror::Class> iface = super_method->GetDeclaringClass();
7862*795d594fSAndroid Build Coastguard Worker           UpdateState(
7863*795d594fSAndroid Build Coastguard Worker               iface, super_method, vtable_index, iftable, ifcount, /*index=*/ super_ifcount - 1u);
7864*795d594fSAndroid Build Coastguard Worker           if (GetMainMethod() == super_method) {
7865*795d594fSAndroid Build Coastguard Worker             DCHECK(GetState() == State::kDefault) << enum_cast<uint32_t>(GetState());
7866*795d594fSAndroid Build Coastguard Worker             SetState(State::kUseSuperMethod);
7867*795d594fSAndroid Build Coastguard Worker           }
7868*795d594fSAndroid Build Coastguard Worker         }
7869*795d594fSAndroid Build Coastguard Worker       } else {
7870*795d594fSAndroid Build Coastguard Worker         DCHECK(super_method->IsMiranda());
7871*795d594fSAndroid Build Coastguard Worker         // Any default methods with this signature in superclass interfaces have been
7872*795d594fSAndroid Build Coastguard Worker         // masked by subinterfaces. Check if we can reuse the miranda method.
7873*795d594fSAndroid Build Coastguard Worker         if (GetState() == State::kAbstractSingle || GetState() == State::kAbstract) {
7874*795d594fSAndroid Build Coastguard Worker           SetState(State::kUseSuperMethod);
7875*795d594fSAndroid Build Coastguard Worker         }
7876*795d594fSAndroid Build Coastguard Worker       }
7877*795d594fSAndroid Build Coastguard Worker     }
7878*795d594fSAndroid Build Coastguard Worker 
7879*795d594fSAndroid Build Coastguard Worker    private:
7880*795d594fSAndroid Build Coastguard Worker     template <typename Predicate>
7881*795d594fSAndroid Build Coastguard Worker     ALWAYS_INLINE
UpdateStateImpl(ObjPtr<mirror::Class> iface,ArtMethod * interface_method,Predicate && slow_is_masked)7882*795d594fSAndroid Build Coastguard Worker     void UpdateStateImpl(ObjPtr<mirror::Class> iface,
7883*795d594fSAndroid Build Coastguard Worker                          ArtMethod* interface_method,
7884*795d594fSAndroid Build Coastguard Worker                          Predicate&& slow_is_masked)
7885*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
7886*795d594fSAndroid Build Coastguard Worker       bool have_default = false;
7887*795d594fSAndroid Build Coastguard Worker       switch (GetState()) {
7888*795d594fSAndroid Build Coastguard Worker         case State::kDefaultSingle:
7889*795d594fSAndroid Build Coastguard Worker           have_default = true;
7890*795d594fSAndroid Build Coastguard Worker           FALLTHROUGH_INTENDED;
7891*795d594fSAndroid Build Coastguard Worker         case State::kAbstractSingle:
7892*795d594fSAndroid Build Coastguard Worker           if (GetMainMethod()->GetDeclaringClass()->Implements(iface)) {
7893*795d594fSAndroid Build Coastguard Worker             return;  // The main method masks the `interface_method`.
7894*795d594fSAndroid Build Coastguard Worker           }
7895*795d594fSAndroid Build Coastguard Worker           if (!interface_method->IsDefault()) {
7896*795d594fSAndroid Build Coastguard Worker             SetState(have_default ? State::kDefault : State::kAbstract);
7897*795d594fSAndroid Build Coastguard Worker             return;
7898*795d594fSAndroid Build Coastguard Worker           }
7899*795d594fSAndroid Build Coastguard Worker           break;
7900*795d594fSAndroid Build Coastguard Worker         case State::kDefault:
7901*795d594fSAndroid Build Coastguard Worker           have_default = true;
7902*795d594fSAndroid Build Coastguard Worker           FALLTHROUGH_INTENDED;
7903*795d594fSAndroid Build Coastguard Worker         case State::kAbstract:
7904*795d594fSAndroid Build Coastguard Worker           if (!interface_method->IsDefault()) {
7905*795d594fSAndroid Build Coastguard Worker             return;  // Keep the same state. We do not need to check for masking.
7906*795d594fSAndroid Build Coastguard Worker           }
7907*795d594fSAndroid Build Coastguard Worker           // We do not record all overriding methods, so we need to walk over all
7908*795d594fSAndroid Build Coastguard Worker           // interfaces that could mask the `interface_method`. The provided
7909*795d594fSAndroid Build Coastguard Worker           // predicate `slow_is_masked()` does that.
7910*795d594fSAndroid Build Coastguard Worker           if (slow_is_masked()) {
7911*795d594fSAndroid Build Coastguard Worker             return;  // Found an overriding method that masks `interface_method`.
7912*795d594fSAndroid Build Coastguard Worker           }
7913*795d594fSAndroid Build Coastguard Worker           break;
7914*795d594fSAndroid Build Coastguard Worker         case State::kDefaultConflict:
7915*795d594fSAndroid Build Coastguard Worker           return;  // The state cannot change anymore.
7916*795d594fSAndroid Build Coastguard Worker         default:
7917*795d594fSAndroid Build Coastguard Worker           LOG(FATAL) << "Unexpected state: " << enum_cast<uint32_t>(GetState());
7918*795d594fSAndroid Build Coastguard Worker           UNREACHABLE();
7919*795d594fSAndroid Build Coastguard Worker       }
7920*795d594fSAndroid Build Coastguard Worker       // We have a new default method that's not masked by any other method.
7921*795d594fSAndroid Build Coastguard Worker       DCHECK(interface_method->IsDefault());
7922*795d594fSAndroid Build Coastguard Worker       if (have_default) {
7923*795d594fSAndroid Build Coastguard Worker         SetState(State::kDefaultConflict);
7924*795d594fSAndroid Build Coastguard Worker       } else {
7925*795d594fSAndroid Build Coastguard Worker         SetMainMethod(interface_method);
7926*795d594fSAndroid Build Coastguard Worker         SetState(State::kDefault);
7927*795d594fSAndroid Build Coastguard Worker       }
7928*795d594fSAndroid Build Coastguard Worker     }
7929*795d594fSAndroid Build Coastguard Worker 
7930*795d594fSAndroid Build Coastguard Worker     // Determine if the given `iftable` contains in the given range a subinterface of `iface`
7931*795d594fSAndroid Build Coastguard Worker     // that declares a method with the same name and signature as 'interface_method'.
7932*795d594fSAndroid Build Coastguard Worker     //
7933*795d594fSAndroid Build Coastguard Worker     // Arguments
7934*795d594fSAndroid Build Coastguard Worker     // - iftable: The iftable we are searching for an overriding method.
7935*795d594fSAndroid Build Coastguard Worker     // - begin:   The start of the range to search.
7936*795d594fSAndroid Build Coastguard Worker     // - end:     The end of the range to search.
7937*795d594fSAndroid Build Coastguard Worker     // - iface:   The interface we are checking to see if anything overrides.
7938*795d594fSAndroid Build Coastguard Worker     // - interface_method:
7939*795d594fSAndroid Build Coastguard Worker     //            The interface method providing a name and signature we're searching for.
7940*795d594fSAndroid Build Coastguard Worker     //
7941*795d594fSAndroid Build Coastguard Worker     // Returns whether an overriding method was found in any subinterface of `iface`.
ContainsOverridingMethodOf(ObjPtr<mirror::IfTable> iftable,size_t begin,size_t end,ObjPtr<mirror::Class> iface,ArtMethod * interface_method)7942*795d594fSAndroid Build Coastguard Worker     static bool ContainsOverridingMethodOf(ObjPtr<mirror::IfTable> iftable,
7943*795d594fSAndroid Build Coastguard Worker                                            size_t begin,
7944*795d594fSAndroid Build Coastguard Worker                                            size_t end,
7945*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::Class> iface,
7946*795d594fSAndroid Build Coastguard Worker                                            ArtMethod* interface_method)
7947*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
7948*795d594fSAndroid Build Coastguard Worker       for (size_t i = begin; i != end; ++i) {
7949*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::Class> current_iface = iftable->GetInterface(i);
7950*795d594fSAndroid Build Coastguard Worker         for (ArtMethod& current_method : current_iface->GetDeclaredVirtualMethods(kPointerSize)) {
7951*795d594fSAndroid Build Coastguard Worker           if (MethodSignatureEquals(&current_method, interface_method)) {
7952*795d594fSAndroid Build Coastguard Worker             // Check if the i'th interface is a subtype of this one.
7953*795d594fSAndroid Build Coastguard Worker             if (current_iface->Implements(iface)) {
7954*795d594fSAndroid Build Coastguard Worker               return true;
7955*795d594fSAndroid Build Coastguard Worker             }
7956*795d594fSAndroid Build Coastguard Worker             break;
7957*795d594fSAndroid Build Coastguard Worker           }
7958*795d594fSAndroid Build Coastguard Worker         }
7959*795d594fSAndroid Build Coastguard Worker       }
7960*795d594fSAndroid Build Coastguard Worker       return false;
7961*795d594fSAndroid Build Coastguard Worker     }
7962*795d594fSAndroid Build Coastguard Worker 
7963*795d594fSAndroid Build Coastguard Worker     // Determine if the given `iftable` contains in the given range a subinterface of `iface`
7964*795d594fSAndroid Build Coastguard Worker     // that declares a method implemented by 'target'. This is an optimized version of
7965*795d594fSAndroid Build Coastguard Worker     // `ContainsOverridingMethodOf()` that searches implementation method arrays instead
7966*795d594fSAndroid Build Coastguard Worker     // of comparing signatures for declared interface methods.
7967*795d594fSAndroid Build Coastguard Worker     //
7968*795d594fSAndroid Build Coastguard Worker     // Arguments
7969*795d594fSAndroid Build Coastguard Worker     // - iftable: The iftable we are searching for an overriding method.
7970*795d594fSAndroid Build Coastguard Worker     // - begin:   The start of the range to search.
7971*795d594fSAndroid Build Coastguard Worker     // - end:     The end of the range to search.
7972*795d594fSAndroid Build Coastguard Worker     // - iface:   The interface we are checking to see if anything overrides.
7973*795d594fSAndroid Build Coastguard Worker     // - target:  The implementation method we're searching for.
7974*795d594fSAndroid Build Coastguard Worker     //            Note that the new `iftable` is filled with vtable indexes for new interfaces,
7975*795d594fSAndroid Build Coastguard Worker     //            so this needs to be the vtable index if we're searching that range.
7976*795d594fSAndroid Build Coastguard Worker     //
7977*795d594fSAndroid Build Coastguard Worker     // Returns whether the `target` was found in a method array for any subinterface of `iface`.
7978*795d594fSAndroid Build Coastguard Worker     template <typename TargetType>
ContainsImplementingMethod(ObjPtr<mirror::IfTable> iftable,size_t begin,size_t end,ObjPtr<mirror::Class> iface,TargetType target)7979*795d594fSAndroid Build Coastguard Worker     static bool ContainsImplementingMethod(ObjPtr<mirror::IfTable> iftable,
7980*795d594fSAndroid Build Coastguard Worker                                            size_t begin,
7981*795d594fSAndroid Build Coastguard Worker                                            size_t end,
7982*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::Class> iface,
7983*795d594fSAndroid Build Coastguard Worker                                            TargetType target)
7984*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
7985*795d594fSAndroid Build Coastguard Worker       for (size_t i = begin; i != end; ++i) {
7986*795d594fSAndroid Build Coastguard Worker         if (MethodArrayContains(iftable->GetMethodArrayOrNull(i), target).first &&
7987*795d594fSAndroid Build Coastguard Worker             iftable->GetInterface(i)->Implements(iface)) {
7988*795d594fSAndroid Build Coastguard Worker           return true;
7989*795d594fSAndroid Build Coastguard Worker         }
7990*795d594fSAndroid Build Coastguard Worker       }
7991*795d594fSAndroid Build Coastguard Worker       return false;
7992*795d594fSAndroid Build Coastguard Worker     }
7993*795d594fSAndroid Build Coastguard Worker 
7994*795d594fSAndroid Build Coastguard Worker     template <typename TargetType>
MethodArrayContains(ObjPtr<mirror::PointerArray> method_array,TargetType target)7995*795d594fSAndroid Build Coastguard Worker     static std::pair<bool, size_t> MethodArrayContains(ObjPtr<mirror::PointerArray> method_array,
7996*795d594fSAndroid Build Coastguard Worker                                                        TargetType target)
7997*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
7998*795d594fSAndroid Build Coastguard Worker       size_t num_methods = (method_array != nullptr) ? method_array->GetLength() : 0u;
7999*795d594fSAndroid Build Coastguard Worker       for (size_t j = 0; j != num_methods; ++j) {
8000*795d594fSAndroid Build Coastguard Worker         if (method_array->GetElementPtrSize<TargetType, kPointerSize>(j) == target) {
8001*795d594fSAndroid Build Coastguard Worker           return {true, j};
8002*795d594fSAndroid Build Coastguard Worker         }
8003*795d594fSAndroid Build Coastguard Worker       }
8004*795d594fSAndroid Build Coastguard Worker       return {false, 0};
8005*795d594fSAndroid Build Coastguard Worker     }
8006*795d594fSAndroid Build Coastguard Worker 
8007*795d594fSAndroid Build Coastguard Worker     ArtMethod* main_method_;
8008*795d594fSAndroid Build Coastguard Worker     uint32_t method_index_;
8009*795d594fSAndroid Build Coastguard Worker     State state_;
8010*795d594fSAndroid Build Coastguard Worker   };
8011*795d594fSAndroid Build Coastguard Worker 
8012*795d594fSAndroid Build Coastguard Worker   class CopiedMethodRecordEmptyFn {
8013*795d594fSAndroid Build Coastguard Worker    public:
MakeEmpty(CopiedMethodRecord & item) const8014*795d594fSAndroid Build Coastguard Worker     void MakeEmpty(CopiedMethodRecord& item) const {
8015*795d594fSAndroid Build Coastguard Worker       item = CopiedMethodRecord();
8016*795d594fSAndroid Build Coastguard Worker     }
IsEmpty(const CopiedMethodRecord & item) const8017*795d594fSAndroid Build Coastguard Worker     bool IsEmpty(const CopiedMethodRecord& item) const {
8018*795d594fSAndroid Build Coastguard Worker       return item.GetMainMethod() == nullptr;
8019*795d594fSAndroid Build Coastguard Worker     }
8020*795d594fSAndroid Build Coastguard Worker   };
8021*795d594fSAndroid Build Coastguard Worker 
8022*795d594fSAndroid Build Coastguard Worker   class CopiedMethodRecordHash {
8023*795d594fSAndroid Build Coastguard Worker    public:
8024*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(ArtMethod * method) const8025*795d594fSAndroid Build Coastguard Worker     size_t operator()(ArtMethod* method) const NO_THREAD_SAFETY_ANALYSIS {
8026*795d594fSAndroid Build Coastguard Worker       DCHECK(method != nullptr);
8027*795d594fSAndroid Build Coastguard Worker       return ComputeMethodHash(method);
8028*795d594fSAndroid Build Coastguard Worker     }
8029*795d594fSAndroid Build Coastguard Worker 
8030*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(const CopiedMethodRecord & record) const8031*795d594fSAndroid Build Coastguard Worker     size_t operator()(const CopiedMethodRecord& record) const NO_THREAD_SAFETY_ANALYSIS {
8032*795d594fSAndroid Build Coastguard Worker       return (*this)(record.GetMainMethod());
8033*795d594fSAndroid Build Coastguard Worker     }
8034*795d594fSAndroid Build Coastguard Worker   };
8035*795d594fSAndroid Build Coastguard Worker 
8036*795d594fSAndroid Build Coastguard Worker   class CopiedMethodRecordEqual {
8037*795d594fSAndroid Build Coastguard Worker    public:
8038*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(const CopiedMethodRecord & lhs_record,ArtMethod * rhs) const8039*795d594fSAndroid Build Coastguard Worker     bool operator()(const CopiedMethodRecord& lhs_record,
8040*795d594fSAndroid Build Coastguard Worker                     ArtMethod* rhs) const NO_THREAD_SAFETY_ANALYSIS {
8041*795d594fSAndroid Build Coastguard Worker       ArtMethod* lhs = lhs_record.GetMainMethod();
8042*795d594fSAndroid Build Coastguard Worker       DCHECK(lhs != nullptr);
8043*795d594fSAndroid Build Coastguard Worker       DCHECK(rhs != nullptr);
8044*795d594fSAndroid Build Coastguard Worker       return MethodSignatureEquals(lhs, rhs);
8045*795d594fSAndroid Build Coastguard Worker     }
8046*795d594fSAndroid Build Coastguard Worker 
8047*795d594fSAndroid Build Coastguard Worker     // NO_THREAD_SAFETY_ANALYSIS: This is called from unannotated `HashSet<>` functions.
operator ()(const CopiedMethodRecord & lhs_record,const CopiedMethodRecord & rhs_record) const8048*795d594fSAndroid Build Coastguard Worker     bool operator()(const CopiedMethodRecord& lhs_record,
8049*795d594fSAndroid Build Coastguard Worker                     const CopiedMethodRecord& rhs_record) const NO_THREAD_SAFETY_ANALYSIS {
8050*795d594fSAndroid Build Coastguard Worker       return (*this)(lhs_record, rhs_record.GetMainMethod());
8051*795d594fSAndroid Build Coastguard Worker     }
8052*795d594fSAndroid Build Coastguard Worker   };
8053*795d594fSAndroid Build Coastguard Worker 
8054*795d594fSAndroid Build Coastguard Worker   using CopiedMethodRecordSet = ScopedArenaHashSet<CopiedMethodRecord,
8055*795d594fSAndroid Build Coastguard Worker                                                    CopiedMethodRecordEmptyFn,
8056*795d594fSAndroid Build Coastguard Worker                                                    CopiedMethodRecordHash,
8057*795d594fSAndroid Build Coastguard Worker                                                    CopiedMethodRecordEqual>;
8058*795d594fSAndroid Build Coastguard Worker 
8059*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kMethodAlignment = ArtMethod::Alignment(kPointerSize);
8060*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kMethodSize = ArtMethod::Size(kPointerSize);
8061*795d594fSAndroid Build Coastguard Worker 
8062*795d594fSAndroid Build Coastguard Worker   ClassLinker* class_linker_;
8063*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> klass_;
8064*795d594fSAndroid Build Coastguard Worker   Thread* const self_;
8065*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime_;
8066*795d594fSAndroid Build Coastguard Worker 
8067*795d594fSAndroid Build Coastguard Worker   // These are allocated on the heap to begin, we then transfer to linear alloc when we re-create
8068*795d594fSAndroid Build Coastguard Worker   // the virtual methods array.
8069*795d594fSAndroid Build Coastguard Worker   // Need to use low 4GB arenas for compiler or else the pointers wont fit in 32 bit method array
8070*795d594fSAndroid Build Coastguard Worker   // during cross compilation.
8071*795d594fSAndroid Build Coastguard Worker   // Use the linear alloc pool since this one is in the low 4gb for the compiler.
8072*795d594fSAndroid Build Coastguard Worker   ArenaStack stack_;
8073*795d594fSAndroid Build Coastguard Worker   ScopedArenaAllocator allocator_;
8074*795d594fSAndroid Build Coastguard Worker 
8075*795d594fSAndroid Build Coastguard Worker   // If there are multiple methods with the same signature in the superclass vtable
8076*795d594fSAndroid Build Coastguard Worker   // (which can happen with a new virtual method having the same signature as an
8077*795d594fSAndroid Build Coastguard Worker   // inaccessible package-private method from another package in the superclass),
8078*795d594fSAndroid Build Coastguard Worker   // we keep singly-linked lists in this single array that maps vtable index to the
8079*795d594fSAndroid Build Coastguard Worker   // next vtable index in the list, `dex::kDexNoIndex` denotes the end of a list.
8080*795d594fSAndroid Build Coastguard Worker   ArrayRef<uint32_t> same_signature_vtable_lists_;
8081*795d594fSAndroid Build Coastguard Worker 
8082*795d594fSAndroid Build Coastguard Worker   // Avoid large allocation for a few copied method records.
8083*795d594fSAndroid Build Coastguard Worker   // Keep the initial buffer on the stack to avoid arena allocations
8084*795d594fSAndroid Build Coastguard Worker   // if there are no special cases (the first arena allocation is costly).
8085*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kCopiedMethodRecordInitialBufferSize = 16u;
8086*795d594fSAndroid Build Coastguard Worker   CopiedMethodRecord copied_method_records_initial_buffer_[kCopiedMethodRecordInitialBufferSize];
8087*795d594fSAndroid Build Coastguard Worker   CopiedMethodRecordSet copied_method_records_;
8088*795d594fSAndroid Build Coastguard Worker   size_t num_new_copied_methods_;
8089*795d594fSAndroid Build Coastguard Worker };
8090*795d594fSAndroid Build Coastguard Worker 
8091*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
8092*795d594fSAndroid Build Coastguard Worker NO_INLINE
ReallocMethods(ObjPtr<mirror::Class> klass)8093*795d594fSAndroid Build Coastguard Worker void ClassLinker::LinkMethodsHelper<kPointerSize>::ReallocMethods(ObjPtr<mirror::Class> klass) {
8094*795d594fSAndroid Build Coastguard Worker   // There should be no thread suspension in this function,
8095*795d594fSAndroid Build Coastguard Worker   // native allocations do not cause thread suspension.
8096*795d594fSAndroid Build Coastguard Worker   ScopedAssertNoThreadSuspension sants(__FUNCTION__);
8097*795d594fSAndroid Build Coastguard Worker 
8098*795d594fSAndroid Build Coastguard Worker   size_t num_new_copied_methods = num_new_copied_methods_;
8099*795d594fSAndroid Build Coastguard Worker   DCHECK_NE(num_new_copied_methods, 0u);
8100*795d594fSAndroid Build Coastguard Worker   const size_t old_method_count = klass->NumMethods();
8101*795d594fSAndroid Build Coastguard Worker   const size_t new_method_count = old_method_count + num_new_copied_methods;
8102*795d594fSAndroid Build Coastguard Worker 
8103*795d594fSAndroid Build Coastguard Worker   // Attempt to realloc to save RAM if possible.
8104*795d594fSAndroid Build Coastguard Worker   LengthPrefixedArray<ArtMethod>* old_methods = klass->GetMethodsPtr();
8105*795d594fSAndroid Build Coastguard Worker   // The Realloced virtual methods aren't visible from the class roots, so there is no issue
8106*795d594fSAndroid Build Coastguard Worker   // where GCs could attempt to mark stale pointers due to memcpy. And since we overwrite the
8107*795d594fSAndroid Build Coastguard Worker   // realloced memory with out->CopyFrom, we are guaranteed to have objects in the to space since
8108*795d594fSAndroid Build Coastguard Worker   // CopyFrom has internal read barriers.
8109*795d594fSAndroid Build Coastguard Worker   //
8110*795d594fSAndroid Build Coastguard Worker   // TODO We should maybe move some of this into mirror::Class or at least into another method.
8111*795d594fSAndroid Build Coastguard Worker   const size_t old_size = LengthPrefixedArray<ArtMethod>::ComputeSize(old_method_count,
8112*795d594fSAndroid Build Coastguard Worker                                                                       kMethodSize,
8113*795d594fSAndroid Build Coastguard Worker                                                                       kMethodAlignment);
8114*795d594fSAndroid Build Coastguard Worker   const size_t new_size = LengthPrefixedArray<ArtMethod>::ComputeSize(new_method_count,
8115*795d594fSAndroid Build Coastguard Worker                                                                       kMethodSize,
8116*795d594fSAndroid Build Coastguard Worker                                                                       kMethodAlignment);
8117*795d594fSAndroid Build Coastguard Worker   const size_t old_methods_ptr_size = (old_methods != nullptr) ? old_size : 0;
8118*795d594fSAndroid Build Coastguard Worker   LinearAlloc* allocator = class_linker_->GetAllocatorForClassLoader(klass->GetClassLoader());
8119*795d594fSAndroid Build Coastguard Worker   auto* methods = reinterpret_cast<LengthPrefixedArray<ArtMethod>*>(allocator->Realloc(
8120*795d594fSAndroid Build Coastguard Worker       self_, old_methods, old_methods_ptr_size, new_size, LinearAllocKind::kArtMethodArray));
8121*795d594fSAndroid Build Coastguard Worker   CHECK(methods != nullptr);  // Native allocation failure aborts.
8122*795d594fSAndroid Build Coastguard Worker 
8123*795d594fSAndroid Build Coastguard Worker   if (methods != old_methods) {
8124*795d594fSAndroid Build Coastguard Worker     if (gUseReadBarrier) {
8125*795d594fSAndroid Build Coastguard Worker       StrideIterator<ArtMethod> out = methods->begin(kMethodSize, kMethodAlignment);
8126*795d594fSAndroid Build Coastguard Worker       // Copy over the old methods. The `ArtMethod::CopyFrom()` is only necessary to not miss
8127*795d594fSAndroid Build Coastguard Worker       // read barriers since `LinearAlloc::Realloc()` won't do read barriers when it copies.
8128*795d594fSAndroid Build Coastguard Worker       for (auto& m : klass->GetMethods(kPointerSize)) {
8129*795d594fSAndroid Build Coastguard Worker         out->CopyFrom(&m, kPointerSize);
8130*795d594fSAndroid Build Coastguard Worker         ++out;
8131*795d594fSAndroid Build Coastguard Worker       }
8132*795d594fSAndroid Build Coastguard Worker     } else if (gUseUserfaultfd) {
8133*795d594fSAndroid Build Coastguard Worker       // In order to make compaction code skip updating the declaring_class_ in
8134*795d594fSAndroid Build Coastguard Worker       // old_methods, convert it into a 'no GC-root' array.
8135*795d594fSAndroid Build Coastguard Worker       allocator->ConvertToNoGcRoots(old_methods, LinearAllocKind::kArtMethodArray);
8136*795d594fSAndroid Build Coastguard Worker     }
8137*795d594fSAndroid Build Coastguard Worker   }
8138*795d594fSAndroid Build Coastguard Worker 
8139*795d594fSAndroid Build Coastguard Worker   // Collect and sort copied method records by the vtable index. This places overriding
8140*795d594fSAndroid Build Coastguard Worker   // copied methods first, sorted by the vtable index already assigned in the superclass,
8141*795d594fSAndroid Build Coastguard Worker   // followed by copied methods with new signatures in the order in which we encountered
8142*795d594fSAndroid Build Coastguard Worker   // them when going over virtual methods of new interfaces.
8143*795d594fSAndroid Build Coastguard Worker   // This order is deterministic but implementation-defined.
8144*795d594fSAndroid Build Coastguard Worker   //
8145*795d594fSAndroid Build Coastguard Worker   // Avoid arena allocation for a few records (the first arena allocation is costly).
8146*795d594fSAndroid Build Coastguard Worker   constexpr size_t kSortedRecordsBufferSize = 16;
8147*795d594fSAndroid Build Coastguard Worker   CopiedMethodRecord* sorted_records_buffer[kSortedRecordsBufferSize];
8148*795d594fSAndroid Build Coastguard Worker   CopiedMethodRecord** sorted_records = (num_new_copied_methods <= kSortedRecordsBufferSize)
8149*795d594fSAndroid Build Coastguard Worker       ? sorted_records_buffer
8150*795d594fSAndroid Build Coastguard Worker       : allocator_.AllocArray<CopiedMethodRecord*>(num_new_copied_methods);
8151*795d594fSAndroid Build Coastguard Worker   size_t filled_sorted_records = 0u;
8152*795d594fSAndroid Build Coastguard Worker   for (CopiedMethodRecord& record : copied_method_records_) {
8153*795d594fSAndroid Build Coastguard Worker     if (record.GetState() != CopiedMethodRecord::State::kUseSuperMethod) {
8154*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(filled_sorted_records, num_new_copied_methods);
8155*795d594fSAndroid Build Coastguard Worker       sorted_records[filled_sorted_records] = &record;
8156*795d594fSAndroid Build Coastguard Worker       ++filled_sorted_records;
8157*795d594fSAndroid Build Coastguard Worker     }
8158*795d594fSAndroid Build Coastguard Worker   }
8159*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(filled_sorted_records, num_new_copied_methods);
8160*795d594fSAndroid Build Coastguard Worker   std::sort(sorted_records,
8161*795d594fSAndroid Build Coastguard Worker             sorted_records + num_new_copied_methods,
8162*795d594fSAndroid Build Coastguard Worker             [](const CopiedMethodRecord* lhs, const CopiedMethodRecord* rhs) {
8163*795d594fSAndroid Build Coastguard Worker               return lhs->GetMethodIndex() < rhs->GetMethodIndex();
8164*795d594fSAndroid Build Coastguard Worker             });
8165*795d594fSAndroid Build Coastguard Worker 
8166*795d594fSAndroid Build Coastguard Worker   if (klass->IsInterface()) {
8167*795d594fSAndroid Build Coastguard Worker     // Some records may have been pruned. Update method indexes in collected records.
8168*795d594fSAndroid Build Coastguard Worker     size_t interface_method_index = klass->NumDeclaredVirtualMethods();
8169*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i != num_new_copied_methods; ++i) {
8170*795d594fSAndroid Build Coastguard Worker       CopiedMethodRecord* record = sorted_records[i];
8171*795d594fSAndroid Build Coastguard Worker       DCHECK_LE(interface_method_index, record->GetMethodIndex());
8172*795d594fSAndroid Build Coastguard Worker       record->SetMethodIndex(interface_method_index);
8173*795d594fSAndroid Build Coastguard Worker       ++interface_method_index;
8174*795d594fSAndroid Build Coastguard Worker     }
8175*795d594fSAndroid Build Coastguard Worker   }
8176*795d594fSAndroid Build Coastguard Worker 
8177*795d594fSAndroid Build Coastguard Worker   // Add copied methods.
8178*795d594fSAndroid Build Coastguard Worker   methods->SetSize(new_method_count);
8179*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i != num_new_copied_methods; ++i) {
8180*795d594fSAndroid Build Coastguard Worker     const CopiedMethodRecord* record = sorted_records[i];
8181*795d594fSAndroid Build Coastguard Worker     ArtMethod* interface_method = record->GetMainMethod();
8182*795d594fSAndroid Build Coastguard Worker     DCHECK(!interface_method->IsCopied());
8183*795d594fSAndroid Build Coastguard Worker     ArtMethod& new_method = methods->At(old_method_count + i, kMethodSize, kMethodAlignment);
8184*795d594fSAndroid Build Coastguard Worker     new_method.CopyFrom(interface_method, kPointerSize);
8185*795d594fSAndroid Build Coastguard Worker     new_method.SetMethodIndex(dchecked_integral_cast<uint16_t>(record->GetMethodIndex()));
8186*795d594fSAndroid Build Coastguard Worker     switch (record->GetState()) {
8187*795d594fSAndroid Build Coastguard Worker       case CopiedMethodRecord::State::kAbstractSingle:
8188*795d594fSAndroid Build Coastguard Worker       case CopiedMethodRecord::State::kAbstract: {
8189*795d594fSAndroid Build Coastguard Worker         DCHECK(!klass->IsInterface());  // We do not create miranda methods for interfaces.
8190*795d594fSAndroid Build Coastguard Worker         uint32_t access_flags = new_method.GetAccessFlags();
8191*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(access_flags & (kAccAbstract | kAccIntrinsic | kAccDefault), kAccAbstract)
8192*795d594fSAndroid Build Coastguard Worker             << "Miranda method should be abstract but not intrinsic or default!";
8193*795d594fSAndroid Build Coastguard Worker         new_method.SetAccessFlags(access_flags | kAccCopied);
8194*795d594fSAndroid Build Coastguard Worker         break;
8195*795d594fSAndroid Build Coastguard Worker       }
8196*795d594fSAndroid Build Coastguard Worker       case CopiedMethodRecord::State::kDefaultSingle:
8197*795d594fSAndroid Build Coastguard Worker       case CopiedMethodRecord::State::kDefault: {
8198*795d594fSAndroid Build Coastguard Worker         DCHECK(!klass->IsInterface());  // We do not copy default methods for interfaces.
8199*795d594fSAndroid Build Coastguard Worker         // Clear the kAccSkipAccessChecks flag if it is present. Since this class hasn't been
8200*795d594fSAndroid Build Coastguard Worker         // verified yet it shouldn't have methods that are skipping access checks.
8201*795d594fSAndroid Build Coastguard Worker         // TODO This is rather arbitrary. We should maybe support classes where only some of its
8202*795d594fSAndroid Build Coastguard Worker         // methods are skip_access_checks.
8203*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(new_method.GetAccessFlags() & kAccNative, 0u);
8204*795d594fSAndroid Build Coastguard Worker         static_assert((kAccDefault & kAccIntrinsicBits) != 0);
8205*795d594fSAndroid Build Coastguard Worker         DCHECK(!new_method.IsIntrinsic()) << "Adding kAccDefault to an intrinsic would be a "
8206*795d594fSAndroid Build Coastguard Worker                                           << "mistake as it overlaps with kAccIntrinsicBits.";
8207*795d594fSAndroid Build Coastguard Worker         constexpr uint32_t kSetFlags = kAccDefault | kAccCopied;
8208*795d594fSAndroid Build Coastguard Worker         constexpr uint32_t kMaskFlags = ~kAccSkipAccessChecks;
8209*795d594fSAndroid Build Coastguard Worker         new_method.SetAccessFlags((new_method.GetAccessFlags() | kSetFlags) & kMaskFlags);
8210*795d594fSAndroid Build Coastguard Worker         break;
8211*795d594fSAndroid Build Coastguard Worker       }
8212*795d594fSAndroid Build Coastguard Worker       case CopiedMethodRecord::State::kDefaultConflict: {
8213*795d594fSAndroid Build Coastguard Worker         // This is a type of default method (there are default method impls, just a conflict)
8214*795d594fSAndroid Build Coastguard Worker         // so mark this as a default. We use the `kAccAbstract` flag to distinguish it from
8215*795d594fSAndroid Build Coastguard Worker         // invokable copied default method without using a separate access flag but the default
8216*795d594fSAndroid Build Coastguard Worker         // conflicting method is technically not abstract and ArtMethod::IsAbstract() shall
8217*795d594fSAndroid Build Coastguard Worker         // return false. Also clear the kAccSkipAccessChecks bit since this class hasn't been
8218*795d594fSAndroid Build Coastguard Worker         // verified yet it shouldn't have methods that are skipping access checks. Also clear
8219*795d594fSAndroid Build Coastguard Worker         // potential kAccSingleImplementation to avoid CHA trying to inline the default method.
8220*795d594fSAndroid Build Coastguard Worker         uint32_t access_flags = new_method.GetAccessFlags();
8221*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(access_flags & (kAccNative | kAccIntrinsic), 0u);
8222*795d594fSAndroid Build Coastguard Worker         constexpr uint32_t kSetFlags = kAccDefault | kAccAbstract | kAccCopied;
8223*795d594fSAndroid Build Coastguard Worker         static_assert((kAccDefault & kAccIntrinsicBits) != 0);
8224*795d594fSAndroid Build Coastguard Worker         DCHECK(!new_method.IsIntrinsic()) << "Adding kAccDefault to an intrinsic would be a "
8225*795d594fSAndroid Build Coastguard Worker                                           << "mistake as it overlaps with kAccIntrinsicBits.";
8226*795d594fSAndroid Build Coastguard Worker         constexpr uint32_t kMaskFlags = ~(kAccSkipAccessChecks | kAccSingleImplementation);
8227*795d594fSAndroid Build Coastguard Worker         new_method.SetAccessFlags((access_flags | kSetFlags) & kMaskFlags);
8228*795d594fSAndroid Build Coastguard Worker         new_method.SetDataPtrSize(nullptr, kPointerSize);
8229*795d594fSAndroid Build Coastguard Worker         DCHECK(new_method.IsDefaultConflicting());
8230*795d594fSAndroid Build Coastguard Worker         DCHECK(!new_method.IsAbstract());
8231*795d594fSAndroid Build Coastguard Worker         // The actual method might or might not be marked abstract since we just copied it from
8232*795d594fSAndroid Build Coastguard Worker         // a (possibly default) interface method. We need to set its entry point to be the bridge
8233*795d594fSAndroid Build Coastguard Worker         // so that the compiler will not invoke the implementation of whatever method we copied
8234*795d594fSAndroid Build Coastguard Worker         // from.
8235*795d594fSAndroid Build Coastguard Worker         EnsureThrowsInvocationError(class_linker_, &new_method);
8236*795d594fSAndroid Build Coastguard Worker         break;
8237*795d594fSAndroid Build Coastguard Worker       }
8238*795d594fSAndroid Build Coastguard Worker       default:
8239*795d594fSAndroid Build Coastguard Worker         LOG(FATAL) << "Unexpected state: " << enum_cast<uint32_t>(record->GetState());
8240*795d594fSAndroid Build Coastguard Worker         UNREACHABLE();
8241*795d594fSAndroid Build Coastguard Worker     }
8242*795d594fSAndroid Build Coastguard Worker   }
8243*795d594fSAndroid Build Coastguard Worker 
8244*795d594fSAndroid Build Coastguard Worker   if (VLOG_IS_ON(class_linker)) {
8245*795d594fSAndroid Build Coastguard Worker     LogNewVirtuals(methods);
8246*795d594fSAndroid Build Coastguard Worker   }
8247*795d594fSAndroid Build Coastguard Worker 
8248*795d594fSAndroid Build Coastguard Worker   class_linker_->UpdateClassMethods(klass, methods);
8249*795d594fSAndroid Build Coastguard Worker }
8250*795d594fSAndroid Build Coastguard Worker 
8251*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
FinalizeIfTable(Handle<mirror::Class> klass,MutableHandle<mirror::IfTable> iftable,Handle<mirror::PointerArray> vtable,bool is_klass_abstract,bool is_super_abstract,bool * out_new_conflict,ArtMethod ** out_imt)8252*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkMethodsHelper<kPointerSize>::FinalizeIfTable(
8253*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> klass,
8254*795d594fSAndroid Build Coastguard Worker     MutableHandle<mirror::IfTable> iftable,
8255*795d594fSAndroid Build Coastguard Worker     Handle<mirror::PointerArray> vtable,
8256*795d594fSAndroid Build Coastguard Worker     bool is_klass_abstract,
8257*795d594fSAndroid Build Coastguard Worker     bool is_super_abstract,
8258*795d594fSAndroid Build Coastguard Worker     bool* out_new_conflict,
8259*795d594fSAndroid Build Coastguard Worker     ArtMethod** out_imt) {
8260*795d594fSAndroid Build Coastguard Worker   size_t ifcount = iftable->Count();
8261*795d594fSAndroid Build Coastguard Worker   // We do not need a read barrier here as the length is constant, both from-space and
8262*795d594fSAndroid Build Coastguard Worker   // to-space `IfTable`s shall yield the same result. See also `Class::GetIfTableCount()`.
8263*795d594fSAndroid Build Coastguard Worker   size_t super_ifcount =
8264*795d594fSAndroid Build Coastguard Worker       klass->GetSuperClass<kDefaultVerifyFlags, kWithoutReadBarrier>()->GetIfTableCount();
8265*795d594fSAndroid Build Coastguard Worker 
8266*795d594fSAndroid Build Coastguard Worker   ClassLinker* class_linker = nullptr;
8267*795d594fSAndroid Build Coastguard Worker   ArtMethod* unimplemented_method = nullptr;
8268*795d594fSAndroid Build Coastguard Worker   ArtMethod* imt_conflict_method = nullptr;
8269*795d594fSAndroid Build Coastguard Worker   uintptr_t imt_methods_begin = 0u;
8270*795d594fSAndroid Build Coastguard Worker   size_t imt_methods_size = 0u;
8271*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(klass->ShouldHaveImt(), !is_klass_abstract);
8272*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(klass->GetSuperClass()->ShouldHaveImt(), !is_super_abstract);
8273*795d594fSAndroid Build Coastguard Worker   if (!is_klass_abstract) {
8274*795d594fSAndroid Build Coastguard Worker     class_linker = class_linker_;
8275*795d594fSAndroid Build Coastguard Worker     unimplemented_method = runtime_->GetImtUnimplementedMethod();
8276*795d594fSAndroid Build Coastguard Worker     imt_conflict_method = runtime_->GetImtConflictMethod();
8277*795d594fSAndroid Build Coastguard Worker     if (is_super_abstract) {
8278*795d594fSAndroid Build Coastguard Worker       // There was no IMT in superclass to copy to `out_imt[]`, so we need
8279*795d594fSAndroid Build Coastguard Worker       // to fill it with all implementation methods from superclass.
8280*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(imt_methods_begin, 0u);
8281*795d594fSAndroid Build Coastguard Worker       imt_methods_size = std::numeric_limits<size_t>::max();  // No method at the last byte.
8282*795d594fSAndroid Build Coastguard Worker     } else {
8283*795d594fSAndroid Build Coastguard Worker       // If the superclass has IMT, we have already copied it to `out_imt[]` and
8284*795d594fSAndroid Build Coastguard Worker       // we do not need to call `SetIMTRef()` for interfaces from superclass when
8285*795d594fSAndroid Build Coastguard Worker       // the implementation method is already in the superclass, only for new methods.
8286*795d594fSAndroid Build Coastguard Worker       // For simplicity, use the entire method array including direct methods.
8287*795d594fSAndroid Build Coastguard Worker       LengthPrefixedArray<ArtMethod>* const new_methods = klass->GetMethodsPtr();
8288*795d594fSAndroid Build Coastguard Worker       if (new_methods != nullptr) {
8289*795d594fSAndroid Build Coastguard Worker         DCHECK_NE(new_methods->size(), 0u);
8290*795d594fSAndroid Build Coastguard Worker         imt_methods_begin =
8291*795d594fSAndroid Build Coastguard Worker             reinterpret_cast<uintptr_t>(&new_methods->At(0, kMethodSize, kMethodAlignment));
8292*795d594fSAndroid Build Coastguard Worker         imt_methods_size = new_methods->size() * kMethodSize;
8293*795d594fSAndroid Build Coastguard Worker       }
8294*795d594fSAndroid Build Coastguard Worker     }
8295*795d594fSAndroid Build Coastguard Worker   }
8296*795d594fSAndroid Build Coastguard Worker 
8297*795d594fSAndroid Build Coastguard Worker   auto update_imt = [=](ObjPtr<mirror::Class> iface, size_t j, ArtMethod* implementation)
8298*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
8299*795d594fSAndroid Build Coastguard Worker     // Place method in imt if entry is empty, place conflict otherwise.
8300*795d594fSAndroid Build Coastguard Worker     ArtMethod** imt_ptr = &out_imt[iface->GetVirtualMethod(j, kPointerSize)->GetImtIndex()];
8301*795d594fSAndroid Build Coastguard Worker     class_linker->SetIMTRef(unimplemented_method,
8302*795d594fSAndroid Build Coastguard Worker                             imt_conflict_method,
8303*795d594fSAndroid Build Coastguard Worker                             implementation,
8304*795d594fSAndroid Build Coastguard Worker                             /*out*/out_new_conflict,
8305*795d594fSAndroid Build Coastguard Worker                             /*out*/imt_ptr);
8306*795d594fSAndroid Build Coastguard Worker   };
8307*795d594fSAndroid Build Coastguard Worker 
8308*795d594fSAndroid Build Coastguard Worker   // For interfaces inherited from superclass, the new method arrays are empty,
8309*795d594fSAndroid Build Coastguard Worker   // so use vtable indexes from implementation methods from the superclass method array.
8310*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i != super_ifcount; ++i) {
8311*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::PointerArray> method_array = iftable->GetMethodArrayOrNull(i);
8312*795d594fSAndroid Build Coastguard Worker     DCHECK(method_array == klass->GetSuperClass()->GetIfTable()->GetMethodArrayOrNull(i));
8313*795d594fSAndroid Build Coastguard Worker     if (method_array == nullptr) {
8314*795d594fSAndroid Build Coastguard Worker       continue;
8315*795d594fSAndroid Build Coastguard Worker     }
8316*795d594fSAndroid Build Coastguard Worker     size_t num_methods = method_array->GetLength();
8317*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> iface = iftable->GetInterface(i);
8318*795d594fSAndroid Build Coastguard Worker     size_t j = 0;
8319*795d594fSAndroid Build Coastguard Worker     // First loop has method array shared with the super class.
8320*795d594fSAndroid Build Coastguard Worker     for (; j != num_methods; ++j) {
8321*795d594fSAndroid Build Coastguard Worker       ArtMethod* super_implementation =
8322*795d594fSAndroid Build Coastguard Worker           method_array->GetElementPtrSize<ArtMethod*, kPointerSize>(j);
8323*795d594fSAndroid Build Coastguard Worker       size_t vtable_index = super_implementation->GetMethodIndex();
8324*795d594fSAndroid Build Coastguard Worker       ArtMethod* implementation =
8325*795d594fSAndroid Build Coastguard Worker           vtable->GetElementPtrSize<ArtMethod*, kPointerSize>(vtable_index);
8326*795d594fSAndroid Build Coastguard Worker       // Check if we need to update IMT with this method, see above.
8327*795d594fSAndroid Build Coastguard Worker       if (reinterpret_cast<uintptr_t>(implementation) - imt_methods_begin < imt_methods_size) {
8328*795d594fSAndroid Build Coastguard Worker         update_imt(iface, j, implementation);
8329*795d594fSAndroid Build Coastguard Worker       }
8330*795d594fSAndroid Build Coastguard Worker       if (implementation != super_implementation) {
8331*795d594fSAndroid Build Coastguard Worker         // Copy-on-write and move to the next loop.
8332*795d594fSAndroid Build Coastguard Worker         Thread* self = self_;
8333*795d594fSAndroid Build Coastguard Worker         StackHandleScope<2u> hs(self);
8334*795d594fSAndroid Build Coastguard Worker         Handle<mirror::PointerArray> old_method_array = hs.NewHandle(method_array);
8335*795d594fSAndroid Build Coastguard Worker         HandleWrapperObjPtr<mirror::Class> h_iface = hs.NewHandleWrapper(&iface);
8336*795d594fSAndroid Build Coastguard Worker         if (ifcount == super_ifcount && iftable.Get() == klass->GetSuperClass()->GetIfTable()) {
8337*795d594fSAndroid Build Coastguard Worker           ObjPtr<mirror::IfTable> new_iftable = ObjPtr<mirror::IfTable>::DownCast(
8338*795d594fSAndroid Build Coastguard Worker               mirror::ObjectArray<mirror::Object>::CopyOf(
8339*795d594fSAndroid Build Coastguard Worker                   iftable, self, ifcount * mirror::IfTable::kMax));
8340*795d594fSAndroid Build Coastguard Worker           if (new_iftable == nullptr) {
8341*795d594fSAndroid Build Coastguard Worker             return false;
8342*795d594fSAndroid Build Coastguard Worker           }
8343*795d594fSAndroid Build Coastguard Worker           iftable.Assign(new_iftable);
8344*795d594fSAndroid Build Coastguard Worker         }
8345*795d594fSAndroid Build Coastguard Worker         method_array = ObjPtr<mirror::PointerArray>::DownCast(
8346*795d594fSAndroid Build Coastguard Worker             mirror::Array::CopyOf(old_method_array, self, num_methods));
8347*795d594fSAndroid Build Coastguard Worker         if (method_array == nullptr) {
8348*795d594fSAndroid Build Coastguard Worker           return false;
8349*795d594fSAndroid Build Coastguard Worker         }
8350*795d594fSAndroid Build Coastguard Worker         iftable->SetMethodArray(i, method_array);
8351*795d594fSAndroid Build Coastguard Worker         method_array->SetElementPtrSize(j, implementation, kPointerSize);
8352*795d594fSAndroid Build Coastguard Worker         ++j;
8353*795d594fSAndroid Build Coastguard Worker         break;
8354*795d594fSAndroid Build Coastguard Worker       }
8355*795d594fSAndroid Build Coastguard Worker     }
8356*795d594fSAndroid Build Coastguard Worker     // Second loop (if non-empty) has method array different from the superclass.
8357*795d594fSAndroid Build Coastguard Worker     for (; j != num_methods; ++j) {
8358*795d594fSAndroid Build Coastguard Worker       ArtMethod* super_implementation =
8359*795d594fSAndroid Build Coastguard Worker           method_array->GetElementPtrSize<ArtMethod*, kPointerSize>(j);
8360*795d594fSAndroid Build Coastguard Worker       size_t vtable_index = super_implementation->GetMethodIndex();
8361*795d594fSAndroid Build Coastguard Worker       ArtMethod* implementation =
8362*795d594fSAndroid Build Coastguard Worker           vtable->GetElementPtrSize<ArtMethod*, kPointerSize>(vtable_index);
8363*795d594fSAndroid Build Coastguard Worker       method_array->SetElementPtrSize(j, implementation, kPointerSize);
8364*795d594fSAndroid Build Coastguard Worker       // Check if we need to update IMT with this method, see above.
8365*795d594fSAndroid Build Coastguard Worker       if (reinterpret_cast<uintptr_t>(implementation) - imt_methods_begin < imt_methods_size) {
8366*795d594fSAndroid Build Coastguard Worker         update_imt(iface, j, implementation);
8367*795d594fSAndroid Build Coastguard Worker       }
8368*795d594fSAndroid Build Coastguard Worker     }
8369*795d594fSAndroid Build Coastguard Worker   }
8370*795d594fSAndroid Build Coastguard Worker 
8371*795d594fSAndroid Build Coastguard Worker   // New interface method arrays contain vtable indexes. Translate them to methods.
8372*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(klass->ShouldHaveImt(), !is_klass_abstract);
8373*795d594fSAndroid Build Coastguard Worker   for (size_t i = super_ifcount; i != ifcount; ++i) {
8374*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::PointerArray> method_array = iftable->GetMethodArrayOrNull(i);
8375*795d594fSAndroid Build Coastguard Worker     if (method_array == nullptr) {
8376*795d594fSAndroid Build Coastguard Worker       continue;
8377*795d594fSAndroid Build Coastguard Worker     }
8378*795d594fSAndroid Build Coastguard Worker     size_t num_methods = method_array->GetLength();
8379*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> iface = iftable->GetInterface(i);
8380*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j != num_methods; ++j) {
8381*795d594fSAndroid Build Coastguard Worker       size_t vtable_index = method_array->GetElementPtrSize<size_t, kPointerSize>(j);
8382*795d594fSAndroid Build Coastguard Worker       ArtMethod* implementation =
8383*795d594fSAndroid Build Coastguard Worker           vtable->GetElementPtrSize<ArtMethod*, kPointerSize>(vtable_index);
8384*795d594fSAndroid Build Coastguard Worker       method_array->SetElementPtrSize(j, implementation, kPointerSize);
8385*795d594fSAndroid Build Coastguard Worker       if (!is_klass_abstract) {
8386*795d594fSAndroid Build Coastguard Worker         update_imt(iface, j, implementation);
8387*795d594fSAndroid Build Coastguard Worker       }
8388*795d594fSAndroid Build Coastguard Worker     }
8389*795d594fSAndroid Build Coastguard Worker   }
8390*795d594fSAndroid Build Coastguard Worker 
8391*795d594fSAndroid Build Coastguard Worker   return true;
8392*795d594fSAndroid Build Coastguard Worker }
8393*795d594fSAndroid Build Coastguard Worker 
8394*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
AllocPointerArray(Thread * self,size_t length)8395*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::PointerArray> ClassLinker::LinkMethodsHelper<kPointerSize>::AllocPointerArray(
8396*795d594fSAndroid Build Coastguard Worker     Thread* self, size_t length) {
8397*795d594fSAndroid Build Coastguard Worker   using PointerArrayType = std::conditional_t<
8398*795d594fSAndroid Build Coastguard Worker       kPointerSize == PointerSize::k64, mirror::LongArray, mirror::IntArray>;
8399*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Array> array = PointerArrayType::Alloc(self, length);
8400*795d594fSAndroid Build Coastguard Worker   return ObjPtr<mirror::PointerArray>::DownCast(array);
8401*795d594fSAndroid Build Coastguard Worker }
8402*795d594fSAndroid Build Coastguard Worker 
8403*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
AllocateIfTableMethodArrays(Thread * self,Handle<mirror::Class> klass,Handle<mirror::IfTable> iftable)8404*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkMethodsHelper<kPointerSize>::AllocateIfTableMethodArrays(
8405*795d594fSAndroid Build Coastguard Worker     Thread* self,
8406*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> klass,
8407*795d594fSAndroid Build Coastguard Worker     Handle<mirror::IfTable> iftable) {
8408*795d594fSAndroid Build Coastguard Worker   DCHECK(!klass->IsInterface());
8409*795d594fSAndroid Build Coastguard Worker   DCHECK(klass_->HasSuperClass());
8410*795d594fSAndroid Build Coastguard Worker   const size_t ifcount = iftable->Count();
8411*795d594fSAndroid Build Coastguard Worker   // We do not need a read barrier here as the length is constant, both from-space and
8412*795d594fSAndroid Build Coastguard Worker   // to-space `IfTable`s shall yield the same result. See also `Class::GetIfTableCount()`.
8413*795d594fSAndroid Build Coastguard Worker   size_t super_ifcount =
8414*795d594fSAndroid Build Coastguard Worker       klass->GetSuperClass<kDefaultVerifyFlags, kWithoutReadBarrier>()->GetIfTableCount();
8415*795d594fSAndroid Build Coastguard Worker   if (ifcount == super_ifcount) {
8416*795d594fSAndroid Build Coastguard Worker     DCHECK(iftable.Get() == klass_->GetSuperClass()->GetIfTable());
8417*795d594fSAndroid Build Coastguard Worker     return true;
8418*795d594fSAndroid Build Coastguard Worker   }
8419*795d594fSAndroid Build Coastguard Worker 
8420*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
8421*795d594fSAndroid Build Coastguard Worker     // The method array references for superclass interfaces have been copied.
8422*795d594fSAndroid Build Coastguard Worker     // We shall allocate new arrays if needed (copy-on-write) in `FinalizeIfTable()`.
8423*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::IfTable> super_iftable = klass_->GetSuperClass()->GetIfTable();
8424*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i != super_ifcount; ++i) {
8425*795d594fSAndroid Build Coastguard Worker       CHECK(iftable->GetInterface(i) == super_iftable->GetInterface(i));
8426*795d594fSAndroid Build Coastguard Worker       CHECK(iftable->GetMethodArrayOrNull(i) == super_iftable->GetMethodArrayOrNull(i));
8427*795d594fSAndroid Build Coastguard Worker     }
8428*795d594fSAndroid Build Coastguard Worker   }
8429*795d594fSAndroid Build Coastguard Worker 
8430*795d594fSAndroid Build Coastguard Worker   for (size_t i = super_ifcount; i < ifcount; ++i) {
8431*795d594fSAndroid Build Coastguard Worker     size_t num_methods = iftable->GetInterface(i)->NumDeclaredVirtualMethods();
8432*795d594fSAndroid Build Coastguard Worker     if (num_methods > 0) {
8433*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::PointerArray> method_array = AllocPointerArray(self, num_methods);
8434*795d594fSAndroid Build Coastguard Worker       if (UNLIKELY(method_array == nullptr)) {
8435*795d594fSAndroid Build Coastguard Worker         self->AssertPendingOOMException();
8436*795d594fSAndroid Build Coastguard Worker         return false;
8437*795d594fSAndroid Build Coastguard Worker       }
8438*795d594fSAndroid Build Coastguard Worker       iftable->SetMethodArray(i, method_array);
8439*795d594fSAndroid Build Coastguard Worker     }
8440*795d594fSAndroid Build Coastguard Worker   }
8441*795d594fSAndroid Build Coastguard Worker   return true;
8442*795d594fSAndroid Build Coastguard Worker }
8443*795d594fSAndroid Build Coastguard Worker 
8444*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
AssignVTableIndexes(ObjPtr<mirror::Class> klass,ObjPtr<mirror::Class> super_class,bool is_super_abstract,size_t num_virtual_methods,ObjPtr<mirror::IfTable> iftable)8445*795d594fSAndroid Build Coastguard Worker size_t ClassLinker::LinkMethodsHelper<kPointerSize>::AssignVTableIndexes(
8446*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass,
8447*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> super_class,
8448*795d594fSAndroid Build Coastguard Worker     bool is_super_abstract,
8449*795d594fSAndroid Build Coastguard Worker     size_t num_virtual_methods,
8450*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::IfTable> iftable) {
8451*795d594fSAndroid Build Coastguard Worker   DCHECK(!klass->IsInterface());
8452*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->HasSuperClass());
8453*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->GetSuperClass() == super_class);
8454*795d594fSAndroid Build Coastguard Worker 
8455*795d594fSAndroid Build Coastguard Worker   // There should be no thread suspension unless we want to throw an exception.
8456*795d594fSAndroid Build Coastguard Worker   // (We are using `ObjPtr<>` and raw vtable pointers that are invalidated by thread suspension.)
8457*795d594fSAndroid Build Coastguard Worker   std::optional<ScopedAssertNoThreadSuspension> sants(__FUNCTION__);
8458*795d594fSAndroid Build Coastguard Worker 
8459*795d594fSAndroid Build Coastguard Worker   // Prepare a hash table with virtual methods from the superclass.
8460*795d594fSAndroid Build Coastguard Worker   // For the unlikely cases that there are multiple methods with the same signature
8461*795d594fSAndroid Build Coastguard Worker   // but different vtable indexes, keep an array with indexes of the previous
8462*795d594fSAndroid Build Coastguard Worker   // methods with the same signature (walked as singly-linked lists).
8463*795d594fSAndroid Build Coastguard Worker   uint8_t* raw_super_vtable;
8464*795d594fSAndroid Build Coastguard Worker   size_t super_vtable_length;
8465*795d594fSAndroid Build Coastguard Worker   if (is_super_abstract) {
8466*795d594fSAndroid Build Coastguard Worker     DCHECK(!super_class->ShouldHaveEmbeddedVTable());
8467*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::PointerArray> super_vtable = super_class->GetVTableDuringLinking();
8468*795d594fSAndroid Build Coastguard Worker     DCHECK(super_vtable != nullptr);
8469*795d594fSAndroid Build Coastguard Worker     raw_super_vtable = reinterpret_cast<uint8_t*>(super_vtable.Ptr()) +
8470*795d594fSAndroid Build Coastguard Worker                        mirror::Array::DataOffset(static_cast<size_t>(kPointerSize)).Uint32Value();
8471*795d594fSAndroid Build Coastguard Worker     super_vtable_length = super_vtable->GetLength();
8472*795d594fSAndroid Build Coastguard Worker   } else {
8473*795d594fSAndroid Build Coastguard Worker     DCHECK(super_class->ShouldHaveEmbeddedVTable());
8474*795d594fSAndroid Build Coastguard Worker     raw_super_vtable = reinterpret_cast<uint8_t*>(super_class.Ptr()) +
8475*795d594fSAndroid Build Coastguard Worker                        mirror::Class::EmbeddedVTableOffset(kPointerSize).Uint32Value();
8476*795d594fSAndroid Build Coastguard Worker     super_vtable_length = super_class->GetEmbeddedVTableLength();
8477*795d594fSAndroid Build Coastguard Worker   }
8478*795d594fSAndroid Build Coastguard Worker   VTableAccessor super_vtable_accessor(raw_super_vtable, super_vtable_length);
8479*795d594fSAndroid Build Coastguard Worker   static constexpr double kMinLoadFactor = 0.3;
8480*795d594fSAndroid Build Coastguard Worker   static constexpr double kMaxLoadFactor = 0.5;
8481*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kMaxStackBuferSize = 256;
8482*795d594fSAndroid Build Coastguard Worker   const size_t declared_virtuals_buffer_size = num_virtual_methods * 3;
8483*795d594fSAndroid Build Coastguard Worker   const size_t super_vtable_buffer_size = super_vtable_length * 3;
8484*795d594fSAndroid Build Coastguard Worker   const size_t bit_vector_size = BitVector::BitsToWords(num_virtual_methods);
8485*795d594fSAndroid Build Coastguard Worker   const size_t total_size =
8486*795d594fSAndroid Build Coastguard Worker       declared_virtuals_buffer_size + super_vtable_buffer_size + bit_vector_size;
8487*795d594fSAndroid Build Coastguard Worker 
8488*795d594fSAndroid Build Coastguard Worker   uint32_t* declared_virtuals_buffer_ptr = (total_size <= kMaxStackBuferSize)
8489*795d594fSAndroid Build Coastguard Worker       ? reinterpret_cast<uint32_t*>(alloca(total_size * sizeof(uint32_t)))
8490*795d594fSAndroid Build Coastguard Worker       : allocator_.AllocArray<uint32_t>(total_size);
8491*795d594fSAndroid Build Coastguard Worker   uint32_t* bit_vector_buffer_ptr = declared_virtuals_buffer_ptr + declared_virtuals_buffer_size;
8492*795d594fSAndroid Build Coastguard Worker 
8493*795d594fSAndroid Build Coastguard Worker   DeclaredVirtualSignatureSet declared_virtual_signatures(
8494*795d594fSAndroid Build Coastguard Worker       kMinLoadFactor,
8495*795d594fSAndroid Build Coastguard Worker       kMaxLoadFactor,
8496*795d594fSAndroid Build Coastguard Worker       DeclaredVirtualSignatureHash(klass),
8497*795d594fSAndroid Build Coastguard Worker       DeclaredVirtualSignatureEqual(klass),
8498*795d594fSAndroid Build Coastguard Worker       declared_virtuals_buffer_ptr,
8499*795d594fSAndroid Build Coastguard Worker       declared_virtuals_buffer_size,
8500*795d594fSAndroid Build Coastguard Worker       allocator_.Adapter());
8501*795d594fSAndroid Build Coastguard Worker 
8502*795d594fSAndroid Build Coastguard Worker   ArrayRef<uint32_t> same_signature_vtable_lists;
8503*795d594fSAndroid Build Coastguard Worker   const bool is_proxy_class = klass->IsProxyClass();
8504*795d594fSAndroid Build Coastguard Worker   size_t vtable_length = super_vtable_length;
8505*795d594fSAndroid Build Coastguard Worker 
8506*795d594fSAndroid Build Coastguard Worker   // Record which declared methods are overriding a super method.
8507*795d594fSAndroid Build Coastguard Worker   BitVector initialized_methods(/* expandable= */ false,
8508*795d594fSAndroid Build Coastguard Worker                                 Allocator::GetNoopAllocator(),
8509*795d594fSAndroid Build Coastguard Worker                                 bit_vector_size,
8510*795d594fSAndroid Build Coastguard Worker                                 bit_vector_buffer_ptr);
8511*795d594fSAndroid Build Coastguard Worker 
8512*795d594fSAndroid Build Coastguard Worker   // Note: our sets hash on the method name, and therefore we pay a high
8513*795d594fSAndroid Build Coastguard Worker   // performance price when a class has many overloads.
8514*795d594fSAndroid Build Coastguard Worker   //
8515*795d594fSAndroid Build Coastguard Worker   // We populate a set of declared signatures instead of signatures from the
8516*795d594fSAndroid Build Coastguard Worker   // super vtable (which is only lazy populated in case of interface overriding,
8517*795d594fSAndroid Build Coastguard Worker   // see below). This makes sure that we pay the performance price only on that
8518*795d594fSAndroid Build Coastguard Worker   // class, and not on its subclasses (except in the case of interface overriding, see below).
8519*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i != num_virtual_methods; ++i) {
8520*795d594fSAndroid Build Coastguard Worker     ArtMethod* virtual_method = klass->GetVirtualMethodDuringLinking(i, kPointerSize);
8521*795d594fSAndroid Build Coastguard Worker     DCHECK(!virtual_method->IsStatic()) << virtual_method->PrettyMethod();
8522*795d594fSAndroid Build Coastguard Worker     ArtMethod* signature_method = UNLIKELY(is_proxy_class)
8523*795d594fSAndroid Build Coastguard Worker         ? virtual_method->GetInterfaceMethodForProxyUnchecked(kPointerSize)
8524*795d594fSAndroid Build Coastguard Worker         : virtual_method;
8525*795d594fSAndroid Build Coastguard Worker     size_t hash = ComputeMethodHash(signature_method);
8526*795d594fSAndroid Build Coastguard Worker     declared_virtual_signatures.PutWithHash(i, hash);
8527*795d594fSAndroid Build Coastguard Worker   }
8528*795d594fSAndroid Build Coastguard Worker 
8529*795d594fSAndroid Build Coastguard Worker   // Loop through each super vtable method and see if they are overridden by a method we added to
8530*795d594fSAndroid Build Coastguard Worker   // the hash table.
8531*795d594fSAndroid Build Coastguard Worker   for (size_t j = 0; j < super_vtable_length; ++j) {
8532*795d594fSAndroid Build Coastguard Worker     // Search the hash table to see if we are overridden by any method.
8533*795d594fSAndroid Build Coastguard Worker     ArtMethod* super_method = super_vtable_accessor.GetVTableEntry(j);
8534*795d594fSAndroid Build Coastguard Worker     if (!klass->CanAccessMember(super_method->GetDeclaringClass(),
8535*795d594fSAndroid Build Coastguard Worker                                 super_method->GetAccessFlags())) {
8536*795d594fSAndroid Build Coastguard Worker       // Continue on to the next method since this one is package private and cannot be overridden.
8537*795d594fSAndroid Build Coastguard Worker       // Before Android 4.1, the package-private method super_method might have been incorrectly
8538*795d594fSAndroid Build Coastguard Worker       // overridden.
8539*795d594fSAndroid Build Coastguard Worker       continue;
8540*795d594fSAndroid Build Coastguard Worker     }
8541*795d594fSAndroid Build Coastguard Worker     size_t hash = (j < mirror::Object::kVTableLength)
8542*795d594fSAndroid Build Coastguard Worker         ? class_linker_->object_virtual_method_hashes_[j]
8543*795d594fSAndroid Build Coastguard Worker         : ComputeMethodHash(super_method);
8544*795d594fSAndroid Build Coastguard Worker     auto it = declared_virtual_signatures.FindWithHash(super_method, hash);
8545*795d594fSAndroid Build Coastguard Worker     if (it == declared_virtual_signatures.end()) {
8546*795d594fSAndroid Build Coastguard Worker       continue;
8547*795d594fSAndroid Build Coastguard Worker     }
8548*795d594fSAndroid Build Coastguard Worker     ArtMethod* virtual_method = klass->GetVirtualMethodDuringLinking(*it, kPointerSize);
8549*795d594fSAndroid Build Coastguard Worker     if (super_method->IsFinal()) {
8550*795d594fSAndroid Build Coastguard Worker       sants.reset();
8551*795d594fSAndroid Build Coastguard Worker       ThrowLinkageError(klass, "Method %s overrides final method in class %s",
8552*795d594fSAndroid Build Coastguard Worker                         virtual_method->PrettyMethod().c_str(),
8553*795d594fSAndroid Build Coastguard Worker                         super_method->GetDeclaringClassDescriptor());
8554*795d594fSAndroid Build Coastguard Worker       return 0u;
8555*795d594fSAndroid Build Coastguard Worker     }
8556*795d594fSAndroid Build Coastguard Worker     if (initialized_methods.IsBitSet(*it)) {
8557*795d594fSAndroid Build Coastguard Worker       // The method is overriding more than one method.
8558*795d594fSAndroid Build Coastguard Worker       // We record that information in a linked list to later set the method in the vtable
8559*795d594fSAndroid Build Coastguard Worker       // locations that are not the method index.
8560*795d594fSAndroid Build Coastguard Worker       if (same_signature_vtable_lists.empty()) {
8561*795d594fSAndroid Build Coastguard Worker         same_signature_vtable_lists = ArrayRef<uint32_t>(
8562*795d594fSAndroid Build Coastguard Worker             allocator_.AllocArray<uint32_t>(super_vtable_length), super_vtable_length);
8563*795d594fSAndroid Build Coastguard Worker         std::fill_n(same_signature_vtable_lists.data(), super_vtable_length, dex::kDexNoIndex);
8564*795d594fSAndroid Build Coastguard Worker         same_signature_vtable_lists_ = same_signature_vtable_lists;
8565*795d594fSAndroid Build Coastguard Worker       }
8566*795d594fSAndroid Build Coastguard Worker       same_signature_vtable_lists[j] = virtual_method->GetMethodIndexDuringLinking();
8567*795d594fSAndroid Build Coastguard Worker     } else {
8568*795d594fSAndroid Build Coastguard Worker       initialized_methods.SetBit(*it);
8569*795d594fSAndroid Build Coastguard Worker     }
8570*795d594fSAndroid Build Coastguard Worker 
8571*795d594fSAndroid Build Coastguard Worker     // We arbitrarily set to the largest index. This is also expected when
8572*795d594fSAndroid Build Coastguard Worker     // iterating over the `same_signature_vtable_lists_`.
8573*795d594fSAndroid Build Coastguard Worker     virtual_method->SetMethodIndex(j);
8574*795d594fSAndroid Build Coastguard Worker   }
8575*795d594fSAndroid Build Coastguard Worker 
8576*795d594fSAndroid Build Coastguard Worker   // Add the non-overridden methods at the end.
8577*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < num_virtual_methods; ++i) {
8578*795d594fSAndroid Build Coastguard Worker     if (!initialized_methods.IsBitSet(i)) {
8579*795d594fSAndroid Build Coastguard Worker       ArtMethod* local_method = klass->GetVirtualMethodDuringLinking(i, kPointerSize);
8580*795d594fSAndroid Build Coastguard Worker       local_method->SetMethodIndex(vtable_length);
8581*795d594fSAndroid Build Coastguard Worker       vtable_length++;
8582*795d594fSAndroid Build Coastguard Worker     }
8583*795d594fSAndroid Build Coastguard Worker   }
8584*795d594fSAndroid Build Coastguard Worker 
8585*795d594fSAndroid Build Coastguard Worker   // A lazily constructed super vtable set, which we only populate in the less
8586*795d594fSAndroid Build Coastguard Worker   // common sittuation of a superclass implementing a method declared in an
8587*795d594fSAndroid Build Coastguard Worker   // interface this class inherits.
8588*795d594fSAndroid Build Coastguard Worker   // We still try to allocate the set on the stack as using the arena will have
8589*795d594fSAndroid Build Coastguard Worker   // a larger cost.
8590*795d594fSAndroid Build Coastguard Worker   uint32_t* super_vtable_buffer_ptr = bit_vector_buffer_ptr + bit_vector_size;
8591*795d594fSAndroid Build Coastguard Worker   VTableSignatureSet super_vtable_signatures(
8592*795d594fSAndroid Build Coastguard Worker       kMinLoadFactor,
8593*795d594fSAndroid Build Coastguard Worker       kMaxLoadFactor,
8594*795d594fSAndroid Build Coastguard Worker       VTableSignatureHash(super_vtable_accessor),
8595*795d594fSAndroid Build Coastguard Worker       VTableSignatureEqual(super_vtable_accessor),
8596*795d594fSAndroid Build Coastguard Worker       super_vtable_buffer_ptr,
8597*795d594fSAndroid Build Coastguard Worker       super_vtable_buffer_size,
8598*795d594fSAndroid Build Coastguard Worker       allocator_.Adapter());
8599*795d594fSAndroid Build Coastguard Worker 
8600*795d594fSAndroid Build Coastguard Worker   // Assign vtable indexes for interface methods in new interfaces and store them
8601*795d594fSAndroid Build Coastguard Worker   // in implementation method arrays. These shall be replaced by actual method
8602*795d594fSAndroid Build Coastguard Worker   // pointers later. We do not need to do this for superclass interfaces as we can
8603*795d594fSAndroid Build Coastguard Worker   // get these vtable indexes from implementation methods in superclass iftable.
8604*795d594fSAndroid Build Coastguard Worker   // Record data for copied methods which shall be referenced by the vtable.
8605*795d594fSAndroid Build Coastguard Worker   const size_t ifcount = iftable->Count();
8606*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::IfTable> super_iftable = super_class->GetIfTable();
8607*795d594fSAndroid Build Coastguard Worker   const size_t super_ifcount = super_iftable->Count();
8608*795d594fSAndroid Build Coastguard Worker   for (size_t i = ifcount; i != super_ifcount; ) {
8609*795d594fSAndroid Build Coastguard Worker     --i;
8610*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(i, ifcount);
8611*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> iface = iftable->GetInterface(i);
8612*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::PointerArray> method_array = iftable->GetMethodArrayOrNull(i);
8613*795d594fSAndroid Build Coastguard Worker     size_t num_methods = (method_array != nullptr) ? method_array->GetLength() : 0u;
8614*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j != num_methods; ++j) {
8615*795d594fSAndroid Build Coastguard Worker       ArtMethod* interface_method = iface->GetVirtualMethod(j, kPointerSize);
8616*795d594fSAndroid Build Coastguard Worker       size_t hash = ComputeMethodHash(interface_method);
8617*795d594fSAndroid Build Coastguard Worker       ArtMethod* vtable_method = nullptr;
8618*795d594fSAndroid Build Coastguard Worker       auto it1 = declared_virtual_signatures.FindWithHash(interface_method, hash);
8619*795d594fSAndroid Build Coastguard Worker       if (it1 != declared_virtual_signatures.end()) {
8620*795d594fSAndroid Build Coastguard Worker         ArtMethod* found_method = klass->GetVirtualMethodDuringLinking(*it1, kPointerSize);
8621*795d594fSAndroid Build Coastguard Worker         // For interface overriding, we only look at public methods.
8622*795d594fSAndroid Build Coastguard Worker         if (found_method->IsPublic()) {
8623*795d594fSAndroid Build Coastguard Worker           vtable_method = found_method;
8624*795d594fSAndroid Build Coastguard Worker         }
8625*795d594fSAndroid Build Coastguard Worker       } else {
8626*795d594fSAndroid Build Coastguard Worker         // This situation should be rare (a superclass implements a method
8627*795d594fSAndroid Build Coastguard Worker         // declared in an interface this class is inheriting). Only in this case
8628*795d594fSAndroid Build Coastguard Worker         // do we lazily populate the super_vtable_signatures.
8629*795d594fSAndroid Build Coastguard Worker         if (super_vtable_signatures.empty()) {
8630*795d594fSAndroid Build Coastguard Worker           for (size_t k = 0; k < super_vtable_length; ++k) {
8631*795d594fSAndroid Build Coastguard Worker             ArtMethod* super_method = super_vtable_accessor.GetVTableEntry(k);
8632*795d594fSAndroid Build Coastguard Worker             if (!super_method->IsPublic()) {
8633*795d594fSAndroid Build Coastguard Worker               // For interface overriding, we only look at public methods.
8634*795d594fSAndroid Build Coastguard Worker               continue;
8635*795d594fSAndroid Build Coastguard Worker             }
8636*795d594fSAndroid Build Coastguard Worker             size_t super_hash = (k < mirror::Object::kVTableLength)
8637*795d594fSAndroid Build Coastguard Worker                 ? class_linker_->object_virtual_method_hashes_[k]
8638*795d594fSAndroid Build Coastguard Worker                 : ComputeMethodHash(super_method);
8639*795d594fSAndroid Build Coastguard Worker             auto [it, inserted] = super_vtable_signatures.InsertWithHash(k, super_hash);
8640*795d594fSAndroid Build Coastguard Worker             DCHECK(inserted || super_vtable_accessor.GetVTableEntry(*it) == super_method);
8641*795d594fSAndroid Build Coastguard Worker           }
8642*795d594fSAndroid Build Coastguard Worker         }
8643*795d594fSAndroid Build Coastguard Worker         auto it2 = super_vtable_signatures.FindWithHash(interface_method, hash);
8644*795d594fSAndroid Build Coastguard Worker         if (it2 != super_vtable_signatures.end()) {
8645*795d594fSAndroid Build Coastguard Worker           vtable_method = super_vtable_accessor.GetVTableEntry(*it2);
8646*795d594fSAndroid Build Coastguard Worker         }
8647*795d594fSAndroid Build Coastguard Worker       }
8648*795d594fSAndroid Build Coastguard Worker 
8649*795d594fSAndroid Build Coastguard Worker       uint32_t vtable_index = vtable_length;
8650*795d594fSAndroid Build Coastguard Worker       if (vtable_method != nullptr) {
8651*795d594fSAndroid Build Coastguard Worker         vtable_index = vtable_method->GetMethodIndexDuringLinking();
8652*795d594fSAndroid Build Coastguard Worker         if (!vtable_method->IsOverridableByDefaultMethod()) {
8653*795d594fSAndroid Build Coastguard Worker           method_array->SetElementPtrSize(j, vtable_index, kPointerSize);
8654*795d594fSAndroid Build Coastguard Worker           continue;
8655*795d594fSAndroid Build Coastguard Worker         }
8656*795d594fSAndroid Build Coastguard Worker       }
8657*795d594fSAndroid Build Coastguard Worker 
8658*795d594fSAndroid Build Coastguard Worker       auto [it, inserted] = copied_method_records_.InsertWithHash(
8659*795d594fSAndroid Build Coastguard Worker           CopiedMethodRecord(interface_method, vtable_index), hash);
8660*795d594fSAndroid Build Coastguard Worker       if (vtable_method != nullptr) {
8661*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(vtable_index, it->GetMethodIndex());
8662*795d594fSAndroid Build Coastguard Worker       } else if (inserted) {
8663*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(vtable_index, it->GetMethodIndex());
8664*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(vtable_index, vtable_length);
8665*795d594fSAndroid Build Coastguard Worker         ++vtable_length;
8666*795d594fSAndroid Build Coastguard Worker       } else {
8667*795d594fSAndroid Build Coastguard Worker         vtable_index = it->GetMethodIndex();
8668*795d594fSAndroid Build Coastguard Worker       }
8669*795d594fSAndroid Build Coastguard Worker       method_array->SetElementPtrSize(j, it->GetMethodIndex(), kPointerSize);
8670*795d594fSAndroid Build Coastguard Worker       if (inserted) {
8671*795d594fSAndroid Build Coastguard Worker         it->SetState(interface_method->IsAbstract() ? CopiedMethodRecord::State::kAbstractSingle
8672*795d594fSAndroid Build Coastguard Worker                                                     : CopiedMethodRecord::State::kDefaultSingle);
8673*795d594fSAndroid Build Coastguard Worker       } else {
8674*795d594fSAndroid Build Coastguard Worker         it->UpdateState(iface, interface_method, vtable_index, iftable, ifcount, i);
8675*795d594fSAndroid Build Coastguard Worker       }
8676*795d594fSAndroid Build Coastguard Worker     }
8677*795d594fSAndroid Build Coastguard Worker   }
8678*795d594fSAndroid Build Coastguard Worker   // Finalize copied method records and check if we can reuse some methods from superclass vtable.
8679*795d594fSAndroid Build Coastguard Worker   size_t num_new_copied_methods = copied_method_records_.size();
8680*795d594fSAndroid Build Coastguard Worker   for (CopiedMethodRecord& record : copied_method_records_) {
8681*795d594fSAndroid Build Coastguard Worker     uint32_t vtable_index = record.GetMethodIndex();
8682*795d594fSAndroid Build Coastguard Worker     if (vtable_index < super_vtable_length) {
8683*795d594fSAndroid Build Coastguard Worker       ArtMethod* super_method = super_vtable_accessor.GetVTableEntry(record.GetMethodIndex());
8684*795d594fSAndroid Build Coastguard Worker       DCHECK(super_method->IsOverridableByDefaultMethod());
8685*795d594fSAndroid Build Coastguard Worker       record.FinalizeState(
8686*795d594fSAndroid Build Coastguard Worker           super_method, vtable_index, iftable, ifcount, super_iftable, super_ifcount);
8687*795d594fSAndroid Build Coastguard Worker       if (record.GetState() == CopiedMethodRecord::State::kUseSuperMethod) {
8688*795d594fSAndroid Build Coastguard Worker         --num_new_copied_methods;
8689*795d594fSAndroid Build Coastguard Worker       }
8690*795d594fSAndroid Build Coastguard Worker     }
8691*795d594fSAndroid Build Coastguard Worker   }
8692*795d594fSAndroid Build Coastguard Worker   num_new_copied_methods_ = num_new_copied_methods;
8693*795d594fSAndroid Build Coastguard Worker 
8694*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(!IsUint<16>(vtable_length))) {
8695*795d594fSAndroid Build Coastguard Worker     sants.reset();
8696*795d594fSAndroid Build Coastguard Worker     ThrowClassFormatError(klass, "Too many methods defined on class: %zd", vtable_length);
8697*795d594fSAndroid Build Coastguard Worker     return 0u;
8698*795d594fSAndroid Build Coastguard Worker   }
8699*795d594fSAndroid Build Coastguard Worker 
8700*795d594fSAndroid Build Coastguard Worker   return vtable_length;
8701*795d594fSAndroid Build Coastguard Worker }
8702*795d594fSAndroid Build Coastguard Worker 
8703*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
FindCopiedMethodsForInterface(ObjPtr<mirror::Class> klass,size_t num_virtual_methods,ObjPtr<mirror::IfTable> iftable)8704*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkMethodsHelper<kPointerSize>::FindCopiedMethodsForInterface(
8705*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass,
8706*795d594fSAndroid Build Coastguard Worker     size_t num_virtual_methods,
8707*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::IfTable> iftable) {
8708*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->IsInterface());
8709*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->HasSuperClass());
8710*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->GetSuperClass()->IsObjectClass());
8711*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(klass->GetSuperClass()->GetIfTableCount(), 0);
8712*795d594fSAndroid Build Coastguard Worker 
8713*795d594fSAndroid Build Coastguard Worker   // There should be no thread suspension unless we want to throw an exception.
8714*795d594fSAndroid Build Coastguard Worker   // (We are using `ObjPtr<>`s that are invalidated by thread suspension.)
8715*795d594fSAndroid Build Coastguard Worker   std::optional<ScopedAssertNoThreadSuspension> sants(__FUNCTION__);
8716*795d594fSAndroid Build Coastguard Worker 
8717*795d594fSAndroid Build Coastguard Worker   // Prepare a `HashSet<>` with the declared virtual methods. These mask any methods
8718*795d594fSAndroid Build Coastguard Worker   // from superinterfaces, so we can filter out matching superinterface methods.
8719*795d594fSAndroid Build Coastguard Worker   static constexpr double kMinLoadFactor = 0.3;
8720*795d594fSAndroid Build Coastguard Worker   static constexpr double kMaxLoadFactor = 0.5;
8721*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kMaxStackBuferSize = 256;
8722*795d594fSAndroid Build Coastguard Worker   const size_t declared_virtuals_buffer_size = num_virtual_methods * 3;
8723*795d594fSAndroid Build Coastguard Worker   uint32_t* declared_virtuals_buffer_ptr = (declared_virtuals_buffer_size <= kMaxStackBuferSize)
8724*795d594fSAndroid Build Coastguard Worker       ? reinterpret_cast<uint32_t*>(alloca(declared_virtuals_buffer_size * sizeof(uint32_t)))
8725*795d594fSAndroid Build Coastguard Worker       : allocator_.AllocArray<uint32_t>(declared_virtuals_buffer_size);
8726*795d594fSAndroid Build Coastguard Worker   DeclaredVirtualSignatureSet declared_virtual_signatures(
8727*795d594fSAndroid Build Coastguard Worker       kMinLoadFactor,
8728*795d594fSAndroid Build Coastguard Worker       kMaxLoadFactor,
8729*795d594fSAndroid Build Coastguard Worker       DeclaredVirtualSignatureHash(klass),
8730*795d594fSAndroid Build Coastguard Worker       DeclaredVirtualSignatureEqual(klass),
8731*795d594fSAndroid Build Coastguard Worker       declared_virtuals_buffer_ptr,
8732*795d594fSAndroid Build Coastguard Worker       declared_virtuals_buffer_size,
8733*795d594fSAndroid Build Coastguard Worker       allocator_.Adapter());
8734*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i != num_virtual_methods; ++i) {
8735*795d594fSAndroid Build Coastguard Worker     ArtMethod* virtual_method = klass->GetVirtualMethodDuringLinking(i, kPointerSize);
8736*795d594fSAndroid Build Coastguard Worker     DCHECK(!virtual_method->IsStatic()) << virtual_method->PrettyMethod();
8737*795d594fSAndroid Build Coastguard Worker     size_t hash = ComputeMethodHash(virtual_method);
8738*795d594fSAndroid Build Coastguard Worker     declared_virtual_signatures.PutWithHash(i, hash);
8739*795d594fSAndroid Build Coastguard Worker   }
8740*795d594fSAndroid Build Coastguard Worker 
8741*795d594fSAndroid Build Coastguard Worker   // We do not create miranda methods for interface classes, so we do not need to track
8742*795d594fSAndroid Build Coastguard Worker   // non-default (abstract) interface methods. The downside is that we cannot use the
8743*795d594fSAndroid Build Coastguard Worker   // optimized code paths with `CopiedMethodRecord::State::kDefaultSingle` and since
8744*795d594fSAndroid Build Coastguard Worker   // we do not fill method arrays for interfaces, the method search actually has to
8745*795d594fSAndroid Build Coastguard Worker   // compare signatures instead of searching for the implementing method.
8746*795d594fSAndroid Build Coastguard Worker   const size_t ifcount = iftable->Count();
8747*795d594fSAndroid Build Coastguard Worker   size_t new_method_index = num_virtual_methods;
8748*795d594fSAndroid Build Coastguard Worker   for (size_t i = ifcount; i != 0u; ) {
8749*795d594fSAndroid Build Coastguard Worker     --i;
8750*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(i, ifcount);
8751*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> iface = iftable->GetInterface(i);
8752*795d594fSAndroid Build Coastguard Worker     if (!iface->HasDefaultMethods()) {
8753*795d594fSAndroid Build Coastguard Worker       continue;  // No default methods to process.
8754*795d594fSAndroid Build Coastguard Worker     }
8755*795d594fSAndroid Build Coastguard Worker     size_t num_methods = iface->NumDeclaredVirtualMethods();
8756*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j != num_methods; ++j) {
8757*795d594fSAndroid Build Coastguard Worker       ArtMethod* interface_method = iface->GetVirtualMethod(j, kPointerSize);
8758*795d594fSAndroid Build Coastguard Worker       if (!interface_method->IsDefault()) {
8759*795d594fSAndroid Build Coastguard Worker         continue;  // Do not process this non-default method.
8760*795d594fSAndroid Build Coastguard Worker       }
8761*795d594fSAndroid Build Coastguard Worker       size_t hash = ComputeMethodHash(interface_method);
8762*795d594fSAndroid Build Coastguard Worker       auto it1 = declared_virtual_signatures.FindWithHash(interface_method, hash);
8763*795d594fSAndroid Build Coastguard Worker       if (it1 != declared_virtual_signatures.end()) {
8764*795d594fSAndroid Build Coastguard Worker         // Virtual methods in interfaces are always public.
8765*795d594fSAndroid Build Coastguard Worker         // This is checked by the `DexFileVerifier`.
8766*795d594fSAndroid Build Coastguard Worker         DCHECK(klass->GetVirtualMethodDuringLinking(*it1, kPointerSize)->IsPublic());
8767*795d594fSAndroid Build Coastguard Worker         continue;  // This default method is masked by a method declared in this interface.
8768*795d594fSAndroid Build Coastguard Worker       }
8769*795d594fSAndroid Build Coastguard Worker 
8770*795d594fSAndroid Build Coastguard Worker       CopiedMethodRecord new_record(interface_method, new_method_index);
8771*795d594fSAndroid Build Coastguard Worker       auto it = copied_method_records_.FindWithHash(new_record, hash);
8772*795d594fSAndroid Build Coastguard Worker       if (it == copied_method_records_.end()) {
8773*795d594fSAndroid Build Coastguard Worker         // Pretend that there is another default method and try to update the state.
8774*795d594fSAndroid Build Coastguard Worker         // If the `interface_method` is not masked, the state shall change to
8775*795d594fSAndroid Build Coastguard Worker         // `kDefaultConflict`; if it is masked, the state remains `kDefault`.
8776*795d594fSAndroid Build Coastguard Worker         new_record.SetState(CopiedMethodRecord::State::kDefault);
8777*795d594fSAndroid Build Coastguard Worker         new_record.UpdateStateForInterface(iface, interface_method, iftable, ifcount, i);
8778*795d594fSAndroid Build Coastguard Worker         if (new_record.GetState() == CopiedMethodRecord::State::kDefaultConflict) {
8779*795d594fSAndroid Build Coastguard Worker           // Insert the new record with the state `kDefault`.
8780*795d594fSAndroid Build Coastguard Worker           new_record.SetState(CopiedMethodRecord::State::kDefault);
8781*795d594fSAndroid Build Coastguard Worker           copied_method_records_.PutWithHash(new_record, hash);
8782*795d594fSAndroid Build Coastguard Worker           DCHECK_EQ(new_method_index, new_record.GetMethodIndex());
8783*795d594fSAndroid Build Coastguard Worker           ++new_method_index;
8784*795d594fSAndroid Build Coastguard Worker         }
8785*795d594fSAndroid Build Coastguard Worker       } else {
8786*795d594fSAndroid Build Coastguard Worker         it->UpdateStateForInterface(iface, interface_method, iftable, ifcount, i);
8787*795d594fSAndroid Build Coastguard Worker       }
8788*795d594fSAndroid Build Coastguard Worker     }
8789*795d594fSAndroid Build Coastguard Worker   }
8790*795d594fSAndroid Build Coastguard Worker 
8791*795d594fSAndroid Build Coastguard Worker   // Prune records without conflict. (Method indexes are updated in `ReallocMethods()`.)
8792*795d594fSAndroid Build Coastguard Worker   // We do not copy normal default methods to subinterfaces, instead we find the
8793*795d594fSAndroid Build Coastguard Worker   // default method with `Class::FindVirtualMethodForInterfaceSuper()` when needed.
8794*795d594fSAndroid Build Coastguard Worker   size_t num_new_copied_methods = copied_method_records_.size();
8795*795d594fSAndroid Build Coastguard Worker   for (CopiedMethodRecord& record : copied_method_records_) {
8796*795d594fSAndroid Build Coastguard Worker     if (record.GetState() != CopiedMethodRecord::State::kDefaultConflict) {
8797*795d594fSAndroid Build Coastguard Worker       DCHECK(record.GetState() == CopiedMethodRecord::State::kDefault);
8798*795d594fSAndroid Build Coastguard Worker       record.SetState(CopiedMethodRecord::State::kUseSuperMethod);
8799*795d594fSAndroid Build Coastguard Worker       --num_new_copied_methods;
8800*795d594fSAndroid Build Coastguard Worker     }
8801*795d594fSAndroid Build Coastguard Worker   }
8802*795d594fSAndroid Build Coastguard Worker   num_new_copied_methods_ = num_new_copied_methods;
8803*795d594fSAndroid Build Coastguard Worker 
8804*795d594fSAndroid Build Coastguard Worker   return true;
8805*795d594fSAndroid Build Coastguard Worker }
8806*795d594fSAndroid Build Coastguard Worker 
8807*795d594fSAndroid Build Coastguard Worker 
8808*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
8809*795d594fSAndroid Build Coastguard Worker FLATTEN
LinkMethods(Thread * self,Handle<mirror::Class> klass,Handle<mirror::ObjectArray<mirror::Class>> interfaces,bool * out_new_conflict,ArtMethod ** out_imt)8810*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkMethodsHelper<kPointerSize>::LinkMethods(
8811*795d594fSAndroid Build Coastguard Worker     Thread* self,
8812*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> klass,
8813*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ObjectArray<mirror::Class>> interfaces,
8814*795d594fSAndroid Build Coastguard Worker     bool* out_new_conflict,
8815*795d594fSAndroid Build Coastguard Worker     ArtMethod** out_imt) {
8816*795d594fSAndroid Build Coastguard Worker   const size_t num_virtual_methods = klass->NumVirtualMethods();
8817*795d594fSAndroid Build Coastguard Worker   if (klass->IsInterface()) {
8818*795d594fSAndroid Build Coastguard Worker     // No vtable.
8819*795d594fSAndroid Build Coastguard Worker     if (!IsUint<16>(num_virtual_methods)) {
8820*795d594fSAndroid Build Coastguard Worker       ThrowClassFormatError(klass.Get(), "Too many methods on interface: %zu", num_virtual_methods);
8821*795d594fSAndroid Build Coastguard Worker       return false;
8822*795d594fSAndroid Build Coastguard Worker     }
8823*795d594fSAndroid Build Coastguard Worker     // Assign each method an interface table index and set the default flag.
8824*795d594fSAndroid Build Coastguard Worker     bool has_defaults = false;
8825*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < num_virtual_methods; ++i) {
8826*795d594fSAndroid Build Coastguard Worker       ArtMethod* m = klass->GetVirtualMethodDuringLinking(i, kPointerSize);
8827*795d594fSAndroid Build Coastguard Worker       m->SetMethodIndex(i);
8828*795d594fSAndroid Build Coastguard Worker       uint32_t access_flags = m->GetAccessFlags();
8829*795d594fSAndroid Build Coastguard Worker       DCHECK(!ArtMethod::IsDefault(access_flags));
8830*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(!ArtMethod::IsAbstract(access_flags), ArtMethod::IsInvokable(access_flags));
8831*795d594fSAndroid Build Coastguard Worker       if (ArtMethod::IsInvokable(access_flags)) {
8832*795d594fSAndroid Build Coastguard Worker         // If the dex file does not support default methods, throw ClassFormatError.
8833*795d594fSAndroid Build Coastguard Worker         // This check is necessary to protect from odd cases, such as native default
8834*795d594fSAndroid Build Coastguard Worker         // methods, that the dex file verifier permits for old dex file versions. b/157170505
8835*795d594fSAndroid Build Coastguard Worker         // FIXME: This should be `if (!m->GetDexFile()->SupportsDefaultMethods())` but we're
8836*795d594fSAndroid Build Coastguard Worker         // currently running CTS tests for default methods with dex file version 035 which
8837*795d594fSAndroid Build Coastguard Worker         // does not support default methods. So, we limit this to native methods. b/157718952
8838*795d594fSAndroid Build Coastguard Worker         if (ArtMethod::IsNative(access_flags)) {
8839*795d594fSAndroid Build Coastguard Worker           DCHECK(!m->GetDexFile()->SupportsDefaultMethods());
8840*795d594fSAndroid Build Coastguard Worker           ThrowClassFormatError(klass.Get(),
8841*795d594fSAndroid Build Coastguard Worker                                 "Dex file does not support default method '%s'",
8842*795d594fSAndroid Build Coastguard Worker                                 m->PrettyMethod().c_str());
8843*795d594fSAndroid Build Coastguard Worker           return false;
8844*795d594fSAndroid Build Coastguard Worker         }
8845*795d594fSAndroid Build Coastguard Worker         if (!ArtMethod::IsPublic(access_flags)) {
8846*795d594fSAndroid Build Coastguard Worker           // The verifier should have caught the non-public method for dex version 37.
8847*795d594fSAndroid Build Coastguard Worker           // Just warn and skip it since this is from before default-methods so we don't
8848*795d594fSAndroid Build Coastguard Worker           // really need to care that it has code.
8849*795d594fSAndroid Build Coastguard Worker           LOG(WARNING) << "Default interface method " << m->PrettyMethod() << " is not public! "
8850*795d594fSAndroid Build Coastguard Worker                        << "This will be a fatal error in subsequent versions of android. "
8851*795d594fSAndroid Build Coastguard Worker                        << "Continuing anyway.";
8852*795d594fSAndroid Build Coastguard Worker         }
8853*795d594fSAndroid Build Coastguard Worker         static_assert((kAccDefault & kAccIntrinsicBits) != 0);
8854*795d594fSAndroid Build Coastguard Worker         DCHECK(!m->IsIntrinsic()) << "Adding kAccDefault to an intrinsic would be a mistake as it "
8855*795d594fSAndroid Build Coastguard Worker                                   << "overlaps with kAccIntrinsicBits.";
8856*795d594fSAndroid Build Coastguard Worker         m->SetAccessFlags(access_flags | kAccDefault);
8857*795d594fSAndroid Build Coastguard Worker         has_defaults = true;
8858*795d594fSAndroid Build Coastguard Worker       }
8859*795d594fSAndroid Build Coastguard Worker     }
8860*795d594fSAndroid Build Coastguard Worker     // Mark that we have default methods so that we won't need to scan the virtual_methods_ array
8861*795d594fSAndroid Build Coastguard Worker     // during initialization. This is a performance optimization. We could simply traverse the
8862*795d594fSAndroid Build Coastguard Worker     // virtual_methods_ array again during initialization.
8863*795d594fSAndroid Build Coastguard Worker     if (has_defaults) {
8864*795d594fSAndroid Build Coastguard Worker       klass->SetHasDefaultMethods();
8865*795d594fSAndroid Build Coastguard Worker     }
8866*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::IfTable> iftable = SetupInterfaceLookupTable(
8867*795d594fSAndroid Build Coastguard Worker         self, klass, &allocator_, NonProxyInterfacesAccessor(class_linker_, klass));
8868*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(iftable == nullptr)) {
8869*795d594fSAndroid Build Coastguard Worker       self->AssertPendingException();
8870*795d594fSAndroid Build Coastguard Worker       return false;
8871*795d594fSAndroid Build Coastguard Worker     }
8872*795d594fSAndroid Build Coastguard Worker     size_t ifcount = iftable->Count();
8873*795d594fSAndroid Build Coastguard Worker     bool have_super_with_defaults = false;
8874*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i != ifcount; ++i) {
8875*795d594fSAndroid Build Coastguard Worker       if (iftable->GetInterface(i)->HasDefaultMethods()) {
8876*795d594fSAndroid Build Coastguard Worker         have_super_with_defaults = true;
8877*795d594fSAndroid Build Coastguard Worker         break;
8878*795d594fSAndroid Build Coastguard Worker       }
8879*795d594fSAndroid Build Coastguard Worker     }
8880*795d594fSAndroid Build Coastguard Worker     LengthPrefixedArray<ArtMethod>* old_methods = kIsDebugBuild ? klass->GetMethodsPtr() : nullptr;
8881*795d594fSAndroid Build Coastguard Worker     if (have_super_with_defaults) {
8882*795d594fSAndroid Build Coastguard Worker       if (!FindCopiedMethodsForInterface(klass.Get(), num_virtual_methods, iftable)) {
8883*795d594fSAndroid Build Coastguard Worker         self->AssertPendingException();
8884*795d594fSAndroid Build Coastguard Worker         return false;
8885*795d594fSAndroid Build Coastguard Worker       }
8886*795d594fSAndroid Build Coastguard Worker       if (num_new_copied_methods_ != 0u) {
8887*795d594fSAndroid Build Coastguard Worker         // Re-check the number of methods.
8888*795d594fSAndroid Build Coastguard Worker         size_t final_num_virtual_methods = num_virtual_methods + num_new_copied_methods_;
8889*795d594fSAndroid Build Coastguard Worker         if (!IsUint<16>(final_num_virtual_methods)) {
8890*795d594fSAndroid Build Coastguard Worker           ThrowClassFormatError(
8891*795d594fSAndroid Build Coastguard Worker               klass.Get(), "Too many methods on interface: %zu", final_num_virtual_methods);
8892*795d594fSAndroid Build Coastguard Worker           return false;
8893*795d594fSAndroid Build Coastguard Worker         }
8894*795d594fSAndroid Build Coastguard Worker         ReallocMethods(klass.Get());
8895*795d594fSAndroid Build Coastguard Worker       }
8896*795d594fSAndroid Build Coastguard Worker     }
8897*795d594fSAndroid Build Coastguard Worker     klass->SetIfTable(iftable);
8898*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
8899*795d594fSAndroid Build Coastguard Worker       // May cause thread suspension, so do this after we're done with `ObjPtr<> iftable`.
8900*795d594fSAndroid Build Coastguard Worker       ClobberOldMethods(old_methods, klass->GetMethodsPtr());
8901*795d594fSAndroid Build Coastguard Worker     }
8902*795d594fSAndroid Build Coastguard Worker     return true;
8903*795d594fSAndroid Build Coastguard Worker   } else if (LIKELY(klass->HasSuperClass())) {
8904*795d594fSAndroid Build Coastguard Worker     // We set up the interface lookup table now because we need it to determine if we need
8905*795d594fSAndroid Build Coastguard Worker     // to update any vtable entries with new default method implementations.
8906*795d594fSAndroid Build Coastguard Worker     StackHandleScope<3> hs(self);
8907*795d594fSAndroid Build Coastguard Worker     MutableHandle<mirror::IfTable> iftable = hs.NewHandle(UNLIKELY(klass->IsProxyClass())
8908*795d594fSAndroid Build Coastguard Worker         ? SetupInterfaceLookupTable(self, klass, &allocator_, ProxyInterfacesAccessor(interfaces))
8909*795d594fSAndroid Build Coastguard Worker         : SetupInterfaceLookupTable(
8910*795d594fSAndroid Build Coastguard Worker               self, klass, &allocator_, NonProxyInterfacesAccessor(class_linker_, klass)));
8911*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(iftable == nullptr)) {
8912*795d594fSAndroid Build Coastguard Worker       self->AssertPendingException();
8913*795d594fSAndroid Build Coastguard Worker       return false;
8914*795d594fSAndroid Build Coastguard Worker     }
8915*795d594fSAndroid Build Coastguard Worker 
8916*795d594fSAndroid Build Coastguard Worker     // Copy the IMT from superclass if present and needed. Update with new methods later.
8917*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> super_class = hs.NewHandle(klass->GetSuperClass());
8918*795d594fSAndroid Build Coastguard Worker     bool is_klass_abstract = klass->IsAbstract();
8919*795d594fSAndroid Build Coastguard Worker     bool is_super_abstract = super_class->IsAbstract();
8920*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(klass->ShouldHaveImt(), !is_klass_abstract);
8921*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(super_class->ShouldHaveImt(), !is_super_abstract);
8922*795d594fSAndroid Build Coastguard Worker     if (!is_klass_abstract && !is_super_abstract) {
8923*795d594fSAndroid Build Coastguard Worker       ImTable* super_imt = super_class->GetImt(kPointerSize);
8924*795d594fSAndroid Build Coastguard Worker       for (size_t i = 0; i < ImTable::kSize; ++i) {
8925*795d594fSAndroid Build Coastguard Worker         out_imt[i] = super_imt->Get(i, kPointerSize);
8926*795d594fSAndroid Build Coastguard Worker       }
8927*795d594fSAndroid Build Coastguard Worker     }
8928*795d594fSAndroid Build Coastguard Worker 
8929*795d594fSAndroid Build Coastguard Worker     // If there are no new virtual methods and no new interfaces, we can simply reuse
8930*795d594fSAndroid Build Coastguard Worker     // the vtable from superclass. We may need to make a copy if it's embedded.
8931*795d594fSAndroid Build Coastguard Worker     const size_t super_vtable_length = super_class->GetVTableLength();
8932*795d594fSAndroid Build Coastguard Worker     if (num_virtual_methods == 0 && iftable.Get() == super_class->GetIfTable()) {
8933*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(is_super_abstract, !super_class->ShouldHaveEmbeddedVTable());
8934*795d594fSAndroid Build Coastguard Worker       if (is_super_abstract) {
8935*795d594fSAndroid Build Coastguard Worker         DCHECK(super_class->IsAbstract() && !super_class->IsArrayClass());
8936*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::PointerArray> super_vtable = super_class->GetVTable();
8937*795d594fSAndroid Build Coastguard Worker         CHECK(super_vtable != nullptr) << super_class->PrettyClass();
8938*795d594fSAndroid Build Coastguard Worker         klass->SetVTable(super_vtable);
8939*795d594fSAndroid Build Coastguard Worker         // No IMT in the super class, we need to reconstruct it from the iftable.
8940*795d594fSAndroid Build Coastguard Worker         if (!is_klass_abstract && iftable->Count() != 0) {
8941*795d594fSAndroid Build Coastguard Worker           class_linker_->FillIMTFromIfTable(iftable.Get(),
8942*795d594fSAndroid Build Coastguard Worker                                             runtime_->GetImtUnimplementedMethod(),
8943*795d594fSAndroid Build Coastguard Worker                                             runtime_->GetImtConflictMethod(),
8944*795d594fSAndroid Build Coastguard Worker                                             klass.Get(),
8945*795d594fSAndroid Build Coastguard Worker                                             /*create_conflict_tables=*/false,
8946*795d594fSAndroid Build Coastguard Worker                                             /*ignore_copied_methods=*/false,
8947*795d594fSAndroid Build Coastguard Worker                                             out_new_conflict,
8948*795d594fSAndroid Build Coastguard Worker                                             out_imt);
8949*795d594fSAndroid Build Coastguard Worker         }
8950*795d594fSAndroid Build Coastguard Worker       } else {
8951*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::PointerArray> vtable = AllocPointerArray(self, super_vtable_length);
8952*795d594fSAndroid Build Coastguard Worker         if (UNLIKELY(vtable == nullptr)) {
8953*795d594fSAndroid Build Coastguard Worker           self->AssertPendingOOMException();
8954*795d594fSAndroid Build Coastguard Worker           return false;
8955*795d594fSAndroid Build Coastguard Worker         }
8956*795d594fSAndroid Build Coastguard Worker         for (size_t i = 0; i < super_vtable_length; i++) {
8957*795d594fSAndroid Build Coastguard Worker           vtable->SetElementPtrSize(
8958*795d594fSAndroid Build Coastguard Worker               i, super_class->GetEmbeddedVTableEntry(i, kPointerSize), kPointerSize);
8959*795d594fSAndroid Build Coastguard Worker         }
8960*795d594fSAndroid Build Coastguard Worker         klass->SetVTable(vtable);
8961*795d594fSAndroid Build Coastguard Worker         // The IMT was already copied from superclass if `klass` is not abstract.
8962*795d594fSAndroid Build Coastguard Worker       }
8963*795d594fSAndroid Build Coastguard Worker       klass->SetIfTable(iftable.Get());
8964*795d594fSAndroid Build Coastguard Worker       return true;
8965*795d594fSAndroid Build Coastguard Worker     }
8966*795d594fSAndroid Build Coastguard Worker 
8967*795d594fSAndroid Build Coastguard Worker     // Allocate method arrays, so that we can link interface methods without thread suspension,
8968*795d594fSAndroid Build Coastguard Worker     // otherwise GC could miss visiting newly allocated copied methods.
8969*795d594fSAndroid Build Coastguard Worker     // TODO: Do not allocate copied methods during linking, store only records about what
8970*795d594fSAndroid Build Coastguard Worker     // we need to allocate and allocate it at the end. Start with superclass iftable and
8971*795d594fSAndroid Build Coastguard Worker     // perform copy-on-write when needed to facilitate maximum memory sharing.
8972*795d594fSAndroid Build Coastguard Worker     if (!AllocateIfTableMethodArrays(self, klass, iftable)) {
8973*795d594fSAndroid Build Coastguard Worker       self->AssertPendingOOMException();
8974*795d594fSAndroid Build Coastguard Worker       return false;
8975*795d594fSAndroid Build Coastguard Worker     }
8976*795d594fSAndroid Build Coastguard Worker 
8977*795d594fSAndroid Build Coastguard Worker     size_t final_vtable_size = AssignVTableIndexes(
8978*795d594fSAndroid Build Coastguard Worker         klass.Get(), super_class.Get(), is_super_abstract, num_virtual_methods, iftable.Get());
8979*795d594fSAndroid Build Coastguard Worker     if (final_vtable_size == 0u) {
8980*795d594fSAndroid Build Coastguard Worker       self->AssertPendingException();
8981*795d594fSAndroid Build Coastguard Worker       return false;
8982*795d594fSAndroid Build Coastguard Worker     }
8983*795d594fSAndroid Build Coastguard Worker     DCHECK(IsUint<16>(final_vtable_size));
8984*795d594fSAndroid Build Coastguard Worker 
8985*795d594fSAndroid Build Coastguard Worker     // Allocate the new vtable.
8986*795d594fSAndroid Build Coastguard Worker     Handle<mirror::PointerArray> vtable = hs.NewHandle(AllocPointerArray(self, final_vtable_size));
8987*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(vtable == nullptr)) {
8988*795d594fSAndroid Build Coastguard Worker       self->AssertPendingOOMException();
8989*795d594fSAndroid Build Coastguard Worker       return false;
8990*795d594fSAndroid Build Coastguard Worker     }
8991*795d594fSAndroid Build Coastguard Worker 
8992*795d594fSAndroid Build Coastguard Worker     LengthPrefixedArray<ArtMethod>* old_methods = kIsDebugBuild ? klass->GetMethodsPtr() : nullptr;
8993*795d594fSAndroid Build Coastguard Worker     if (num_new_copied_methods_ != 0u) {
8994*795d594fSAndroid Build Coastguard Worker       ReallocMethods(klass.Get());
8995*795d594fSAndroid Build Coastguard Worker     }
8996*795d594fSAndroid Build Coastguard Worker 
8997*795d594fSAndroid Build Coastguard Worker     // Store new virtual methods in the new vtable.
8998*795d594fSAndroid Build Coastguard Worker     ArrayRef<uint32_t> same_signature_vtable_lists = same_signature_vtable_lists_;
8999*795d594fSAndroid Build Coastguard Worker     for (ArtMethod& virtual_method : klass->GetVirtualMethodsSliceUnchecked(kPointerSize)) {
9000*795d594fSAndroid Build Coastguard Worker       uint32_t vtable_index = virtual_method.GetMethodIndexDuringLinking();
9001*795d594fSAndroid Build Coastguard Worker       vtable->SetElementPtrSize(vtable_index, &virtual_method, kPointerSize);
9002*795d594fSAndroid Build Coastguard Worker       if (UNLIKELY(vtable_index < same_signature_vtable_lists.size())) {
9003*795d594fSAndroid Build Coastguard Worker         // We may override more than one method according to JLS, see b/211854716.
9004*795d594fSAndroid Build Coastguard Worker         while (same_signature_vtable_lists[vtable_index] != dex::kDexNoIndex) {
9005*795d594fSAndroid Build Coastguard Worker           DCHECK_LT(same_signature_vtable_lists[vtable_index], vtable_index);
9006*795d594fSAndroid Build Coastguard Worker           vtable_index = same_signature_vtable_lists[vtable_index];
9007*795d594fSAndroid Build Coastguard Worker           vtable->SetElementPtrSize(vtable_index, &virtual_method, kPointerSize);
9008*795d594fSAndroid Build Coastguard Worker           if (kIsDebugBuild) {
9009*795d594fSAndroid Build Coastguard Worker             ArtMethod* current_method = super_class->GetVTableEntry(vtable_index, kPointerSize);
9010*795d594fSAndroid Build Coastguard Worker             DCHECK(klass->CanAccessMember(current_method->GetDeclaringClass(),
9011*795d594fSAndroid Build Coastguard Worker                                           current_method->GetAccessFlags()));
9012*795d594fSAndroid Build Coastguard Worker             DCHECK(!current_method->IsFinal());
9013*795d594fSAndroid Build Coastguard Worker           }
9014*795d594fSAndroid Build Coastguard Worker         }
9015*795d594fSAndroid Build Coastguard Worker       }
9016*795d594fSAndroid Build Coastguard Worker     }
9017*795d594fSAndroid Build Coastguard Worker 
9018*795d594fSAndroid Build Coastguard Worker     // For non-overridden vtable slots, copy a method from `super_class`.
9019*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j != super_vtable_length; ++j) {
9020*795d594fSAndroid Build Coastguard Worker       if (vtable->GetElementPtrSize<ArtMethod*, kPointerSize>(j) == nullptr) {
9021*795d594fSAndroid Build Coastguard Worker         ArtMethod* super_method = super_class->GetVTableEntry(j, kPointerSize);
9022*795d594fSAndroid Build Coastguard Worker         vtable->SetElementPtrSize(j, super_method, kPointerSize);
9023*795d594fSAndroid Build Coastguard Worker       }
9024*795d594fSAndroid Build Coastguard Worker     }
9025*795d594fSAndroid Build Coastguard Worker 
9026*795d594fSAndroid Build Coastguard Worker     // Update the `iftable` (and IMT) with finalized virtual methods.
9027*795d594fSAndroid Build Coastguard Worker     if (!FinalizeIfTable(klass,
9028*795d594fSAndroid Build Coastguard Worker                          iftable,
9029*795d594fSAndroid Build Coastguard Worker                          vtable,
9030*795d594fSAndroid Build Coastguard Worker                          is_klass_abstract,
9031*795d594fSAndroid Build Coastguard Worker                          is_super_abstract,
9032*795d594fSAndroid Build Coastguard Worker                          out_new_conflict,
9033*795d594fSAndroid Build Coastguard Worker                          out_imt)) {
9034*795d594fSAndroid Build Coastguard Worker       self->AssertPendingOOMException();
9035*795d594fSAndroid Build Coastguard Worker       return false;
9036*795d594fSAndroid Build Coastguard Worker     }
9037*795d594fSAndroid Build Coastguard Worker 
9038*795d594fSAndroid Build Coastguard Worker     klass->SetVTable(vtable.Get());
9039*795d594fSAndroid Build Coastguard Worker     klass->SetIfTable(iftable.Get());
9040*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
9041*795d594fSAndroid Build Coastguard Worker       CheckVTable(self, klass, kPointerSize);
9042*795d594fSAndroid Build Coastguard Worker       ClobberOldMethods(old_methods, klass->GetMethodsPtr());
9043*795d594fSAndroid Build Coastguard Worker     }
9044*795d594fSAndroid Build Coastguard Worker     return true;
9045*795d594fSAndroid Build Coastguard Worker   } else {
9046*795d594fSAndroid Build Coastguard Worker     return LinkJavaLangObjectMethods(self, klass);
9047*795d594fSAndroid Build Coastguard Worker   }
9048*795d594fSAndroid Build Coastguard Worker }
9049*795d594fSAndroid Build Coastguard Worker 
9050*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize>
LinkJavaLangObjectMethods(Thread * self,Handle<mirror::Class> klass)9051*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkMethodsHelper<kPointerSize>::LinkJavaLangObjectMethods(
9052*795d594fSAndroid Build Coastguard Worker     Thread* self,
9053*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> klass) {
9054*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(klass.Get(), GetClassRoot<mirror::Object>(class_linker_));
9055*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(klass->NumVirtualMethods(), mirror::Object::kVTableLength);
9056*795d594fSAndroid Build Coastguard Worker   static_assert(IsUint<16>(mirror::Object::kVTableLength));
9057*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::PointerArray> vtable = AllocPointerArray(self, mirror::Object::kVTableLength);
9058*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(vtable == nullptr)) {
9059*795d594fSAndroid Build Coastguard Worker     self->AssertPendingOOMException();
9060*795d594fSAndroid Build Coastguard Worker     return false;
9061*795d594fSAndroid Build Coastguard Worker   }
9062*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < mirror::Object::kVTableLength; ++i) {
9063*795d594fSAndroid Build Coastguard Worker     ArtMethod* virtual_method = klass->GetVirtualMethodDuringLinking(i, kPointerSize);
9064*795d594fSAndroid Build Coastguard Worker     vtable->SetElementPtrSize(i, virtual_method, kPointerSize);
9065*795d594fSAndroid Build Coastguard Worker     virtual_method->SetMethodIndex(i);
9066*795d594fSAndroid Build Coastguard Worker   }
9067*795d594fSAndroid Build Coastguard Worker   klass->SetVTable(vtable);
9068*795d594fSAndroid Build Coastguard Worker   InitializeObjectVirtualMethodHashes(
9069*795d594fSAndroid Build Coastguard Worker       klass.Get(),
9070*795d594fSAndroid Build Coastguard Worker       kPointerSize,
9071*795d594fSAndroid Build Coastguard Worker       ArrayRef<uint32_t>(class_linker_->object_virtual_method_hashes_));
9072*795d594fSAndroid Build Coastguard Worker   // The interface table is already allocated but there are no interface methods to link.
9073*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->GetIfTable() != nullptr);
9074*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(klass->GetIfTableCount(), 0);
9075*795d594fSAndroid Build Coastguard Worker   return true;
9076*795d594fSAndroid Build Coastguard Worker }
9077*795d594fSAndroid Build Coastguard Worker 
9078*795d594fSAndroid Build Coastguard Worker // Populate the class vtable and itable. Compute return type indices.
LinkMethods(Thread * self,Handle<mirror::Class> klass,Handle<mirror::ObjectArray<mirror::Class>> interfaces,bool * out_new_conflict,ArtMethod ** out_imt)9079*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkMethods(Thread* self,
9080*795d594fSAndroid Build Coastguard Worker                               Handle<mirror::Class> klass,
9081*795d594fSAndroid Build Coastguard Worker                               Handle<mirror::ObjectArray<mirror::Class>> interfaces,
9082*795d594fSAndroid Build Coastguard Worker                               bool* out_new_conflict,
9083*795d594fSAndroid Build Coastguard Worker                               ArtMethod** out_imt) {
9084*795d594fSAndroid Build Coastguard Worker   self->AllowThreadSuspension();
9085*795d594fSAndroid Build Coastguard Worker   // Link virtual methods then interface methods.
9086*795d594fSAndroid Build Coastguard Worker   Runtime* const runtime = Runtime::Current();
9087*795d594fSAndroid Build Coastguard Worker   if (LIKELY(GetImagePointerSize() == kRuntimePointerSize)) {
9088*795d594fSAndroid Build Coastguard Worker     LinkMethodsHelper<kRuntimePointerSize> helper(this, klass, self, runtime);
9089*795d594fSAndroid Build Coastguard Worker     return helper.LinkMethods(self, klass, interfaces, out_new_conflict, out_imt);
9090*795d594fSAndroid Build Coastguard Worker   } else {
9091*795d594fSAndroid Build Coastguard Worker     constexpr PointerSize kOtherPointerSize =
9092*795d594fSAndroid Build Coastguard Worker         (kRuntimePointerSize == PointerSize::k64) ? PointerSize::k32 : PointerSize::k64;
9093*795d594fSAndroid Build Coastguard Worker     LinkMethodsHelper<kOtherPointerSize> helper(this, klass, self, runtime);
9094*795d594fSAndroid Build Coastguard Worker     return helper.LinkMethods(self, klass, interfaces, out_new_conflict, out_imt);
9095*795d594fSAndroid Build Coastguard Worker   }
9096*795d594fSAndroid Build Coastguard Worker }
9097*795d594fSAndroid Build Coastguard Worker 
9098*795d594fSAndroid Build Coastguard Worker class ClassLinker::LinkFieldsHelper {
9099*795d594fSAndroid Build Coastguard Worker  public:
9100*795d594fSAndroid Build Coastguard Worker   static bool LinkFields(ClassLinker* class_linker,
9101*795d594fSAndroid Build Coastguard Worker                          Thread* self,
9102*795d594fSAndroid Build Coastguard Worker                          Handle<mirror::Class> klass,
9103*795d594fSAndroid Build Coastguard Worker                          bool is_static,
9104*795d594fSAndroid Build Coastguard Worker                          size_t* class_size)
9105*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
9106*795d594fSAndroid Build Coastguard Worker 
9107*795d594fSAndroid Build Coastguard Worker  private:
9108*795d594fSAndroid Build Coastguard Worker   enum class FieldTypeOrder : uint16_t;
9109*795d594fSAndroid Build Coastguard Worker   class FieldGaps;
9110*795d594fSAndroid Build Coastguard Worker 
9111*795d594fSAndroid Build Coastguard Worker   struct FieldTypeOrderAndIndex {
9112*795d594fSAndroid Build Coastguard Worker     FieldTypeOrder field_type_order;
9113*795d594fSAndroid Build Coastguard Worker     uint16_t field_index;
9114*795d594fSAndroid Build Coastguard Worker   };
9115*795d594fSAndroid Build Coastguard Worker 
9116*795d594fSAndroid Build Coastguard Worker   static FieldTypeOrder FieldTypeOrderFromFirstDescriptorCharacter(char first_char);
9117*795d594fSAndroid Build Coastguard Worker 
9118*795d594fSAndroid Build Coastguard Worker   template <size_t kSize>
9119*795d594fSAndroid Build Coastguard Worker   static MemberOffset AssignFieldOffset(ArtField* field, MemberOffset field_offset)
9120*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
9121*795d594fSAndroid Build Coastguard Worker };
9122*795d594fSAndroid Build Coastguard Worker 
9123*795d594fSAndroid Build Coastguard Worker // We use the following order of field types for assigning offsets.
9124*795d594fSAndroid Build Coastguard Worker // Some fields can be shuffled forward to fill gaps, see
9125*795d594fSAndroid Build Coastguard Worker // `ClassLinker::LinkFieldsHelper::LinkFields()`.
9126*795d594fSAndroid Build Coastguard Worker enum class ClassLinker::LinkFieldsHelper::FieldTypeOrder : uint16_t {
9127*795d594fSAndroid Build Coastguard Worker   kReference = 0u,
9128*795d594fSAndroid Build Coastguard Worker   kLong,
9129*795d594fSAndroid Build Coastguard Worker   kDouble,
9130*795d594fSAndroid Build Coastguard Worker   kInt,
9131*795d594fSAndroid Build Coastguard Worker   kFloat,
9132*795d594fSAndroid Build Coastguard Worker   kChar,
9133*795d594fSAndroid Build Coastguard Worker   kShort,
9134*795d594fSAndroid Build Coastguard Worker   kBoolean,
9135*795d594fSAndroid Build Coastguard Worker   kByte,
9136*795d594fSAndroid Build Coastguard Worker 
9137*795d594fSAndroid Build Coastguard Worker   kLast64BitType = kDouble,
9138*795d594fSAndroid Build Coastguard Worker   kLast32BitType = kFloat,
9139*795d594fSAndroid Build Coastguard Worker   kLast16BitType = kShort,
9140*795d594fSAndroid Build Coastguard Worker };
9141*795d594fSAndroid Build Coastguard Worker 
9142*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
9143*795d594fSAndroid Build Coastguard Worker ClassLinker::LinkFieldsHelper::FieldTypeOrder
FieldTypeOrderFromFirstDescriptorCharacter(char first_char)9144*795d594fSAndroid Build Coastguard Worker ClassLinker::LinkFieldsHelper::FieldTypeOrderFromFirstDescriptorCharacter(char first_char) {
9145*795d594fSAndroid Build Coastguard Worker   switch (first_char) {
9146*795d594fSAndroid Build Coastguard Worker     case 'J':
9147*795d594fSAndroid Build Coastguard Worker       return FieldTypeOrder::kLong;
9148*795d594fSAndroid Build Coastguard Worker     case 'D':
9149*795d594fSAndroid Build Coastguard Worker       return FieldTypeOrder::kDouble;
9150*795d594fSAndroid Build Coastguard Worker     case 'I':
9151*795d594fSAndroid Build Coastguard Worker       return FieldTypeOrder::kInt;
9152*795d594fSAndroid Build Coastguard Worker     case 'F':
9153*795d594fSAndroid Build Coastguard Worker       return FieldTypeOrder::kFloat;
9154*795d594fSAndroid Build Coastguard Worker     case 'C':
9155*795d594fSAndroid Build Coastguard Worker       return FieldTypeOrder::kChar;
9156*795d594fSAndroid Build Coastguard Worker     case 'S':
9157*795d594fSAndroid Build Coastguard Worker       return FieldTypeOrder::kShort;
9158*795d594fSAndroid Build Coastguard Worker     case 'Z':
9159*795d594fSAndroid Build Coastguard Worker       return FieldTypeOrder::kBoolean;
9160*795d594fSAndroid Build Coastguard Worker     case 'B':
9161*795d594fSAndroid Build Coastguard Worker       return FieldTypeOrder::kByte;
9162*795d594fSAndroid Build Coastguard Worker     default:
9163*795d594fSAndroid Build Coastguard Worker       DCHECK(first_char == 'L' || first_char == '[') << first_char;
9164*795d594fSAndroid Build Coastguard Worker       return FieldTypeOrder::kReference;
9165*795d594fSAndroid Build Coastguard Worker   }
9166*795d594fSAndroid Build Coastguard Worker }
9167*795d594fSAndroid Build Coastguard Worker 
9168*795d594fSAndroid Build Coastguard Worker // Gaps where we can insert fields in object layout.
9169*795d594fSAndroid Build Coastguard Worker class ClassLinker::LinkFieldsHelper::FieldGaps {
9170*795d594fSAndroid Build Coastguard Worker  public:
9171*795d594fSAndroid Build Coastguard Worker   template <uint32_t kSize>
AlignFieldOffset(MemberOffset field_offset)9172*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE MemberOffset AlignFieldOffset(MemberOffset field_offset) {
9173*795d594fSAndroid Build Coastguard Worker     static_assert(kSize == 2u || kSize == 4u || kSize == 8u);
9174*795d594fSAndroid Build Coastguard Worker     if (!IsAligned<kSize>(field_offset.Uint32Value())) {
9175*795d594fSAndroid Build Coastguard Worker       uint32_t gap_start = field_offset.Uint32Value();
9176*795d594fSAndroid Build Coastguard Worker       field_offset = MemberOffset(RoundUp(gap_start, kSize));
9177*795d594fSAndroid Build Coastguard Worker       AddGaps<kSize - 1u>(gap_start, field_offset.Uint32Value());
9178*795d594fSAndroid Build Coastguard Worker     }
9179*795d594fSAndroid Build Coastguard Worker     return field_offset;
9180*795d594fSAndroid Build Coastguard Worker   }
9181*795d594fSAndroid Build Coastguard Worker 
9182*795d594fSAndroid Build Coastguard Worker   template <uint32_t kSize>
HasGap() const9183*795d594fSAndroid Build Coastguard Worker   bool HasGap() const {
9184*795d594fSAndroid Build Coastguard Worker     static_assert(kSize == 1u || kSize == 2u || kSize == 4u);
9185*795d594fSAndroid Build Coastguard Worker     return (kSize == 1u && gap1_offset_ != kNoOffset) ||
9186*795d594fSAndroid Build Coastguard Worker            (kSize <= 2u && gap2_offset_ != kNoOffset) ||
9187*795d594fSAndroid Build Coastguard Worker            gap4_offset_ != kNoOffset;
9188*795d594fSAndroid Build Coastguard Worker   }
9189*795d594fSAndroid Build Coastguard Worker 
9190*795d594fSAndroid Build Coastguard Worker   template <uint32_t kSize>
ReleaseGap()9191*795d594fSAndroid Build Coastguard Worker   MemberOffset ReleaseGap() {
9192*795d594fSAndroid Build Coastguard Worker     static_assert(kSize == 1u || kSize == 2u || kSize == 4u);
9193*795d594fSAndroid Build Coastguard Worker     uint32_t result;
9194*795d594fSAndroid Build Coastguard Worker     if (kSize == 1u && gap1_offset_ != kNoOffset) {
9195*795d594fSAndroid Build Coastguard Worker       DCHECK(gap2_offset_ == kNoOffset || gap2_offset_ > gap1_offset_);
9196*795d594fSAndroid Build Coastguard Worker       DCHECK(gap4_offset_ == kNoOffset || gap4_offset_ > gap1_offset_);
9197*795d594fSAndroid Build Coastguard Worker       result = gap1_offset_;
9198*795d594fSAndroid Build Coastguard Worker       gap1_offset_ = kNoOffset;
9199*795d594fSAndroid Build Coastguard Worker     } else if (kSize <= 2u && gap2_offset_ != kNoOffset) {
9200*795d594fSAndroid Build Coastguard Worker       DCHECK(gap4_offset_ == kNoOffset || gap4_offset_ > gap2_offset_);
9201*795d594fSAndroid Build Coastguard Worker       result = gap2_offset_;
9202*795d594fSAndroid Build Coastguard Worker       gap2_offset_ = kNoOffset;
9203*795d594fSAndroid Build Coastguard Worker       if (kSize < 2u) {
9204*795d594fSAndroid Build Coastguard Worker         AddGaps<1u>(result + kSize, result + 2u);
9205*795d594fSAndroid Build Coastguard Worker       }
9206*795d594fSAndroid Build Coastguard Worker     } else {
9207*795d594fSAndroid Build Coastguard Worker       DCHECK_NE(gap4_offset_, kNoOffset);
9208*795d594fSAndroid Build Coastguard Worker       result = gap4_offset_;
9209*795d594fSAndroid Build Coastguard Worker       gap4_offset_ = kNoOffset;
9210*795d594fSAndroid Build Coastguard Worker       if (kSize < 4u) {
9211*795d594fSAndroid Build Coastguard Worker         AddGaps<kSize | 2u>(result + kSize, result + 4u);
9212*795d594fSAndroid Build Coastguard Worker       }
9213*795d594fSAndroid Build Coastguard Worker     }
9214*795d594fSAndroid Build Coastguard Worker     return MemberOffset(result);
9215*795d594fSAndroid Build Coastguard Worker   }
9216*795d594fSAndroid Build Coastguard Worker 
9217*795d594fSAndroid Build Coastguard Worker  private:
9218*795d594fSAndroid Build Coastguard Worker   template <uint32_t kGapsToCheck>
AddGaps(uint32_t gap_start,uint32_t gap_end)9219*795d594fSAndroid Build Coastguard Worker   void AddGaps(uint32_t gap_start, uint32_t gap_end) {
9220*795d594fSAndroid Build Coastguard Worker     if ((kGapsToCheck & 1u) != 0u) {
9221*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(gap_start, gap_end);
9222*795d594fSAndroid Build Coastguard Worker       DCHECK_ALIGNED(gap_end, 2u);
9223*795d594fSAndroid Build Coastguard Worker       if ((gap_start & 1u) != 0u) {
9224*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(gap1_offset_, kNoOffset);
9225*795d594fSAndroid Build Coastguard Worker         gap1_offset_ = gap_start;
9226*795d594fSAndroid Build Coastguard Worker         gap_start += 1u;
9227*795d594fSAndroid Build Coastguard Worker         if (kGapsToCheck == 1u || gap_start == gap_end) {
9228*795d594fSAndroid Build Coastguard Worker           DCHECK_EQ(gap_start, gap_end);
9229*795d594fSAndroid Build Coastguard Worker           return;
9230*795d594fSAndroid Build Coastguard Worker         }
9231*795d594fSAndroid Build Coastguard Worker       }
9232*795d594fSAndroid Build Coastguard Worker     }
9233*795d594fSAndroid Build Coastguard Worker 
9234*795d594fSAndroid Build Coastguard Worker     if ((kGapsToCheck & 2u) != 0u) {
9235*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(gap_start, gap_end);
9236*795d594fSAndroid Build Coastguard Worker       DCHECK_ALIGNED(gap_start, 2u);
9237*795d594fSAndroid Build Coastguard Worker       DCHECK_ALIGNED(gap_end, 4u);
9238*795d594fSAndroid Build Coastguard Worker       if ((gap_start & 2u) != 0u) {
9239*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(gap2_offset_, kNoOffset);
9240*795d594fSAndroid Build Coastguard Worker         gap2_offset_ = gap_start;
9241*795d594fSAndroid Build Coastguard Worker         gap_start += 2u;
9242*795d594fSAndroid Build Coastguard Worker         if (kGapsToCheck <= 3u || gap_start == gap_end) {
9243*795d594fSAndroid Build Coastguard Worker           DCHECK_EQ(gap_start, gap_end);
9244*795d594fSAndroid Build Coastguard Worker           return;
9245*795d594fSAndroid Build Coastguard Worker         }
9246*795d594fSAndroid Build Coastguard Worker       }
9247*795d594fSAndroid Build Coastguard Worker     }
9248*795d594fSAndroid Build Coastguard Worker 
9249*795d594fSAndroid Build Coastguard Worker     if ((kGapsToCheck & 4u) != 0u) {
9250*795d594fSAndroid Build Coastguard Worker       DCHECK_LT(gap_start, gap_end);
9251*795d594fSAndroid Build Coastguard Worker       DCHECK_ALIGNED(gap_start, 4u);
9252*795d594fSAndroid Build Coastguard Worker       DCHECK_ALIGNED(gap_end, 8u);
9253*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(gap_start + 4u, gap_end);
9254*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(gap4_offset_, kNoOffset);
9255*795d594fSAndroid Build Coastguard Worker       gap4_offset_ = gap_start;
9256*795d594fSAndroid Build Coastguard Worker       return;
9257*795d594fSAndroid Build Coastguard Worker     }
9258*795d594fSAndroid Build Coastguard Worker 
9259*795d594fSAndroid Build Coastguard Worker     DCHECK(false) << "Remaining gap: " << gap_start << " to " << gap_end
9260*795d594fSAndroid Build Coastguard Worker         << " after checking " << kGapsToCheck;
9261*795d594fSAndroid Build Coastguard Worker   }
9262*795d594fSAndroid Build Coastguard Worker 
9263*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t kNoOffset = static_cast<uint32_t>(-1);
9264*795d594fSAndroid Build Coastguard Worker 
9265*795d594fSAndroid Build Coastguard Worker   uint32_t gap4_offset_ = kNoOffset;
9266*795d594fSAndroid Build Coastguard Worker   uint32_t gap2_offset_ = kNoOffset;
9267*795d594fSAndroid Build Coastguard Worker   uint32_t gap1_offset_ = kNoOffset;
9268*795d594fSAndroid Build Coastguard Worker };
9269*795d594fSAndroid Build Coastguard Worker 
9270*795d594fSAndroid Build Coastguard Worker template <size_t kSize>
9271*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
AssignFieldOffset(ArtField * field,MemberOffset field_offset)9272*795d594fSAndroid Build Coastguard Worker MemberOffset ClassLinker::LinkFieldsHelper::AssignFieldOffset(ArtField* field,
9273*795d594fSAndroid Build Coastguard Worker                                                               MemberOffset field_offset) {
9274*795d594fSAndroid Build Coastguard Worker   DCHECK_ALIGNED(field_offset.Uint32Value(), kSize);
9275*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(Primitive::ComponentSize(field->GetTypeAsPrimitiveType()), kSize);
9276*795d594fSAndroid Build Coastguard Worker   field->SetOffset(field_offset);
9277*795d594fSAndroid Build Coastguard Worker   return MemberOffset(field_offset.Uint32Value() + kSize);
9278*795d594fSAndroid Build Coastguard Worker }
9279*795d594fSAndroid Build Coastguard Worker 
LinkFields(ClassLinker * class_linker,Thread * self,Handle<mirror::Class> klass,bool is_static,size_t * class_size)9280*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkFieldsHelper::LinkFields(ClassLinker* class_linker,
9281*795d594fSAndroid Build Coastguard Worker                                                Thread* self,
9282*795d594fSAndroid Build Coastguard Worker                                                Handle<mirror::Class> klass,
9283*795d594fSAndroid Build Coastguard Worker                                                bool is_static,
9284*795d594fSAndroid Build Coastguard Worker                                                size_t* class_size) {
9285*795d594fSAndroid Build Coastguard Worker   self->AllowThreadSuspension();
9286*795d594fSAndroid Build Coastguard Worker   const size_t num_fields = is_static ? klass->NumStaticFields() : klass->NumInstanceFields();
9287*795d594fSAndroid Build Coastguard Worker   LengthPrefixedArray<ArtField>* const fields = is_static ? klass->GetSFieldsPtr() :
9288*795d594fSAndroid Build Coastguard Worker       klass->GetIFieldsPtr();
9289*795d594fSAndroid Build Coastguard Worker 
9290*795d594fSAndroid Build Coastguard Worker   // Initialize field_offset
9291*795d594fSAndroid Build Coastguard Worker   MemberOffset field_offset(0);
9292*795d594fSAndroid Build Coastguard Worker   if (is_static) {
9293*795d594fSAndroid Build Coastguard Worker     field_offset = klass->GetFirstReferenceStaticFieldOffsetDuringLinking(
9294*795d594fSAndroid Build Coastguard Worker         class_linker->GetImagePointerSize());
9295*795d594fSAndroid Build Coastguard Worker   } else {
9296*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
9297*795d594fSAndroid Build Coastguard Worker     if (super_class != nullptr) {
9298*795d594fSAndroid Build Coastguard Worker       CHECK(super_class->IsResolved())
9299*795d594fSAndroid Build Coastguard Worker           << klass->PrettyClass() << " " << super_class->PrettyClass();
9300*795d594fSAndroid Build Coastguard Worker       field_offset = MemberOffset(super_class->GetObjectSize());
9301*795d594fSAndroid Build Coastguard Worker     }
9302*795d594fSAndroid Build Coastguard Worker   }
9303*795d594fSAndroid Build Coastguard Worker 
9304*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(num_fields == 0, fields == nullptr) << klass->PrettyClass();
9305*795d594fSAndroid Build Coastguard Worker 
9306*795d594fSAndroid Build Coastguard Worker   // we want a relatively stable order so that adding new fields
9307*795d594fSAndroid Build Coastguard Worker   // minimizes disruption of C++ version such as Class and Method.
9308*795d594fSAndroid Build Coastguard Worker   //
9309*795d594fSAndroid Build Coastguard Worker   // The overall sort order order is:
9310*795d594fSAndroid Build Coastguard Worker   // 1) All object reference fields, sorted alphabetically.
9311*795d594fSAndroid Build Coastguard Worker   // 2) All java long (64-bit) integer fields, sorted alphabetically.
9312*795d594fSAndroid Build Coastguard Worker   // 3) All java double (64-bit) floating point fields, sorted alphabetically.
9313*795d594fSAndroid Build Coastguard Worker   // 4) All java int (32-bit) integer fields, sorted alphabetically.
9314*795d594fSAndroid Build Coastguard Worker   // 5) All java float (32-bit) floating point fields, sorted alphabetically.
9315*795d594fSAndroid Build Coastguard Worker   // 6) All java char (16-bit) integer fields, sorted alphabetically.
9316*795d594fSAndroid Build Coastguard Worker   // 7) All java short (16-bit) integer fields, sorted alphabetically.
9317*795d594fSAndroid Build Coastguard Worker   // 8) All java boolean (8-bit) integer fields, sorted alphabetically.
9318*795d594fSAndroid Build Coastguard Worker   // 9) All java byte (8-bit) integer fields, sorted alphabetically.
9319*795d594fSAndroid Build Coastguard Worker   //
9320*795d594fSAndroid Build Coastguard Worker   // (References are first to increase the chance of reference visiting
9321*795d594fSAndroid Build Coastguard Worker   // being able to take a fast path using a bitmap of references at the
9322*795d594fSAndroid Build Coastguard Worker   // start of the object, see `Class::reference_instance_offsets_`.)
9323*795d594fSAndroid Build Coastguard Worker   //
9324*795d594fSAndroid Build Coastguard Worker   // Once the fields are sorted in this order we will attempt to fill any gaps
9325*795d594fSAndroid Build Coastguard Worker   // that might be present in the memory layout of the structure.
9326*795d594fSAndroid Build Coastguard Worker   // Note that we shall not fill gaps between the superclass fields.
9327*795d594fSAndroid Build Coastguard Worker 
9328*795d594fSAndroid Build Coastguard Worker   // Collect fields and their "type order index" (see numbered points above).
9329*795d594fSAndroid Build Coastguard Worker   const char* old_no_suspend_cause = self->StartAssertNoThreadSuspension(
9330*795d594fSAndroid Build Coastguard Worker       "Using plain ArtField references");
9331*795d594fSAndroid Build Coastguard Worker   constexpr size_t kStackBufferEntries = 64;  // Avoid allocations for small number of fields.
9332*795d594fSAndroid Build Coastguard Worker   FieldTypeOrderAndIndex stack_buffer[kStackBufferEntries];
9333*795d594fSAndroid Build Coastguard Worker   std::vector<FieldTypeOrderAndIndex> heap_buffer;
9334*795d594fSAndroid Build Coastguard Worker   ArrayRef<FieldTypeOrderAndIndex> sorted_fields;
9335*795d594fSAndroid Build Coastguard Worker   if (num_fields <= kStackBufferEntries) {
9336*795d594fSAndroid Build Coastguard Worker     sorted_fields = ArrayRef<FieldTypeOrderAndIndex>(stack_buffer, num_fields);
9337*795d594fSAndroid Build Coastguard Worker   } else {
9338*795d594fSAndroid Build Coastguard Worker     heap_buffer.resize(num_fields);
9339*795d594fSAndroid Build Coastguard Worker     sorted_fields = ArrayRef<FieldTypeOrderAndIndex>(heap_buffer);
9340*795d594fSAndroid Build Coastguard Worker   }
9341*795d594fSAndroid Build Coastguard Worker   size_t num_reference_fields = 0;
9342*795d594fSAndroid Build Coastguard Worker   size_t primitive_fields_start = num_fields;
9343*795d594fSAndroid Build Coastguard Worker   DCHECK_LE(num_fields, 1u << 16);
9344*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i != num_fields; ++i) {
9345*795d594fSAndroid Build Coastguard Worker     ArtField* field = &fields->At(i);
9346*795d594fSAndroid Build Coastguard Worker     const char* descriptor = field->GetTypeDescriptor();
9347*795d594fSAndroid Build Coastguard Worker     FieldTypeOrder field_type_order = FieldTypeOrderFromFirstDescriptorCharacter(descriptor[0]);
9348*795d594fSAndroid Build Coastguard Worker     uint16_t field_index = dchecked_integral_cast<uint16_t>(i);
9349*795d594fSAndroid Build Coastguard Worker     // Insert references to the start, other fields to the end.
9350*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(num_reference_fields, primitive_fields_start);
9351*795d594fSAndroid Build Coastguard Worker     if (field_type_order == FieldTypeOrder::kReference) {
9352*795d594fSAndroid Build Coastguard Worker       sorted_fields[num_reference_fields] = { field_type_order, field_index };
9353*795d594fSAndroid Build Coastguard Worker       ++num_reference_fields;
9354*795d594fSAndroid Build Coastguard Worker     } else {
9355*795d594fSAndroid Build Coastguard Worker       --primitive_fields_start;
9356*795d594fSAndroid Build Coastguard Worker       sorted_fields[primitive_fields_start] = { field_type_order, field_index };
9357*795d594fSAndroid Build Coastguard Worker     }
9358*795d594fSAndroid Build Coastguard Worker   }
9359*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(num_reference_fields, primitive_fields_start);
9360*795d594fSAndroid Build Coastguard Worker 
9361*795d594fSAndroid Build Coastguard Worker   // Reference fields are already sorted by field index (and dex field index).
9362*795d594fSAndroid Build Coastguard Worker   DCHECK(std::is_sorted(
9363*795d594fSAndroid Build Coastguard Worker       sorted_fields.begin(),
9364*795d594fSAndroid Build Coastguard Worker       sorted_fields.begin() + num_reference_fields,
9365*795d594fSAndroid Build Coastguard Worker       [fields](const auto& lhs, const auto& rhs) REQUIRES_SHARED(Locks::mutator_lock_) {
9366*795d594fSAndroid Build Coastguard Worker         ArtField* lhs_field = &fields->At(lhs.field_index);
9367*795d594fSAndroid Build Coastguard Worker         ArtField* rhs_field = &fields->At(rhs.field_index);
9368*795d594fSAndroid Build Coastguard Worker         CHECK_EQ(lhs_field->GetTypeAsPrimitiveType(), Primitive::kPrimNot);
9369*795d594fSAndroid Build Coastguard Worker         CHECK_EQ(rhs_field->GetTypeAsPrimitiveType(), Primitive::kPrimNot);
9370*795d594fSAndroid Build Coastguard Worker         CHECK_EQ(lhs_field->GetDexFieldIndex() < rhs_field->GetDexFieldIndex(),
9371*795d594fSAndroid Build Coastguard Worker                  lhs.field_index < rhs.field_index);
9372*795d594fSAndroid Build Coastguard Worker         return lhs_field->GetDexFieldIndex() < rhs_field->GetDexFieldIndex();
9373*795d594fSAndroid Build Coastguard Worker       }));
9374*795d594fSAndroid Build Coastguard Worker   // Primitive fields were stored in reverse order of their field index (and dex field index).
9375*795d594fSAndroid Build Coastguard Worker   DCHECK(std::is_sorted(
9376*795d594fSAndroid Build Coastguard Worker       sorted_fields.begin() + primitive_fields_start,
9377*795d594fSAndroid Build Coastguard Worker       sorted_fields.end(),
9378*795d594fSAndroid Build Coastguard Worker       [fields](const auto& lhs, const auto& rhs) REQUIRES_SHARED(Locks::mutator_lock_) {
9379*795d594fSAndroid Build Coastguard Worker         ArtField* lhs_field = &fields->At(lhs.field_index);
9380*795d594fSAndroid Build Coastguard Worker         ArtField* rhs_field = &fields->At(rhs.field_index);
9381*795d594fSAndroid Build Coastguard Worker         CHECK_NE(lhs_field->GetTypeAsPrimitiveType(), Primitive::kPrimNot);
9382*795d594fSAndroid Build Coastguard Worker         CHECK_NE(rhs_field->GetTypeAsPrimitiveType(), Primitive::kPrimNot);
9383*795d594fSAndroid Build Coastguard Worker         CHECK_EQ(lhs_field->GetDexFieldIndex() > rhs_field->GetDexFieldIndex(),
9384*795d594fSAndroid Build Coastguard Worker                  lhs.field_index > rhs.field_index);
9385*795d594fSAndroid Build Coastguard Worker         return lhs.field_index > rhs.field_index;
9386*795d594fSAndroid Build Coastguard Worker       }));
9387*795d594fSAndroid Build Coastguard Worker   // Sort the primitive fields by the field type order, then field index.
9388*795d594fSAndroid Build Coastguard Worker   std::sort(sorted_fields.begin() + primitive_fields_start,
9389*795d594fSAndroid Build Coastguard Worker             sorted_fields.end(),
9390*795d594fSAndroid Build Coastguard Worker             [](const auto& lhs, const auto& rhs) {
9391*795d594fSAndroid Build Coastguard Worker               if (lhs.field_type_order != rhs.field_type_order) {
9392*795d594fSAndroid Build Coastguard Worker                 return lhs.field_type_order < rhs.field_type_order;
9393*795d594fSAndroid Build Coastguard Worker               } else {
9394*795d594fSAndroid Build Coastguard Worker                 return lhs.field_index < rhs.field_index;
9395*795d594fSAndroid Build Coastguard Worker               }
9396*795d594fSAndroid Build Coastguard Worker             });
9397*795d594fSAndroid Build Coastguard Worker   // Primitive fields are now sorted by field size (descending), then type, then field index.
9398*795d594fSAndroid Build Coastguard Worker   DCHECK(std::is_sorted(
9399*795d594fSAndroid Build Coastguard Worker       sorted_fields.begin() + primitive_fields_start,
9400*795d594fSAndroid Build Coastguard Worker       sorted_fields.end(),
9401*795d594fSAndroid Build Coastguard Worker       [fields](const auto& lhs, const auto& rhs) REQUIRES_SHARED(Locks::mutator_lock_) {
9402*795d594fSAndroid Build Coastguard Worker         ArtField* lhs_field = &fields->At(lhs.field_index);
9403*795d594fSAndroid Build Coastguard Worker         ArtField* rhs_field = &fields->At(rhs.field_index);
9404*795d594fSAndroid Build Coastguard Worker         Primitive::Type lhs_type = lhs_field->GetTypeAsPrimitiveType();
9405*795d594fSAndroid Build Coastguard Worker         CHECK_NE(lhs_type, Primitive::kPrimNot);
9406*795d594fSAndroid Build Coastguard Worker         Primitive::Type rhs_type = rhs_field->GetTypeAsPrimitiveType();
9407*795d594fSAndroid Build Coastguard Worker         CHECK_NE(rhs_type, Primitive::kPrimNot);
9408*795d594fSAndroid Build Coastguard Worker         if (lhs_type != rhs_type) {
9409*795d594fSAndroid Build Coastguard Worker           size_t lhs_size = Primitive::ComponentSize(lhs_type);
9410*795d594fSAndroid Build Coastguard Worker           size_t rhs_size = Primitive::ComponentSize(rhs_type);
9411*795d594fSAndroid Build Coastguard Worker           return (lhs_size != rhs_size) ? (lhs_size > rhs_size) : (lhs_type < rhs_type);
9412*795d594fSAndroid Build Coastguard Worker         } else {
9413*795d594fSAndroid Build Coastguard Worker           return lhs_field->GetDexFieldIndex() < rhs_field->GetDexFieldIndex();
9414*795d594fSAndroid Build Coastguard Worker         }
9415*795d594fSAndroid Build Coastguard Worker       }));
9416*795d594fSAndroid Build Coastguard Worker 
9417*795d594fSAndroid Build Coastguard Worker   // Process reference fields.
9418*795d594fSAndroid Build Coastguard Worker   FieldGaps field_gaps;
9419*795d594fSAndroid Build Coastguard Worker   size_t index = 0u;
9420*795d594fSAndroid Build Coastguard Worker   if (num_reference_fields != 0u) {
9421*795d594fSAndroid Build Coastguard Worker     constexpr size_t kReferenceSize = sizeof(mirror::HeapReference<mirror::Object>);
9422*795d594fSAndroid Build Coastguard Worker     field_offset = field_gaps.AlignFieldOffset<kReferenceSize>(field_offset);
9423*795d594fSAndroid Build Coastguard Worker     for (; index != num_reference_fields; ++index) {
9424*795d594fSAndroid Build Coastguard Worker       ArtField* field = &fields->At(sorted_fields[index].field_index);
9425*795d594fSAndroid Build Coastguard Worker       field_offset = AssignFieldOffset<kReferenceSize>(field, field_offset);
9426*795d594fSAndroid Build Coastguard Worker     }
9427*795d594fSAndroid Build Coastguard Worker   }
9428*795d594fSAndroid Build Coastguard Worker   // Process 64-bit fields.
9429*795d594fSAndroid Build Coastguard Worker   if (index != num_fields &&
9430*795d594fSAndroid Build Coastguard Worker       sorted_fields[index].field_type_order <= FieldTypeOrder::kLast64BitType) {
9431*795d594fSAndroid Build Coastguard Worker     field_offset = field_gaps.AlignFieldOffset<8u>(field_offset);
9432*795d594fSAndroid Build Coastguard Worker     while (index != num_fields &&
9433*795d594fSAndroid Build Coastguard Worker            sorted_fields[index].field_type_order <= FieldTypeOrder::kLast64BitType) {
9434*795d594fSAndroid Build Coastguard Worker       ArtField* field = &fields->At(sorted_fields[index].field_index);
9435*795d594fSAndroid Build Coastguard Worker       field_offset = AssignFieldOffset<8u>(field, field_offset);
9436*795d594fSAndroid Build Coastguard Worker       ++index;
9437*795d594fSAndroid Build Coastguard Worker     }
9438*795d594fSAndroid Build Coastguard Worker   }
9439*795d594fSAndroid Build Coastguard Worker   // Process 32-bit fields.
9440*795d594fSAndroid Build Coastguard Worker   if (index != num_fields &&
9441*795d594fSAndroid Build Coastguard Worker       sorted_fields[index].field_type_order <= FieldTypeOrder::kLast32BitType) {
9442*795d594fSAndroid Build Coastguard Worker     field_offset = field_gaps.AlignFieldOffset<4u>(field_offset);
9443*795d594fSAndroid Build Coastguard Worker     if (field_gaps.HasGap<4u>()) {
9444*795d594fSAndroid Build Coastguard Worker       ArtField* field = &fields->At(sorted_fields[index].field_index);
9445*795d594fSAndroid Build Coastguard Worker       AssignFieldOffset<4u>(field, field_gaps.ReleaseGap<4u>());  // Ignore return value.
9446*795d594fSAndroid Build Coastguard Worker       ++index;
9447*795d594fSAndroid Build Coastguard Worker       DCHECK(!field_gaps.HasGap<4u>());  // There can be only one gap for a 32-bit field.
9448*795d594fSAndroid Build Coastguard Worker     }
9449*795d594fSAndroid Build Coastguard Worker     while (index != num_fields &&
9450*795d594fSAndroid Build Coastguard Worker            sorted_fields[index].field_type_order <= FieldTypeOrder::kLast32BitType) {
9451*795d594fSAndroid Build Coastguard Worker       ArtField* field = &fields->At(sorted_fields[index].field_index);
9452*795d594fSAndroid Build Coastguard Worker       field_offset = AssignFieldOffset<4u>(field, field_offset);
9453*795d594fSAndroid Build Coastguard Worker       ++index;
9454*795d594fSAndroid Build Coastguard Worker     }
9455*795d594fSAndroid Build Coastguard Worker   }
9456*795d594fSAndroid Build Coastguard Worker   // Process 16-bit fields.
9457*795d594fSAndroid Build Coastguard Worker   if (index != num_fields &&
9458*795d594fSAndroid Build Coastguard Worker       sorted_fields[index].field_type_order <= FieldTypeOrder::kLast16BitType) {
9459*795d594fSAndroid Build Coastguard Worker     field_offset = field_gaps.AlignFieldOffset<2u>(field_offset);
9460*795d594fSAndroid Build Coastguard Worker     while (index != num_fields &&
9461*795d594fSAndroid Build Coastguard Worker            sorted_fields[index].field_type_order <= FieldTypeOrder::kLast16BitType &&
9462*795d594fSAndroid Build Coastguard Worker            field_gaps.HasGap<2u>()) {
9463*795d594fSAndroid Build Coastguard Worker       ArtField* field = &fields->At(sorted_fields[index].field_index);
9464*795d594fSAndroid Build Coastguard Worker       AssignFieldOffset<2u>(field, field_gaps.ReleaseGap<2u>());  // Ignore return value.
9465*795d594fSAndroid Build Coastguard Worker       ++index;
9466*795d594fSAndroid Build Coastguard Worker     }
9467*795d594fSAndroid Build Coastguard Worker     while (index != num_fields &&
9468*795d594fSAndroid Build Coastguard Worker            sorted_fields[index].field_type_order <= FieldTypeOrder::kLast16BitType) {
9469*795d594fSAndroid Build Coastguard Worker       ArtField* field = &fields->At(sorted_fields[index].field_index);
9470*795d594fSAndroid Build Coastguard Worker       field_offset = AssignFieldOffset<2u>(field, field_offset);
9471*795d594fSAndroid Build Coastguard Worker       ++index;
9472*795d594fSAndroid Build Coastguard Worker     }
9473*795d594fSAndroid Build Coastguard Worker   }
9474*795d594fSAndroid Build Coastguard Worker   // Process 8-bit fields.
9475*795d594fSAndroid Build Coastguard Worker   for (; index != num_fields && field_gaps.HasGap<1u>(); ++index) {
9476*795d594fSAndroid Build Coastguard Worker     ArtField* field = &fields->At(sorted_fields[index].field_index);
9477*795d594fSAndroid Build Coastguard Worker     AssignFieldOffset<1u>(field, field_gaps.ReleaseGap<1u>());  // Ignore return value.
9478*795d594fSAndroid Build Coastguard Worker   }
9479*795d594fSAndroid Build Coastguard Worker   for (; index != num_fields; ++index) {
9480*795d594fSAndroid Build Coastguard Worker     ArtField* field = &fields->At(sorted_fields[index].field_index);
9481*795d594fSAndroid Build Coastguard Worker     field_offset = AssignFieldOffset<1u>(field, field_offset);
9482*795d594fSAndroid Build Coastguard Worker   }
9483*795d594fSAndroid Build Coastguard Worker 
9484*795d594fSAndroid Build Coastguard Worker   self->EndAssertNoThreadSuspension(old_no_suspend_cause);
9485*795d594fSAndroid Build Coastguard Worker 
9486*795d594fSAndroid Build Coastguard Worker   // We lie to the GC about the java.lang.ref.Reference.referent field, so it doesn't scan it.
9487*795d594fSAndroid Build Coastguard Worker   DCHECK_IMPLIES(class_linker->init_done_, !klass->DescriptorEquals("Ljava/lang/ref/Reference;"));
9488*795d594fSAndroid Build Coastguard Worker   if (!is_static &&
9489*795d594fSAndroid Build Coastguard Worker       UNLIKELY(!class_linker->init_done_) &&
9490*795d594fSAndroid Build Coastguard Worker       klass->DescriptorEquals("Ljava/lang/ref/Reference;")) {
9491*795d594fSAndroid Build Coastguard Worker     // We know there are no non-reference fields in the Reference classes, and we know
9492*795d594fSAndroid Build Coastguard Worker     // that 'referent' is alphabetically last, so this is easy...
9493*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(num_reference_fields, num_fields) << klass->PrettyClass();
9494*795d594fSAndroid Build Coastguard Worker     CHECK_STREQ(fields->At(num_fields - 1).GetName(), "referent")
9495*795d594fSAndroid Build Coastguard Worker         << klass->PrettyClass();
9496*795d594fSAndroid Build Coastguard Worker     --num_reference_fields;
9497*795d594fSAndroid Build Coastguard Worker   }
9498*795d594fSAndroid Build Coastguard Worker 
9499*795d594fSAndroid Build Coastguard Worker   size_t size = field_offset.Uint32Value();
9500*795d594fSAndroid Build Coastguard Worker   // Update klass
9501*795d594fSAndroid Build Coastguard Worker   if (is_static) {
9502*795d594fSAndroid Build Coastguard Worker     klass->SetNumReferenceStaticFields(num_reference_fields);
9503*795d594fSAndroid Build Coastguard Worker     *class_size = size;
9504*795d594fSAndroid Build Coastguard Worker   } else {
9505*795d594fSAndroid Build Coastguard Worker     klass->SetNumReferenceInstanceFields(num_reference_fields);
9506*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
9507*795d594fSAndroid Build Coastguard Worker     if (num_reference_fields == 0 || super_class == nullptr) {
9508*795d594fSAndroid Build Coastguard Worker       // object has one reference field, klass, but we ignore it since we always visit the class.
9509*795d594fSAndroid Build Coastguard Worker       // super_class is null iff the class is java.lang.Object.
9510*795d594fSAndroid Build Coastguard Worker       if (super_class == nullptr ||
9511*795d594fSAndroid Build Coastguard Worker           (super_class->GetClassFlags() & mirror::kClassFlagNoReferenceFields) != 0) {
9512*795d594fSAndroid Build Coastguard Worker         klass->SetClassFlags(klass->GetClassFlags() | mirror::kClassFlagNoReferenceFields);
9513*795d594fSAndroid Build Coastguard Worker       }
9514*795d594fSAndroid Build Coastguard Worker     }
9515*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
9516*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(super_class == nullptr, klass->DescriptorEquals("Ljava/lang/Object;"));
9517*795d594fSAndroid Build Coastguard Worker       size_t total_reference_instance_fields = 0;
9518*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Class> cur_super = klass.Get();
9519*795d594fSAndroid Build Coastguard Worker       while (cur_super != nullptr) {
9520*795d594fSAndroid Build Coastguard Worker         total_reference_instance_fields += cur_super->NumReferenceInstanceFieldsDuringLinking();
9521*795d594fSAndroid Build Coastguard Worker         cur_super = cur_super->GetSuperClass();
9522*795d594fSAndroid Build Coastguard Worker       }
9523*795d594fSAndroid Build Coastguard Worker       if (super_class == nullptr) {
9524*795d594fSAndroid Build Coastguard Worker         CHECK_EQ(total_reference_instance_fields, 1u) << klass->PrettyDescriptor();
9525*795d594fSAndroid Build Coastguard Worker       } else {
9526*795d594fSAndroid Build Coastguard Worker         // Check that there is at least num_reference_fields other than Object.class.
9527*795d594fSAndroid Build Coastguard Worker         CHECK_GE(total_reference_instance_fields, 1u + num_reference_fields)
9528*795d594fSAndroid Build Coastguard Worker             << klass->PrettyClass();
9529*795d594fSAndroid Build Coastguard Worker       }
9530*795d594fSAndroid Build Coastguard Worker     }
9531*795d594fSAndroid Build Coastguard Worker     if (!klass->IsVariableSize()) {
9532*795d594fSAndroid Build Coastguard Worker       std::string temp;
9533*795d594fSAndroid Build Coastguard Worker       DCHECK_GE(size, sizeof(mirror::Object)) << klass->GetDescriptor(&temp);
9534*795d594fSAndroid Build Coastguard Worker       size_t previous_size = klass->GetObjectSize();
9535*795d594fSAndroid Build Coastguard Worker       if (previous_size != 0) {
9536*795d594fSAndroid Build Coastguard Worker         // Make sure that we didn't originally have an incorrect size.
9537*795d594fSAndroid Build Coastguard Worker         CHECK_EQ(previous_size, size) << klass->GetDescriptor(&temp);
9538*795d594fSAndroid Build Coastguard Worker       }
9539*795d594fSAndroid Build Coastguard Worker       klass->SetObjectSize(size);
9540*795d594fSAndroid Build Coastguard Worker     }
9541*795d594fSAndroid Build Coastguard Worker   }
9542*795d594fSAndroid Build Coastguard Worker 
9543*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
9544*795d594fSAndroid Build Coastguard Worker     // Make sure that the fields array is ordered by name but all reference
9545*795d594fSAndroid Build Coastguard Worker     // offsets are at the beginning as far as alignment allows.
9546*795d594fSAndroid Build Coastguard Worker     MemberOffset start_ref_offset = is_static
9547*795d594fSAndroid Build Coastguard Worker         ? klass->GetFirstReferenceStaticFieldOffsetDuringLinking(class_linker->image_pointer_size_)
9548*795d594fSAndroid Build Coastguard Worker         : klass->GetFirstReferenceInstanceFieldOffset();
9549*795d594fSAndroid Build Coastguard Worker     MemberOffset end_ref_offset(start_ref_offset.Uint32Value() +
9550*795d594fSAndroid Build Coastguard Worker                                 num_reference_fields *
9551*795d594fSAndroid Build Coastguard Worker                                     sizeof(mirror::HeapReference<mirror::Object>));
9552*795d594fSAndroid Build Coastguard Worker     MemberOffset current_ref_offset = start_ref_offset;
9553*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < num_fields; i++) {
9554*795d594fSAndroid Build Coastguard Worker       ArtField* field = &fields->At(i);
9555*795d594fSAndroid Build Coastguard Worker       VLOG(class_linker) << "LinkFields: " << (is_static ? "static" : "instance")
9556*795d594fSAndroid Build Coastguard Worker           << " class=" << klass->PrettyClass() << " field=" << field->PrettyField()
9557*795d594fSAndroid Build Coastguard Worker           << " offset=" << field->GetOffsetDuringLinking();
9558*795d594fSAndroid Build Coastguard Worker       if (i != 0) {
9559*795d594fSAndroid Build Coastguard Worker         ArtField* const prev_field = &fields->At(i - 1);
9560*795d594fSAndroid Build Coastguard Worker         // NOTE: The field names can be the same. This is not possible in the Java language
9561*795d594fSAndroid Build Coastguard Worker         // but it's valid Java/dex bytecode and for example proguard can generate such bytecode.
9562*795d594fSAndroid Build Coastguard Worker         DCHECK_LE(strcmp(prev_field->GetName(), field->GetName()), 0);
9563*795d594fSAndroid Build Coastguard Worker       }
9564*795d594fSAndroid Build Coastguard Worker       Primitive::Type type = field->GetTypeAsPrimitiveType();
9565*795d594fSAndroid Build Coastguard Worker       bool is_primitive = type != Primitive::kPrimNot;
9566*795d594fSAndroid Build Coastguard Worker       if (klass->DescriptorEquals("Ljava/lang/ref/Reference;") &&
9567*795d594fSAndroid Build Coastguard Worker           strcmp("referent", field->GetName()) == 0) {
9568*795d594fSAndroid Build Coastguard Worker         is_primitive = true;  // We lied above, so we have to expect a lie here.
9569*795d594fSAndroid Build Coastguard Worker       }
9570*795d594fSAndroid Build Coastguard Worker       MemberOffset offset = field->GetOffsetDuringLinking();
9571*795d594fSAndroid Build Coastguard Worker       if (is_primitive) {
9572*795d594fSAndroid Build Coastguard Worker         if (offset.Uint32Value() < end_ref_offset.Uint32Value()) {
9573*795d594fSAndroid Build Coastguard Worker           // Shuffled before references.
9574*795d594fSAndroid Build Coastguard Worker           size_t type_size = Primitive::ComponentSize(type);
9575*795d594fSAndroid Build Coastguard Worker           CHECK_LT(type_size, sizeof(mirror::HeapReference<mirror::Object>));
9576*795d594fSAndroid Build Coastguard Worker           CHECK_LT(offset.Uint32Value(), start_ref_offset.Uint32Value());
9577*795d594fSAndroid Build Coastguard Worker           CHECK_LE(offset.Uint32Value() + type_size, start_ref_offset.Uint32Value());
9578*795d594fSAndroid Build Coastguard Worker           CHECK(!IsAligned<sizeof(mirror::HeapReference<mirror::Object>)>(offset.Uint32Value()));
9579*795d594fSAndroid Build Coastguard Worker         }
9580*795d594fSAndroid Build Coastguard Worker       } else {
9581*795d594fSAndroid Build Coastguard Worker         CHECK_EQ(current_ref_offset.Uint32Value(), offset.Uint32Value());
9582*795d594fSAndroid Build Coastguard Worker         current_ref_offset = MemberOffset(current_ref_offset.Uint32Value() +
9583*795d594fSAndroid Build Coastguard Worker                                           sizeof(mirror::HeapReference<mirror::Object>));
9584*795d594fSAndroid Build Coastguard Worker       }
9585*795d594fSAndroid Build Coastguard Worker     }
9586*795d594fSAndroid Build Coastguard Worker     CHECK_EQ(current_ref_offset.Uint32Value(), end_ref_offset.Uint32Value());
9587*795d594fSAndroid Build Coastguard Worker   }
9588*795d594fSAndroid Build Coastguard Worker   return true;
9589*795d594fSAndroid Build Coastguard Worker }
9590*795d594fSAndroid Build Coastguard Worker 
LinkInstanceFields(Thread * self,Handle<mirror::Class> klass)9591*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkInstanceFields(Thread* self, Handle<mirror::Class> klass) {
9592*795d594fSAndroid Build Coastguard Worker   CHECK(klass != nullptr);
9593*795d594fSAndroid Build Coastguard Worker   return LinkFieldsHelper::LinkFields(this, self, klass, false, nullptr);
9594*795d594fSAndroid Build Coastguard Worker }
9595*795d594fSAndroid Build Coastguard Worker 
LinkStaticFields(Thread * self,Handle<mirror::Class> klass,size_t * class_size)9596*795d594fSAndroid Build Coastguard Worker bool ClassLinker::LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size) {
9597*795d594fSAndroid Build Coastguard Worker   CHECK(klass != nullptr);
9598*795d594fSAndroid Build Coastguard Worker   return LinkFieldsHelper::LinkFields(this, self, klass, true, class_size);
9599*795d594fSAndroid Build Coastguard Worker }
9600*795d594fSAndroid Build Coastguard Worker 
9601*795d594fSAndroid Build Coastguard Worker enum class RecordElementType : uint8_t {
9602*795d594fSAndroid Build Coastguard Worker   kNames = 0,
9603*795d594fSAndroid Build Coastguard Worker   kTypes = 1,
9604*795d594fSAndroid Build Coastguard Worker   kSignatures = 2,
9605*795d594fSAndroid Build Coastguard Worker   kAnnotationVisibilities = 3,
9606*795d594fSAndroid Build Coastguard Worker   kAnnotations = 4
9607*795d594fSAndroid Build Coastguard Worker };
9608*795d594fSAndroid Build Coastguard Worker 
9609*795d594fSAndroid Build Coastguard Worker static const char* kRecordElementNames[] = {"componentNames",
9610*795d594fSAndroid Build Coastguard Worker                                             "componentTypes",
9611*795d594fSAndroid Build Coastguard Worker                                             "componentSignatures",
9612*795d594fSAndroid Build Coastguard Worker                                             "componentAnnotationVisibilities",
9613*795d594fSAndroid Build Coastguard Worker                                             "componentAnnotations"};
9614*795d594fSAndroid Build Coastguard Worker 
9615*795d594fSAndroid Build Coastguard Worker class RecordAnnotationVisitor final : public annotations::AnnotationVisitor {
9616*795d594fSAndroid Build Coastguard Worker  public:
RecordAnnotationVisitor()9617*795d594fSAndroid Build Coastguard Worker   RecordAnnotationVisitor() {}
9618*795d594fSAndroid Build Coastguard Worker 
ValidateCounts()9619*795d594fSAndroid Build Coastguard Worker   bool ValidateCounts() {
9620*795d594fSAndroid Build Coastguard Worker     if (has_error_) {
9621*795d594fSAndroid Build Coastguard Worker       return false;
9622*795d594fSAndroid Build Coastguard Worker     }
9623*795d594fSAndroid Build Coastguard Worker 
9624*795d594fSAndroid Build Coastguard Worker     // Verify the counts.
9625*795d594fSAndroid Build Coastguard Worker     bool annotation_element_exists =
9626*795d594fSAndroid Build Coastguard Worker         (signatures_count_ != UINT32_MAX) || (annotations_count_ != UINT32_MAX);
9627*795d594fSAndroid Build Coastguard Worker     if (count_ >= 2) {
9628*795d594fSAndroid Build Coastguard Worker       SetErrorMsg("Record class can't have more than one @Record Annotation");
9629*795d594fSAndroid Build Coastguard Worker     } else if (names_count_ == UINT32_MAX) {
9630*795d594fSAndroid Build Coastguard Worker       SetErrorMsg("componentNames element is required");
9631*795d594fSAndroid Build Coastguard Worker     } else if (types_count_ == UINT32_MAX) {
9632*795d594fSAndroid Build Coastguard Worker       SetErrorMsg("componentTypes element is required");
9633*795d594fSAndroid Build Coastguard Worker     } else if (names_count_ != types_count_) {  // Every component must have a name and a type.
9634*795d594fSAndroid Build Coastguard Worker       SetErrorMsg(StringPrintf(
9635*795d594fSAndroid Build Coastguard Worker           "componentTypes is expected to have %i, but has %i types", names_count_, types_count_));
9636*795d594fSAndroid Build Coastguard Worker       // The other 3 elements are optional, but is expected to have the same count if it exists.
9637*795d594fSAndroid Build Coastguard Worker     } else if (signatures_count_ != UINT32_MAX && signatures_count_ != names_count_) {
9638*795d594fSAndroid Build Coastguard Worker       SetErrorMsg(StringPrintf("componentSignatures size is %i, but is expected to be %i",
9639*795d594fSAndroid Build Coastguard Worker                                signatures_count_,
9640*795d594fSAndroid Build Coastguard Worker                                names_count_));
9641*795d594fSAndroid Build Coastguard Worker     } else if (annotation_element_exists && visibilities_count_ != names_count_) {
9642*795d594fSAndroid Build Coastguard Worker       SetErrorMsg(
9643*795d594fSAndroid Build Coastguard Worker           StringPrintf("componentAnnotationVisibilities size is %i, but is expected to be %i",
9644*795d594fSAndroid Build Coastguard Worker                        visibilities_count_,
9645*795d594fSAndroid Build Coastguard Worker                        names_count_));
9646*795d594fSAndroid Build Coastguard Worker     } else if (annotation_element_exists && annotations_count_ != names_count_) {
9647*795d594fSAndroid Build Coastguard Worker       SetErrorMsg(StringPrintf("componentAnnotations size is %i, but is expected to be %i",
9648*795d594fSAndroid Build Coastguard Worker                                annotations_count_,
9649*795d594fSAndroid Build Coastguard Worker                                names_count_));
9650*795d594fSAndroid Build Coastguard Worker     }
9651*795d594fSAndroid Build Coastguard Worker 
9652*795d594fSAndroid Build Coastguard Worker     return !has_error_;
9653*795d594fSAndroid Build Coastguard Worker   }
9654*795d594fSAndroid Build Coastguard Worker 
IsRecordAnnotationFound()9655*795d594fSAndroid Build Coastguard Worker   bool IsRecordAnnotationFound() { return count_ != 0; }
9656*795d594fSAndroid Build Coastguard Worker 
VisitAnnotation(const char * descriptor,uint8_t visibility)9657*795d594fSAndroid Build Coastguard Worker   annotations::VisitorStatus VisitAnnotation(const char* descriptor, uint8_t visibility) override {
9658*795d594fSAndroid Build Coastguard Worker     if (has_error_) {
9659*795d594fSAndroid Build Coastguard Worker       return annotations::VisitorStatus::kVisitBreak;
9660*795d594fSAndroid Build Coastguard Worker     }
9661*795d594fSAndroid Build Coastguard Worker 
9662*795d594fSAndroid Build Coastguard Worker     if (visibility != DexFile::kDexVisibilitySystem) {
9663*795d594fSAndroid Build Coastguard Worker       return annotations::VisitorStatus::kVisitNext;
9664*795d594fSAndroid Build Coastguard Worker     }
9665*795d594fSAndroid Build Coastguard Worker 
9666*795d594fSAndroid Build Coastguard Worker     if (strcmp(descriptor, "Ldalvik/annotation/Record;") != 0) {
9667*795d594fSAndroid Build Coastguard Worker       return annotations::VisitorStatus::kVisitNext;
9668*795d594fSAndroid Build Coastguard Worker     }
9669*795d594fSAndroid Build Coastguard Worker 
9670*795d594fSAndroid Build Coastguard Worker     count_ += 1;
9671*795d594fSAndroid Build Coastguard Worker     if (count_ >= 2) {
9672*795d594fSAndroid Build Coastguard Worker       return annotations::VisitorStatus::kVisitBreak;
9673*795d594fSAndroid Build Coastguard Worker     }
9674*795d594fSAndroid Build Coastguard Worker     return annotations::VisitorStatus::kVisitInner;
9675*795d594fSAndroid Build Coastguard Worker   }
9676*795d594fSAndroid Build Coastguard Worker 
VisitAnnotationElement(const char * element_name,uint8_t type,const JValue & value)9677*795d594fSAndroid Build Coastguard Worker   annotations::VisitorStatus VisitAnnotationElement(const char* element_name,
9678*795d594fSAndroid Build Coastguard Worker                                                     uint8_t type,
9679*795d594fSAndroid Build Coastguard Worker                                                     [[maybe_unused]] const JValue& value) override {
9680*795d594fSAndroid Build Coastguard Worker     if (has_error_) {
9681*795d594fSAndroid Build Coastguard Worker       return annotations::VisitorStatus::kVisitBreak;
9682*795d594fSAndroid Build Coastguard Worker     }
9683*795d594fSAndroid Build Coastguard Worker 
9684*795d594fSAndroid Build Coastguard Worker     RecordElementType visiting_type;
9685*795d594fSAndroid Build Coastguard Worker     uint32_t* element_count;
9686*795d594fSAndroid Build Coastguard Worker     if (strcmp(element_name, "componentNames") == 0) {
9687*795d594fSAndroid Build Coastguard Worker       visiting_type = RecordElementType::kNames;
9688*795d594fSAndroid Build Coastguard Worker       element_count = &names_count_;
9689*795d594fSAndroid Build Coastguard Worker     } else if (strcmp(element_name, "componentTypes") == 0) {
9690*795d594fSAndroid Build Coastguard Worker       visiting_type = RecordElementType::kTypes;
9691*795d594fSAndroid Build Coastguard Worker       element_count = &types_count_;
9692*795d594fSAndroid Build Coastguard Worker     } else if (strcmp(element_name, "componentSignatures") == 0) {
9693*795d594fSAndroid Build Coastguard Worker       visiting_type = RecordElementType::kSignatures;
9694*795d594fSAndroid Build Coastguard Worker       element_count = &signatures_count_;
9695*795d594fSAndroid Build Coastguard Worker     } else if (strcmp(element_name, "componentAnnotationVisibilities") == 0) {
9696*795d594fSAndroid Build Coastguard Worker       visiting_type = RecordElementType::kAnnotationVisibilities;
9697*795d594fSAndroid Build Coastguard Worker       element_count = &visibilities_count_;
9698*795d594fSAndroid Build Coastguard Worker     } else if (strcmp(element_name, "componentAnnotations") == 0) {
9699*795d594fSAndroid Build Coastguard Worker       visiting_type = RecordElementType::kAnnotations;
9700*795d594fSAndroid Build Coastguard Worker       element_count = &annotations_count_;
9701*795d594fSAndroid Build Coastguard Worker     } else {
9702*795d594fSAndroid Build Coastguard Worker       // ignore this element that could be introduced in the future ART.
9703*795d594fSAndroid Build Coastguard Worker       return annotations::VisitorStatus::kVisitNext;
9704*795d594fSAndroid Build Coastguard Worker     }
9705*795d594fSAndroid Build Coastguard Worker 
9706*795d594fSAndroid Build Coastguard Worker     if ((*element_count) != UINT32_MAX) {
9707*795d594fSAndroid Build Coastguard Worker       SetErrorMsg(StringPrintf("Two %s annotation elements are found but only one is expected",
9708*795d594fSAndroid Build Coastguard Worker                                kRecordElementNames[static_cast<uint8_t>(visiting_type)]));
9709*795d594fSAndroid Build Coastguard Worker       return annotations::VisitorStatus::kVisitBreak;
9710*795d594fSAndroid Build Coastguard Worker     }
9711*795d594fSAndroid Build Coastguard Worker 
9712*795d594fSAndroid Build Coastguard Worker     if (type != DexFile::kDexAnnotationArray) {
9713*795d594fSAndroid Build Coastguard Worker       SetErrorMsg(StringPrintf("%s must be array type", element_name));
9714*795d594fSAndroid Build Coastguard Worker       return annotations::VisitorStatus::kVisitBreak;
9715*795d594fSAndroid Build Coastguard Worker     }
9716*795d594fSAndroid Build Coastguard Worker 
9717*795d594fSAndroid Build Coastguard Worker     *element_count = 0;
9718*795d594fSAndroid Build Coastguard Worker     visiting_type_ = visiting_type;
9719*795d594fSAndroid Build Coastguard Worker     return annotations::VisitorStatus::kVisitInner;
9720*795d594fSAndroid Build Coastguard Worker   }
9721*795d594fSAndroid Build Coastguard Worker 
VisitArrayElement(uint8_t depth,uint32_t index,uint8_t type,const JValue & value)9722*795d594fSAndroid Build Coastguard Worker   annotations::VisitorStatus VisitArrayElement(uint8_t depth,
9723*795d594fSAndroid Build Coastguard Worker                                                uint32_t index,
9724*795d594fSAndroid Build Coastguard Worker                                                uint8_t type,
9725*795d594fSAndroid Build Coastguard Worker                                                [[maybe_unused]] const JValue& value) override {
9726*795d594fSAndroid Build Coastguard Worker     if (has_error_) {
9727*795d594fSAndroid Build Coastguard Worker       return annotations::VisitorStatus::kVisitBreak;
9728*795d594fSAndroid Build Coastguard Worker     }
9729*795d594fSAndroid Build Coastguard Worker     switch (visiting_type_) {
9730*795d594fSAndroid Build Coastguard Worker       case RecordElementType::kNames: {
9731*795d594fSAndroid Build Coastguard Worker         if (depth == 0) {
9732*795d594fSAndroid Build Coastguard Worker           if (!ExpectedTypeOrError(
9733*795d594fSAndroid Build Coastguard Worker                   type, DexFile::kDexAnnotationString, visiting_type_, index, depth)) {
9734*795d594fSAndroid Build Coastguard Worker             return annotations::VisitorStatus::kVisitBreak;
9735*795d594fSAndroid Build Coastguard Worker           }
9736*795d594fSAndroid Build Coastguard Worker           names_count_++;
9737*795d594fSAndroid Build Coastguard Worker           return annotations::VisitorStatus::kVisitNext;
9738*795d594fSAndroid Build Coastguard Worker         }
9739*795d594fSAndroid Build Coastguard Worker         break;
9740*795d594fSAndroid Build Coastguard Worker       }
9741*795d594fSAndroid Build Coastguard Worker       case RecordElementType::kTypes: {
9742*795d594fSAndroid Build Coastguard Worker         if (depth == 0) {
9743*795d594fSAndroid Build Coastguard Worker           if (!ExpectedTypeOrError(
9744*795d594fSAndroid Build Coastguard Worker                   type, DexFile::kDexAnnotationType, visiting_type_, index, depth)) {
9745*795d594fSAndroid Build Coastguard Worker             return annotations::VisitorStatus::kVisitBreak;
9746*795d594fSAndroid Build Coastguard Worker           }
9747*795d594fSAndroid Build Coastguard Worker           types_count_++;
9748*795d594fSAndroid Build Coastguard Worker           return annotations::VisitorStatus::kVisitNext;
9749*795d594fSAndroid Build Coastguard Worker         }
9750*795d594fSAndroid Build Coastguard Worker         break;
9751*795d594fSAndroid Build Coastguard Worker       }
9752*795d594fSAndroid Build Coastguard Worker       case RecordElementType::kSignatures: {
9753*795d594fSAndroid Build Coastguard Worker         if (depth == 0) {
9754*795d594fSAndroid Build Coastguard Worker           // kDexAnnotationNull implies no generic signature for the component.
9755*795d594fSAndroid Build Coastguard Worker           if (type != DexFile::kDexAnnotationNull &&
9756*795d594fSAndroid Build Coastguard Worker               !ExpectedTypeOrError(
9757*795d594fSAndroid Build Coastguard Worker                   type, DexFile::kDexAnnotationAnnotation, visiting_type_, index, depth)) {
9758*795d594fSAndroid Build Coastguard Worker             return annotations::VisitorStatus::kVisitBreak;
9759*795d594fSAndroid Build Coastguard Worker           }
9760*795d594fSAndroid Build Coastguard Worker           signatures_count_++;
9761*795d594fSAndroid Build Coastguard Worker           return annotations::VisitorStatus::kVisitNext;
9762*795d594fSAndroid Build Coastguard Worker         }
9763*795d594fSAndroid Build Coastguard Worker         break;
9764*795d594fSAndroid Build Coastguard Worker       }
9765*795d594fSAndroid Build Coastguard Worker       case RecordElementType::kAnnotationVisibilities: {
9766*795d594fSAndroid Build Coastguard Worker         if (depth == 0) {
9767*795d594fSAndroid Build Coastguard Worker           if (!ExpectedTypeOrError(
9768*795d594fSAndroid Build Coastguard Worker                   type, DexFile::kDexAnnotationArray, visiting_type_, index, depth)) {
9769*795d594fSAndroid Build Coastguard Worker             return annotations::VisitorStatus::kVisitBreak;
9770*795d594fSAndroid Build Coastguard Worker           }
9771*795d594fSAndroid Build Coastguard Worker           visibilities_count_++;
9772*795d594fSAndroid Build Coastguard Worker           return annotations::VisitorStatus::kVisitInner;
9773*795d594fSAndroid Build Coastguard Worker         } else if (depth == 1) {
9774*795d594fSAndroid Build Coastguard Worker           if (!ExpectedTypeOrError(
9775*795d594fSAndroid Build Coastguard Worker                   type, DexFile::kDexAnnotationByte, visiting_type_, index, depth)) {
9776*795d594fSAndroid Build Coastguard Worker             return annotations::VisitorStatus::kVisitBreak;
9777*795d594fSAndroid Build Coastguard Worker           }
9778*795d594fSAndroid Build Coastguard Worker           return annotations::VisitorStatus::kVisitNext;
9779*795d594fSAndroid Build Coastguard Worker         }
9780*795d594fSAndroid Build Coastguard Worker         break;
9781*795d594fSAndroid Build Coastguard Worker       }
9782*795d594fSAndroid Build Coastguard Worker       case RecordElementType::kAnnotations: {
9783*795d594fSAndroid Build Coastguard Worker         if (depth == 0) {
9784*795d594fSAndroid Build Coastguard Worker           if (!ExpectedTypeOrError(
9785*795d594fSAndroid Build Coastguard Worker                   type, DexFile::kDexAnnotationArray, visiting_type_, index, depth)) {
9786*795d594fSAndroid Build Coastguard Worker             return annotations::VisitorStatus::kVisitBreak;
9787*795d594fSAndroid Build Coastguard Worker           }
9788*795d594fSAndroid Build Coastguard Worker           annotations_count_++;
9789*795d594fSAndroid Build Coastguard Worker           return annotations::VisitorStatus::kVisitInner;
9790*795d594fSAndroid Build Coastguard Worker         } else if (depth == 1) {
9791*795d594fSAndroid Build Coastguard Worker           if (!ExpectedTypeOrError(
9792*795d594fSAndroid Build Coastguard Worker                   type, DexFile::kDexAnnotationAnnotation, visiting_type_, index, depth)) {
9793*795d594fSAndroid Build Coastguard Worker             return annotations::VisitorStatus::kVisitBreak;
9794*795d594fSAndroid Build Coastguard Worker           }
9795*795d594fSAndroid Build Coastguard Worker           return annotations::VisitorStatus::kVisitNext;
9796*795d594fSAndroid Build Coastguard Worker         }
9797*795d594fSAndroid Build Coastguard Worker         break;
9798*795d594fSAndroid Build Coastguard Worker       }
9799*795d594fSAndroid Build Coastguard Worker     }
9800*795d594fSAndroid Build Coastguard Worker 
9801*795d594fSAndroid Build Coastguard Worker     // Should never happen if every next depth level is handled above whenever kVisitInner is
9802*795d594fSAndroid Build Coastguard Worker     // returned.
9803*795d594fSAndroid Build Coastguard Worker     DCHECK(false) << StringPrintf("Unexpected depth %i for element %s",
9804*795d594fSAndroid Build Coastguard Worker                                   depth,
9805*795d594fSAndroid Build Coastguard Worker                                   kRecordElementNames[static_cast<uint8_t>(visiting_type_)]);
9806*795d594fSAndroid Build Coastguard Worker     return annotations::VisitorStatus::kVisitBreak;
9807*795d594fSAndroid Build Coastguard Worker   }
9808*795d594fSAndroid Build Coastguard Worker 
9809*795d594fSAndroid Build Coastguard Worker  private:
9810*795d594fSAndroid Build Coastguard Worker   uint32_t count_ = 0;
9811*795d594fSAndroid Build Coastguard Worker   uint32_t names_count_ = UINT32_MAX;
9812*795d594fSAndroid Build Coastguard Worker   uint32_t types_count_ = UINT32_MAX;
9813*795d594fSAndroid Build Coastguard Worker   uint32_t signatures_count_ = UINT32_MAX;
9814*795d594fSAndroid Build Coastguard Worker   uint32_t visibilities_count_ = UINT32_MAX;
9815*795d594fSAndroid Build Coastguard Worker   uint32_t annotations_count_ = UINT32_MAX;
9816*795d594fSAndroid Build Coastguard Worker   RecordElementType visiting_type_;
9817*795d594fSAndroid Build Coastguard Worker 
ExpectedTypeOrError(uint8_t type,uint8_t expected,RecordElementType visiting_type,uint8_t depth,uint32_t index)9818*795d594fSAndroid Build Coastguard Worker   inline bool ExpectedTypeOrError(uint8_t type,
9819*795d594fSAndroid Build Coastguard Worker                                   uint8_t expected,
9820*795d594fSAndroid Build Coastguard Worker                                   RecordElementType visiting_type,
9821*795d594fSAndroid Build Coastguard Worker                                   uint8_t depth,
9822*795d594fSAndroid Build Coastguard Worker                                   uint32_t index) {
9823*795d594fSAndroid Build Coastguard Worker     if (type == expected) {
9824*795d594fSAndroid Build Coastguard Worker       return true;
9825*795d594fSAndroid Build Coastguard Worker     }
9826*795d594fSAndroid Build Coastguard Worker 
9827*795d594fSAndroid Build Coastguard Worker     SetErrorMsg(StringPrintf(
9828*795d594fSAndroid Build Coastguard Worker         "Expect 0x%02x type but got 0x%02x at the index %i and depth %i for the element %s",
9829*795d594fSAndroid Build Coastguard Worker         expected,
9830*795d594fSAndroid Build Coastguard Worker         type,
9831*795d594fSAndroid Build Coastguard Worker         index,
9832*795d594fSAndroid Build Coastguard Worker         depth,
9833*795d594fSAndroid Build Coastguard Worker         kRecordElementNames[static_cast<uint8_t>(visiting_type)]));
9834*795d594fSAndroid Build Coastguard Worker     return false;
9835*795d594fSAndroid Build Coastguard Worker   }
9836*795d594fSAndroid Build Coastguard Worker 
9837*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(RecordAnnotationVisitor);
9838*795d594fSAndroid Build Coastguard Worker };
9839*795d594fSAndroid Build Coastguard Worker 
9840*795d594fSAndroid Build Coastguard Worker /**
9841*795d594fSAndroid Build Coastguard Worker  * Set kClassFlagRecord and verify if klass is a record class.
9842*795d594fSAndroid Build Coastguard Worker  * If the verification fails, a pending java exception is thrown.
9843*795d594fSAndroid Build Coastguard Worker  *
9844*795d594fSAndroid Build Coastguard Worker  * @return false if verification fails. If klass isn't a record class,
9845*795d594fSAndroid Build Coastguard Worker  * it should always return true.
9846*795d594fSAndroid Build Coastguard Worker  */
VerifyRecordClass(Handle<mirror::Class> klass,ObjPtr<mirror::Class> super)9847*795d594fSAndroid Build Coastguard Worker bool ClassLinker::VerifyRecordClass(Handle<mirror::Class> klass, ObjPtr<mirror::Class> super) {
9848*795d594fSAndroid Build Coastguard Worker   CHECK(klass != nullptr);
9849*795d594fSAndroid Build Coastguard Worker   // First, we check the conditions specified in java.lang.Class#isRecord().
9850*795d594fSAndroid Build Coastguard Worker   // If any of the conditions isn't fulfilled, it's not a record class and
9851*795d594fSAndroid Build Coastguard Worker   // ART should treat it as a normal class even if it's inherited from java.lang.Record.
9852*795d594fSAndroid Build Coastguard Worker   if (!klass->IsFinal()) {
9853*795d594fSAndroid Build Coastguard Worker     return true;
9854*795d594fSAndroid Build Coastguard Worker   }
9855*795d594fSAndroid Build Coastguard Worker 
9856*795d594fSAndroid Build Coastguard Worker   if (super == nullptr) {
9857*795d594fSAndroid Build Coastguard Worker     return true;
9858*795d594fSAndroid Build Coastguard Worker   }
9859*795d594fSAndroid Build Coastguard Worker 
9860*795d594fSAndroid Build Coastguard Worker   // Compare the string directly when this ClassLinker is initializing before
9861*795d594fSAndroid Build Coastguard Worker   // WellKnownClasses initializes
9862*795d594fSAndroid Build Coastguard Worker   if (WellKnownClasses::java_lang_Record == nullptr) {
9863*795d594fSAndroid Build Coastguard Worker     if (!super->DescriptorEquals("Ljava/lang/Record;")) {
9864*795d594fSAndroid Build Coastguard Worker       return true;
9865*795d594fSAndroid Build Coastguard Worker     }
9866*795d594fSAndroid Build Coastguard Worker   } else {
9867*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> java_lang_Record =
9868*795d594fSAndroid Build Coastguard Worker         WellKnownClasses::ToClass(WellKnownClasses::java_lang_Record);
9869*795d594fSAndroid Build Coastguard Worker     if (super.Ptr() != java_lang_Record.Ptr()) {
9870*795d594fSAndroid Build Coastguard Worker       return true;
9871*795d594fSAndroid Build Coastguard Worker     }
9872*795d594fSAndroid Build Coastguard Worker   }
9873*795d594fSAndroid Build Coastguard Worker 
9874*795d594fSAndroid Build Coastguard Worker   // Verify @dalvik.annotation.Record
9875*795d594fSAndroid Build Coastguard Worker   // The annotation has a mandatory element componentNames[] and componentTypes[] of the same size.
9876*795d594fSAndroid Build Coastguard Worker   // componentSignatures[], componentAnnotationVisibilities[][], componentAnnotations[][] are
9877*795d594fSAndroid Build Coastguard Worker   // optional, but should have the same size if it exists.
9878*795d594fSAndroid Build Coastguard Worker   RecordAnnotationVisitor visitor;
9879*795d594fSAndroid Build Coastguard Worker   annotations::VisitClassAnnotations(klass, &visitor);
9880*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(visitor.HasError())) {
9881*795d594fSAndroid Build Coastguard Worker     ThrowClassFormatError(klass.Get(), "%s", visitor.GetErrorMsg().c_str());
9882*795d594fSAndroid Build Coastguard Worker     return false;
9883*795d594fSAndroid Build Coastguard Worker   }
9884*795d594fSAndroid Build Coastguard Worker 
9885*795d594fSAndroid Build Coastguard Worker   if (!visitor.IsRecordAnnotationFound()) {
9886*795d594fSAndroid Build Coastguard Worker     return true;
9887*795d594fSAndroid Build Coastguard Worker   }
9888*795d594fSAndroid Build Coastguard Worker 
9889*795d594fSAndroid Build Coastguard Worker   if (!visitor.ValidateCounts()) {
9890*795d594fSAndroid Build Coastguard Worker     ThrowClassFormatError(klass.Get(), "%s", visitor.GetErrorMsg().c_str());
9891*795d594fSAndroid Build Coastguard Worker     return false;
9892*795d594fSAndroid Build Coastguard Worker   }
9893*795d594fSAndroid Build Coastguard Worker 
9894*795d594fSAndroid Build Coastguard Worker   // Set kClassFlagRecord.
9895*795d594fSAndroid Build Coastguard Worker   klass->SetRecordClass();
9896*795d594fSAndroid Build Coastguard Worker   return true;
9897*795d594fSAndroid Build Coastguard Worker }
9898*795d594fSAndroid Build Coastguard Worker 
DoResolveString(dex::StringIndex string_idx,ObjPtr<mirror::DexCache> dex_cache)9899*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::String> ClassLinker::DoResolveString(dex::StringIndex string_idx,
9900*795d594fSAndroid Build Coastguard Worker                                                     ObjPtr<mirror::DexCache> dex_cache) {
9901*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(Thread::Current());
9902*795d594fSAndroid Build Coastguard Worker   Handle<mirror::DexCache> h_dex_cache(hs.NewHandle(dex_cache));
9903*795d594fSAndroid Build Coastguard Worker   return DoResolveString(string_idx, h_dex_cache);
9904*795d594fSAndroid Build Coastguard Worker }
9905*795d594fSAndroid Build Coastguard Worker 
DoResolveString(dex::StringIndex string_idx,Handle<mirror::DexCache> dex_cache)9906*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::String> ClassLinker::DoResolveString(dex::StringIndex string_idx,
9907*795d594fSAndroid Build Coastguard Worker                                                     Handle<mirror::DexCache> dex_cache) {
9908*795d594fSAndroid Build Coastguard Worker   const DexFile& dex_file = *dex_cache->GetDexFile();
9909*795d594fSAndroid Build Coastguard Worker   uint32_t utf16_length;
9910*795d594fSAndroid Build Coastguard Worker   const char* utf8_data = dex_file.GetStringDataAndUtf16Length(string_idx, &utf16_length);
9911*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::String> string = intern_table_->InternStrong(utf16_length, utf8_data);
9912*795d594fSAndroid Build Coastguard Worker   if (string != nullptr) {
9913*795d594fSAndroid Build Coastguard Worker     dex_cache->SetResolvedString(string_idx, string);
9914*795d594fSAndroid Build Coastguard Worker   }
9915*795d594fSAndroid Build Coastguard Worker   return string;
9916*795d594fSAndroid Build Coastguard Worker }
9917*795d594fSAndroid Build Coastguard Worker 
DoLookupString(dex::StringIndex string_idx,ObjPtr<mirror::DexCache> dex_cache)9918*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::String> ClassLinker::DoLookupString(dex::StringIndex string_idx,
9919*795d594fSAndroid Build Coastguard Worker                                                    ObjPtr<mirror::DexCache> dex_cache) {
9920*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache != nullptr);
9921*795d594fSAndroid Build Coastguard Worker   const DexFile& dex_file = *dex_cache->GetDexFile();
9922*795d594fSAndroid Build Coastguard Worker   uint32_t utf16_length;
9923*795d594fSAndroid Build Coastguard Worker   const char* utf8_data = dex_file.GetStringDataAndUtf16Length(string_idx, &utf16_length);
9924*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::String> string =
9925*795d594fSAndroid Build Coastguard Worker       intern_table_->LookupStrong(Thread::Current(), utf16_length, utf8_data);
9926*795d594fSAndroid Build Coastguard Worker   if (string != nullptr) {
9927*795d594fSAndroid Build Coastguard Worker     dex_cache->SetResolvedString(string_idx, string);
9928*795d594fSAndroid Build Coastguard Worker   }
9929*795d594fSAndroid Build Coastguard Worker   return string;
9930*795d594fSAndroid Build Coastguard Worker }
9931*795d594fSAndroid Build Coastguard Worker 
DoLookupResolvedType(dex::TypeIndex type_idx,ObjPtr<mirror::Class> referrer)9932*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::DoLookupResolvedType(dex::TypeIndex type_idx,
9933*795d594fSAndroid Build Coastguard Worker                                                         ObjPtr<mirror::Class> referrer) {
9934*795d594fSAndroid Build Coastguard Worker   return DoLookupResolvedType(type_idx, referrer->GetDexCache(), referrer->GetClassLoader());
9935*795d594fSAndroid Build Coastguard Worker }
9936*795d594fSAndroid Build Coastguard Worker 
DoLookupResolvedType(dex::TypeIndex type_idx,ObjPtr<mirror::DexCache> dex_cache,ObjPtr<mirror::ClassLoader> class_loader)9937*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::DoLookupResolvedType(dex::TypeIndex type_idx,
9938*795d594fSAndroid Build Coastguard Worker                                                         ObjPtr<mirror::DexCache> dex_cache,
9939*795d594fSAndroid Build Coastguard Worker                                                         ObjPtr<mirror::ClassLoader> class_loader) {
9940*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader() == class_loader);
9941*795d594fSAndroid Build Coastguard Worker   const DexFile& dex_file = *dex_cache->GetDexFile();
9942*795d594fSAndroid Build Coastguard Worker   std::string_view descriptor = dex_file.GetTypeDescriptorView(type_idx);
9943*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> type = LookupResolvedType(descriptor, class_loader);
9944*795d594fSAndroid Build Coastguard Worker   if (type != nullptr) {
9945*795d594fSAndroid Build Coastguard Worker     DCHECK(type->IsResolved());
9946*795d594fSAndroid Build Coastguard Worker     dex_cache->SetResolvedType(type_idx, type);
9947*795d594fSAndroid Build Coastguard Worker   }
9948*795d594fSAndroid Build Coastguard Worker   return type;
9949*795d594fSAndroid Build Coastguard Worker }
9950*795d594fSAndroid Build Coastguard Worker 
LookupResolvedType(std::string_view descriptor,ObjPtr<mirror::ClassLoader> class_loader)9951*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::LookupResolvedType(std::string_view descriptor,
9952*795d594fSAndroid Build Coastguard Worker                                                       ObjPtr<mirror::ClassLoader> class_loader) {
9953*795d594fSAndroid Build Coastguard Worker   DCHECK(!descriptor.empty()) << "descriptor is empty string";
9954*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> type = nullptr;
9955*795d594fSAndroid Build Coastguard Worker   if (descriptor.length() == 1u) {
9956*795d594fSAndroid Build Coastguard Worker     // only the descriptors of primitive types should be 1 character long, also avoid class lookup
9957*795d594fSAndroid Build Coastguard Worker     // for primitive classes that aren't backed by dex files.
9958*795d594fSAndroid Build Coastguard Worker     type = LookupPrimitiveClass(descriptor[0]);
9959*795d594fSAndroid Build Coastguard Worker   } else {
9960*795d594fSAndroid Build Coastguard Worker     Thread* const self = Thread::Current();
9961*795d594fSAndroid Build Coastguard Worker     DCHECK(self != nullptr);
9962*795d594fSAndroid Build Coastguard Worker     const size_t hash = ComputeModifiedUtf8Hash(descriptor);
9963*795d594fSAndroid Build Coastguard Worker     // Find the class in the loaded classes table.
9964*795d594fSAndroid Build Coastguard Worker     type = LookupClass(self, descriptor, hash, class_loader);
9965*795d594fSAndroid Build Coastguard Worker   }
9966*795d594fSAndroid Build Coastguard Worker   return (type != nullptr && type->IsResolved()) ? type : nullptr;
9967*795d594fSAndroid Build Coastguard Worker }
9968*795d594fSAndroid Build Coastguard Worker 
9969*795d594fSAndroid Build Coastguard Worker template <typename RefType>
DoResolveType(dex::TypeIndex type_idx,RefType referrer)9970*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx, RefType referrer) {
9971*795d594fSAndroid Build Coastguard Worker   StackHandleScope<2> hs(Thread::Current());
9972*795d594fSAndroid Build Coastguard Worker   Handle<mirror::DexCache> dex_cache(hs.NewHandle(referrer->GetDexCache()));
9973*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader(hs.NewHandle(referrer->GetClassLoader()));
9974*795d594fSAndroid Build Coastguard Worker   return DoResolveType(type_idx, dex_cache, class_loader);
9975*795d594fSAndroid Build Coastguard Worker }
9976*795d594fSAndroid Build Coastguard Worker 
9977*795d594fSAndroid Build Coastguard Worker // Instantiate the above.
9978*795d594fSAndroid Build Coastguard Worker template ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx,
9979*795d594fSAndroid Build Coastguard Worker                                                           ArtField* referrer);
9980*795d594fSAndroid Build Coastguard Worker template ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx,
9981*795d594fSAndroid Build Coastguard Worker                                                           ArtMethod* referrer);
9982*795d594fSAndroid Build Coastguard Worker template ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx,
9983*795d594fSAndroid Build Coastguard Worker                                                           ObjPtr<mirror::Class> referrer);
9984*795d594fSAndroid Build Coastguard Worker 
DoResolveType(dex::TypeIndex type_idx,Handle<mirror::DexCache> dex_cache,Handle<mirror::ClassLoader> class_loader)9985*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx,
9986*795d594fSAndroid Build Coastguard Worker                                                  Handle<mirror::DexCache> dex_cache,
9987*795d594fSAndroid Build Coastguard Worker                                                  Handle<mirror::ClassLoader> class_loader) {
9988*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader() == class_loader.Get());
9989*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
9990*795d594fSAndroid Build Coastguard Worker   const DexFile* dex_file = dex_cache->GetDexFile();
9991*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> resolved = FindClass(self, *dex_file, type_idx, class_loader);
9992*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr) {
9993*795d594fSAndroid Build Coastguard Worker     // TODO: we used to throw here if resolved's class loader was not the
9994*795d594fSAndroid Build Coastguard Worker     //       boot class loader. This was to permit different classes with the
9995*795d594fSAndroid Build Coastguard Worker     //       same name to be loaded simultaneously by different loaders
9996*795d594fSAndroid Build Coastguard Worker     dex_cache->SetResolvedType(type_idx, resolved);
9997*795d594fSAndroid Build Coastguard Worker   } else {
9998*795d594fSAndroid Build Coastguard Worker     CHECK(self->IsExceptionPending())
9999*795d594fSAndroid Build Coastguard Worker         << "Expected pending exception for failed resolution of: "
10000*795d594fSAndroid Build Coastguard Worker         << dex_file->GetTypeDescriptor(type_idx);
10001*795d594fSAndroid Build Coastguard Worker     // Convert a ClassNotFoundException to a NoClassDefFoundError.
10002*795d594fSAndroid Build Coastguard Worker     StackHandleScope<1> hs(self);
10003*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Throwable> cause(hs.NewHandle(self->GetException()));
10004*795d594fSAndroid Build Coastguard Worker     if (cause->InstanceOf(GetClassRoot(ClassRoot::kJavaLangClassNotFoundException, this))) {
10005*795d594fSAndroid Build Coastguard Worker       DCHECK(resolved == nullptr);  // No Handle needed to preserve resolved.
10006*795d594fSAndroid Build Coastguard Worker       self->ClearException();
10007*795d594fSAndroid Build Coastguard Worker       ThrowNoClassDefFoundError("Failed resolution of: %s", dex_file->GetTypeDescriptor(type_idx));
10008*795d594fSAndroid Build Coastguard Worker       self->GetException()->SetCause(cause.Get());
10009*795d594fSAndroid Build Coastguard Worker     }
10010*795d594fSAndroid Build Coastguard Worker   }
10011*795d594fSAndroid Build Coastguard Worker   DCHECK((resolved == nullptr) || resolved->IsResolved())
10012*795d594fSAndroid Build Coastguard Worker       << resolved->PrettyDescriptor() << " " << resolved->GetStatus();
10013*795d594fSAndroid Build Coastguard Worker   return resolved;
10014*795d594fSAndroid Build Coastguard Worker }
10015*795d594fSAndroid Build Coastguard Worker 
FindResolvedMethod(ObjPtr<mirror::Class> klass,ObjPtr<mirror::DexCache> dex_cache,ObjPtr<mirror::ClassLoader> class_loader,uint32_t method_idx)10016*795d594fSAndroid Build Coastguard Worker ArtMethod* ClassLinker::FindResolvedMethod(ObjPtr<mirror::Class> klass,
10017*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::DexCache> dex_cache,
10018*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::ClassLoader> class_loader,
10019*795d594fSAndroid Build Coastguard Worker                                            uint32_t method_idx) {
10020*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader() == class_loader);
10021*795d594fSAndroid Build Coastguard Worker   // Search for the method using dex_cache and method_idx. The Class::Find*Method()
10022*795d594fSAndroid Build Coastguard Worker   // functions can optimize the search if the dex_cache is the same as the DexCache
10023*795d594fSAndroid Build Coastguard Worker   // of the class, with fall-back to name and signature search otherwise.
10024*795d594fSAndroid Build Coastguard Worker   ArtMethod* resolved = nullptr;
10025*795d594fSAndroid Build Coastguard Worker   if (klass->IsInterface()) {
10026*795d594fSAndroid Build Coastguard Worker     resolved = klass->FindInterfaceMethod(dex_cache, method_idx, image_pointer_size_);
10027*795d594fSAndroid Build Coastguard Worker   } else {
10028*795d594fSAndroid Build Coastguard Worker     resolved = klass->FindClassMethod(dex_cache, method_idx, image_pointer_size_);
10029*795d594fSAndroid Build Coastguard Worker   }
10030*795d594fSAndroid Build Coastguard Worker   DCHECK(resolved == nullptr || resolved->GetDeclaringClassUnchecked() != nullptr);
10031*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr &&
10032*795d594fSAndroid Build Coastguard Worker       // We pass AccessMethod::kNone instead of kLinking to not warn yet on the
10033*795d594fSAndroid Build Coastguard Worker       // access, as we'll be looking if the method can be accessed through an
10034*795d594fSAndroid Build Coastguard Worker       // interface.
10035*795d594fSAndroid Build Coastguard Worker       hiddenapi::ShouldDenyAccessToMember(resolved,
10036*795d594fSAndroid Build Coastguard Worker                                           hiddenapi::AccessContext(class_loader, dex_cache),
10037*795d594fSAndroid Build Coastguard Worker                                           hiddenapi::AccessMethod::kNone)) {
10038*795d594fSAndroid Build Coastguard Worker     // The resolved method that we have found cannot be accessed due to
10039*795d594fSAndroid Build Coastguard Worker     // hiddenapi (typically it is declared up the hierarchy and is not an SDK
10040*795d594fSAndroid Build Coastguard Worker     // method). Try to find an interface method from the implemented interfaces which is
10041*795d594fSAndroid Build Coastguard Worker     // part of the SDK.
10042*795d594fSAndroid Build Coastguard Worker     ArtMethod* itf_method = klass->FindAccessibleInterfaceMethod(resolved, image_pointer_size_);
10043*795d594fSAndroid Build Coastguard Worker     if (itf_method == nullptr) {
10044*795d594fSAndroid Build Coastguard Worker       // No interface method. Call ShouldDenyAccessToMember again but this time
10045*795d594fSAndroid Build Coastguard Worker       // with AccessMethod::kLinking to ensure that an appropriate warning is
10046*795d594fSAndroid Build Coastguard Worker       // logged.
10047*795d594fSAndroid Build Coastguard Worker       hiddenapi::ShouldDenyAccessToMember(resolved,
10048*795d594fSAndroid Build Coastguard Worker                                           hiddenapi::AccessContext(class_loader, dex_cache),
10049*795d594fSAndroid Build Coastguard Worker                                           hiddenapi::AccessMethod::kLinking);
10050*795d594fSAndroid Build Coastguard Worker       resolved = nullptr;
10051*795d594fSAndroid Build Coastguard Worker     } else {
10052*795d594fSAndroid Build Coastguard Worker       // We found an interface method that is accessible, continue with the resolved method.
10053*795d594fSAndroid Build Coastguard Worker     }
10054*795d594fSAndroid Build Coastguard Worker   }
10055*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr) {
10056*795d594fSAndroid Build Coastguard Worker     // In case of jmvti, the dex file gets verified before being registered, so first
10057*795d594fSAndroid Build Coastguard Worker     // check if it's registered before checking class tables.
10058*795d594fSAndroid Build Coastguard Worker     const DexFile& dex_file = *dex_cache->GetDexFile();
10059*795d594fSAndroid Build Coastguard Worker     DCHECK_IMPLIES(
10060*795d594fSAndroid Build Coastguard Worker         IsDexFileRegistered(Thread::Current(), dex_file),
10061*795d594fSAndroid Build Coastguard Worker         FindClassTable(Thread::Current(), dex_cache) == ClassTableForClassLoader(class_loader))
10062*795d594fSAndroid Build Coastguard Worker         << "DexFile referrer: " << dex_file.GetLocation()
10063*795d594fSAndroid Build Coastguard Worker         << " ClassLoader: " << DescribeLoaders(class_loader, "");
10064*795d594fSAndroid Build Coastguard Worker     // Be a good citizen and update the dex cache to speed subsequent calls.
10065*795d594fSAndroid Build Coastguard Worker     dex_cache->SetResolvedMethod(method_idx, resolved);
10066*795d594fSAndroid Build Coastguard Worker     // Disable the following invariant check as the verifier breaks it. b/73760543
10067*795d594fSAndroid Build Coastguard Worker     // const DexFile::MethodId& method_id = dex_file.GetMethodId(method_idx);
10068*795d594fSAndroid Build Coastguard Worker     // DCHECK(LookupResolvedType(method_id.class_idx_, dex_cache, class_loader) != nullptr)
10069*795d594fSAndroid Build Coastguard Worker     //    << "Method: " << resolved->PrettyMethod() << ", "
10070*795d594fSAndroid Build Coastguard Worker     //    << "Class: " << klass->PrettyClass() << " (" << klass->GetStatus() << "), "
10071*795d594fSAndroid Build Coastguard Worker     //    << "DexFile referrer: " << dex_file.GetLocation();
10072*795d594fSAndroid Build Coastguard Worker   }
10073*795d594fSAndroid Build Coastguard Worker   return resolved;
10074*795d594fSAndroid Build Coastguard Worker }
10075*795d594fSAndroid Build Coastguard Worker 
10076*795d594fSAndroid Build Coastguard Worker // Returns true if `method` is either null or hidden.
10077*795d594fSAndroid Build Coastguard Worker // Does not print any warnings if it is hidden.
CheckNoSuchMethod(ArtMethod * method,ObjPtr<mirror::DexCache> dex_cache,ObjPtr<mirror::ClassLoader> class_loader)10078*795d594fSAndroid Build Coastguard Worker static bool CheckNoSuchMethod(ArtMethod* method,
10079*795d594fSAndroid Build Coastguard Worker                               ObjPtr<mirror::DexCache> dex_cache,
10080*795d594fSAndroid Build Coastguard Worker                               ObjPtr<mirror::ClassLoader> class_loader)
10081*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
10082*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Ptr());
10083*795d594fSAndroid Build Coastguard Worker   return method == nullptr ||
10084*795d594fSAndroid Build Coastguard Worker          hiddenapi::ShouldDenyAccessToMember(method,
10085*795d594fSAndroid Build Coastguard Worker                                              hiddenapi::AccessContext(class_loader, dex_cache),
10086*795d594fSAndroid Build Coastguard Worker                                              hiddenapi::AccessMethod::kNone);  // no warnings
10087*795d594fSAndroid Build Coastguard Worker }
10088*795d594fSAndroid Build Coastguard Worker 
FindIncompatibleMethod(ObjPtr<mirror::Class> klass,ObjPtr<mirror::DexCache> dex_cache,ObjPtr<mirror::ClassLoader> class_loader,uint32_t method_idx)10089*795d594fSAndroid Build Coastguard Worker ArtMethod* ClassLinker::FindIncompatibleMethod(ObjPtr<mirror::Class> klass,
10090*795d594fSAndroid Build Coastguard Worker                                                ObjPtr<mirror::DexCache> dex_cache,
10091*795d594fSAndroid Build Coastguard Worker                                                ObjPtr<mirror::ClassLoader> class_loader,
10092*795d594fSAndroid Build Coastguard Worker                                                uint32_t method_idx) {
10093*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader() == class_loader);
10094*795d594fSAndroid Build Coastguard Worker   if (klass->IsInterface()) {
10095*795d594fSAndroid Build Coastguard Worker     ArtMethod* method = klass->FindClassMethod(dex_cache, method_idx, image_pointer_size_);
10096*795d594fSAndroid Build Coastguard Worker     return CheckNoSuchMethod(method, dex_cache, class_loader) ? nullptr : method;
10097*795d594fSAndroid Build Coastguard Worker   } else {
10098*795d594fSAndroid Build Coastguard Worker     // If there was an interface method with the same signature, we would have
10099*795d594fSAndroid Build Coastguard Worker     // found it in the "copied" methods. Only DCHECK that the interface method
10100*795d594fSAndroid Build Coastguard Worker     // really does not exist.
10101*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild) {
10102*795d594fSAndroid Build Coastguard Worker       ArtMethod* method =
10103*795d594fSAndroid Build Coastguard Worker           klass->FindInterfaceMethod(dex_cache, method_idx, image_pointer_size_);
10104*795d594fSAndroid Build Coastguard Worker       CHECK(CheckNoSuchMethod(method, dex_cache, class_loader) ||
10105*795d594fSAndroid Build Coastguard Worker             (klass->FindAccessibleInterfaceMethod(method, image_pointer_size_) == nullptr));
10106*795d594fSAndroid Build Coastguard Worker     }
10107*795d594fSAndroid Build Coastguard Worker     return nullptr;
10108*795d594fSAndroid Build Coastguard Worker   }
10109*795d594fSAndroid Build Coastguard Worker }
10110*795d594fSAndroid Build Coastguard Worker 
ResolveMethodId(uint32_t method_idx,Handle<mirror::DexCache> dex_cache,Handle<mirror::ClassLoader> class_loader)10111*795d594fSAndroid Build Coastguard Worker ArtMethod* ClassLinker::ResolveMethodId(uint32_t method_idx,
10112*795d594fSAndroid Build Coastguard Worker                                         Handle<mirror::DexCache> dex_cache,
10113*795d594fSAndroid Build Coastguard Worker                                         Handle<mirror::ClassLoader> class_loader) {
10114*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader() == class_loader.Get());
10115*795d594fSAndroid Build Coastguard Worker   ArtMethod* resolved = dex_cache->GetResolvedMethod(method_idx);
10116*795d594fSAndroid Build Coastguard Worker   Thread::PoisonObjectPointersIfDebug();
10117*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr) {
10118*795d594fSAndroid Build Coastguard Worker     DCHECK(!resolved->IsRuntimeMethod());
10119*795d594fSAndroid Build Coastguard Worker     DCHECK(resolved->GetDeclaringClassUnchecked() != nullptr) << resolved->GetDexMethodIndex();
10120*795d594fSAndroid Build Coastguard Worker     return resolved;
10121*795d594fSAndroid Build Coastguard Worker   }
10122*795d594fSAndroid Build Coastguard Worker   // Fail, get the declaring class.
10123*795d594fSAndroid Build Coastguard Worker   const dex::MethodId& method_id = dex_cache->GetDexFile()->GetMethodId(method_idx);
10124*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> klass = ResolveType(method_id.class_idx_, dex_cache, class_loader);
10125*795d594fSAndroid Build Coastguard Worker   if (klass == nullptr) {
10126*795d594fSAndroid Build Coastguard Worker     Thread::Current()->AssertPendingException();
10127*795d594fSAndroid Build Coastguard Worker     return nullptr;
10128*795d594fSAndroid Build Coastguard Worker   }
10129*795d594fSAndroid Build Coastguard Worker   return FindResolvedMethod(klass, dex_cache.Get(), class_loader.Get(), method_idx);
10130*795d594fSAndroid Build Coastguard Worker }
10131*795d594fSAndroid Build Coastguard Worker 
LookupResolvedField(uint32_t field_idx,ObjPtr<mirror::DexCache> dex_cache,ObjPtr<mirror::ClassLoader> class_loader,bool is_static)10132*795d594fSAndroid Build Coastguard Worker ArtField* ClassLinker::LookupResolvedField(uint32_t field_idx,
10133*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::DexCache> dex_cache,
10134*795d594fSAndroid Build Coastguard Worker                                            ObjPtr<mirror::ClassLoader> class_loader,
10135*795d594fSAndroid Build Coastguard Worker                                            bool is_static) {
10136*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Ptr());
10137*795d594fSAndroid Build Coastguard Worker   const DexFile& dex_file = *dex_cache->GetDexFile();
10138*795d594fSAndroid Build Coastguard Worker   const dex::FieldId& field_id = dex_file.GetFieldId(field_idx);
10139*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> klass = dex_cache->GetResolvedType(field_id.class_idx_);
10140*795d594fSAndroid Build Coastguard Worker   if (klass == nullptr) {
10141*795d594fSAndroid Build Coastguard Worker     klass = LookupResolvedType(field_id.class_idx_, dex_cache, class_loader);
10142*795d594fSAndroid Build Coastguard Worker   }
10143*795d594fSAndroid Build Coastguard Worker   if (klass == nullptr) {
10144*795d594fSAndroid Build Coastguard Worker     // The class has not been resolved yet, so the field is also unresolved.
10145*795d594fSAndroid Build Coastguard Worker     return nullptr;
10146*795d594fSAndroid Build Coastguard Worker   }
10147*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->IsResolved());
10148*795d594fSAndroid Build Coastguard Worker 
10149*795d594fSAndroid Build Coastguard Worker   return FindResolvedField(klass, dex_cache, class_loader, field_idx, is_static);
10150*795d594fSAndroid Build Coastguard Worker }
10151*795d594fSAndroid Build Coastguard Worker 
ResolveFieldJLS(uint32_t field_idx,Handle<mirror::DexCache> dex_cache,Handle<mirror::ClassLoader> class_loader)10152*795d594fSAndroid Build Coastguard Worker ArtField* ClassLinker::ResolveFieldJLS(uint32_t field_idx,
10153*795d594fSAndroid Build Coastguard Worker                                        Handle<mirror::DexCache> dex_cache,
10154*795d594fSAndroid Build Coastguard Worker                                        Handle<mirror::ClassLoader> class_loader) {
10155*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache != nullptr);
10156*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader() == class_loader.Get());
10157*795d594fSAndroid Build Coastguard Worker   ArtField* resolved = dex_cache->GetResolvedField(field_idx);
10158*795d594fSAndroid Build Coastguard Worker   Thread::PoisonObjectPointersIfDebug();
10159*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr) {
10160*795d594fSAndroid Build Coastguard Worker     return resolved;
10161*795d594fSAndroid Build Coastguard Worker   }
10162*795d594fSAndroid Build Coastguard Worker   const DexFile& dex_file = *dex_cache->GetDexFile();
10163*795d594fSAndroid Build Coastguard Worker   const dex::FieldId& field_id = dex_file.GetFieldId(field_idx);
10164*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> klass = ResolveType(field_id.class_idx_, dex_cache, class_loader);
10165*795d594fSAndroid Build Coastguard Worker   if (klass == nullptr) {
10166*795d594fSAndroid Build Coastguard Worker     DCHECK(Thread::Current()->IsExceptionPending());
10167*795d594fSAndroid Build Coastguard Worker     return nullptr;
10168*795d594fSAndroid Build Coastguard Worker   }
10169*795d594fSAndroid Build Coastguard Worker 
10170*795d594fSAndroid Build Coastguard Worker   resolved = FindResolvedFieldJLS(klass, dex_cache.Get(), class_loader.Get(), field_idx);
10171*795d594fSAndroid Build Coastguard Worker   if (resolved == nullptr) {
10172*795d594fSAndroid Build Coastguard Worker     const char* name = dex_file.GetFieldName(field_id);
10173*795d594fSAndroid Build Coastguard Worker     const char* type = dex_file.GetFieldTypeDescriptor(field_id);
10174*795d594fSAndroid Build Coastguard Worker     ThrowNoSuchFieldError("", klass, type, name);
10175*795d594fSAndroid Build Coastguard Worker   }
10176*795d594fSAndroid Build Coastguard Worker   return resolved;
10177*795d594fSAndroid Build Coastguard Worker }
10178*795d594fSAndroid Build Coastguard Worker 
FindResolvedField(ObjPtr<mirror::Class> klass,ObjPtr<mirror::DexCache> dex_cache,ObjPtr<mirror::ClassLoader> class_loader,uint32_t field_idx,bool is_static)10179*795d594fSAndroid Build Coastguard Worker ArtField* ClassLinker::FindResolvedField(ObjPtr<mirror::Class> klass,
10180*795d594fSAndroid Build Coastguard Worker                                          ObjPtr<mirror::DexCache> dex_cache,
10181*795d594fSAndroid Build Coastguard Worker                                          ObjPtr<mirror::ClassLoader> class_loader,
10182*795d594fSAndroid Build Coastguard Worker                                          uint32_t field_idx,
10183*795d594fSAndroid Build Coastguard Worker                                          bool is_static) {
10184*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader() == class_loader);
10185*795d594fSAndroid Build Coastguard Worker   ArtField* resolved = is_static ? klass->FindStaticField(dex_cache, field_idx)
10186*795d594fSAndroid Build Coastguard Worker                                  : klass->FindInstanceField(dex_cache, field_idx);
10187*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr &&
10188*795d594fSAndroid Build Coastguard Worker       hiddenapi::ShouldDenyAccessToMember(resolved,
10189*795d594fSAndroid Build Coastguard Worker                                           hiddenapi::AccessContext(class_loader, dex_cache),
10190*795d594fSAndroid Build Coastguard Worker                                           hiddenapi::AccessMethod::kLinking)) {
10191*795d594fSAndroid Build Coastguard Worker     resolved = nullptr;
10192*795d594fSAndroid Build Coastguard Worker   }
10193*795d594fSAndroid Build Coastguard Worker 
10194*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr) {
10195*795d594fSAndroid Build Coastguard Worker     dex_cache->SetResolvedField(field_idx, resolved);
10196*795d594fSAndroid Build Coastguard Worker   }
10197*795d594fSAndroid Build Coastguard Worker 
10198*795d594fSAndroid Build Coastguard Worker   return resolved;
10199*795d594fSAndroid Build Coastguard Worker }
10200*795d594fSAndroid Build Coastguard Worker 
FindResolvedFieldJLS(ObjPtr<mirror::Class> klass,ObjPtr<mirror::DexCache> dex_cache,ObjPtr<mirror::ClassLoader> class_loader,uint32_t field_idx)10201*795d594fSAndroid Build Coastguard Worker ArtField* ClassLinker::FindResolvedFieldJLS(ObjPtr<mirror::Class> klass,
10202*795d594fSAndroid Build Coastguard Worker                                             ObjPtr<mirror::DexCache> dex_cache,
10203*795d594fSAndroid Build Coastguard Worker                                             ObjPtr<mirror::ClassLoader> class_loader,
10204*795d594fSAndroid Build Coastguard Worker                                             uint32_t field_idx) {
10205*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Ptr());
10206*795d594fSAndroid Build Coastguard Worker   ArtField* resolved = klass->FindField(dex_cache, field_idx);
10207*795d594fSAndroid Build Coastguard Worker 
10208*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr &&
10209*795d594fSAndroid Build Coastguard Worker       hiddenapi::ShouldDenyAccessToMember(resolved,
10210*795d594fSAndroid Build Coastguard Worker                                           hiddenapi::AccessContext(class_loader, dex_cache),
10211*795d594fSAndroid Build Coastguard Worker                                           hiddenapi::AccessMethod::kLinking)) {
10212*795d594fSAndroid Build Coastguard Worker     resolved = nullptr;
10213*795d594fSAndroid Build Coastguard Worker   }
10214*795d594fSAndroid Build Coastguard Worker 
10215*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr) {
10216*795d594fSAndroid Build Coastguard Worker     dex_cache->SetResolvedField(field_idx, resolved);
10217*795d594fSAndroid Build Coastguard Worker   }
10218*795d594fSAndroid Build Coastguard Worker 
10219*795d594fSAndroid Build Coastguard Worker   return resolved;
10220*795d594fSAndroid Build Coastguard Worker }
10221*795d594fSAndroid Build Coastguard Worker 
ResolveMethodType(Thread * self,dex::ProtoIndex proto_idx,Handle<mirror::DexCache> dex_cache,Handle<mirror::ClassLoader> class_loader)10222*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::MethodType> ClassLinker::ResolveMethodType(
10223*795d594fSAndroid Build Coastguard Worker     Thread* self,
10224*795d594fSAndroid Build Coastguard Worker     dex::ProtoIndex proto_idx,
10225*795d594fSAndroid Build Coastguard Worker     Handle<mirror::DexCache> dex_cache,
10226*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ClassLoader> class_loader) {
10227*795d594fSAndroid Build Coastguard Worker   DCHECK(Runtime::Current()->IsMethodHandlesEnabled());
10228*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache != nullptr);
10229*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader() == class_loader.Get());
10230*795d594fSAndroid Build Coastguard Worker 
10231*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::MethodType> resolved = dex_cache->GetResolvedMethodType(proto_idx);
10232*795d594fSAndroid Build Coastguard Worker   if (resolved != nullptr) {
10233*795d594fSAndroid Build Coastguard Worker     return resolved;
10234*795d594fSAndroid Build Coastguard Worker   }
10235*795d594fSAndroid Build Coastguard Worker 
10236*795d594fSAndroid Build Coastguard Worker   VariableSizedHandleScope raw_method_type_hs(self);
10237*795d594fSAndroid Build Coastguard Worker   mirror::RawMethodType raw_method_type(&raw_method_type_hs);
10238*795d594fSAndroid Build Coastguard Worker   if (!ResolveMethodType(self, proto_idx, dex_cache, class_loader, raw_method_type)) {
10239*795d594fSAndroid Build Coastguard Worker     DCHECK(self->IsExceptionPending());
10240*795d594fSAndroid Build Coastguard Worker     return nullptr;
10241*795d594fSAndroid Build Coastguard Worker   }
10242*795d594fSAndroid Build Coastguard Worker 
10243*795d594fSAndroid Build Coastguard Worker   // The handle scope was filled with return type and paratemer types.
10244*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(raw_method_type_hs.Size(),
10245*795d594fSAndroid Build Coastguard Worker             dex_cache->GetDexFile()->GetShortyView(proto_idx).length());
10246*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::MethodType> method_type = mirror::MethodType::Create(self, raw_method_type);
10247*795d594fSAndroid Build Coastguard Worker   if (method_type != nullptr) {
10248*795d594fSAndroid Build Coastguard Worker     // Ensure all stores for the newly created MethodType are visible, before we attempt to place
10249*795d594fSAndroid Build Coastguard Worker     // it in the DexCache (b/224733324).
10250*795d594fSAndroid Build Coastguard Worker     std::atomic_thread_fence(std::memory_order_release);
10251*795d594fSAndroid Build Coastguard Worker     dex_cache->SetResolvedMethodType(proto_idx, method_type.Ptr());
10252*795d594fSAndroid Build Coastguard Worker   }
10253*795d594fSAndroid Build Coastguard Worker   return method_type;
10254*795d594fSAndroid Build Coastguard Worker }
10255*795d594fSAndroid Build Coastguard Worker 
ResolveMethodType(Thread * self,dex::ProtoIndex proto_idx,Handle<mirror::DexCache> dex_cache,Handle<mirror::ClassLoader> class_loader,mirror::RawMethodType method_type)10256*795d594fSAndroid Build Coastguard Worker bool ClassLinker::ResolveMethodType(Thread* self,
10257*795d594fSAndroid Build Coastguard Worker                                     dex::ProtoIndex proto_idx,
10258*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::DexCache> dex_cache,
10259*795d594fSAndroid Build Coastguard Worker                                     Handle<mirror::ClassLoader> class_loader,
10260*795d594fSAndroid Build Coastguard Worker                                     /*out*/ mirror::RawMethodType method_type) {
10261*795d594fSAndroid Build Coastguard Worker   DCHECK(Runtime::Current()->IsMethodHandlesEnabled());
10262*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache != nullptr);
10263*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_cache->GetClassLoader() == class_loader.Get());
10264*795d594fSAndroid Build Coastguard Worker 
10265*795d594fSAndroid Build Coastguard Worker   // First resolve the return type.
10266*795d594fSAndroid Build Coastguard Worker   const DexFile& dex_file = *dex_cache->GetDexFile();
10267*795d594fSAndroid Build Coastguard Worker   const dex::ProtoId& proto_id = dex_file.GetProtoId(proto_idx);
10268*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> return_type =
10269*795d594fSAndroid Build Coastguard Worker       ResolveType(proto_id.return_type_idx_, dex_cache, class_loader);
10270*795d594fSAndroid Build Coastguard Worker   if (return_type == nullptr) {
10271*795d594fSAndroid Build Coastguard Worker     DCHECK(self->IsExceptionPending());
10272*795d594fSAndroid Build Coastguard Worker     return false;
10273*795d594fSAndroid Build Coastguard Worker   }
10274*795d594fSAndroid Build Coastguard Worker   method_type.SetRType(return_type);
10275*795d594fSAndroid Build Coastguard Worker 
10276*795d594fSAndroid Build Coastguard Worker   // Then resolve the argument types.
10277*795d594fSAndroid Build Coastguard Worker   DexFileParameterIterator it(dex_file, proto_id);
10278*795d594fSAndroid Build Coastguard Worker   for (; it.HasNext(); it.Next()) {
10279*795d594fSAndroid Build Coastguard Worker     const dex::TypeIndex type_idx = it.GetTypeIdx();
10280*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> param_type = ResolveType(type_idx, dex_cache, class_loader);
10281*795d594fSAndroid Build Coastguard Worker     if (param_type == nullptr) {
10282*795d594fSAndroid Build Coastguard Worker       DCHECK(self->IsExceptionPending());
10283*795d594fSAndroid Build Coastguard Worker       return false;
10284*795d594fSAndroid Build Coastguard Worker     }
10285*795d594fSAndroid Build Coastguard Worker     method_type.AddPType(param_type);
10286*795d594fSAndroid Build Coastguard Worker   }
10287*795d594fSAndroid Build Coastguard Worker 
10288*795d594fSAndroid Build Coastguard Worker   return true;
10289*795d594fSAndroid Build Coastguard Worker }
10290*795d594fSAndroid Build Coastguard Worker 
ResolveMethodType(Thread * self,dex::ProtoIndex proto_idx,ArtMethod * referrer)10291*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::MethodType> ClassLinker::ResolveMethodType(Thread* self,
10292*795d594fSAndroid Build Coastguard Worker                                                           dex::ProtoIndex proto_idx,
10293*795d594fSAndroid Build Coastguard Worker                                                           ArtMethod* referrer) {
10294*795d594fSAndroid Build Coastguard Worker   StackHandleScope<2> hs(self);
10295*795d594fSAndroid Build Coastguard Worker   Handle<mirror::DexCache> dex_cache(hs.NewHandle(referrer->GetDexCache()));
10296*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader(hs.NewHandle(referrer->GetClassLoader()));
10297*795d594fSAndroid Build Coastguard Worker   return ResolveMethodType(self, proto_idx, dex_cache, class_loader);
10298*795d594fSAndroid Build Coastguard Worker }
10299*795d594fSAndroid Build Coastguard Worker 
ResolveMethodHandleForField(Thread * self,const dex::MethodHandleItem & method_handle,ArtMethod * referrer)10300*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::MethodHandle> ClassLinker::ResolveMethodHandleForField(
10301*795d594fSAndroid Build Coastguard Worker     Thread* self,
10302*795d594fSAndroid Build Coastguard Worker     const dex::MethodHandleItem& method_handle,
10303*795d594fSAndroid Build Coastguard Worker     ArtMethod* referrer) {
10304*795d594fSAndroid Build Coastguard Worker   DexFile::MethodHandleType handle_type =
10305*795d594fSAndroid Build Coastguard Worker       static_cast<DexFile::MethodHandleType>(method_handle.method_handle_type_);
10306*795d594fSAndroid Build Coastguard Worker   mirror::MethodHandle::Kind kind;
10307*795d594fSAndroid Build Coastguard Worker   bool is_put;
10308*795d594fSAndroid Build Coastguard Worker   bool is_static;
10309*795d594fSAndroid Build Coastguard Worker   int32_t num_params;
10310*795d594fSAndroid Build Coastguard Worker   switch (handle_type) {
10311*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kStaticPut: {
10312*795d594fSAndroid Build Coastguard Worker       kind = mirror::MethodHandle::Kind::kStaticPut;
10313*795d594fSAndroid Build Coastguard Worker       is_put = true;
10314*795d594fSAndroid Build Coastguard Worker       is_static = true;
10315*795d594fSAndroid Build Coastguard Worker       num_params = 1;
10316*795d594fSAndroid Build Coastguard Worker       break;
10317*795d594fSAndroid Build Coastguard Worker     }
10318*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kStaticGet: {
10319*795d594fSAndroid Build Coastguard Worker       kind = mirror::MethodHandle::Kind::kStaticGet;
10320*795d594fSAndroid Build Coastguard Worker       is_put = false;
10321*795d594fSAndroid Build Coastguard Worker       is_static = true;
10322*795d594fSAndroid Build Coastguard Worker       num_params = 0;
10323*795d594fSAndroid Build Coastguard Worker       break;
10324*795d594fSAndroid Build Coastguard Worker     }
10325*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInstancePut: {
10326*795d594fSAndroid Build Coastguard Worker       kind = mirror::MethodHandle::Kind::kInstancePut;
10327*795d594fSAndroid Build Coastguard Worker       is_put = true;
10328*795d594fSAndroid Build Coastguard Worker       is_static = false;
10329*795d594fSAndroid Build Coastguard Worker       num_params = 2;
10330*795d594fSAndroid Build Coastguard Worker       break;
10331*795d594fSAndroid Build Coastguard Worker     }
10332*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInstanceGet: {
10333*795d594fSAndroid Build Coastguard Worker       kind = mirror::MethodHandle::Kind::kInstanceGet;
10334*795d594fSAndroid Build Coastguard Worker       is_put = false;
10335*795d594fSAndroid Build Coastguard Worker       is_static = false;
10336*795d594fSAndroid Build Coastguard Worker       num_params = 1;
10337*795d594fSAndroid Build Coastguard Worker       break;
10338*795d594fSAndroid Build Coastguard Worker     }
10339*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeStatic:
10340*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeInstance:
10341*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeConstructor:
10342*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeDirect:
10343*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeInterface:
10344*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "Unreachable";
10345*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
10346*795d594fSAndroid Build Coastguard Worker   }
10347*795d594fSAndroid Build Coastguard Worker 
10348*795d594fSAndroid Build Coastguard Worker   ArtField* target_field =
10349*795d594fSAndroid Build Coastguard Worker       ResolveField(method_handle.field_or_method_idx_, referrer, is_static);
10350*795d594fSAndroid Build Coastguard Worker   if (LIKELY(target_field != nullptr)) {
10351*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> target_class = target_field->GetDeclaringClass();
10352*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> referring_class = referrer->GetDeclaringClass();
10353*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(!referring_class->CanAccessMember(target_class, target_field->GetAccessFlags()))) {
10354*795d594fSAndroid Build Coastguard Worker       ThrowIllegalAccessErrorField(referring_class, target_field);
10355*795d594fSAndroid Build Coastguard Worker       return nullptr;
10356*795d594fSAndroid Build Coastguard Worker     }
10357*795d594fSAndroid Build Coastguard Worker     // TODO(b/364876321): ResolveField might return instance field when is_static is true and
10358*795d594fSAndroid Build Coastguard Worker     // vice versa.
10359*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(is_static != target_field->IsStatic())) {
10360*795d594fSAndroid Build Coastguard Worker       ThrowIncompatibleClassChangeErrorField(target_field, is_static, referrer);
10361*795d594fSAndroid Build Coastguard Worker       return nullptr;
10362*795d594fSAndroid Build Coastguard Worker     }
10363*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(is_put && target_field->IsFinal())) {
10364*795d594fSAndroid Build Coastguard Worker       ThrowIllegalAccessErrorField(referring_class, target_field);
10365*795d594fSAndroid Build Coastguard Worker       return nullptr;
10366*795d594fSAndroid Build Coastguard Worker     }
10367*795d594fSAndroid Build Coastguard Worker   } else {
10368*795d594fSAndroid Build Coastguard Worker     DCHECK(Thread::Current()->IsExceptionPending());
10369*795d594fSAndroid Build Coastguard Worker     return nullptr;
10370*795d594fSAndroid Build Coastguard Worker   }
10371*795d594fSAndroid Build Coastguard Worker 
10372*795d594fSAndroid Build Coastguard Worker   StackHandleScope<4> hs(self);
10373*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> array_of_class = GetClassRoot<mirror::ObjectArray<mirror::Class>>(this);
10374*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::Class>> method_params(hs.NewHandle(
10375*795d594fSAndroid Build Coastguard Worker       mirror::ObjectArray<mirror::Class>::Alloc(self, array_of_class, num_params)));
10376*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(method_params == nullptr)) {
10377*795d594fSAndroid Build Coastguard Worker     DCHECK(self->IsExceptionPending());
10378*795d594fSAndroid Build Coastguard Worker     return nullptr;
10379*795d594fSAndroid Build Coastguard Worker   }
10380*795d594fSAndroid Build Coastguard Worker 
10381*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> constructor_class;
10382*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> return_type;
10383*795d594fSAndroid Build Coastguard Worker   switch (handle_type) {
10384*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kStaticPut: {
10385*795d594fSAndroid Build Coastguard Worker       method_params->Set(0, target_field->ResolveType());
10386*795d594fSAndroid Build Coastguard Worker       return_type = hs.NewHandle(GetClassRoot(ClassRoot::kPrimitiveVoid, this));
10387*795d594fSAndroid Build Coastguard Worker       break;
10388*795d594fSAndroid Build Coastguard Worker     }
10389*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kStaticGet: {
10390*795d594fSAndroid Build Coastguard Worker       return_type = hs.NewHandle(target_field->ResolveType());
10391*795d594fSAndroid Build Coastguard Worker       break;
10392*795d594fSAndroid Build Coastguard Worker     }
10393*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInstancePut: {
10394*795d594fSAndroid Build Coastguard Worker       method_params->Set(0, target_field->GetDeclaringClass());
10395*795d594fSAndroid Build Coastguard Worker       method_params->Set(1, target_field->ResolveType());
10396*795d594fSAndroid Build Coastguard Worker       return_type = hs.NewHandle(GetClassRoot(ClassRoot::kPrimitiveVoid, this));
10397*795d594fSAndroid Build Coastguard Worker       break;
10398*795d594fSAndroid Build Coastguard Worker     }
10399*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInstanceGet: {
10400*795d594fSAndroid Build Coastguard Worker       method_params->Set(0, target_field->GetDeclaringClass());
10401*795d594fSAndroid Build Coastguard Worker       return_type = hs.NewHandle(target_field->ResolveType());
10402*795d594fSAndroid Build Coastguard Worker       break;
10403*795d594fSAndroid Build Coastguard Worker     }
10404*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeStatic:
10405*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeInstance:
10406*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeConstructor:
10407*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeDirect:
10408*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeInterface:
10409*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "Unreachable";
10410*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
10411*795d594fSAndroid Build Coastguard Worker   }
10412*795d594fSAndroid Build Coastguard Worker 
10413*795d594fSAndroid Build Coastguard Worker   for (int32_t i = 0; i < num_params; ++i) {
10414*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(method_params->Get(i) == nullptr)) {
10415*795d594fSAndroid Build Coastguard Worker       DCHECK(self->IsExceptionPending());
10416*795d594fSAndroid Build Coastguard Worker       return nullptr;
10417*795d594fSAndroid Build Coastguard Worker     }
10418*795d594fSAndroid Build Coastguard Worker   }
10419*795d594fSAndroid Build Coastguard Worker 
10420*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(return_type.IsNull())) {
10421*795d594fSAndroid Build Coastguard Worker     DCHECK(self->IsExceptionPending());
10422*795d594fSAndroid Build Coastguard Worker     return nullptr;
10423*795d594fSAndroid Build Coastguard Worker   }
10424*795d594fSAndroid Build Coastguard Worker 
10425*795d594fSAndroid Build Coastguard Worker   Handle<mirror::MethodType>
10426*795d594fSAndroid Build Coastguard Worker       method_type(hs.NewHandle(mirror::MethodType::Create(self, return_type, method_params)));
10427*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(method_type.IsNull())) {
10428*795d594fSAndroid Build Coastguard Worker     DCHECK(self->IsExceptionPending());
10429*795d594fSAndroid Build Coastguard Worker     return nullptr;
10430*795d594fSAndroid Build Coastguard Worker   }
10431*795d594fSAndroid Build Coastguard Worker 
10432*795d594fSAndroid Build Coastguard Worker   uintptr_t target = reinterpret_cast<uintptr_t>(target_field);
10433*795d594fSAndroid Build Coastguard Worker   return mirror::MethodHandleImpl::Create(self, target, kind, method_type);
10434*795d594fSAndroid Build Coastguard Worker }
10435*795d594fSAndroid Build Coastguard Worker 
ResolveMethodHandleForMethod(Thread * self,const dex::MethodHandleItem & method_handle,ArtMethod * referrer)10436*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::MethodHandle> ClassLinker::ResolveMethodHandleForMethod(
10437*795d594fSAndroid Build Coastguard Worker     Thread* self,
10438*795d594fSAndroid Build Coastguard Worker     const dex::MethodHandleItem& method_handle,
10439*795d594fSAndroid Build Coastguard Worker     ArtMethod* referrer) {
10440*795d594fSAndroid Build Coastguard Worker   DexFile::MethodHandleType handle_type =
10441*795d594fSAndroid Build Coastguard Worker       static_cast<DexFile::MethodHandleType>(method_handle.method_handle_type_);
10442*795d594fSAndroid Build Coastguard Worker   mirror::MethodHandle::Kind kind;
10443*795d594fSAndroid Build Coastguard Worker   uint32_t receiver_count = 0;
10444*795d594fSAndroid Build Coastguard Worker   ArtMethod* target_method = nullptr;
10445*795d594fSAndroid Build Coastguard Worker   switch (handle_type) {
10446*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kStaticPut:
10447*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kStaticGet:
10448*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInstancePut:
10449*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInstanceGet:
10450*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "Unreachable";
10451*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
10452*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeStatic: {
10453*795d594fSAndroid Build Coastguard Worker       kind = mirror::MethodHandle::Kind::kInvokeStatic;
10454*795d594fSAndroid Build Coastguard Worker       receiver_count = 0;
10455*795d594fSAndroid Build Coastguard Worker       target_method = ResolveMethodWithChecks(method_handle.field_or_method_idx_,
10456*795d594fSAndroid Build Coastguard Worker                                               referrer,
10457*795d594fSAndroid Build Coastguard Worker                                               InvokeType::kStatic);
10458*795d594fSAndroid Build Coastguard Worker       break;
10459*795d594fSAndroid Build Coastguard Worker     }
10460*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeInstance: {
10461*795d594fSAndroid Build Coastguard Worker       kind = mirror::MethodHandle::Kind::kInvokeVirtual;
10462*795d594fSAndroid Build Coastguard Worker       receiver_count = 1;
10463*795d594fSAndroid Build Coastguard Worker       target_method = ResolveMethodWithChecks(method_handle.field_or_method_idx_,
10464*795d594fSAndroid Build Coastguard Worker                                               referrer,
10465*795d594fSAndroid Build Coastguard Worker                                               InvokeType::kVirtual);
10466*795d594fSAndroid Build Coastguard Worker       break;
10467*795d594fSAndroid Build Coastguard Worker     }
10468*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeConstructor: {
10469*795d594fSAndroid Build Coastguard Worker       // Constructors are currently implemented as a transform. They
10470*795d594fSAndroid Build Coastguard Worker       // are special cased later in this method.
10471*795d594fSAndroid Build Coastguard Worker       kind = mirror::MethodHandle::Kind::kInvokeTransform;
10472*795d594fSAndroid Build Coastguard Worker       receiver_count = 0;
10473*795d594fSAndroid Build Coastguard Worker       target_method = ResolveMethodWithChecks(method_handle.field_or_method_idx_,
10474*795d594fSAndroid Build Coastguard Worker                                               referrer,
10475*795d594fSAndroid Build Coastguard Worker                                               InvokeType::kDirect);
10476*795d594fSAndroid Build Coastguard Worker       break;
10477*795d594fSAndroid Build Coastguard Worker     }
10478*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeDirect: {
10479*795d594fSAndroid Build Coastguard Worker       kind = mirror::MethodHandle::Kind::kInvokeDirect;
10480*795d594fSAndroid Build Coastguard Worker       receiver_count = 1;
10481*795d594fSAndroid Build Coastguard Worker       StackHandleScope<2> hs(self);
10482*795d594fSAndroid Build Coastguard Worker       // A constant method handle with type kInvokeDirect can refer to
10483*795d594fSAndroid Build Coastguard Worker       // a method that is private or to a method in a super class. To
10484*795d594fSAndroid Build Coastguard Worker       // disambiguate the two options, we resolve the method ignoring
10485*795d594fSAndroid Build Coastguard Worker       // the invocation type to determine if the method is private. We
10486*795d594fSAndroid Build Coastguard Worker       // then resolve again specifying the intended invocation type to
10487*795d594fSAndroid Build Coastguard Worker       // force the appropriate checks.
10488*795d594fSAndroid Build Coastguard Worker       target_method = ResolveMethodId(method_handle.field_or_method_idx_,
10489*795d594fSAndroid Build Coastguard Worker                                       hs.NewHandle(referrer->GetDexCache()),
10490*795d594fSAndroid Build Coastguard Worker                                       hs.NewHandle(referrer->GetClassLoader()));
10491*795d594fSAndroid Build Coastguard Worker       if (UNLIKELY(target_method == nullptr)) {
10492*795d594fSAndroid Build Coastguard Worker         break;
10493*795d594fSAndroid Build Coastguard Worker       }
10494*795d594fSAndroid Build Coastguard Worker 
10495*795d594fSAndroid Build Coastguard Worker       if (target_method->IsPrivate()) {
10496*795d594fSAndroid Build Coastguard Worker         kind = mirror::MethodHandle::Kind::kInvokeDirect;
10497*795d594fSAndroid Build Coastguard Worker         target_method = ResolveMethodWithChecks(method_handle.field_or_method_idx_,
10498*795d594fSAndroid Build Coastguard Worker                                                 referrer,
10499*795d594fSAndroid Build Coastguard Worker                                                 InvokeType::kDirect);
10500*795d594fSAndroid Build Coastguard Worker       } else {
10501*795d594fSAndroid Build Coastguard Worker         kind = mirror::MethodHandle::Kind::kInvokeSuper;
10502*795d594fSAndroid Build Coastguard Worker         target_method = ResolveMethodWithChecks(method_handle.field_or_method_idx_,
10503*795d594fSAndroid Build Coastguard Worker                                                 referrer,
10504*795d594fSAndroid Build Coastguard Worker                                                 InvokeType::kSuper);
10505*795d594fSAndroid Build Coastguard Worker         if (UNLIKELY(target_method == nullptr)) {
10506*795d594fSAndroid Build Coastguard Worker           break;
10507*795d594fSAndroid Build Coastguard Worker         }
10508*795d594fSAndroid Build Coastguard Worker         // Find the method specified in the parent in referring class
10509*795d594fSAndroid Build Coastguard Worker         // so invoke-super invokes the method in the parent of the
10510*795d594fSAndroid Build Coastguard Worker         // referrer.
10511*795d594fSAndroid Build Coastguard Worker         target_method =
10512*795d594fSAndroid Build Coastguard Worker             referrer->GetDeclaringClass()->FindVirtualMethodForVirtual(target_method,
10513*795d594fSAndroid Build Coastguard Worker                                                                        kRuntimePointerSize);
10514*795d594fSAndroid Build Coastguard Worker       }
10515*795d594fSAndroid Build Coastguard Worker       break;
10516*795d594fSAndroid Build Coastguard Worker     }
10517*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeInterface: {
10518*795d594fSAndroid Build Coastguard Worker       kind = mirror::MethodHandle::Kind::kInvokeInterface;
10519*795d594fSAndroid Build Coastguard Worker       receiver_count = 1;
10520*795d594fSAndroid Build Coastguard Worker       target_method = ResolveMethodWithChecks(method_handle.field_or_method_idx_,
10521*795d594fSAndroid Build Coastguard Worker                                               referrer,
10522*795d594fSAndroid Build Coastguard Worker                                               InvokeType::kInterface);
10523*795d594fSAndroid Build Coastguard Worker       break;
10524*795d594fSAndroid Build Coastguard Worker     }
10525*795d594fSAndroid Build Coastguard Worker   }
10526*795d594fSAndroid Build Coastguard Worker 
10527*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(target_method == nullptr)) {
10528*795d594fSAndroid Build Coastguard Worker     DCHECK(Thread::Current()->IsExceptionPending());
10529*795d594fSAndroid Build Coastguard Worker     return nullptr;
10530*795d594fSAndroid Build Coastguard Worker   }
10531*795d594fSAndroid Build Coastguard Worker 
10532*795d594fSAndroid Build Coastguard Worker   // According to JVMS 4.4.8 none of invoke* MethodHandle-s can target <clinit> methods.
10533*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(target_method->IsClassInitializer())) {
10534*795d594fSAndroid Build Coastguard Worker     ThrowClassFormatError(referrer->GetDeclaringClass(),
10535*795d594fSAndroid Build Coastguard Worker         "Method handles can't target class initializer method");
10536*795d594fSAndroid Build Coastguard Worker     return nullptr;
10537*795d594fSAndroid Build Coastguard Worker   }
10538*795d594fSAndroid Build Coastguard Worker 
10539*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> target_class = target_method->GetDeclaringClass();
10540*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> referring_class = referrer->GetDeclaringClass();
10541*795d594fSAndroid Build Coastguard Worker   uint32_t access_flags = target_method->GetAccessFlags();
10542*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(!referring_class->CanAccessMember(target_class, access_flags))) {
10543*795d594fSAndroid Build Coastguard Worker     ThrowIllegalAccessErrorMethod(referring_class, target_method);
10544*795d594fSAndroid Build Coastguard Worker     return nullptr;
10545*795d594fSAndroid Build Coastguard Worker   }
10546*795d594fSAndroid Build Coastguard Worker 
10547*795d594fSAndroid Build Coastguard Worker   // Calculate the number of parameters from the method shorty. We add the
10548*795d594fSAndroid Build Coastguard Worker   // receiver count (0 or 1) and deduct one for the return value.
10549*795d594fSAndroid Build Coastguard Worker   uint32_t shorty_length;
10550*795d594fSAndroid Build Coastguard Worker   target_method->GetShorty(&shorty_length);
10551*795d594fSAndroid Build Coastguard Worker   int32_t num_params = static_cast<int32_t>(shorty_length + receiver_count - 1);
10552*795d594fSAndroid Build Coastguard Worker 
10553*795d594fSAndroid Build Coastguard Worker   StackHandleScope<5> hs(self);
10554*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> array_of_class = GetClassRoot<mirror::ObjectArray<mirror::Class>>(this);
10555*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::Class>> method_params(hs.NewHandle(
10556*795d594fSAndroid Build Coastguard Worker       mirror::ObjectArray<mirror::Class>::Alloc(self, array_of_class, num_params)));
10557*795d594fSAndroid Build Coastguard Worker   if (method_params.Get() == nullptr) {
10558*795d594fSAndroid Build Coastguard Worker     DCHECK(self->IsExceptionPending());
10559*795d594fSAndroid Build Coastguard Worker     return nullptr;
10560*795d594fSAndroid Build Coastguard Worker   }
10561*795d594fSAndroid Build Coastguard Worker 
10562*795d594fSAndroid Build Coastguard Worker   const DexFile* dex_file = referrer->GetDexFile();
10563*795d594fSAndroid Build Coastguard Worker   const dex::MethodId& method_id = dex_file->GetMethodId(method_handle.field_or_method_idx_);
10564*795d594fSAndroid Build Coastguard Worker   int32_t index = 0;
10565*795d594fSAndroid Build Coastguard Worker   if (receiver_count != 0) {
10566*795d594fSAndroid Build Coastguard Worker     // Insert receiver. Use the class identified in the method handle rather than the declaring
10567*795d594fSAndroid Build Coastguard Worker     // class of the resolved method which may be super class or default interface method
10568*795d594fSAndroid Build Coastguard Worker     // (b/115964401).
10569*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> receiver_class = LookupResolvedType(method_id.class_idx_, referrer);
10570*795d594fSAndroid Build Coastguard Worker     // receiver_class should have been resolved when resolving the target method.
10571*795d594fSAndroid Build Coastguard Worker     DCHECK(receiver_class != nullptr);
10572*795d594fSAndroid Build Coastguard Worker     method_params->Set(index++, receiver_class);
10573*795d594fSAndroid Build Coastguard Worker   }
10574*795d594fSAndroid Build Coastguard Worker 
10575*795d594fSAndroid Build Coastguard Worker   const dex::ProtoId& proto_id = dex_file->GetProtoId(method_id.proto_idx_);
10576*795d594fSAndroid Build Coastguard Worker   DexFileParameterIterator it(*dex_file, proto_id);
10577*795d594fSAndroid Build Coastguard Worker   while (it.HasNext()) {
10578*795d594fSAndroid Build Coastguard Worker     DCHECK_LT(index, num_params);
10579*795d594fSAndroid Build Coastguard Worker     const dex::TypeIndex type_idx = it.GetTypeIdx();
10580*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> klass = ResolveType(type_idx, referrer);
10581*795d594fSAndroid Build Coastguard Worker     if (nullptr == klass) {
10582*795d594fSAndroid Build Coastguard Worker       DCHECK(self->IsExceptionPending());
10583*795d594fSAndroid Build Coastguard Worker       return nullptr;
10584*795d594fSAndroid Build Coastguard Worker     }
10585*795d594fSAndroid Build Coastguard Worker     method_params->Set(index++, klass);
10586*795d594fSAndroid Build Coastguard Worker     it.Next();
10587*795d594fSAndroid Build Coastguard Worker   }
10588*795d594fSAndroid Build Coastguard Worker 
10589*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> return_type =
10590*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(ResolveType(proto_id.return_type_idx_, referrer));
10591*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(return_type.IsNull())) {
10592*795d594fSAndroid Build Coastguard Worker     DCHECK(self->IsExceptionPending());
10593*795d594fSAndroid Build Coastguard Worker     return nullptr;
10594*795d594fSAndroid Build Coastguard Worker   }
10595*795d594fSAndroid Build Coastguard Worker 
10596*795d594fSAndroid Build Coastguard Worker   Handle<mirror::MethodType>
10597*795d594fSAndroid Build Coastguard Worker       method_type(hs.NewHandle(mirror::MethodType::Create(self, return_type, method_params)));
10598*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(method_type.IsNull())) {
10599*795d594fSAndroid Build Coastguard Worker     DCHECK(self->IsExceptionPending());
10600*795d594fSAndroid Build Coastguard Worker     return nullptr;
10601*795d594fSAndroid Build Coastguard Worker   }
10602*795d594fSAndroid Build Coastguard Worker 
10603*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(handle_type == DexFile::MethodHandleType::kInvokeConstructor)) {
10604*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> constructor_class = hs.NewHandle(target_method->GetDeclaringClass());
10605*795d594fSAndroid Build Coastguard Worker     Handle<mirror::MethodHandlesLookup> lookup =
10606*795d594fSAndroid Build Coastguard Worker         hs.NewHandle(mirror::MethodHandlesLookup::GetDefault(self));
10607*795d594fSAndroid Build Coastguard Worker     return lookup->FindConstructor(self, constructor_class, method_type);
10608*795d594fSAndroid Build Coastguard Worker   }
10609*795d594fSAndroid Build Coastguard Worker 
10610*795d594fSAndroid Build Coastguard Worker   uintptr_t target = reinterpret_cast<uintptr_t>(target_method);
10611*795d594fSAndroid Build Coastguard Worker   return mirror::MethodHandleImpl::Create(self, target, kind, method_type);
10612*795d594fSAndroid Build Coastguard Worker }
10613*795d594fSAndroid Build Coastguard Worker 
ResolveMethodHandle(Thread * self,uint32_t method_handle_idx,ArtMethod * referrer)10614*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::MethodHandle> ClassLinker::ResolveMethodHandle(Thread* self,
10615*795d594fSAndroid Build Coastguard Worker                                                               uint32_t method_handle_idx,
10616*795d594fSAndroid Build Coastguard Worker                                                               ArtMethod* referrer)
10617*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
10618*795d594fSAndroid Build Coastguard Worker   const DexFile* const dex_file = referrer->GetDexFile();
10619*795d594fSAndroid Build Coastguard Worker   const dex::MethodHandleItem& method_handle = dex_file->GetMethodHandle(method_handle_idx);
10620*795d594fSAndroid Build Coastguard Worker   switch (static_cast<DexFile::MethodHandleType>(method_handle.method_handle_type_)) {
10621*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kStaticPut:
10622*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kStaticGet:
10623*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInstancePut:
10624*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInstanceGet:
10625*795d594fSAndroid Build Coastguard Worker       return ResolveMethodHandleForField(self, method_handle, referrer);
10626*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeStatic:
10627*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeInstance:
10628*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeConstructor:
10629*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeDirect:
10630*795d594fSAndroid Build Coastguard Worker     case DexFile::MethodHandleType::kInvokeInterface:
10631*795d594fSAndroid Build Coastguard Worker       return ResolveMethodHandleForMethod(self, method_handle, referrer);
10632*795d594fSAndroid Build Coastguard Worker   }
10633*795d594fSAndroid Build Coastguard Worker }
10634*795d594fSAndroid Build Coastguard Worker 
IsQuickResolutionStub(const void * entry_point) const10635*795d594fSAndroid Build Coastguard Worker bool ClassLinker::IsQuickResolutionStub(const void* entry_point) const {
10636*795d594fSAndroid Build Coastguard Worker   return (entry_point == GetQuickResolutionStub()) ||
10637*795d594fSAndroid Build Coastguard Worker       (quick_resolution_trampoline_ == entry_point);
10638*795d594fSAndroid Build Coastguard Worker }
10639*795d594fSAndroid Build Coastguard Worker 
IsQuickToInterpreterBridge(const void * entry_point) const10640*795d594fSAndroid Build Coastguard Worker bool ClassLinker::IsQuickToInterpreterBridge(const void* entry_point) const {
10641*795d594fSAndroid Build Coastguard Worker   return (entry_point == GetQuickToInterpreterBridge()) ||
10642*795d594fSAndroid Build Coastguard Worker       (quick_to_interpreter_bridge_trampoline_ == entry_point);
10643*795d594fSAndroid Build Coastguard Worker }
10644*795d594fSAndroid Build Coastguard Worker 
IsQuickGenericJniStub(const void * entry_point) const10645*795d594fSAndroid Build Coastguard Worker bool ClassLinker::IsQuickGenericJniStub(const void* entry_point) const {
10646*795d594fSAndroid Build Coastguard Worker   return (entry_point == GetQuickGenericJniStub()) ||
10647*795d594fSAndroid Build Coastguard Worker       (quick_generic_jni_trampoline_ == entry_point);
10648*795d594fSAndroid Build Coastguard Worker }
10649*795d594fSAndroid Build Coastguard Worker 
IsJniDlsymLookupStub(const void * entry_point) const10650*795d594fSAndroid Build Coastguard Worker bool ClassLinker::IsJniDlsymLookupStub(const void* entry_point) const {
10651*795d594fSAndroid Build Coastguard Worker   return entry_point == GetJniDlsymLookupStub() ||
10652*795d594fSAndroid Build Coastguard Worker       (jni_dlsym_lookup_trampoline_ == entry_point);
10653*795d594fSAndroid Build Coastguard Worker }
10654*795d594fSAndroid Build Coastguard Worker 
IsJniDlsymLookupCriticalStub(const void * entry_point) const10655*795d594fSAndroid Build Coastguard Worker bool ClassLinker::IsJniDlsymLookupCriticalStub(const void* entry_point) const {
10656*795d594fSAndroid Build Coastguard Worker   return entry_point == GetJniDlsymLookupCriticalStub() ||
10657*795d594fSAndroid Build Coastguard Worker       (jni_dlsym_lookup_critical_trampoline_ == entry_point);
10658*795d594fSAndroid Build Coastguard Worker }
10659*795d594fSAndroid Build Coastguard Worker 
GetRuntimeQuickGenericJniStub() const10660*795d594fSAndroid Build Coastguard Worker const void* ClassLinker::GetRuntimeQuickGenericJniStub() const {
10661*795d594fSAndroid Build Coastguard Worker   return GetQuickGenericJniStub();
10662*795d594fSAndroid Build Coastguard Worker }
10663*795d594fSAndroid Build Coastguard Worker 
SetEntryPointsForObsoleteMethod(ArtMethod * method) const10664*795d594fSAndroid Build Coastguard Worker void ClassLinker::SetEntryPointsForObsoleteMethod(ArtMethod* method) const {
10665*795d594fSAndroid Build Coastguard Worker   DCHECK(method->IsObsolete());
10666*795d594fSAndroid Build Coastguard Worker   // We cannot mess with the entrypoints of native methods because they are used to determine how
10667*795d594fSAndroid Build Coastguard Worker   // large the method's quick stack frame is. Without this information we cannot walk the stacks.
10668*795d594fSAndroid Build Coastguard Worker   if (!method->IsNative()) {
10669*795d594fSAndroid Build Coastguard Worker     method->SetEntryPointFromQuickCompiledCode(GetInvokeObsoleteMethodStub());
10670*795d594fSAndroid Build Coastguard Worker   }
10671*795d594fSAndroid Build Coastguard Worker }
10672*795d594fSAndroid Build Coastguard Worker 
DumpForSigQuit(std::ostream & os)10673*795d594fSAndroid Build Coastguard Worker void ClassLinker::DumpForSigQuit(std::ostream& os) {
10674*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
10675*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(soa.Self(), *Locks::classlinker_classes_lock_);
10676*795d594fSAndroid Build Coastguard Worker   os << "Zygote loaded classes=" << NumZygoteClasses() << " post zygote classes="
10677*795d594fSAndroid Build Coastguard Worker      << NumNonZygoteClasses() << "\n";
10678*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu2(soa.Self(), *Locks::dex_lock_);
10679*795d594fSAndroid Build Coastguard Worker   os << "Dumping registered class loaders\n";
10680*795d594fSAndroid Build Coastguard Worker   size_t class_loader_index = 0;
10681*795d594fSAndroid Build Coastguard Worker   for (const ClassLoaderData& class_loader : class_loaders_) {
10682*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::ClassLoader> loader =
10683*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::ClassLoader>::DownCast(soa.Self()->DecodeJObject(class_loader.weak_root));
10684*795d594fSAndroid Build Coastguard Worker     if (loader != nullptr) {
10685*795d594fSAndroid Build Coastguard Worker       os << "#" << class_loader_index++ << " " << loader->GetClass()->PrettyDescriptor() << ": [";
10686*795d594fSAndroid Build Coastguard Worker       bool saw_one_dex_file = false;
10687*795d594fSAndroid Build Coastguard Worker       for (const auto& entry : dex_caches_) {
10688*795d594fSAndroid Build Coastguard Worker         const DexCacheData& dex_cache = entry.second;
10689*795d594fSAndroid Build Coastguard Worker         if (dex_cache.class_table == class_loader.class_table) {
10690*795d594fSAndroid Build Coastguard Worker           if (saw_one_dex_file) {
10691*795d594fSAndroid Build Coastguard Worker             os << ":";
10692*795d594fSAndroid Build Coastguard Worker           }
10693*795d594fSAndroid Build Coastguard Worker           saw_one_dex_file = true;
10694*795d594fSAndroid Build Coastguard Worker           os << entry.first->GetLocation();
10695*795d594fSAndroid Build Coastguard Worker         }
10696*795d594fSAndroid Build Coastguard Worker       }
10697*795d594fSAndroid Build Coastguard Worker       os << "]";
10698*795d594fSAndroid Build Coastguard Worker       bool found_parent = false;
10699*795d594fSAndroid Build Coastguard Worker       if (loader->GetParent() != nullptr) {
10700*795d594fSAndroid Build Coastguard Worker         size_t parent_index = 0;
10701*795d594fSAndroid Build Coastguard Worker         for (const ClassLoaderData& class_loader2 : class_loaders_) {
10702*795d594fSAndroid Build Coastguard Worker           ObjPtr<mirror::ClassLoader> loader2 = ObjPtr<mirror::ClassLoader>::DownCast(
10703*795d594fSAndroid Build Coastguard Worker               soa.Self()->DecodeJObject(class_loader2.weak_root));
10704*795d594fSAndroid Build Coastguard Worker           if (loader2 == loader->GetParent()) {
10705*795d594fSAndroid Build Coastguard Worker             os << ", parent #" << parent_index;
10706*795d594fSAndroid Build Coastguard Worker             found_parent = true;
10707*795d594fSAndroid Build Coastguard Worker             break;
10708*795d594fSAndroid Build Coastguard Worker           }
10709*795d594fSAndroid Build Coastguard Worker           parent_index++;
10710*795d594fSAndroid Build Coastguard Worker         }
10711*795d594fSAndroid Build Coastguard Worker         if (!found_parent) {
10712*795d594fSAndroid Build Coastguard Worker           os << ", unregistered parent of type "
10713*795d594fSAndroid Build Coastguard Worker              << loader->GetParent()->GetClass()->PrettyDescriptor();
10714*795d594fSAndroid Build Coastguard Worker         }
10715*795d594fSAndroid Build Coastguard Worker       } else {
10716*795d594fSAndroid Build Coastguard Worker         os << ", no parent";
10717*795d594fSAndroid Build Coastguard Worker       }
10718*795d594fSAndroid Build Coastguard Worker       os << "\n";
10719*795d594fSAndroid Build Coastguard Worker     }
10720*795d594fSAndroid Build Coastguard Worker   }
10721*795d594fSAndroid Build Coastguard Worker   os << "Done dumping class loaders\n";
10722*795d594fSAndroid Build Coastguard Worker   Runtime* runtime = Runtime::Current();
10723*795d594fSAndroid Build Coastguard Worker   os << "Classes initialized: " << runtime->GetStat(KIND_GLOBAL_CLASS_INIT_COUNT) << " in "
10724*795d594fSAndroid Build Coastguard Worker      << PrettyDuration(runtime->GetStat(KIND_GLOBAL_CLASS_INIT_TIME)) << "\n";
10725*795d594fSAndroid Build Coastguard Worker }
10726*795d594fSAndroid Build Coastguard Worker 
10727*795d594fSAndroid Build Coastguard Worker class CountClassesVisitor : public ClassLoaderVisitor {
10728*795d594fSAndroid Build Coastguard Worker  public:
CountClassesVisitor()10729*795d594fSAndroid Build Coastguard Worker   CountClassesVisitor() : num_zygote_classes(0), num_non_zygote_classes(0) {}
10730*795d594fSAndroid Build Coastguard Worker 
Visit(ObjPtr<mirror::ClassLoader> class_loader)10731*795d594fSAndroid Build Coastguard Worker   void Visit(ObjPtr<mirror::ClassLoader> class_loader)
10732*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) override {
10733*795d594fSAndroid Build Coastguard Worker     ClassTable* const class_table = class_loader->GetClassTable();
10734*795d594fSAndroid Build Coastguard Worker     if (class_table != nullptr) {
10735*795d594fSAndroid Build Coastguard Worker       num_zygote_classes += class_table->NumZygoteClasses(class_loader);
10736*795d594fSAndroid Build Coastguard Worker       num_non_zygote_classes += class_table->NumNonZygoteClasses(class_loader);
10737*795d594fSAndroid Build Coastguard Worker     }
10738*795d594fSAndroid Build Coastguard Worker   }
10739*795d594fSAndroid Build Coastguard Worker 
10740*795d594fSAndroid Build Coastguard Worker   size_t num_zygote_classes;
10741*795d594fSAndroid Build Coastguard Worker   size_t num_non_zygote_classes;
10742*795d594fSAndroid Build Coastguard Worker };
10743*795d594fSAndroid Build Coastguard Worker 
NumZygoteClasses() const10744*795d594fSAndroid Build Coastguard Worker size_t ClassLinker::NumZygoteClasses() const {
10745*795d594fSAndroid Build Coastguard Worker   CountClassesVisitor visitor;
10746*795d594fSAndroid Build Coastguard Worker   VisitClassLoaders(&visitor);
10747*795d594fSAndroid Build Coastguard Worker   return visitor.num_zygote_classes + boot_class_table_->NumZygoteClasses(nullptr);
10748*795d594fSAndroid Build Coastguard Worker }
10749*795d594fSAndroid Build Coastguard Worker 
NumNonZygoteClasses() const10750*795d594fSAndroid Build Coastguard Worker size_t ClassLinker::NumNonZygoteClasses() const {
10751*795d594fSAndroid Build Coastguard Worker   CountClassesVisitor visitor;
10752*795d594fSAndroid Build Coastguard Worker   VisitClassLoaders(&visitor);
10753*795d594fSAndroid Build Coastguard Worker   return visitor.num_non_zygote_classes + boot_class_table_->NumNonZygoteClasses(nullptr);
10754*795d594fSAndroid Build Coastguard Worker }
10755*795d594fSAndroid Build Coastguard Worker 
NumLoadedClasses()10756*795d594fSAndroid Build Coastguard Worker size_t ClassLinker::NumLoadedClasses() {
10757*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
10758*795d594fSAndroid Build Coastguard Worker   // Only return non zygote classes since these are the ones which apps which care about.
10759*795d594fSAndroid Build Coastguard Worker   return NumNonZygoteClasses();
10760*795d594fSAndroid Build Coastguard Worker }
10761*795d594fSAndroid Build Coastguard Worker 
GetClassesLockOwner()10762*795d594fSAndroid Build Coastguard Worker pid_t ClassLinker::GetClassesLockOwner() {
10763*795d594fSAndroid Build Coastguard Worker   return Locks::classlinker_classes_lock_->GetExclusiveOwnerTid();
10764*795d594fSAndroid Build Coastguard Worker }
10765*795d594fSAndroid Build Coastguard Worker 
GetDexLockOwner()10766*795d594fSAndroid Build Coastguard Worker pid_t ClassLinker::GetDexLockOwner() {
10767*795d594fSAndroid Build Coastguard Worker   return Locks::dex_lock_->GetExclusiveOwnerTid();
10768*795d594fSAndroid Build Coastguard Worker }
10769*795d594fSAndroid Build Coastguard Worker 
SetClassRoot(ClassRoot class_root,ObjPtr<mirror::Class> klass)10770*795d594fSAndroid Build Coastguard Worker void ClassLinker::SetClassRoot(ClassRoot class_root, ObjPtr<mirror::Class> klass) {
10771*795d594fSAndroid Build Coastguard Worker   DCHECK(!init_done_);
10772*795d594fSAndroid Build Coastguard Worker 
10773*795d594fSAndroid Build Coastguard Worker   DCHECK(klass != nullptr);
10774*795d594fSAndroid Build Coastguard Worker   DCHECK(klass->GetClassLoader() == nullptr);
10775*795d594fSAndroid Build Coastguard Worker 
10776*795d594fSAndroid Build Coastguard Worker   mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read();
10777*795d594fSAndroid Build Coastguard Worker   DCHECK(class_roots != nullptr);
10778*795d594fSAndroid Build Coastguard Worker   DCHECK_LT(static_cast<uint32_t>(class_root), static_cast<uint32_t>(ClassRoot::kMax));
10779*795d594fSAndroid Build Coastguard Worker   int32_t index = static_cast<int32_t>(class_root);
10780*795d594fSAndroid Build Coastguard Worker   DCHECK(class_roots->Get(index) == nullptr);
10781*795d594fSAndroid Build Coastguard Worker   class_roots->Set<false>(index, klass);
10782*795d594fSAndroid Build Coastguard Worker }
10783*795d594fSAndroid Build Coastguard Worker 
CreateWellKnownClassLoader(Thread * self,const std::vector<const DexFile * > & dex_files,Handle<mirror::Class> loader_class,Handle<mirror::ClassLoader> parent_loader,Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries,Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries_after)10784*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ClassLoader> ClassLinker::CreateWellKnownClassLoader(
10785*795d594fSAndroid Build Coastguard Worker     Thread* self,
10786*795d594fSAndroid Build Coastguard Worker     const std::vector<const DexFile*>& dex_files,
10787*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> loader_class,
10788*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ClassLoader> parent_loader,
10789*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries,
10790*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries_after) {
10791*795d594fSAndroid Build Coastguard Worker   CHECK(loader_class.Get() == WellKnownClasses::dalvik_system_PathClassLoader ||
10792*795d594fSAndroid Build Coastguard Worker         loader_class.Get() == WellKnownClasses::dalvik_system_DelegateLastClassLoader ||
10793*795d594fSAndroid Build Coastguard Worker         loader_class.Get() == WellKnownClasses::dalvik_system_InMemoryDexClassLoader);
10794*795d594fSAndroid Build Coastguard Worker 
10795*795d594fSAndroid Build Coastguard Worker   StackHandleScope<5> hs(self);
10796*795d594fSAndroid Build Coastguard Worker 
10797*795d594fSAndroid Build Coastguard Worker   ArtField* dex_elements_field = WellKnownClasses::dalvik_system_DexPathList_dexElements;
10798*795d594fSAndroid Build Coastguard Worker 
10799*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> dex_elements_class(hs.NewHandle(dex_elements_field->ResolveType()));
10800*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_elements_class != nullptr);
10801*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_elements_class->IsArrayClass());
10802*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::Object>> h_dex_elements(hs.NewHandle(
10803*795d594fSAndroid Build Coastguard Worker       mirror::ObjectArray<mirror::Object>::Alloc(self,
10804*795d594fSAndroid Build Coastguard Worker                                                  dex_elements_class.Get(),
10805*795d594fSAndroid Build Coastguard Worker                                                  dex_files.size())));
10806*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> h_dex_element_class =
10807*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(dex_elements_class->GetComponentType());
10808*795d594fSAndroid Build Coastguard Worker 
10809*795d594fSAndroid Build Coastguard Worker   ArtField* element_file_field = WellKnownClasses::dalvik_system_DexPathList__Element_dexFile;
10810*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(h_dex_element_class.Get(), element_file_field->GetDeclaringClass());
10811*795d594fSAndroid Build Coastguard Worker 
10812*795d594fSAndroid Build Coastguard Worker   ArtField* cookie_field = WellKnownClasses::dalvik_system_DexFile_cookie;
10813*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(cookie_field->GetDeclaringClass(), element_file_field->LookupResolvedType());
10814*795d594fSAndroid Build Coastguard Worker 
10815*795d594fSAndroid Build Coastguard Worker   ArtField* file_name_field = WellKnownClasses::dalvik_system_DexFile_fileName;
10816*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(file_name_field->GetDeclaringClass(), element_file_field->LookupResolvedType());
10817*795d594fSAndroid Build Coastguard Worker 
10818*795d594fSAndroid Build Coastguard Worker   // Fill the elements array.
10819*795d594fSAndroid Build Coastguard Worker   int32_t index = 0;
10820*795d594fSAndroid Build Coastguard Worker   for (const DexFile* dex_file : dex_files) {
10821*795d594fSAndroid Build Coastguard Worker     StackHandleScope<4> hs2(self);
10822*795d594fSAndroid Build Coastguard Worker 
10823*795d594fSAndroid Build Coastguard Worker     // CreateWellKnownClassLoader is only used by gtests and compiler.
10824*795d594fSAndroid Build Coastguard Worker     // Index 0 of h_long_array is supposed to be the oat file but we can leave it null.
10825*795d594fSAndroid Build Coastguard Worker     Handle<mirror::LongArray> h_long_array = hs2.NewHandle(mirror::LongArray::Alloc(
10826*795d594fSAndroid Build Coastguard Worker         self,
10827*795d594fSAndroid Build Coastguard Worker         kDexFileIndexStart + 1));
10828*795d594fSAndroid Build Coastguard Worker     DCHECK(h_long_array != nullptr);
10829*795d594fSAndroid Build Coastguard Worker     h_long_array->Set(kDexFileIndexStart, reinterpret_cast64<int64_t>(dex_file));
10830*795d594fSAndroid Build Coastguard Worker 
10831*795d594fSAndroid Build Coastguard Worker     // Note that this creates a finalizable dalvik.system.DexFile object and a corresponding
10832*795d594fSAndroid Build Coastguard Worker     // FinalizerReference which will never get cleaned up without a started runtime.
10833*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Object> h_dex_file = hs2.NewHandle(
10834*795d594fSAndroid Build Coastguard Worker         cookie_field->GetDeclaringClass()->AllocObject(self));
10835*795d594fSAndroid Build Coastguard Worker     DCHECK(h_dex_file != nullptr);
10836*795d594fSAndroid Build Coastguard Worker     cookie_field->SetObject<false>(h_dex_file.Get(), h_long_array.Get());
10837*795d594fSAndroid Build Coastguard Worker 
10838*795d594fSAndroid Build Coastguard Worker     Handle<mirror::String> h_file_name = hs2.NewHandle(
10839*795d594fSAndroid Build Coastguard Worker         mirror::String::AllocFromModifiedUtf8(self, dex_file->GetLocation().c_str()));
10840*795d594fSAndroid Build Coastguard Worker     DCHECK(h_file_name != nullptr);
10841*795d594fSAndroid Build Coastguard Worker     file_name_field->SetObject<false>(h_dex_file.Get(), h_file_name.Get());
10842*795d594fSAndroid Build Coastguard Worker 
10843*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Object> h_element = hs2.NewHandle(h_dex_element_class->AllocObject(self));
10844*795d594fSAndroid Build Coastguard Worker     DCHECK(h_element != nullptr);
10845*795d594fSAndroid Build Coastguard Worker     element_file_field->SetObject<false>(h_element.Get(), h_dex_file.Get());
10846*795d594fSAndroid Build Coastguard Worker 
10847*795d594fSAndroid Build Coastguard Worker     h_dex_elements->Set(index, h_element.Get());
10848*795d594fSAndroid Build Coastguard Worker     index++;
10849*795d594fSAndroid Build Coastguard Worker   }
10850*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(index, h_dex_elements->GetLength());
10851*795d594fSAndroid Build Coastguard Worker 
10852*795d594fSAndroid Build Coastguard Worker   // Create DexPathList.
10853*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Object> h_dex_path_list = hs.NewHandle(
10854*795d594fSAndroid Build Coastguard Worker       dex_elements_field->GetDeclaringClass()->AllocObject(self));
10855*795d594fSAndroid Build Coastguard Worker   DCHECK(h_dex_path_list != nullptr);
10856*795d594fSAndroid Build Coastguard Worker   // Set elements.
10857*795d594fSAndroid Build Coastguard Worker   dex_elements_field->SetObject<false>(h_dex_path_list.Get(), h_dex_elements.Get());
10858*795d594fSAndroid Build Coastguard Worker   // Create an empty List for the "nativeLibraryDirectories," required for native tests.
10859*795d594fSAndroid Build Coastguard Worker   // Note: this code is uncommon(oatdump)/testing-only, so don't add further WellKnownClasses
10860*795d594fSAndroid Build Coastguard Worker   //       elements.
10861*795d594fSAndroid Build Coastguard Worker   {
10862*795d594fSAndroid Build Coastguard Worker     ArtField* native_lib_dirs = dex_elements_field->GetDeclaringClass()->
10863*795d594fSAndroid Build Coastguard Worker         FindDeclaredInstanceField("nativeLibraryDirectories", "Ljava/util/List;");
10864*795d594fSAndroid Build Coastguard Worker     DCHECK(native_lib_dirs != nullptr);
10865*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> list_class = FindSystemClass(self, "Ljava/util/ArrayList;");
10866*795d594fSAndroid Build Coastguard Worker     DCHECK(list_class != nullptr);
10867*795d594fSAndroid Build Coastguard Worker     {
10868*795d594fSAndroid Build Coastguard Worker       StackHandleScope<1> h_list_scope(self);
10869*795d594fSAndroid Build Coastguard Worker       Handle<mirror::Class> h_list_class(h_list_scope.NewHandle<mirror::Class>(list_class));
10870*795d594fSAndroid Build Coastguard Worker       bool list_init = EnsureInitialized(self, h_list_class, true, true);
10871*795d594fSAndroid Build Coastguard Worker       DCHECK(list_init);
10872*795d594fSAndroid Build Coastguard Worker       list_class = h_list_class.Get();
10873*795d594fSAndroid Build Coastguard Worker     }
10874*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Object> list_object = list_class->AllocObject(self);
10875*795d594fSAndroid Build Coastguard Worker     // Note: we leave the object uninitialized. This must never leak into any non-testing code, but
10876*795d594fSAndroid Build Coastguard Worker     //       is fine for testing. While it violates a Java-code invariant (the elementData field is
10877*795d594fSAndroid Build Coastguard Worker     //       normally never null), as long as one does not try to add elements, this will still
10878*795d594fSAndroid Build Coastguard Worker     //       work.
10879*795d594fSAndroid Build Coastguard Worker     native_lib_dirs->SetObject<false>(h_dex_path_list.Get(), list_object);
10880*795d594fSAndroid Build Coastguard Worker   }
10881*795d594fSAndroid Build Coastguard Worker 
10882*795d594fSAndroid Build Coastguard Worker   // Create the class loader..
10883*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> h_class_loader = hs.NewHandle<mirror::ClassLoader>(
10884*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::ClassLoader>::DownCast(loader_class->AllocObject(self)));
10885*795d594fSAndroid Build Coastguard Worker   DCHECK(h_class_loader != nullptr);
10886*795d594fSAndroid Build Coastguard Worker   // Set DexPathList.
10887*795d594fSAndroid Build Coastguard Worker   ArtField* path_list_field = WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList;
10888*795d594fSAndroid Build Coastguard Worker   DCHECK(path_list_field != nullptr);
10889*795d594fSAndroid Build Coastguard Worker   path_list_field->SetObject<false>(h_class_loader.Get(), h_dex_path_list.Get());
10890*795d594fSAndroid Build Coastguard Worker 
10891*795d594fSAndroid Build Coastguard Worker   // Make a pretend boot-classpath.
10892*795d594fSAndroid Build Coastguard Worker   // TODO: Should we scan the image?
10893*795d594fSAndroid Build Coastguard Worker   ArtField* const parent_field = WellKnownClasses::java_lang_ClassLoader_parent;
10894*795d594fSAndroid Build Coastguard Worker   DCHECK(parent_field != nullptr);
10895*795d594fSAndroid Build Coastguard Worker   if (parent_loader.Get() == nullptr) {
10896*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Object> boot_loader(
10897*795d594fSAndroid Build Coastguard Worker         WellKnownClasses::java_lang_BootClassLoader->AllocObject(self));
10898*795d594fSAndroid Build Coastguard Worker     parent_field->SetObject<false>(h_class_loader.Get(), boot_loader);
10899*795d594fSAndroid Build Coastguard Worker   } else {
10900*795d594fSAndroid Build Coastguard Worker     parent_field->SetObject<false>(h_class_loader.Get(), parent_loader.Get());
10901*795d594fSAndroid Build Coastguard Worker   }
10902*795d594fSAndroid Build Coastguard Worker 
10903*795d594fSAndroid Build Coastguard Worker   ArtField* shared_libraries_field =
10904*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoaders;
10905*795d594fSAndroid Build Coastguard Worker   DCHECK(shared_libraries_field != nullptr);
10906*795d594fSAndroid Build Coastguard Worker   shared_libraries_field->SetObject<false>(h_class_loader.Get(), shared_libraries.Get());
10907*795d594fSAndroid Build Coastguard Worker 
10908*795d594fSAndroid Build Coastguard Worker   ArtField* shared_libraries_after_field =
10909*795d594fSAndroid Build Coastguard Worker         WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoadersAfter;
10910*795d594fSAndroid Build Coastguard Worker   DCHECK(shared_libraries_after_field != nullptr);
10911*795d594fSAndroid Build Coastguard Worker   shared_libraries_after_field->SetObject<false>(h_class_loader.Get(),
10912*795d594fSAndroid Build Coastguard Worker                                                  shared_libraries_after.Get());
10913*795d594fSAndroid Build Coastguard Worker   return h_class_loader.Get();
10914*795d594fSAndroid Build Coastguard Worker }
10915*795d594fSAndroid Build Coastguard Worker 
CreatePathClassLoader(Thread * self,const std::vector<const DexFile * > & dex_files)10916*795d594fSAndroid Build Coastguard Worker jobject ClassLinker::CreatePathClassLoader(Thread* self,
10917*795d594fSAndroid Build Coastguard Worker                                            const std::vector<const DexFile*>& dex_files) {
10918*795d594fSAndroid Build Coastguard Worker   StackHandleScope<3u> hs(self);
10919*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> d_s_pcl =
10920*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(WellKnownClasses::dalvik_system_PathClassLoader.Get());
10921*795d594fSAndroid Build Coastguard Worker   auto null_parent = hs.NewHandle<mirror::ClassLoader>(nullptr);
10922*795d594fSAndroid Build Coastguard Worker   auto null_libs = hs.NewHandle<mirror::ObjectArray<mirror::ClassLoader>>(nullptr);
10923*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ClassLoader> class_loader =
10924*795d594fSAndroid Build Coastguard Worker       CreateWellKnownClassLoader(self, dex_files, d_s_pcl, null_parent, null_libs, null_libs);
10925*795d594fSAndroid Build Coastguard Worker   return Runtime::Current()->GetJavaVM()->AddGlobalRef(self, class_loader);
10926*795d594fSAndroid Build Coastguard Worker }
10927*795d594fSAndroid Build Coastguard Worker 
DropFindArrayClassCache()10928*795d594fSAndroid Build Coastguard Worker void ClassLinker::DropFindArrayClassCache() {
10929*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < kFindArrayCacheSize; i++) {
10930*795d594fSAndroid Build Coastguard Worker     find_array_class_cache_[i].store(GcRoot<mirror::Class>(nullptr), std::memory_order_relaxed);
10931*795d594fSAndroid Build Coastguard Worker   }
10932*795d594fSAndroid Build Coastguard Worker   find_array_class_cache_next_victim_ = 0;
10933*795d594fSAndroid Build Coastguard Worker }
10934*795d594fSAndroid Build Coastguard Worker 
VisitClassLoaders(ClassLoaderVisitor * visitor) const10935*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisitClassLoaders(ClassLoaderVisitor* visitor) const {
10936*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
10937*795d594fSAndroid Build Coastguard Worker   for (const ClassLoaderData& data : class_loaders_) {
10938*795d594fSAndroid Build Coastguard Worker     // Need to use DecodeJObject so that we get null for cleared JNI weak globals.
10939*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::ClassLoader> class_loader = ObjPtr<mirror::ClassLoader>::DownCast(
10940*795d594fSAndroid Build Coastguard Worker         self->DecodeJObject(data.weak_root));
10941*795d594fSAndroid Build Coastguard Worker     if (class_loader != nullptr) {
10942*795d594fSAndroid Build Coastguard Worker       visitor->Visit(class_loader);
10943*795d594fSAndroid Build Coastguard Worker     }
10944*795d594fSAndroid Build Coastguard Worker   }
10945*795d594fSAndroid Build Coastguard Worker }
10946*795d594fSAndroid Build Coastguard Worker 
VisitDexCaches(DexCacheVisitor * visitor) const10947*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisitDexCaches(DexCacheVisitor* visitor) const {
10948*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
10949*795d594fSAndroid Build Coastguard Worker   for (const auto& it : dex_caches_) {
10950*795d594fSAndroid Build Coastguard Worker     // Need to use DecodeJObject so that we get null for cleared JNI weak globals.
10951*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::DexCache> dex_cache = ObjPtr<mirror::DexCache>::DownCast(
10952*795d594fSAndroid Build Coastguard Worker         self->DecodeJObject(it.second.weak_root));
10953*795d594fSAndroid Build Coastguard Worker     if (dex_cache != nullptr) {
10954*795d594fSAndroid Build Coastguard Worker       visitor->Visit(dex_cache);
10955*795d594fSAndroid Build Coastguard Worker     }
10956*795d594fSAndroid Build Coastguard Worker   }
10957*795d594fSAndroid Build Coastguard Worker }
10958*795d594fSAndroid Build Coastguard Worker 
VisitAllocators(AllocatorVisitor * visitor) const10959*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisitAllocators(AllocatorVisitor* visitor) const {
10960*795d594fSAndroid Build Coastguard Worker   for (const ClassLoaderData& data : class_loaders_) {
10961*795d594fSAndroid Build Coastguard Worker     LinearAlloc* alloc = data.allocator;
10962*795d594fSAndroid Build Coastguard Worker     if (alloc != nullptr && !visitor->Visit(alloc)) {
10963*795d594fSAndroid Build Coastguard Worker         break;
10964*795d594fSAndroid Build Coastguard Worker     }
10965*795d594fSAndroid Build Coastguard Worker   }
10966*795d594fSAndroid Build Coastguard Worker }
10967*795d594fSAndroid Build Coastguard Worker 
InsertDexFileInToClassLoader(ObjPtr<mirror::Object> dex_file,ObjPtr<mirror::ClassLoader> class_loader)10968*795d594fSAndroid Build Coastguard Worker void ClassLinker::InsertDexFileInToClassLoader(ObjPtr<mirror::Object> dex_file,
10969*795d594fSAndroid Build Coastguard Worker                                                ObjPtr<mirror::ClassLoader> class_loader) {
10970*795d594fSAndroid Build Coastguard Worker   DCHECK(dex_file != nullptr);
10971*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
10972*795d594fSAndroid Build Coastguard Worker   WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
10973*795d594fSAndroid Build Coastguard Worker   ClassTable* const table = ClassTableForClassLoader(class_loader);
10974*795d594fSAndroid Build Coastguard Worker   DCHECK(table != nullptr);
10975*795d594fSAndroid Build Coastguard Worker   if (table->InsertStrongRoot(dex_file)) {
10976*795d594fSAndroid Build Coastguard Worker     WriteBarrierOnClassLoaderLocked(class_loader, dex_file);
10977*795d594fSAndroid Build Coastguard Worker   } else {
10978*795d594fSAndroid Build Coastguard Worker     // Write-barrier not required if strong-root isn't inserted.
10979*795d594fSAndroid Build Coastguard Worker   }
10980*795d594fSAndroid Build Coastguard Worker }
10981*795d594fSAndroid Build Coastguard Worker 
CleanupClassLoaders()10982*795d594fSAndroid Build Coastguard Worker void ClassLinker::CleanupClassLoaders() {
10983*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
10984*795d594fSAndroid Build Coastguard Worker   std::list<ClassLoaderData> to_delete;
10985*795d594fSAndroid Build Coastguard Worker   // Do the delete outside the lock to avoid lock violation in jit code cache.
10986*795d594fSAndroid Build Coastguard Worker   {
10987*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
10988*795d594fSAndroid Build Coastguard Worker     for (auto it = class_loaders_.begin(); it != class_loaders_.end(); ) {
10989*795d594fSAndroid Build Coastguard Worker       auto this_it = it;
10990*795d594fSAndroid Build Coastguard Worker       ++it;
10991*795d594fSAndroid Build Coastguard Worker       const ClassLoaderData& data = *this_it;
10992*795d594fSAndroid Build Coastguard Worker       // Need to use DecodeJObject so that we get null for cleared JNI weak globals.
10993*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::ClassLoader> class_loader =
10994*795d594fSAndroid Build Coastguard Worker           ObjPtr<mirror::ClassLoader>::DownCast(self->DecodeJObject(data.weak_root));
10995*795d594fSAndroid Build Coastguard Worker       if (class_loader == nullptr) {
10996*795d594fSAndroid Build Coastguard Worker         VLOG(class_linker) << "Freeing class loader";
10997*795d594fSAndroid Build Coastguard Worker         to_delete.splice(to_delete.end(), class_loaders_, this_it);
10998*795d594fSAndroid Build Coastguard Worker       }
10999*795d594fSAndroid Build Coastguard Worker     }
11000*795d594fSAndroid Build Coastguard Worker   }
11001*795d594fSAndroid Build Coastguard Worker   if (to_delete.empty()) {
11002*795d594fSAndroid Build Coastguard Worker     return;
11003*795d594fSAndroid Build Coastguard Worker   }
11004*795d594fSAndroid Build Coastguard Worker   std::set<const OatFile*> unregistered_oat_files;
11005*795d594fSAndroid Build Coastguard Worker   JavaVMExt* vm = self->GetJniEnv()->GetVm();
11006*795d594fSAndroid Build Coastguard Worker   {
11007*795d594fSAndroid Build Coastguard Worker     WriterMutexLock mu(self, *Locks::dex_lock_);
11008*795d594fSAndroid Build Coastguard Worker     for (auto it = dex_caches_.begin(), end = dex_caches_.end(); it != end; ) {
11009*795d594fSAndroid Build Coastguard Worker       const DexFile* dex_file = it->first;
11010*795d594fSAndroid Build Coastguard Worker       const DexCacheData& data = it->second;
11011*795d594fSAndroid Build Coastguard Worker       if (self->DecodeJObject(data.weak_root) == nullptr) {
11012*795d594fSAndroid Build Coastguard Worker         DCHECK(to_delete.end() != std::find_if(
11013*795d594fSAndroid Build Coastguard Worker             to_delete.begin(),
11014*795d594fSAndroid Build Coastguard Worker             to_delete.end(),
11015*795d594fSAndroid Build Coastguard Worker             [&](const ClassLoaderData& cld) { return cld.class_table == data.class_table; }));
11016*795d594fSAndroid Build Coastguard Worker         if (dex_file->GetOatDexFile() != nullptr &&
11017*795d594fSAndroid Build Coastguard Worker             dex_file->GetOatDexFile()->GetOatFile() != nullptr &&
11018*795d594fSAndroid Build Coastguard Worker             dex_file->GetOatDexFile()->GetOatFile()->IsExecutable()) {
11019*795d594fSAndroid Build Coastguard Worker           unregistered_oat_files.insert(dex_file->GetOatDexFile()->GetOatFile());
11020*795d594fSAndroid Build Coastguard Worker         }
11021*795d594fSAndroid Build Coastguard Worker         vm->DeleteWeakGlobalRef(self, data.weak_root);
11022*795d594fSAndroid Build Coastguard Worker         it = dex_caches_.erase(it);
11023*795d594fSAndroid Build Coastguard Worker       } else {
11024*795d594fSAndroid Build Coastguard Worker         ++it;
11025*795d594fSAndroid Build Coastguard Worker       }
11026*795d594fSAndroid Build Coastguard Worker     }
11027*795d594fSAndroid Build Coastguard Worker   }
11028*795d594fSAndroid Build Coastguard Worker   {
11029*795d594fSAndroid Build Coastguard Worker     ScopedDebugDisallowReadBarriers sddrb(self);
11030*795d594fSAndroid Build Coastguard Worker     for (ClassLoaderData& data : to_delete) {
11031*795d594fSAndroid Build Coastguard Worker       // CHA unloading analysis and SingleImplementaion cleanups are required.
11032*795d594fSAndroid Build Coastguard Worker       PrepareToDeleteClassLoader(self, data, /*cleanup_cha=*/true);
11033*795d594fSAndroid Build Coastguard Worker     }
11034*795d594fSAndroid Build Coastguard Worker   }
11035*795d594fSAndroid Build Coastguard Worker   for (const ClassLoaderData& data : to_delete) {
11036*795d594fSAndroid Build Coastguard Worker     delete data.allocator;
11037*795d594fSAndroid Build Coastguard Worker     delete data.class_table;
11038*795d594fSAndroid Build Coastguard Worker   }
11039*795d594fSAndroid Build Coastguard Worker   Runtime* runtime = Runtime::Current();
11040*795d594fSAndroid Build Coastguard Worker   if (!unregistered_oat_files.empty()) {
11041*795d594fSAndroid Build Coastguard Worker     for (const OatFile* oat_file : unregistered_oat_files) {
11042*795d594fSAndroid Build Coastguard Worker       // Notify the fault handler about removal of the executable code range if needed.
11043*795d594fSAndroid Build Coastguard Worker       DCHECK(oat_file->IsExecutable());
11044*795d594fSAndroid Build Coastguard Worker       size_t exec_offset = oat_file->GetOatHeader().GetExecutableOffset();
11045*795d594fSAndroid Build Coastguard Worker       DCHECK_LE(exec_offset, oat_file->Size());
11046*795d594fSAndroid Build Coastguard Worker       size_t exec_size = oat_file->Size() - exec_offset;
11047*795d594fSAndroid Build Coastguard Worker       if (exec_size != 0u) {
11048*795d594fSAndroid Build Coastguard Worker         runtime->RemoveGeneratedCodeRange(oat_file->Begin() + exec_offset, exec_size);
11049*795d594fSAndroid Build Coastguard Worker       }
11050*795d594fSAndroid Build Coastguard Worker     }
11051*795d594fSAndroid Build Coastguard Worker   }
11052*795d594fSAndroid Build Coastguard Worker 
11053*795d594fSAndroid Build Coastguard Worker   if (runtime->GetStartupLinearAlloc() != nullptr) {
11054*795d594fSAndroid Build Coastguard Worker     // Because the startup linear alloc can contain dex cache arrays associated
11055*795d594fSAndroid Build Coastguard Worker     // to class loaders that got unloaded, we need to delete these
11056*795d594fSAndroid Build Coastguard Worker     // arrays.
11057*795d594fSAndroid Build Coastguard Worker     StartupCompletedTask::DeleteStartupDexCaches(self, /* called_by_gc= */ true);
11058*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(runtime->GetStartupLinearAlloc(), nullptr);
11059*795d594fSAndroid Build Coastguard Worker   }
11060*795d594fSAndroid Build Coastguard Worker }
11061*795d594fSAndroid Build Coastguard Worker 
11062*795d594fSAndroid Build Coastguard Worker class ClassLinker::FindVirtualMethodHolderVisitor : public ClassVisitor {
11063*795d594fSAndroid Build Coastguard Worker  public:
FindVirtualMethodHolderVisitor(const ArtMethod * method,PointerSize pointer_size)11064*795d594fSAndroid Build Coastguard Worker   FindVirtualMethodHolderVisitor(const ArtMethod* method, PointerSize pointer_size)
11065*795d594fSAndroid Build Coastguard Worker       : method_(method),
11066*795d594fSAndroid Build Coastguard Worker         pointer_size_(pointer_size) {}
11067*795d594fSAndroid Build Coastguard Worker 
operator ()(ObjPtr<mirror::Class> klass)11068*795d594fSAndroid Build Coastguard Worker   bool operator()(ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) override {
11069*795d594fSAndroid Build Coastguard Worker     if (klass->GetVirtualMethodsSliceUnchecked(pointer_size_).Contains(method_)) {
11070*795d594fSAndroid Build Coastguard Worker       holder_ = klass;
11071*795d594fSAndroid Build Coastguard Worker     }
11072*795d594fSAndroid Build Coastguard Worker     // Return false to stop searching if holder_ is not null.
11073*795d594fSAndroid Build Coastguard Worker     return holder_ == nullptr;
11074*795d594fSAndroid Build Coastguard Worker   }
11075*795d594fSAndroid Build Coastguard Worker 
11076*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> holder_ = nullptr;
11077*795d594fSAndroid Build Coastguard Worker   const ArtMethod* const method_;
11078*795d594fSAndroid Build Coastguard Worker   const PointerSize pointer_size_;
11079*795d594fSAndroid Build Coastguard Worker };
11080*795d594fSAndroid Build Coastguard Worker 
GetHoldingClassOfCopiedMethod(ArtMethod * method)11081*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> ClassLinker::GetHoldingClassOfCopiedMethod(ArtMethod* method) {
11082*795d594fSAndroid Build Coastguard Worker   ScopedTrace trace(__FUNCTION__);  // Since this function is slow, have a trace to notify people.
11083*795d594fSAndroid Build Coastguard Worker   CHECK(method->IsCopied());
11084*795d594fSAndroid Build Coastguard Worker   FindVirtualMethodHolderVisitor visitor(method, image_pointer_size_);
11085*795d594fSAndroid Build Coastguard Worker   VisitClasses(&visitor);
11086*795d594fSAndroid Build Coastguard Worker   DCHECK(visitor.holder_ != nullptr);
11087*795d594fSAndroid Build Coastguard Worker   return visitor.holder_;
11088*795d594fSAndroid Build Coastguard Worker }
11089*795d594fSAndroid Build Coastguard Worker 
GetHoldingClassLoaderOfCopiedMethod(Thread * self,ArtMethod * method)11090*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ClassLoader> ClassLinker::GetHoldingClassLoaderOfCopiedMethod(Thread* self,
11091*795d594fSAndroid Build Coastguard Worker                                                                              ArtMethod* method) {
11092*795d594fSAndroid Build Coastguard Worker   // Note: `GetHoldingClassOfCopiedMethod(method)` is a lot more expensive than finding
11093*795d594fSAndroid Build Coastguard Worker   // the class loader, so we're using it only to verify the result in debug mode.
11094*795d594fSAndroid Build Coastguard Worker   CHECK(method->IsCopied());
11095*795d594fSAndroid Build Coastguard Worker   gc::Heap* heap = Runtime::Current()->GetHeap();
11096*795d594fSAndroid Build Coastguard Worker   // Check if the copied method is in the boot class path.
11097*795d594fSAndroid Build Coastguard Worker   if (heap->IsBootImageAddress(method) || GetAllocatorForClassLoader(nullptr)->Contains(method)) {
11098*795d594fSAndroid Build Coastguard Worker     DCHECK(GetHoldingClassOfCopiedMethod(method)->GetClassLoader() == nullptr);
11099*795d594fSAndroid Build Coastguard Worker     return nullptr;
11100*795d594fSAndroid Build Coastguard Worker   }
11101*795d594fSAndroid Build Coastguard Worker   // Check if the copied method is in an app image.
11102*795d594fSAndroid Build Coastguard Worker   // Note: Continuous spaces contain boot image spaces and app image spaces.
11103*795d594fSAndroid Build Coastguard Worker   // However, they are sorted by address, so boot images are not trivial to skip.
11104*795d594fSAndroid Build Coastguard Worker   ArrayRef<gc::space::ContinuousSpace* const> spaces(heap->GetContinuousSpaces());
11105*795d594fSAndroid Build Coastguard Worker   DCHECK_GE(spaces.size(), heap->GetBootImageSpaces().size());
11106*795d594fSAndroid Build Coastguard Worker   for (gc::space::ContinuousSpace* space : spaces) {
11107*795d594fSAndroid Build Coastguard Worker     if (space->IsImageSpace()) {
11108*795d594fSAndroid Build Coastguard Worker       gc::space::ImageSpace* image_space = space->AsImageSpace();
11109*795d594fSAndroid Build Coastguard Worker       size_t offset = reinterpret_cast<const uint8_t*>(method) - image_space->Begin();
11110*795d594fSAndroid Build Coastguard Worker       const ImageSection& methods_section = image_space->GetImageHeader().GetMethodsSection();
11111*795d594fSAndroid Build Coastguard Worker       if (offset - methods_section.Offset() < methods_section.Size()) {
11112*795d594fSAndroid Build Coastguard Worker         // Grab the class loader from the first non-BCP class in the app image class table.
11113*795d594fSAndroid Build Coastguard Worker         // Note: If we allow classes from arbitrary parent or library class loaders in app
11114*795d594fSAndroid Build Coastguard Worker         // images, this shall need to be updated to actually search for the exact class.
11115*795d594fSAndroid Build Coastguard Worker         const ImageSection& class_table_section =
11116*795d594fSAndroid Build Coastguard Worker             image_space->GetImageHeader().GetClassTableSection();
11117*795d594fSAndroid Build Coastguard Worker         CHECK_NE(class_table_section.Size(), 0u);
11118*795d594fSAndroid Build Coastguard Worker         const uint8_t* ptr = image_space->Begin() + class_table_section.Offset();
11119*795d594fSAndroid Build Coastguard Worker         size_t read_count = 0;
11120*795d594fSAndroid Build Coastguard Worker         ClassTable::ClassSet class_set(ptr, /*make_copy_of_data=*/ false, &read_count);
11121*795d594fSAndroid Build Coastguard Worker         CHECK(!class_set.empty());
11122*795d594fSAndroid Build Coastguard Worker         auto it = class_set.begin();
11123*795d594fSAndroid Build Coastguard Worker         // No read barrier needed for references to non-movable image classes.
11124*795d594fSAndroid Build Coastguard Worker         while ((*it).Read<kWithoutReadBarrier>()->IsBootStrapClassLoaded()) {
11125*795d594fSAndroid Build Coastguard Worker           ++it;
11126*795d594fSAndroid Build Coastguard Worker           CHECK(it != class_set.end());
11127*795d594fSAndroid Build Coastguard Worker         }
11128*795d594fSAndroid Build Coastguard Worker         ObjPtr<mirror::ClassLoader> class_loader =
11129*795d594fSAndroid Build Coastguard Worker             (*it).Read<kWithoutReadBarrier>()->GetClassLoader();
11130*795d594fSAndroid Build Coastguard Worker         DCHECK(GetHoldingClassOfCopiedMethod(method)->GetClassLoader() == class_loader);
11131*795d594fSAndroid Build Coastguard Worker         return class_loader;
11132*795d594fSAndroid Build Coastguard Worker       }
11133*795d594fSAndroid Build Coastguard Worker     }
11134*795d594fSAndroid Build Coastguard Worker   }
11135*795d594fSAndroid Build Coastguard Worker   // Otherwise, the method must be in one of the `LinearAlloc` memory areas.
11136*795d594fSAndroid Build Coastguard Worker   jweak result = nullptr;
11137*795d594fSAndroid Build Coastguard Worker   {
11138*795d594fSAndroid Build Coastguard Worker     ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_);
11139*795d594fSAndroid Build Coastguard Worker     for (const ClassLoaderData& data : class_loaders_) {
11140*795d594fSAndroid Build Coastguard Worker       if (data.allocator->Contains(method)) {
11141*795d594fSAndroid Build Coastguard Worker         result = data.weak_root;
11142*795d594fSAndroid Build Coastguard Worker         break;
11143*795d594fSAndroid Build Coastguard Worker       }
11144*795d594fSAndroid Build Coastguard Worker     }
11145*795d594fSAndroid Build Coastguard Worker   }
11146*795d594fSAndroid Build Coastguard Worker   CHECK(result != nullptr) << "Did not find allocator holding the copied method: " << method
11147*795d594fSAndroid Build Coastguard Worker       << " " << method->PrettyMethod();
11148*795d594fSAndroid Build Coastguard Worker   // The `method` is alive, so the class loader must also be alive.
11149*795d594fSAndroid Build Coastguard Worker   return ObjPtr<mirror::ClassLoader>::DownCast(
11150*795d594fSAndroid Build Coastguard Worker       Runtime::Current()->GetJavaVM()->DecodeWeakGlobalAsStrong(result));
11151*795d594fSAndroid Build Coastguard Worker }
11152*795d594fSAndroid Build Coastguard Worker 
DenyAccessBasedOnPublicSdk(ArtMethod * art_method) const11153*795d594fSAndroid Build Coastguard Worker bool ClassLinker::DenyAccessBasedOnPublicSdk([[maybe_unused]] ArtMethod* art_method) const
11154*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
11155*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11156*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11157*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11158*795d594fSAndroid Build Coastguard Worker }
11159*795d594fSAndroid Build Coastguard Worker 
DenyAccessBasedOnPublicSdk(ArtField * art_field) const11160*795d594fSAndroid Build Coastguard Worker bool ClassLinker::DenyAccessBasedOnPublicSdk([[maybe_unused]] ArtField* art_field) const
11161*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
11162*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11163*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11164*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11165*795d594fSAndroid Build Coastguard Worker }
11166*795d594fSAndroid Build Coastguard Worker 
DenyAccessBasedOnPublicSdk(std::string_view type_descriptor) const11167*795d594fSAndroid Build Coastguard Worker bool ClassLinker::DenyAccessBasedOnPublicSdk(
11168*795d594fSAndroid Build Coastguard Worker     [[maybe_unused]] std::string_view type_descriptor) const {
11169*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11170*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11171*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11172*795d594fSAndroid Build Coastguard Worker }
11173*795d594fSAndroid Build Coastguard Worker 
SetEnablePublicSdkChecks(bool enabled)11174*795d594fSAndroid Build Coastguard Worker void ClassLinker::SetEnablePublicSdkChecks([[maybe_unused]] bool enabled) {
11175*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11176*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11177*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11178*795d594fSAndroid Build Coastguard Worker }
11179*795d594fSAndroid Build Coastguard Worker 
TransactionWriteConstraint(Thread * self,ObjPtr<mirror::Object> obj)11180*795d594fSAndroid Build Coastguard Worker bool ClassLinker::TransactionWriteConstraint(
11181*795d594fSAndroid Build Coastguard Worker     [[maybe_unused]] Thread* self, [[maybe_unused]] ObjPtr<mirror::Object> obj) {
11182*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11183*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11184*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11185*795d594fSAndroid Build Coastguard Worker }
11186*795d594fSAndroid Build Coastguard Worker 
TransactionWriteValueConstraint(Thread * self,ObjPtr<mirror::Object> value)11187*795d594fSAndroid Build Coastguard Worker bool ClassLinker::TransactionWriteValueConstraint(
11188*795d594fSAndroid Build Coastguard Worker     [[maybe_unused]] Thread* self, [[maybe_unused]] ObjPtr<mirror::Object> value) {
11189*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11190*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11191*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11192*795d594fSAndroid Build Coastguard Worker }
11193*795d594fSAndroid Build Coastguard Worker 
TransactionAllocationConstraint(Thread * self,ObjPtr<mirror::Class> klass)11194*795d594fSAndroid Build Coastguard Worker bool ClassLinker::TransactionAllocationConstraint(
11195*795d594fSAndroid Build Coastguard Worker     [[maybe_unused]] Thread* self, [[maybe_unused]] ObjPtr<mirror::Class> klass) {
11196*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11197*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11198*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11199*795d594fSAndroid Build Coastguard Worker }
11200*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldBoolean(mirror::Object * obj,MemberOffset field_offset,uint8_t value,bool is_volatile)11201*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWriteFieldBoolean([[maybe_unused]] mirror::Object* obj,
11202*795d594fSAndroid Build Coastguard Worker                                           [[maybe_unused]] MemberOffset field_offset,
11203*795d594fSAndroid Build Coastguard Worker                                           [[maybe_unused]] uint8_t value,
11204*795d594fSAndroid Build Coastguard Worker                                           [[maybe_unused]] bool is_volatile) {
11205*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11206*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11207*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11208*795d594fSAndroid Build Coastguard Worker }
11209*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldByte(mirror::Object * obj,MemberOffset field_offset,int8_t value,bool is_volatile)11210*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWriteFieldByte([[maybe_unused]] mirror::Object* obj,
11211*795d594fSAndroid Build Coastguard Worker                                        [[maybe_unused]] MemberOffset field_offset,
11212*795d594fSAndroid Build Coastguard Worker                                        [[maybe_unused]] int8_t value,
11213*795d594fSAndroid Build Coastguard Worker                                        [[maybe_unused]] bool is_volatile) {
11214*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11215*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11216*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11217*795d594fSAndroid Build Coastguard Worker }
11218*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldChar(mirror::Object * obj,MemberOffset field_offset,uint16_t value,bool is_volatile)11219*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWriteFieldChar([[maybe_unused]] mirror::Object* obj,
11220*795d594fSAndroid Build Coastguard Worker                                        [[maybe_unused]] MemberOffset field_offset,
11221*795d594fSAndroid Build Coastguard Worker                                        [[maybe_unused]] uint16_t value,
11222*795d594fSAndroid Build Coastguard Worker                                        [[maybe_unused]] bool is_volatile) {
11223*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11224*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11225*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11226*795d594fSAndroid Build Coastguard Worker }
11227*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldShort(mirror::Object * obj,MemberOffset field_offset,int16_t value,bool is_volatile)11228*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWriteFieldShort([[maybe_unused]] mirror::Object* obj,
11229*795d594fSAndroid Build Coastguard Worker                                         [[maybe_unused]] MemberOffset field_offset,
11230*795d594fSAndroid Build Coastguard Worker                                         [[maybe_unused]] int16_t value,
11231*795d594fSAndroid Build Coastguard Worker                                         [[maybe_unused]] bool is_volatile) {
11232*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11233*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11234*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11235*795d594fSAndroid Build Coastguard Worker }
11236*795d594fSAndroid Build Coastguard Worker 
RecordWriteField32(mirror::Object * obj,MemberOffset field_offset,uint32_t value,bool is_volatile)11237*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWriteField32([[maybe_unused]] mirror::Object* obj,
11238*795d594fSAndroid Build Coastguard Worker                                      [[maybe_unused]] MemberOffset field_offset,
11239*795d594fSAndroid Build Coastguard Worker                                      [[maybe_unused]] uint32_t value,
11240*795d594fSAndroid Build Coastguard Worker                                      [[maybe_unused]] bool is_volatile) {
11241*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11242*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11243*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11244*795d594fSAndroid Build Coastguard Worker }
11245*795d594fSAndroid Build Coastguard Worker 
RecordWriteField64(mirror::Object * obj,MemberOffset field_offset,uint64_t value,bool is_volatile)11246*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWriteField64([[maybe_unused]] mirror::Object* obj,
11247*795d594fSAndroid Build Coastguard Worker                                      [[maybe_unused]] MemberOffset field_offset,
11248*795d594fSAndroid Build Coastguard Worker                                      [[maybe_unused]] uint64_t value,
11249*795d594fSAndroid Build Coastguard Worker                                      [[maybe_unused]] bool is_volatile) {
11250*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11251*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11252*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11253*795d594fSAndroid Build Coastguard Worker }
11254*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldReference(mirror::Object * obj,MemberOffset field_offset,ObjPtr<mirror::Object> value,bool is_volatile)11255*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWriteFieldReference([[maybe_unused]] mirror::Object* obj,
11256*795d594fSAndroid Build Coastguard Worker                                             [[maybe_unused]] MemberOffset field_offset,
11257*795d594fSAndroid Build Coastguard Worker                                             [[maybe_unused]] ObjPtr<mirror::Object> value,
11258*795d594fSAndroid Build Coastguard Worker                                             [[maybe_unused]] bool is_volatile) {
11259*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11260*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11261*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11262*795d594fSAndroid Build Coastguard Worker }
11263*795d594fSAndroid Build Coastguard Worker 
RecordWriteArray(mirror::Array * array,size_t index,uint64_t value)11264*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWriteArray([[maybe_unused]] mirror::Array* array,
11265*795d594fSAndroid Build Coastguard Worker                                    [[maybe_unused]] size_t index,
11266*795d594fSAndroid Build Coastguard Worker                                    [[maybe_unused]] uint64_t value) {
11267*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11268*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11269*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11270*795d594fSAndroid Build Coastguard Worker }
11271*795d594fSAndroid Build Coastguard Worker 
RecordStrongStringInsertion(ObjPtr<mirror::String> s)11272*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordStrongStringInsertion([[maybe_unused]] ObjPtr<mirror::String> s) {
11273*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11274*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11275*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11276*795d594fSAndroid Build Coastguard Worker }
11277*795d594fSAndroid Build Coastguard Worker 
RecordWeakStringInsertion(ObjPtr<mirror::String> s)11278*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWeakStringInsertion([[maybe_unused]] ObjPtr<mirror::String> s) {
11279*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11280*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11281*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11282*795d594fSAndroid Build Coastguard Worker }
11283*795d594fSAndroid Build Coastguard Worker 
RecordStrongStringRemoval(ObjPtr<mirror::String> s)11284*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordStrongStringRemoval([[maybe_unused]] ObjPtr<mirror::String> s) {
11285*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11286*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11287*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11288*795d594fSAndroid Build Coastguard Worker }
11289*795d594fSAndroid Build Coastguard Worker 
RecordWeakStringRemoval(ObjPtr<mirror::String> s)11290*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordWeakStringRemoval([[maybe_unused]] ObjPtr<mirror::String> s) {
11291*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11292*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11293*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11294*795d594fSAndroid Build Coastguard Worker }
11295*795d594fSAndroid Build Coastguard Worker 
RecordResolveString(ObjPtr<mirror::DexCache> dex_cache,dex::StringIndex string_idx)11296*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordResolveString([[maybe_unused]] ObjPtr<mirror::DexCache> dex_cache,
11297*795d594fSAndroid Build Coastguard Worker                                       [[maybe_unused]] dex::StringIndex string_idx) {
11298*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11299*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11300*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11301*795d594fSAndroid Build Coastguard Worker }
11302*795d594fSAndroid Build Coastguard Worker 
RecordResolveMethodType(ObjPtr<mirror::DexCache> dex_cache,dex::ProtoIndex proto_idx)11303*795d594fSAndroid Build Coastguard Worker void ClassLinker::RecordResolveMethodType([[maybe_unused]] ObjPtr<mirror::DexCache> dex_cache,
11304*795d594fSAndroid Build Coastguard Worker                                           [[maybe_unused]] dex::ProtoIndex proto_idx) {
11305*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11306*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11307*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11308*795d594fSAndroid Build Coastguard Worker }
11309*795d594fSAndroid Build Coastguard Worker 
ThrowTransactionAbortError(Thread * self)11310*795d594fSAndroid Build Coastguard Worker void ClassLinker::ThrowTransactionAbortError([[maybe_unused]] Thread* self) {
11311*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11312*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11313*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11314*795d594fSAndroid Build Coastguard Worker }
11315*795d594fSAndroid Build Coastguard Worker 
AbortTransactionF(Thread * self,const char * fmt,...)11316*795d594fSAndroid Build Coastguard Worker void ClassLinker::AbortTransactionF(
11317*795d594fSAndroid Build Coastguard Worker     [[maybe_unused]] Thread* self, [[maybe_unused]] const char* fmt, ...) {
11318*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11319*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11320*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11321*795d594fSAndroid Build Coastguard Worker }
11322*795d594fSAndroid Build Coastguard Worker 
AbortTransactionV(Thread * self,const char * fmt,va_list args)11323*795d594fSAndroid Build Coastguard Worker void ClassLinker::AbortTransactionV([[maybe_unused]] Thread* self,
11324*795d594fSAndroid Build Coastguard Worker                                     [[maybe_unused]] const char* fmt,
11325*795d594fSAndroid Build Coastguard Worker                                     [[maybe_unused]] va_list args) {
11326*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11327*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11328*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11329*795d594fSAndroid Build Coastguard Worker }
11330*795d594fSAndroid Build Coastguard Worker 
IsTransactionAborted() const11331*795d594fSAndroid Build Coastguard Worker bool ClassLinker::IsTransactionAborted() const {
11332*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11333*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11334*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11335*795d594fSAndroid Build Coastguard Worker }
11336*795d594fSAndroid Build Coastguard Worker 
VisitTransactionRoots(RootVisitor * visitor)11337*795d594fSAndroid Build Coastguard Worker void ClassLinker::VisitTransactionRoots([[maybe_unused]] RootVisitor* visitor) {
11338*795d594fSAndroid Build Coastguard Worker   // Nothing to do for normal `ClassLinker`, only `AotClassLinker` handles transactions.
11339*795d594fSAndroid Build Coastguard Worker }
11340*795d594fSAndroid Build Coastguard Worker 
GetTransactionalInterpreter()11341*795d594fSAndroid Build Coastguard Worker const void* ClassLinker::GetTransactionalInterpreter() {
11342*795d594fSAndroid Build Coastguard Worker   // Should not be called on ClassLinker, only on AotClassLinker that overrides this.
11343*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "UNREACHABLE";
11344*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
11345*795d594fSAndroid Build Coastguard Worker }
11346*795d594fSAndroid Build Coastguard Worker 
RemoveDexFromCaches(const DexFile & dex_file)11347*795d594fSAndroid Build Coastguard Worker void ClassLinker::RemoveDexFromCaches(const DexFile& dex_file) {
11348*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(Thread::Current(), *Locks::dex_lock_);
11349*795d594fSAndroid Build Coastguard Worker 
11350*795d594fSAndroid Build Coastguard Worker   auto it = dex_caches_.find(&dex_file);
11351*795d594fSAndroid Build Coastguard Worker   if (it != dex_caches_.end()) {
11352*795d594fSAndroid Build Coastguard Worker       dex_caches_.erase(it);
11353*795d594fSAndroid Build Coastguard Worker   }
11354*795d594fSAndroid Build Coastguard Worker }
11355*795d594fSAndroid Build Coastguard Worker 
11356*795d594fSAndroid Build Coastguard Worker // GetClassLoadersVisitor collects visited class loaders.
11357*795d594fSAndroid Build Coastguard Worker class GetClassLoadersVisitor : public ClassLoaderVisitor {
11358*795d594fSAndroid Build Coastguard Worker  public:
GetClassLoadersVisitor(VariableSizedHandleScope * class_loaders)11359*795d594fSAndroid Build Coastguard Worker   explicit GetClassLoadersVisitor(VariableSizedHandleScope* class_loaders)
11360*795d594fSAndroid Build Coastguard Worker       : class_loaders_(class_loaders) {}
11361*795d594fSAndroid Build Coastguard Worker 
Visit(ObjPtr<mirror::ClassLoader> class_loader)11362*795d594fSAndroid Build Coastguard Worker   void Visit(ObjPtr<mirror::ClassLoader> class_loader)
11363*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) override {
11364*795d594fSAndroid Build Coastguard Worker     DCHECK(class_loader != nullptr);
11365*795d594fSAndroid Build Coastguard Worker     class_loaders_->NewHandle(class_loader);
11366*795d594fSAndroid Build Coastguard Worker   }
11367*795d594fSAndroid Build Coastguard Worker 
11368*795d594fSAndroid Build Coastguard Worker  private:
11369*795d594fSAndroid Build Coastguard Worker   VariableSizedHandleScope* const class_loaders_;
11370*795d594fSAndroid Build Coastguard Worker };
11371*795d594fSAndroid Build Coastguard Worker 
GetClassLoaders(Thread * self,VariableSizedHandleScope * handles)11372*795d594fSAndroid Build Coastguard Worker void ClassLinker::GetClassLoaders(Thread* self, VariableSizedHandleScope* handles) {
11373*795d594fSAndroid Build Coastguard Worker   GetClassLoadersVisitor class_loader_visitor(handles);
11374*795d594fSAndroid Build Coastguard Worker   ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_);
11375*795d594fSAndroid Build Coastguard Worker   VisitClassLoaders(&class_loader_visitor);
11376*795d594fSAndroid Build Coastguard Worker }
11377*795d594fSAndroid Build Coastguard Worker 
11378*795d594fSAndroid Build Coastguard Worker // Instantiate ClassLinker::AllocClass.
11379*795d594fSAndroid Build Coastguard Worker template ObjPtr<mirror::Class> ClassLinker::AllocClass</* kMovable= */ true>(
11380*795d594fSAndroid Build Coastguard Worker     Thread* self,
11381*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> java_lang_Class,
11382*795d594fSAndroid Build Coastguard Worker     uint32_t class_size);
11383*795d594fSAndroid Build Coastguard Worker template ObjPtr<mirror::Class> ClassLinker::AllocClass</* kMovable= */ false>(
11384*795d594fSAndroid Build Coastguard Worker     Thread* self,
11385*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::Class> java_lang_Class,
11386*795d594fSAndroid Build Coastguard Worker     uint32_t class_size);
11387*795d594fSAndroid Build Coastguard Worker 
11388*795d594fSAndroid Build Coastguard Worker }  // namespace art
11389