xref: /aosp_15_r20/art/runtime/noop_compiler_callbacks.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2013 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_RUNTIME_NOOP_COMPILER_CALLBACKS_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_NOOP_COMPILER_CALLBACKS_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
21*795d594fSAndroid Build Coastguard Worker #include "class_linker.h"
22*795d594fSAndroid Build Coastguard Worker #include "compiler_callbacks.h"
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker // Used for tests and some tools that pretend to be a compiler (say, oatdump).
27*795d594fSAndroid Build Coastguard Worker class NoopCompilerCallbacks final : public CompilerCallbacks {
28*795d594fSAndroid Build Coastguard Worker  public:
NoopCompilerCallbacks()29*795d594fSAndroid Build Coastguard Worker   NoopCompilerCallbacks() : CompilerCallbacks(CompilerCallbacks::CallbackMode::kCompileApp) {}
~NoopCompilerCallbacks()30*795d594fSAndroid Build Coastguard Worker   ~NoopCompilerCallbacks() {}
31*795d594fSAndroid Build Coastguard Worker 
CreateAotClassLinker(InternTable * intern_table)32*795d594fSAndroid Build Coastguard Worker   ClassLinker* CreateAotClassLinker(InternTable* intern_table) override {
33*795d594fSAndroid Build Coastguard Worker     return new PermissiveClassLinker(intern_table);
34*795d594fSAndroid Build Coastguard Worker   }
35*795d594fSAndroid Build Coastguard Worker 
AddUncompilableMethod(MethodReference ref)36*795d594fSAndroid Build Coastguard Worker   void AddUncompilableMethod([[maybe_unused]] MethodReference ref) override {}
AddUncompilableClass(ClassReference ref)37*795d594fSAndroid Build Coastguard Worker   void AddUncompilableClass([[maybe_unused]] ClassReference ref) override {}
ClassRejected(ClassReference ref)38*795d594fSAndroid Build Coastguard Worker   void ClassRejected([[maybe_unused]] ClassReference ref) override {}
39*795d594fSAndroid Build Coastguard Worker 
GetVerifierDeps()40*795d594fSAndroid Build Coastguard Worker   verifier::VerifierDeps* GetVerifierDeps() const override { return nullptr; }
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker  private:
43*795d594fSAndroid Build Coastguard Worker   // When we supply compiler callbacks, we need an appropriate `ClassLinker` that can
44*795d594fSAndroid Build Coastguard Worker   // handle `SdkChecker`-related calls that are unimplemented in the base `ClassLinker`.
45*795d594fSAndroid Build Coastguard Worker   class PermissiveClassLinker : public ClassLinker {
46*795d594fSAndroid Build Coastguard Worker    public:
PermissiveClassLinker(InternTable * intern_table)47*795d594fSAndroid Build Coastguard Worker     explicit PermissiveClassLinker(InternTable* intern_table)
48*795d594fSAndroid Build Coastguard Worker         : ClassLinker(intern_table, /*fast_class_not_found_exceptions=*/ false) {}
49*795d594fSAndroid Build Coastguard Worker 
DenyAccessBasedOnPublicSdk(ArtMethod * art_method)50*795d594fSAndroid Build Coastguard Worker     bool DenyAccessBasedOnPublicSdk([[maybe_unused]] ArtMethod* art_method) const override
51*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
52*795d594fSAndroid Build Coastguard Worker       return false;
53*795d594fSAndroid Build Coastguard Worker     }
DenyAccessBasedOnPublicSdk(ArtField * art_field)54*795d594fSAndroid Build Coastguard Worker     bool DenyAccessBasedOnPublicSdk([[maybe_unused]] ArtField* art_field) const override
55*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
56*795d594fSAndroid Build Coastguard Worker       return false;
57*795d594fSAndroid Build Coastguard Worker     }
DenyAccessBasedOnPublicSdk(std::string_view type_descriptor)58*795d594fSAndroid Build Coastguard Worker     bool DenyAccessBasedOnPublicSdk(
59*795d594fSAndroid Build Coastguard Worker         [[maybe_unused]] std::string_view type_descriptor) const override {
60*795d594fSAndroid Build Coastguard Worker       return false;
61*795d594fSAndroid Build Coastguard Worker     }
SetEnablePublicSdkChecks(bool enabled)62*795d594fSAndroid Build Coastguard Worker     void SetEnablePublicSdkChecks([[maybe_unused]] bool enabled) override {}
63*795d594fSAndroid Build Coastguard Worker 
64*795d594fSAndroid Build Coastguard Worker     // Transaction-related virtual functions should not be called on `PermissiveClassLinker`.
65*795d594fSAndroid Build Coastguard Worker 
TransactionWriteConstraint(Thread * self,ObjPtr<mirror::Object> obj)66*795d594fSAndroid Build Coastguard Worker     bool TransactionWriteConstraint([[maybe_unused]] Thread* self,
67*795d594fSAndroid Build Coastguard Worker                                     [[maybe_unused]] ObjPtr<mirror::Object> obj) override
68*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
69*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
70*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
71*795d594fSAndroid Build Coastguard Worker     }
72*795d594fSAndroid Build Coastguard Worker 
TransactionWriteValueConstraint(Thread * self,ObjPtr<mirror::Object> value)73*795d594fSAndroid Build Coastguard Worker     bool TransactionWriteValueConstraint([[maybe_unused]] Thread* self,
74*795d594fSAndroid Build Coastguard Worker                                          [[maybe_unused]] ObjPtr<mirror::Object> value) override
75*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
76*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
77*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
78*795d594fSAndroid Build Coastguard Worker     }
79*795d594fSAndroid Build Coastguard Worker 
TransactionAllocationConstraint(Thread * self,ObjPtr<mirror::Class> klass)80*795d594fSAndroid Build Coastguard Worker     bool TransactionAllocationConstraint([[maybe_unused]] Thread* self,
81*795d594fSAndroid Build Coastguard Worker                                          [[maybe_unused]] ObjPtr<mirror::Class> klass) override
82*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
83*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
84*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
85*795d594fSAndroid Build Coastguard Worker     }
86*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldBoolean(mirror::Object * obj,MemberOffset field_offset,uint8_t value,bool is_volatile)87*795d594fSAndroid Build Coastguard Worker     void RecordWriteFieldBoolean([[maybe_unused]] mirror::Object* obj,
88*795d594fSAndroid Build Coastguard Worker                                  [[maybe_unused]] MemberOffset field_offset,
89*795d594fSAndroid Build Coastguard Worker                                  [[maybe_unused]] uint8_t value,
90*795d594fSAndroid Build Coastguard Worker                                  [[maybe_unused]] bool is_volatile) override {
91*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
92*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
93*795d594fSAndroid Build Coastguard Worker     }
94*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldByte(mirror::Object * obj,MemberOffset field_offset,int8_t value,bool is_volatile)95*795d594fSAndroid Build Coastguard Worker     void RecordWriteFieldByte([[maybe_unused]] mirror::Object* obj,
96*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] MemberOffset field_offset,
97*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] int8_t value,
98*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] bool is_volatile) override {
99*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
100*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
101*795d594fSAndroid Build Coastguard Worker     }
102*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldChar(mirror::Object * obj,MemberOffset field_offset,uint16_t value,bool is_volatile)103*795d594fSAndroid Build Coastguard Worker     void RecordWriteFieldChar([[maybe_unused]] mirror::Object* obj,
104*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] MemberOffset field_offset,
105*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] uint16_t value,
106*795d594fSAndroid Build Coastguard Worker                               [[maybe_unused]] bool is_volatile) override {
107*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
108*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
109*795d594fSAndroid Build Coastguard Worker     }
110*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldShort(mirror::Object * obj,MemberOffset field_offset,int16_t value,bool is_volatile)111*795d594fSAndroid Build Coastguard Worker     void RecordWriteFieldShort([[maybe_unused]] mirror::Object* obj,
112*795d594fSAndroid Build Coastguard Worker                                [[maybe_unused]] MemberOffset field_offset,
113*795d594fSAndroid Build Coastguard Worker                                [[maybe_unused]] int16_t value,
114*795d594fSAndroid Build Coastguard Worker                                [[maybe_unused]] bool is_volatile) override {
115*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
116*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
117*795d594fSAndroid Build Coastguard Worker     }
118*795d594fSAndroid Build Coastguard Worker 
RecordWriteField32(mirror::Object * obj,MemberOffset field_offset,uint32_t value,bool is_volatile)119*795d594fSAndroid Build Coastguard Worker     void RecordWriteField32([[maybe_unused]] mirror::Object* obj,
120*795d594fSAndroid Build Coastguard Worker                             [[maybe_unused]] MemberOffset field_offset,
121*795d594fSAndroid Build Coastguard Worker                             [[maybe_unused]] uint32_t value,
122*795d594fSAndroid Build Coastguard Worker                             [[maybe_unused]] bool is_volatile) override {
123*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
124*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
125*795d594fSAndroid Build Coastguard Worker     }
126*795d594fSAndroid Build Coastguard Worker 
RecordWriteField64(mirror::Object * obj,MemberOffset field_offset,uint64_t value,bool is_volatile)127*795d594fSAndroid Build Coastguard Worker     void RecordWriteField64([[maybe_unused]] mirror::Object* obj,
128*795d594fSAndroid Build Coastguard Worker                             [[maybe_unused]] MemberOffset field_offset,
129*795d594fSAndroid Build Coastguard Worker                             [[maybe_unused]] uint64_t value,
130*795d594fSAndroid Build Coastguard Worker                             [[maybe_unused]] bool is_volatile) override {
131*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
132*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
133*795d594fSAndroid Build Coastguard Worker     }
134*795d594fSAndroid Build Coastguard Worker 
RecordWriteFieldReference(mirror::Object * obj,MemberOffset field_offset,ObjPtr<mirror::Object> value,bool is_volatile)135*795d594fSAndroid Build Coastguard Worker     void RecordWriteFieldReference([[maybe_unused]] mirror::Object* obj,
136*795d594fSAndroid Build Coastguard Worker                                    [[maybe_unused]] MemberOffset field_offset,
137*795d594fSAndroid Build Coastguard Worker                                    [[maybe_unused]] ObjPtr<mirror::Object> value,
138*795d594fSAndroid Build Coastguard Worker                                    [[maybe_unused]] bool is_volatile) override
139*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
140*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
141*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
142*795d594fSAndroid Build Coastguard Worker     }
143*795d594fSAndroid Build Coastguard Worker 
RecordWriteArray(mirror::Array * array,size_t index,uint64_t value)144*795d594fSAndroid Build Coastguard Worker     void RecordWriteArray([[maybe_unused]] mirror::Array* array,
145*795d594fSAndroid Build Coastguard Worker                           [[maybe_unused]] size_t index,
146*795d594fSAndroid Build Coastguard Worker                           [[maybe_unused]] uint64_t value) override
147*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
148*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
149*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
150*795d594fSAndroid Build Coastguard Worker     }
151*795d594fSAndroid Build Coastguard Worker 
RecordStrongStringInsertion(ObjPtr<mirror::String> s)152*795d594fSAndroid Build Coastguard Worker     void RecordStrongStringInsertion([[maybe_unused]] ObjPtr<mirror::String> s) override
153*795d594fSAndroid Build Coastguard Worker         REQUIRES(Locks::intern_table_lock_) {
154*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
155*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
156*795d594fSAndroid Build Coastguard Worker     }
157*795d594fSAndroid Build Coastguard Worker 
RecordWeakStringInsertion(ObjPtr<mirror::String> s)158*795d594fSAndroid Build Coastguard Worker     void RecordWeakStringInsertion([[maybe_unused]] ObjPtr<mirror::String> s) override
159*795d594fSAndroid Build Coastguard Worker         REQUIRES(Locks::intern_table_lock_) {
160*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
161*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
162*795d594fSAndroid Build Coastguard Worker     }
163*795d594fSAndroid Build Coastguard Worker 
RecordStrongStringRemoval(ObjPtr<mirror::String> s)164*795d594fSAndroid Build Coastguard Worker     void RecordStrongStringRemoval([[maybe_unused]] ObjPtr<mirror::String> s) override
165*795d594fSAndroid Build Coastguard Worker         REQUIRES(Locks::intern_table_lock_) {
166*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
167*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
168*795d594fSAndroid Build Coastguard Worker     }
169*795d594fSAndroid Build Coastguard Worker 
RecordWeakStringRemoval(ObjPtr<mirror::String> s)170*795d594fSAndroid Build Coastguard Worker     void RecordWeakStringRemoval([[maybe_unused]] ObjPtr<mirror::String> s) override
171*795d594fSAndroid Build Coastguard Worker         REQUIRES(Locks::intern_table_lock_) {
172*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
173*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
174*795d594fSAndroid Build Coastguard Worker     }
175*795d594fSAndroid Build Coastguard Worker 
RecordResolveString(ObjPtr<mirror::DexCache> dex_cache,dex::StringIndex string_idx)176*795d594fSAndroid Build Coastguard Worker     void RecordResolveString([[maybe_unused]] ObjPtr<mirror::DexCache> dex_cache,
177*795d594fSAndroid Build Coastguard Worker                              [[maybe_unused]] dex::StringIndex string_idx) override
178*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
179*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
180*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
181*795d594fSAndroid Build Coastguard Worker     }
182*795d594fSAndroid Build Coastguard Worker 
RecordResolveMethodType(ObjPtr<mirror::DexCache> dex_cache,dex::ProtoIndex proto_idx)183*795d594fSAndroid Build Coastguard Worker     void RecordResolveMethodType([[maybe_unused]] ObjPtr<mirror::DexCache> dex_cache,
184*795d594fSAndroid Build Coastguard Worker                                  [[maybe_unused]] dex::ProtoIndex proto_idx) override
185*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
186*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
187*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
188*795d594fSAndroid Build Coastguard Worker     }
189*795d594fSAndroid Build Coastguard Worker 
ThrowTransactionAbortError(Thread * self)190*795d594fSAndroid Build Coastguard Worker     void ThrowTransactionAbortError([[maybe_unused]] Thread* self) override
191*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
192*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
193*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
194*795d594fSAndroid Build Coastguard Worker     }
195*795d594fSAndroid Build Coastguard Worker 
AbortTransactionF(Thread * self,const char * fmt,...)196*795d594fSAndroid Build Coastguard Worker     void AbortTransactionF([[maybe_unused]] Thread* self,
197*795d594fSAndroid Build Coastguard Worker                            [[maybe_unused]] const char* fmt, ...) override
198*795d594fSAndroid Build Coastguard Worker         __attribute__((__format__(__printf__, 3, 4)))
199*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
200*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
201*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
202*795d594fSAndroid Build Coastguard Worker     }
203*795d594fSAndroid Build Coastguard Worker 
AbortTransactionV(Thread * self,const char * fmt,va_list args)204*795d594fSAndroid Build Coastguard Worker     void AbortTransactionV([[maybe_unused]] Thread* self,
205*795d594fSAndroid Build Coastguard Worker                            [[maybe_unused]] const char* fmt,
206*795d594fSAndroid Build Coastguard Worker                            [[maybe_unused]] va_list args) override
207*795d594fSAndroid Build Coastguard Worker         REQUIRES_SHARED(Locks::mutator_lock_) {
208*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
209*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
210*795d594fSAndroid Build Coastguard Worker     }
211*795d594fSAndroid Build Coastguard Worker 
IsTransactionAborted()212*795d594fSAndroid Build Coastguard Worker     bool IsTransactionAborted() const override {
213*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
214*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
215*795d594fSAndroid Build Coastguard Worker     }
216*795d594fSAndroid Build Coastguard Worker 
VisitTransactionRoots(RootVisitor * visitor)217*795d594fSAndroid Build Coastguard Worker     void VisitTransactionRoots([[maybe_unused]] RootVisitor* visitor) override {
218*795d594fSAndroid Build Coastguard Worker       // Nothing to do for `PermissiveClassLinker`, only `AotClassLinker` handles transactions.
219*795d594fSAndroid Build Coastguard Worker     }
220*795d594fSAndroid Build Coastguard Worker 
GetTransactionalInterpreter()221*795d594fSAndroid Build Coastguard Worker     const void* GetTransactionalInterpreter() override {
222*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "UNREACHABLE";
223*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
224*795d594fSAndroid Build Coastguard Worker     }
225*795d594fSAndroid Build Coastguard Worker   };
226*795d594fSAndroid Build Coastguard Worker 
227*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(NoopCompilerCallbacks);
228*795d594fSAndroid Build Coastguard Worker };
229*795d594fSAndroid Build Coastguard Worker 
230*795d594fSAndroid Build Coastguard Worker }  // namespace art
231*795d594fSAndroid Build Coastguard Worker 
232*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_NOOP_COMPILER_CALLBACKS_H_
233