xref: /aosp_15_r20/art/compiler/optimizing/handle_cache.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2024 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 #ifndef ART_COMPILER_OPTIMIZING_HANDLE_CACHE_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_OPTIMIZING_HANDLE_CACHE_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
21*795d594fSAndroid Build Coastguard Worker #include "class_root.h"
22*795d594fSAndroid Build Coastguard Worker #include "reference_type_info.h"
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker class VariableSizedHandleScope;
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker class HandleCache {
29*795d594fSAndroid Build Coastguard Worker  public:
HandleCache(VariableSizedHandleScope * handles)30*795d594fSAndroid Build Coastguard Worker   explicit HandleCache(VariableSizedHandleScope* handles) : handles_(handles) { }
31*795d594fSAndroid Build Coastguard Worker 
GetHandles()32*795d594fSAndroid Build Coastguard Worker   VariableSizedHandleScope* GetHandles() { return handles_; }
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker   template <typename T>
35*795d594fSAndroid Build Coastguard Worker   MutableHandle<T> NewHandle(T* object) REQUIRES_SHARED(Locks::mutator_lock_);
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker   template <typename T>
38*795d594fSAndroid Build Coastguard Worker   MutableHandle<T> NewHandle(ObjPtr<T> object) REQUIRES_SHARED(Locks::mutator_lock_);
39*795d594fSAndroid Build Coastguard Worker 
GetObjectClassHandle()40*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle GetObjectClassHandle() {
41*795d594fSAndroid Build Coastguard Worker     return GetRootHandle(ClassRoot::kJavaLangObject, &object_class_handle_);
42*795d594fSAndroid Build Coastguard Worker   }
43*795d594fSAndroid Build Coastguard Worker 
GetClassClassHandle()44*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle GetClassClassHandle() {
45*795d594fSAndroid Build Coastguard Worker     return GetRootHandle(ClassRoot::kJavaLangClass, &class_class_handle_);
46*795d594fSAndroid Build Coastguard Worker   }
47*795d594fSAndroid Build Coastguard Worker 
GetMethodHandleClassHandle()48*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle GetMethodHandleClassHandle() {
49*795d594fSAndroid Build Coastguard Worker     return GetRootHandle(ClassRoot::kJavaLangInvokeMethodHandleImpl, &method_handle_class_handle_);
50*795d594fSAndroid Build Coastguard Worker   }
51*795d594fSAndroid Build Coastguard Worker 
GetMethodTypeClassHandle()52*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle GetMethodTypeClassHandle() {
53*795d594fSAndroid Build Coastguard Worker     return GetRootHandle(ClassRoot::kJavaLangInvokeMethodType, &method_type_class_handle_);
54*795d594fSAndroid Build Coastguard Worker   }
55*795d594fSAndroid Build Coastguard Worker 
GetStringClassHandle()56*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle GetStringClassHandle() {
57*795d594fSAndroid Build Coastguard Worker     return GetRootHandle(ClassRoot::kJavaLangString, &string_class_handle_);
58*795d594fSAndroid Build Coastguard Worker   }
59*795d594fSAndroid Build Coastguard Worker 
GetThrowableClassHandle()60*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle GetThrowableClassHandle() {
61*795d594fSAndroid Build Coastguard Worker     return GetRootHandle(ClassRoot::kJavaLangThrowable, &throwable_class_handle_);
62*795d594fSAndroid Build Coastguard Worker   }
63*795d594fSAndroid Build Coastguard Worker 
64*795d594fSAndroid Build Coastguard Worker  private:
GetRootHandle(ClassRoot class_root,ReferenceTypeInfo::TypeHandle * cache)65*795d594fSAndroid Build Coastguard Worker   inline ReferenceTypeInfo::TypeHandle GetRootHandle(ClassRoot class_root,
66*795d594fSAndroid Build Coastguard Worker                                                      ReferenceTypeInfo::TypeHandle* cache) {
67*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(!ReferenceTypeInfo::IsValidHandle(*cache))) {
68*795d594fSAndroid Build Coastguard Worker       *cache = CreateRootHandle(handles_, class_root);
69*795d594fSAndroid Build Coastguard Worker     }
70*795d594fSAndroid Build Coastguard Worker     return *cache;
71*795d594fSAndroid Build Coastguard Worker   }
72*795d594fSAndroid Build Coastguard Worker 
73*795d594fSAndroid Build Coastguard Worker   static ReferenceTypeInfo::TypeHandle CreateRootHandle(VariableSizedHandleScope* handles,
74*795d594fSAndroid Build Coastguard Worker                                                         ClassRoot class_root);
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker   VariableSizedHandleScope* handles_;
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle object_class_handle_;
79*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle class_class_handle_;
80*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle method_handle_class_handle_;
81*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle method_type_class_handle_;
82*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle string_class_handle_;
83*795d594fSAndroid Build Coastguard Worker   ReferenceTypeInfo::TypeHandle throwable_class_handle_;
84*795d594fSAndroid Build Coastguard Worker };
85*795d594fSAndroid Build Coastguard Worker 
86*795d594fSAndroid Build Coastguard Worker }  // namespace art
87*795d594fSAndroid Build Coastguard Worker 
88*795d594fSAndroid Build Coastguard Worker #endif  // ART_COMPILER_OPTIMIZING_HANDLE_CACHE_H_
89*795d594fSAndroid Build Coastguard Worker 
90