1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2012 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_DRIVER_DEX_COMPILATION_UNIT_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_DRIVER_DEX_COMPILATION_UNIT_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <stdint.h> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "base/arena_object.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 24*795d594fSAndroid Build Coastguard Worker #include "dex/code_item_accessors.h" 25*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file.h" 26*795d594fSAndroid Build Coastguard Worker #include "handle.h" 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 29*795d594fSAndroid Build Coastguard Worker namespace mirror { 30*795d594fSAndroid Build Coastguard Worker class Class; 31*795d594fSAndroid Build Coastguard Worker class ClassLoader; 32*795d594fSAndroid Build Coastguard Worker class DexCache; 33*795d594fSAndroid Build Coastguard Worker } // namespace mirror 34*795d594fSAndroid Build Coastguard Worker class ClassLinker; 35*795d594fSAndroid Build Coastguard Worker class VerifiedMethod; 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker class DexCompilationUnit : public DeletableArenaObject<kArenaAllocMisc> { 38*795d594fSAndroid Build Coastguard Worker public: 39*795d594fSAndroid Build Coastguard Worker DexCompilationUnit(Handle<mirror::ClassLoader> class_loader, 40*795d594fSAndroid Build Coastguard Worker ClassLinker* class_linker, 41*795d594fSAndroid Build Coastguard Worker const DexFile& dex_file, 42*795d594fSAndroid Build Coastguard Worker const dex::CodeItem* code_item, 43*795d594fSAndroid Build Coastguard Worker uint16_t class_def_idx, 44*795d594fSAndroid Build Coastguard Worker uint32_t method_idx, 45*795d594fSAndroid Build Coastguard Worker uint32_t access_flags, 46*795d594fSAndroid Build Coastguard Worker const VerifiedMethod* verified_method, 47*795d594fSAndroid Build Coastguard Worker Handle<mirror::DexCache> dex_cache, 48*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> compiling_class = Handle<mirror::Class>()); 49*795d594fSAndroid Build Coastguard Worker GetClassLoader()50*795d594fSAndroid Build Coastguard Worker Handle<mirror::ClassLoader> GetClassLoader() const { 51*795d594fSAndroid Build Coastguard Worker return class_loader_; 52*795d594fSAndroid Build Coastguard Worker } 53*795d594fSAndroid Build Coastguard Worker GetClassLinker()54*795d594fSAndroid Build Coastguard Worker ClassLinker* GetClassLinker() const { 55*795d594fSAndroid Build Coastguard Worker return class_linker_; 56*795d594fSAndroid Build Coastguard Worker } 57*795d594fSAndroid Build Coastguard Worker GetDexFile()58*795d594fSAndroid Build Coastguard Worker const DexFile* GetDexFile() const { 59*795d594fSAndroid Build Coastguard Worker return dex_file_; 60*795d594fSAndroid Build Coastguard Worker } 61*795d594fSAndroid Build Coastguard Worker GetClassDefIndex()62*795d594fSAndroid Build Coastguard Worker uint16_t GetClassDefIndex() const { 63*795d594fSAndroid Build Coastguard Worker return class_def_idx_; 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker GetDexMethodIndex()66*795d594fSAndroid Build Coastguard Worker uint32_t GetDexMethodIndex() const { 67*795d594fSAndroid Build Coastguard Worker return dex_method_idx_; 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker GetCodeItem()70*795d594fSAndroid Build Coastguard Worker const dex::CodeItem* GetCodeItem() const { 71*795d594fSAndroid Build Coastguard Worker return code_item_; 72*795d594fSAndroid Build Coastguard Worker } 73*795d594fSAndroid Build Coastguard Worker GetShorty()74*795d594fSAndroid Build Coastguard Worker const char* GetShorty() const { 75*795d594fSAndroid Build Coastguard Worker const dex::MethodId& method_id = dex_file_->GetMethodId(dex_method_idx_); 76*795d594fSAndroid Build Coastguard Worker return dex_file_->GetMethodShorty(method_id); 77*795d594fSAndroid Build Coastguard Worker } 78*795d594fSAndroid Build Coastguard Worker GetShorty(uint32_t * shorty_len)79*795d594fSAndroid Build Coastguard Worker const char* GetShorty(uint32_t* shorty_len) const { 80*795d594fSAndroid Build Coastguard Worker const dex::MethodId& method_id = dex_file_->GetMethodId(dex_method_idx_); 81*795d594fSAndroid Build Coastguard Worker return dex_file_->GetMethodShorty(method_id, shorty_len); 82*795d594fSAndroid Build Coastguard Worker } 83*795d594fSAndroid Build Coastguard Worker GetAccessFlags()84*795d594fSAndroid Build Coastguard Worker uint32_t GetAccessFlags() const { 85*795d594fSAndroid Build Coastguard Worker return access_flags_; 86*795d594fSAndroid Build Coastguard Worker } 87*795d594fSAndroid Build Coastguard Worker IsConstructor()88*795d594fSAndroid Build Coastguard Worker bool IsConstructor() const { 89*795d594fSAndroid Build Coastguard Worker return ((access_flags_ & kAccConstructor) != 0); 90*795d594fSAndroid Build Coastguard Worker } 91*795d594fSAndroid Build Coastguard Worker IsNative()92*795d594fSAndroid Build Coastguard Worker bool IsNative() const { 93*795d594fSAndroid Build Coastguard Worker return ((access_flags_ & kAccNative) != 0); 94*795d594fSAndroid Build Coastguard Worker } 95*795d594fSAndroid Build Coastguard Worker IsStatic()96*795d594fSAndroid Build Coastguard Worker bool IsStatic() const { 97*795d594fSAndroid Build Coastguard Worker return ((access_flags_ & kAccStatic) != 0); 98*795d594fSAndroid Build Coastguard Worker } 99*795d594fSAndroid Build Coastguard Worker IsSynchronized()100*795d594fSAndroid Build Coastguard Worker bool IsSynchronized() const { 101*795d594fSAndroid Build Coastguard Worker return ((access_flags_ & kAccSynchronized) != 0); 102*795d594fSAndroid Build Coastguard Worker } 103*795d594fSAndroid Build Coastguard Worker GetVerifiedMethod()104*795d594fSAndroid Build Coastguard Worker const VerifiedMethod* GetVerifiedMethod() const { 105*795d594fSAndroid Build Coastguard Worker return verified_method_; 106*795d594fSAndroid Build Coastguard Worker } 107*795d594fSAndroid Build Coastguard Worker ClearVerifiedMethod()108*795d594fSAndroid Build Coastguard Worker void ClearVerifiedMethod() { 109*795d594fSAndroid Build Coastguard Worker verified_method_ = nullptr; 110*795d594fSAndroid Build Coastguard Worker } 111*795d594fSAndroid Build Coastguard Worker 112*795d594fSAndroid Build Coastguard Worker const std::string& GetSymbol(); 113*795d594fSAndroid Build Coastguard Worker GetDexCache()114*795d594fSAndroid Build Coastguard Worker Handle<mirror::DexCache> GetDexCache() const { 115*795d594fSAndroid Build Coastguard Worker return dex_cache_; 116*795d594fSAndroid Build Coastguard Worker } 117*795d594fSAndroid Build Coastguard Worker GetCodeItemAccessor()118*795d594fSAndroid Build Coastguard Worker const CodeItemDataAccessor& GetCodeItemAccessor() const { 119*795d594fSAndroid Build Coastguard Worker return code_item_accessor_; 120*795d594fSAndroid Build Coastguard Worker } 121*795d594fSAndroid Build Coastguard Worker GetCompilingClass()122*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> GetCompilingClass() const { 123*795d594fSAndroid Build Coastguard Worker return compiling_class_; 124*795d594fSAndroid Build Coastguard Worker } 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker // Does this <init> method require a constructor barrier (prior to the return)? 127*795d594fSAndroid Build Coastguard Worker // The answer is "yes", if and only if the class has any instance final fields. 128*795d594fSAndroid Build Coastguard Worker // (This must not be called for any non-<init> methods; the answer would be "no"). 129*795d594fSAndroid Build Coastguard Worker // 130*795d594fSAndroid Build Coastguard Worker // --- 131*795d594fSAndroid Build Coastguard Worker // 132*795d594fSAndroid Build Coastguard Worker // JLS 17.5.1 "Semantics of final fields" mandates that all final fields are frozen at the end 133*795d594fSAndroid Build Coastguard Worker // of the invoked constructor. The constructor barrier is a conservative implementation means of 134*795d594fSAndroid Build Coastguard Worker // enforcing the freezes happen-before the object being constructed is observable by another 135*795d594fSAndroid Build Coastguard Worker // thread. 136*795d594fSAndroid Build Coastguard Worker // 137*795d594fSAndroid Build Coastguard Worker // Note: This question only makes sense for instance constructors; 138*795d594fSAndroid Build Coastguard Worker // static constructors (despite possibly having finals) never need 139*795d594fSAndroid Build Coastguard Worker // a barrier. 140*795d594fSAndroid Build Coastguard Worker // 141*795d594fSAndroid Build Coastguard Worker // JLS 12.4.2 "Detailed Initialization Procedure" approximately describes 142*795d594fSAndroid Build Coastguard Worker // class initialization as: 143*795d594fSAndroid Build Coastguard Worker // 144*795d594fSAndroid Build Coastguard Worker // lock(class.lock) 145*795d594fSAndroid Build Coastguard Worker // class.state = initializing 146*795d594fSAndroid Build Coastguard Worker // unlock(class.lock) 147*795d594fSAndroid Build Coastguard Worker // 148*795d594fSAndroid Build Coastguard Worker // invoke <clinit> 149*795d594fSAndroid Build Coastguard Worker // 150*795d594fSAndroid Build Coastguard Worker // lock(class.lock) 151*795d594fSAndroid Build Coastguard Worker // class.state = initialized 152*795d594fSAndroid Build Coastguard Worker // unlock(class.lock) <-- acts as a release 153*795d594fSAndroid Build Coastguard Worker // 154*795d594fSAndroid Build Coastguard Worker // The last operation in the above example acts as an atomic release 155*795d594fSAndroid Build Coastguard Worker // for any stores in <clinit>, which ends up being stricter 156*795d594fSAndroid Build Coastguard Worker // than what a constructor barrier needs. 157*795d594fSAndroid Build Coastguard Worker // 158*795d594fSAndroid Build Coastguard Worker // See also QuasiAtomic::ThreadFenceForConstructor(). 159*795d594fSAndroid Build Coastguard Worker bool RequiresConstructorBarrier() const; 160*795d594fSAndroid Build Coastguard Worker 161*795d594fSAndroid Build Coastguard Worker private: 162*795d594fSAndroid Build Coastguard Worker const Handle<mirror::ClassLoader> class_loader_; 163*795d594fSAndroid Build Coastguard Worker 164*795d594fSAndroid Build Coastguard Worker ClassLinker* const class_linker_; 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker const DexFile* const dex_file_; 167*795d594fSAndroid Build Coastguard Worker 168*795d594fSAndroid Build Coastguard Worker const dex::CodeItem* const code_item_; 169*795d594fSAndroid Build Coastguard Worker const uint16_t class_def_idx_; 170*795d594fSAndroid Build Coastguard Worker const uint32_t dex_method_idx_; 171*795d594fSAndroid Build Coastguard Worker const uint32_t access_flags_; 172*795d594fSAndroid Build Coastguard Worker const VerifiedMethod* verified_method_; 173*795d594fSAndroid Build Coastguard Worker 174*795d594fSAndroid Build Coastguard Worker const Handle<mirror::DexCache> dex_cache_; 175*795d594fSAndroid Build Coastguard Worker 176*795d594fSAndroid Build Coastguard Worker const CodeItemDataAccessor code_item_accessor_; 177*795d594fSAndroid Build Coastguard Worker 178*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> compiling_class_; 179*795d594fSAndroid Build Coastguard Worker 180*795d594fSAndroid Build Coastguard Worker std::string symbol_; 181*795d594fSAndroid Build Coastguard Worker }; 182*795d594fSAndroid Build Coastguard Worker 183*795d594fSAndroid Build Coastguard Worker } // namespace art 184*795d594fSAndroid Build Coastguard Worker 185*795d594fSAndroid Build Coastguard Worker #endif // ART_COMPILER_DRIVER_DEX_COMPILATION_UNIT_H_ 186