xref: /aosp_15_r20/art/compiler/driver/dex_compilation_unit.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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