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