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