class_linker.h revision 28db0129e5d7ef642cf8845c86c0e11832817085
1418d20fc407052d4152157f61e7453359f902383Elliott Hughes/*
2418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Copyright (C) 2011 The Android Open Source Project
3418d20fc407052d4152157f61e7453359f902383Elliott Hughes *
4418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
5418d20fc407052d4152157f61e7453359f902383Elliott Hughes * you may not use this file except in compliance with the License.
6418d20fc407052d4152157f61e7453359f902383Elliott Hughes * You may obtain a copy of the License at
7418d20fc407052d4152157f61e7453359f902383Elliott Hughes *
8418d20fc407052d4152157f61e7453359f902383Elliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9418d20fc407052d4152157f61e7453359f902383Elliott Hughes *
10418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Unless required by applicable law or agreed to in writing, software
11418d20fc407052d4152157f61e7453359f902383Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12418d20fc407052d4152157f61e7453359f902383Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13418d20fc407052d4152157f61e7453359f902383Elliott Hughes * See the License for the specific language governing permissions and
14418d20fc407052d4152157f61e7453359f902383Elliott Hughes * limitations under the License.
15418d20fc407052d4152157f61e7453359f902383Elliott Hughes */
160e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
170e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#ifndef ART_SRC_CLASS_LINKER_H_
180e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#define ART_SRC_CLASS_LINKER_H_
190e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
206d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers#include <string>
210e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <utility>
220e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <vector>
230e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
24caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers#include "dex_cache.h"
257e93b50433cde2a44d99212e8040299bde498546Brian Carlstrom#include "dex_file.h"
26e5448b5a12003b405b22cde3b94f962ab4888a87Elliott Hughes#include "gtest/gtest.h"
274a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom#include "heap.h"
28578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "macros.h"
298daa0929f08a3080ea64dbd4e997e72f411e6fc9Elliott Hughes#include "mutex.h"
3058ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom#include "oat_file.h"
31578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "object.h"
32a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes#include "safe_map.h"
330e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
340e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapironamespace art {
350e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
36cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughesclass ClassLoader;
3730fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogersclass ImageSpace;
38cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughesclass InternTable;
39d1422f81bf9b35cb2aad3fb5615d3f5209014709Brian Carlstromclass ObjectLock;
401f5393447b9f45be7918042d9ee7b521376de866Ian Rogerstemplate<class T> class SirtRef;
41cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
42a215526d5c789cbef0f81a1f9aba22541a841ccaElliott Hughestypedef bool (ClassVisitor)(Class* c, void* arg);
43a215526d5c789cbef0f81a1f9aba22541a841ccaElliott Hughes
440e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiroclass ClassLinker {
450e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro public:
461f5393447b9f45be7918042d9ee7b521376de866Ian Rogers  // Creates the class linker by bootstrapping from dex files.
47a004aa933a58428489e42d77f707c2b063b73747Brian Carlstrom  static ClassLinker* CreateFromCompiler(const std::vector<const DexFile*>& boot_class_path,
4800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                                         InternTable* intern_table)
49b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5058ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
51a004aa933a58428489e42d77f707c2b063b73747Brian Carlstrom  // Creates the class linker from an image.
5200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  static ClassLinker* CreateFromImage(InternTable* intern_table)
53b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
549ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
559ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  ~ClassLinker();
56565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro
5764bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes  // Finds a class by its descriptor, loading it if necessary.
5874eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom  // If class_loader is null, searches boot_class_path_.
5900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Class* FindClass(const char* descriptor, ClassLoader* class_loader)
60b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
61aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
6200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Class* FindSystemClass(const char* descriptor)
63b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
64aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
65aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // Define a new a class based on a ClassDef from a DexFile
66365c10235438607541fa2259a5fec48061b90bd8Ian Rogers  Class* DefineClass(const StringPiece& descriptor, ClassLoader* class_loader,
6700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                     const DexFile& dex_file, const DexFile::ClassDef& dex_class_def)
68b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
6964bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes
7064bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes  // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
7164bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes  // by the given 'class_loader'.
7200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Class* LookupClass(const char* descriptor, const ClassLoader* class_loader)
73b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
74b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
750e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
766fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes  // Finds all the classes with the given descriptor, regardless of ClassLoader.
7700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void LookupClasses(const char* descriptor, std::vector<Class*>& classes)
78b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
79b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
806fa602d614d418f38afebb4d44f42e7dc0b4bd94Elliott Hughes
81b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
82d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes
83ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  // General class unloading is not supported, this is used to prune
84ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  // unwanted classes during image writing.
8500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool RemoveClass(const char* descriptor, const ClassLoader* class_loader)
86b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
87b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
88ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom
8900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void DumpAllClasses(int flags) const
90b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
91b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
929d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
9300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void DumpForSigQuit(std::ostream& os) const
94b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
95cac6cc72c3331257fa6437b36a131e5d551e2f3cElliott Hughes
96b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  size_t NumLoadedClasses() const LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
97e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes
98b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // Resolve a String with the given index from the DexFile, storing the
99aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // result in the DexCache. The referrer is used to identify the
100aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // target DexCache and ClassLoader to use for resolution.
10166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  String* ResolveString(uint32_t string_idx, const AbstractMethod* referrer)
102b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
103caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    String* resolved_string = referrer->GetDexCacheStrings()->Get(string_idx);
104caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    if (UNLIKELY(resolved_string == NULL)) {
105caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers      Class* declaring_class = referrer->GetDeclaringClass();
106caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers      DexCache* dex_cache = declaring_class->GetDexCache();
1074445a7e3398a6143939168097a3aa275b734504dIan Rogers      const DexFile& dex_file = *dex_cache->GetDexFile();
108caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers      resolved_string = ResolveString(dex_file, string_idx, dex_cache);
109caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    }
110caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    return resolved_string;
111aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  }
112aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
113aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // Resolve a String with the given index from the DexFile, storing the
1149ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in the DexCache.
11500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  String* ResolveString(const DexFile& dex_file, uint32_t string_idx, DexCache* dex_cache)
116b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1179ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
118b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // Resolve a Type with the given index from the DexFile, storing the
1199ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in the DexCache. The referrer is used to identity the
1209ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // target DexCache and ClassLoader to use for resolution.
12100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, const Class* referrer)
122b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1239ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom    return ResolveType(dex_file,
1249ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom                       type_idx,
1259ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom                       referrer->GetDexCache(),
1269ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom                       referrer->GetClassLoader());
1279ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  }
1289ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
129b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // Resolve a Type with the given index from the DexFile, storing the
1300cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers  // result in the DexCache. The referrer is used to identify the
131b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  // target DexCache and ClassLoader to use for resolution.
13266f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  Class* ResolveType(uint16_t type_idx, const AbstractMethod* referrer)
133b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
134caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    Class* resolved_type = referrer->GetDexCacheResolvedTypes()->Get(type_idx);
135caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    if (UNLIKELY(resolved_type == NULL)) {
136caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers      Class* declaring_class = referrer->GetDeclaringClass();
137caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers      DexCache* dex_cache = declaring_class->GetDexCache();
138365c10235438607541fa2259a5fec48061b90bd8Ian Rogers      ClassLoader* class_loader = declaring_class->GetClassLoader();
1394445a7e3398a6143939168097a3aa275b734504dIan Rogers      const DexFile& dex_file = *dex_cache->GetDexFile();
140caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers      resolved_type = ResolveType(dex_file, type_idx, dex_cache, class_loader);
141caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    }
142caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    return resolved_type;
1430cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers  }
1440cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers
14500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Class* ResolveType(uint16_t type_idx, const Field* referrer)
146b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1470cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers    Class* declaring_class = referrer->GetDeclaringClass();
1480cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers    DexCache* dex_cache = declaring_class->GetDexCache();
149caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    Class* resolved_type = dex_cache->GetResolvedType(type_idx);
150caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    if (UNLIKELY(resolved_type == NULL)) {
151365c10235438607541fa2259a5fec48061b90bd8Ian Rogers      ClassLoader* class_loader = declaring_class->GetClassLoader();
1524445a7e3398a6143939168097a3aa275b734504dIan Rogers      const DexFile& dex_file = *dex_cache->GetDexFile();
153caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers      resolved_type = ResolveType(dex_file, type_idx, dex_cache, class_loader);
154caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    }
155caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    return resolved_type;
156b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom  }
157b63ec393a5c4ba2be1d34dd871cda811eaa803c7Brian Carlstrom
1589ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // Resolve a type with the given ID from the DexFile, storing the
1599ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in DexCache. The ClassLoader is used to search for the
1609ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // type, since it may be referenced from but not contained within
1619ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // the given DexFile.
1629ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  Class* ResolveType(const DexFile& dex_file,
1636d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers                     uint16_t type_idx,
1649ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom                     DexCache* dex_cache,
16500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                     ClassLoader* class_loader)
166b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1679ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
1689ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // Resolve a method with a given ID from the DexFile, storing the
1699ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in DexCache. The ClassLinker and ClassLoader are used as
1709ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // in ResolveType. What is unique is the method type argument which
1719ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // is used to determine if this method is a direct, static, or
1729ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // virtual method.
17366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  AbstractMethod* ResolveMethod(const DexFile& dex_file,
1749ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom                        uint32_t method_idx,
1759ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom                        DexCache* dex_cache,
176365c10235438607541fa2259a5fec48061b90bd8Ian Rogers                        ClassLoader* class_loader,
17766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                        const AbstractMethod* referrer,
17808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers                        InvokeType type)
179b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
1809ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
18166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  AbstractMethod* ResolveMethod(uint32_t method_idx, const AbstractMethod* referrer, InvokeType type)
182b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
18366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier    AbstractMethod* resolved_method = referrer->GetDexCacheResolvedMethods()->Get(method_idx);
1841984651929744dd603fd082e23eacd877b9bc177Ian Rogers    if (UNLIKELY(resolved_method == NULL || resolved_method->IsRuntimeMethod())) {
1851984651929744dd603fd082e23eacd877b9bc177Ian Rogers      Class* declaring_class = referrer->GetDeclaringClass();
1861984651929744dd603fd082e23eacd877b9bc177Ian Rogers      DexCache* dex_cache = declaring_class->GetDexCache();
187365c10235438607541fa2259a5fec48061b90bd8Ian Rogers      ClassLoader* class_loader = declaring_class->GetClassLoader();
1884445a7e3398a6143939168097a3aa275b734504dIan Rogers      const DexFile& dex_file = *dex_cache->GetDexFile();
189c0228b8f02c05ed58bea58490e0d8bdcaf8c5bb8jeffhao      resolved_method = ResolveMethod(dex_file, method_idx, dex_cache, class_loader, referrer, type);
190caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    }
191caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    return resolved_method;
192161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom  }
193161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom
19466f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  Field* ResolveField(uint32_t field_idx, const AbstractMethod* referrer, bool is_static)
195b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
196b5d6a4983732387dd9fe9f0024d19a766819755dIan Rogers    Field* resolved_field =
197b5d6a4983732387dd9fe9f0024d19a766819755dIan Rogers        referrer->GetDeclaringClass()->GetDexCache()->GetResolvedField(field_idx);
198caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    if (UNLIKELY(resolved_field == NULL)) {
199b5d6a4983732387dd9fe9f0024d19a766819755dIan Rogers      Class* declaring_class = referrer->GetDeclaringClass();
200b5d6a4983732387dd9fe9f0024d19a766819755dIan Rogers      DexCache* dex_cache = declaring_class->GetDexCache();
201365c10235438607541fa2259a5fec48061b90bd8Ian Rogers      ClassLoader* class_loader = declaring_class->GetClassLoader();
2024445a7e3398a6143939168097a3aa275b734504dIan Rogers      const DexFile& dex_file = *dex_cache->GetDexFile();
203caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers      resolved_field = ResolveField(dex_file, field_idx, dex_cache, class_loader, is_static);
204caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    }
205caab8c4ef372db5c119bfac1911fa27b174a935cIan Rogers    return resolved_field;
206b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom  }
207b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom
208161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom  // Resolve a field with a given ID from the DexFile, storing the
2099ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // result in DexCache. The ClassLinker and ClassLoader are used as
2109ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // in ResolveType. What is unique is the is_static argument which is
2119ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // used to determine if we are resolving a static or non-static
2129ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  // field.
2139ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom  Field* ResolveField(const DexFile& dex_file,
2149ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom                      uint32_t field_idx,
2159ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom                      DexCache* dex_cache,
216365c10235438607541fa2259a5fec48061b90bd8Ian Rogers                      ClassLoader* class_loader,
21700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                      bool is_static)
218b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2199ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom
220b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // Resolve a field with a given ID from the DexFile, storing the
221b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // result in DexCache. The ClassLinker and ClassLoader are used as
222b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // in ResolveType. No is_static argument is provided so that Java
223b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  // field resolution semantics are followed.
224b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers  Field* ResolveFieldJLS(const DexFile& dex_file,
225b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers                         uint32_t field_idx,
226b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers                         DexCache* dex_cache,
22700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                         ClassLoader* class_loader)
228b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
229b067ac2fe225c76fc9eb9434ef62cbb797bfa425Ian Rogers
230ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers  // Get shorty from method index without resolution. Used to do handlerization.
23166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  const char* MethodShorty(uint32_t method_idx, AbstractMethod* referrer, uint32_t* length)
232b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
233ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers
234f4c21c9f6440c3980c47a297519f758796dbc039Elliott Hughes  // Returns true on success, false if there's an exception pending.
23525c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom  // can_run_clinit=false allows the compiler to attempt to init a class,
23625c3325bf95036bf325fc7cb21b4fd6d40282857Brian Carlstrom  // given the restriction that no <clinit> execution is possible.
23700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool EnsureInitialized(Class* c, bool can_run_clinit, bool can_init_fields)
238b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2390e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
2402a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes  // Initializes classes that have instances in the image but that have
2412a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes  // <clinit> methods so they could not be initialized by the compiler.
242b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2432a20cfd0b7fc81099f5de0da782ebcc1cb262792Elliott Hughes
24400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void RegisterDexFile(const DexFile& dex_file)
24500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
246b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
24700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void RegisterDexFile(const DexFile& dex_file, SirtRef<DexCache>& dex_cache)
24800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
249b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2500e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
25100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void RegisterOatFile(const OatFile& oat_file)
25200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_);
253866c8627626b7c47fb69b498b341772d7dfa7f60Brian Carlstrom
2548a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom  const std::vector<const DexFile*>& GetBootClassPath() {
2558a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom    return boot_class_path_;
2568a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom  }
2578a48741b96ca9cc5835cac72ac133c4ca480930fBrian Carlstrom
25800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void VisitClasses(ClassVisitor* visitor, void* arg) const
259b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
26000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  // Less efficient variant of VisitClasses that doesn't hold the classlinker_classes_lock_
26100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  // when calling the visitor.
26200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg) const
263b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
26400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
2659ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier  void VisitRoots(Heap::RootVisitor* visitor, void* arg)
266b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_, dex_lock_);
26700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
26800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  DexCache* FindDexCache(const DexFile& dex_file) const
26900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
270b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
27100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool IsDexFileRegistered(const DexFile& dex_file) const
27200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_);
27366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  void FixupDexCaches(AbstractMethod* resolution_method) const
27400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
275b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
2761d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom
277262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao  // Generate an oat file from a dex file
278d601af8d9549ca95a911afb2fc67c4e562da661fBrian Carlstrom  bool GenerateOatFile(const std::string& dex_filename,
279d601af8d9549ca95a911afb2fc67c4e562da661fBrian Carlstrom                       int oat_fd,
280d601af8d9549ca95a911afb2fc67c4e562da661fBrian Carlstrom                       const std::string& oat_cache_filename);
281262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao
28200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const OatFile* FindOatFileFromOatLocation(const std::string& location)
28300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_);
28400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
28500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const OatFile* FindOatFileFromOatLocationLocked(const std::string& location)
28600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_);
287c143c55718342519db5398e41dda31422cf16c79buzbee
2885b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // Finds the oat file for a dex location, generating the oat file if
2895b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // it is missing or out of date. Returns the DexFile from within the
2905b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // created oat file.
2915b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  const DexFile* FindOrCreateOatFileForDexLocation(const std::string& dex_location,
29200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                                                   const std::string& oat_location)
29300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_);
29400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const DexFile* FindOrCreateOatFileForDexLocationLocked(const std::string& dex_location,
29500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                                                         const std::string& oat_location)
29600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_);
2975b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // Find a DexFile within an OatFile given a DexFile location. Note
2985b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // that this returns null if the location checksum of the DexFile
2995b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // does not match the OatFile.
30000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const DexFile* FindDexFileInOatFileFromDexLocation(const std::string& location)
30100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
302b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3035b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
304f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao
30528db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom  // Returns true if oat file contains the dex file with the given location and checksum.
306afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom  static bool VerifyOatFileChecksums(const OatFile* oat_file,
307afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom                                     const std::string& dex_location,
30800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                                     uint32_t dex_location_checksum)
309b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
310afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom
311418d20fc407052d4152157f61e7453359f902383Elliott Hughes  // TODO: replace this with multiple methods that allocate the correct managed type.
3124417536522fd2a9d8215d8672331984769c9520bShih-wei Liao  template <class T>
31350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  ObjectArray<T>* AllocObjectArray(Thread* self, size_t length)
314b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
31550b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers    return ObjectArray<T>::Alloc(self, GetClassRoot(kObjectArrayClass), length);
3164417536522fd2a9d8215d8672331984769c9520bShih-wei Liao  }
3174417536522fd2a9d8215d8672331984769c9520bShih-wei Liao
31850b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  ObjectArray<Class>* AllocClassArray(Thread* self, size_t length)
319b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
32050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers    return ObjectArray<Class>::Alloc(self, GetClassRoot(kClassArrayClass), length);
321418d20fc407052d4152157f61e7453359f902383Elliott Hughes  }
322418d20fc407052d4152157f61e7453359f902383Elliott Hughes
32350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  ObjectArray<String>* AllocStringArray(Thread* self, size_t length)
32466f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
32550b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers    return ObjectArray<String>::Alloc(self, GetClassRoot(kJavaLangStringArrayClass), length);
32666f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  }
32766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier
3284445a7e3398a6143939168097a3aa275b734504dIan Rogers  ObjectArray<AbstractMethod>* AllocAbstractMethodArray(Thread* self, size_t length)
32966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
33050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers    return ObjectArray<AbstractMethod>::Alloc(self,
33166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier        GetClassRoot(kJavaLangReflectAbstractMethodArrayClass), length);
33266f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  }
33366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier
3344445a7e3398a6143939168097a3aa275b734504dIan Rogers  ObjectArray<AbstractMethod>* AllocMethodArray(Thread* self, size_t length)
3354445a7e3398a6143939168097a3aa275b734504dIan Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
3364445a7e3398a6143939168097a3aa275b734504dIan Rogers    return ObjectArray<AbstractMethod>::Alloc(self,
3374445a7e3398a6143939168097a3aa275b734504dIan Rogers        GetClassRoot(kJavaLangReflectMethodArrayClass), length);
3384445a7e3398a6143939168097a3aa275b734504dIan Rogers  }
3394445a7e3398a6143939168097a3aa275b734504dIan Rogers
3409bc81918a2c663339f7739d9cf968f354506e3a7Ian Rogers  IfTable* AllocIfTable(Thread* self, size_t ifcount) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
3419bc81918a2c663339f7739d9cf968f354506e3a7Ian Rogers    return down_cast<IfTable*>(
3429bc81918a2c663339f7739d9cf968f354506e3a7Ian Rogers        IfTable::Alloc(self, GetClassRoot(kObjectArrayClass), ifcount * IfTable::kMax));
34323435d0df17e19fe312a08ff151464d4b9f83e81Ian Rogers  }
34423435d0df17e19fe312a08ff151464d4b9f83e81Ian Rogers
34550b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  ObjectArray<Field>* AllocFieldArray(Thread* self, size_t length)
34666f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
34750b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers    return ObjectArray<Field>::Alloc(self, GetClassRoot(kJavaLangReflectFieldArrayClass), length);
34866f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  }
34966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier
35050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  ObjectArray<StackTraceElement>* AllocStackTraceElementArray(Thread* self, size_t length)
351b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
35255df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao
353b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  void VerifyClass(Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
354634eb2eb14f87753519d0ef2c5f256e55888f378Elliott Hughes  bool VerifyClassUsingOatFile(const DexFile& dex_file, Class* klass,
35500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                               Class::Status& oat_file_class_status)
356b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
35700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void ResolveClassExceptionHandlerTypes(const DexFile& dex_file, Class* klass)
358b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
35966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, AbstractMethod* klass)
360b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
36198eacac683b78e60799323e8c7d59e7214808639jeffhao
36295caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson  Class* CreateProxyClass(String* name, ObjectArray<Class>* interfaces, ClassLoader* loader,
36366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                          ObjectArray<AbstractMethod>* methods, ObjectArray<ObjectArray<Class> >* throws)
364b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
36500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  std::string GetDescriptorForProxy(const Class* proxy_class)
366b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
36766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  AbstractMethod* FindMethodForProxy(const Class* proxy_class, const AbstractMethod* proxy_method)
36800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
369b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
37095caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
3711984651929744dd603fd082e23eacd877b9bc177Ian Rogers  // Get the oat code for a method when its class isn't yet initialized
37266f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  const void* GetOatCodeFor(const AbstractMethod* method)
373b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3741984651929744dd603fd082e23eacd877b9bc177Ian Rogers
3750c717dd1c56bd29cf860d0feda8e629dab2cadb3Logan Chien  // Relocate the OatFiles (ELF images)
37600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void RelocateExecutable() LOCKS_EXCLUDED(dex_lock_);
3770c717dd1c56bd29cf860d0feda8e629dab2cadb3Logan Chien
37847d237a4b1a41772005c60083e72fe75c0aa0743Brian Carlstrom  pid_t GetClassesLockOwner(); // For SignalCatcher.
37947d237a4b1a41772005c60083e72fe75c0aa0743Brian Carlstrom  pid_t GetDexLockOwner(); // For SignalCatcher.
38024a3c2e9924e8765c4a9b4d383cb8f3b922f9c9fBrian Carlstrom
3819ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier  bool IsDirty() const {
3829ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier    return is_dirty_;
3839ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier  }
3849ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier
3859ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier  void Dirty() {
3869ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier    is_dirty_ = true;
3879ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier  }
3889ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier
3890e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro private:
3904dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes  explicit ClassLinker(InternTable*);
39161e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
39266f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  const OatFile::OatMethod GetOatMethodFor(const AbstractMethod* method)
393b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
3948532191c4fc8e005f7d432fec40fd9f2936275c6TDYa
39558ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // Initialize class linker by bootstraping from dex files
39600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void InitFromCompiler(const std::vector<const DexFile*>& boot_class_path)
397b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
39861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
39958ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // Initialize class linker from one or more images.
400b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
40100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  OatFile* OpenOat(const ImageSpace* space)
40200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_)
403b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
40400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  static void InitFromImageCallback(Object* obj, void* arg)
405b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
406a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
407b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  void FinishInit() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
408a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
40975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // For early bootstrapping by Init
41050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  Class* AllocClass(Thread* self, Class* java_lang_Class, size_t class_size)
411b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
41275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom
41375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // Alloc* convenience functions to avoid needing to pass in Class*
41475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // values that are known to the ClassLinker such as
41575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  // kObjectArrayClass and kJavaLangString etc.
41650b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  Class* AllocClass(Thread* self, size_t class_size) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
41750b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
418b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
41950b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  Field* AllocField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
42050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  Method* AllocMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
42150b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  Constructor* AllocConstructor(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
422bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers
42350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
424b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
42550b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers    return InitializePrimitiveClass(AllocClass(self, sizeof(Class)), type);
4265b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom  }
427c8982582778cc1571b65519e1112441be59a5f83Ian Rogers  Class* InitializePrimitiveClass(Class* primitive_class, Primitive::Type type)
428b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4295b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
430a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom
43100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Class* CreateArrayClass(const std::string& descriptor, ClassLoader* class_loader)
432b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
433578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
43400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void AppendToBootClassPath(const DexFile& dex_file)
435b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
43600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void AppendToBootClassPath(const DexFile& dex_file, SirtRef<DexCache>& dex_cache)
437b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
438578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
4395fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes  void ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
44000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                         Class* c, SafeMap<uint32_t, Field*>& field_map)
441b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4425fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes
4434873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom  size_t SizeOfClass(const DexFile& dex_file,
4444873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom                     const DexFile::ClassDef& dex_class_def);
4454873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom
446f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  void LoadClass(const DexFile& dex_file,
447f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom                 const DexFile::ClassDef& dex_class_def,
44840381fb9dc4b4cf274f1e58b2cdf4396202c6189Brian Carlstrom                 SirtRef<Class>& klass,
44900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                 ClassLoader* class_loader)
450b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
451565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro
4520571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it, SirtRef<Class>& klass,
45323435d0df17e19fe312a08ff151464d4b9f83e81Ian Rogers                 SirtRef<Field>& dst) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
454934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
45550b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  AbstractMethod* LoadMethod(Thread* self, const DexFile& dex_file,
45650b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers                             const ClassDataItemIterator& dex_method,
45750b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers                             SirtRef<Class>& klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
458934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
45923435d0df17e19fe312a08ff151464d4b9f83e81Ian Rogers  void FixupStaticTrampolines(Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4601984651929744dd603fd082e23eacd877b9bc177Ian Rogers
4611984651929744dd603fd082e23eacd877b9bc177Ian Rogers  // Finds the associated oat class for a dex_file and descriptor
4621984651929744dd603fd082e23eacd877b9bc177Ian Rogers  const OatFile::OatClass* GetOatClass(const DexFile& dex_file, const char* descriptor);
4631984651929744dd603fd082e23eacd877b9bc177Ian Rogers
46407bb855daaad20f2d300418cee5a2d977758a3a1Brian Carlstrom  // Attempts to insert a class into a class table.  Returns NULL if
46507bb855daaad20f2d300418cee5a2d977758a3a1Brian Carlstrom  // the class was inserted, otherwise returns an existing class with
46607bb855daaad20f2d300418cee5a2d977758a3a1Brian Carlstrom  // the same descriptor and ClassLoader.
46700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Class* InsertClass(const StringPiece& descriptor, Class* klass, bool image_class)
468b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
469b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
470aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
47100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void RegisterDexFileLocked(const DexFile& dex_file, SirtRef<DexCache>& dex_cache)
47200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
473b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
474f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes  bool IsDexFileRegisteredLocked(const DexFile& dex_file) const EXCLUSIVE_LOCKS_REQUIRED(dex_lock_);
47500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void RegisterOatFileLocked(const OatFile& oat_file) EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
47600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_);
477aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
47800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool InitializeClass(Class* klass, bool can_run_clinit, bool can_init_statics)
479b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
480d1422f81bf9b35cb2aad3fb5615d3f5209014709Brian Carlstrom  bool WaitForInitializeClass(Class* klass, Thread* self, ObjectLock& lock);
48100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool ValidateSuperClassDescriptors(const Class* klass)
482b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
48300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool InitializeSuperClass(Class* klass, bool can_run_clinit, bool can_init_fields)
484b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4850045a290e6b79a274250e3112880c04bde437d4aIan Rogers  // Initialize static fields, returns true if fields were initialized.
48600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool InitializeStaticFields(Class* klass)
487b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4880e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
489595799e000e95f999a6fd4ac3d32f2f2a16f9947Ian Rogers  bool IsSameDescriptorInDifferentClassContexts(const char* descriptor,
490595799e000e95f999a6fd4ac3d32f2f2a16f9947Ian Rogers                                                const Class* klass1,
49100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                                                const Class* klass2)
492b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4930e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
49466f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  bool IsSameMethodSignatureInDifferentClassContexts(const AbstractMethod* descriptor,
495595799e000e95f999a6fd4ac3d32f2f2a16f9947Ian Rogers                                                     const Class* klass1,
49600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                                                     const Class* klass2)
497b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
4980e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
49900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool LinkClass(SirtRef<Class>& klass, ObjectArray<Class>* interfaces)
500b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5010e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
50200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool LinkSuperClass(SirtRef<Class>& klass)
503b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5040e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
50500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool LoadSuperAndInterfaces(SirtRef<Class>& klass, const DexFile& dex_file)
506b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5070e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
50800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool LinkMethods(SirtRef<Class>& klass, ObjectArray<Class>* interfaces)
509b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5100e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
51100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool LinkVirtualMethods(SirtRef<Class>& klass)
512b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5130e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
51400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool LinkInterfaceMethods(SirtRef<Class>& klass, ObjectArray<Class>* interfaces)
515b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5160e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
51700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool LinkStaticFields(SirtRef<Class>& klass)
518b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
51900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool LinkInstanceFields(SirtRef<Class>& klass)
520b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
52100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  bool LinkFields(SirtRef<Class>& klass, bool is_static)
522b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5230cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers
5244873d465a1eb6dfbdeddb085c81239d39db60c42Brian Carlstrom
52500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void CreateReferenceInstanceOffsets(SirtRef<Class>& klass)
526b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
52700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void CreateReferenceStaticOffsets(SirtRef<Class>& klass)
528b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
52940381fb9dc4b4cf274f1e58b2cdf4396202c6189Brian Carlstrom  void CreateReferenceOffsets(SirtRef<Class>& klass, bool is_static,
53000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                              uint32_t reference_offsets)
531b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
5320e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
53358ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // For use by ImageWriter to find DexCaches for its roots
53458ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  const std::vector<DexCache*>& GetDexCaches() {
53558ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom    return dex_caches_;
53658ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  }
53758ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
53800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const OatFile* FindOpenedOatFileForDexFile(const DexFile& dex_file)
53900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      LOCKS_EXCLUDED(dex_lock_);
54000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const OatFile* FindOpenedOatFileFromDexLocation(const std::string& dex_location)
54100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_);
54200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
54300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_);
544afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom  const DexFile* VerifyAndOpenDexFileFromOatFile(const OatFile* oat_file,
545afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom                                                 const std::string& dex_location,
546afe25515c358617321d69ab4f25003e3d905d613Brian Carlstrom                                                 uint32_t dex_location_checksum)
54700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
548b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
549fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom
55050b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  AbstractMethod* CreateProxyConstructor(Thread* self, SirtRef<Class>& klass, Class* proxy_class)
551b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
55250b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers  AbstractMethod* CreateProxyMethod(Thread* self, SirtRef<Class>& klass,
55350b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers                                    SirtRef<AbstractMethod>& prototype)
554b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
55595caa791e560da97363c0c0d22bfda4a7e7377c3Jesse Wilson
5564a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom  std::vector<const DexFile*> boot_class_path_;
557578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
55800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  mutable Mutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
559f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes  std::vector<DexCache*> dex_caches_ GUARDED_BY(dex_lock_);
560f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes  std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
56147d237a4b1a41772005c60083e72fe75c0aa0743Brian Carlstrom
5620e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
563aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // multimap from a string hash code of a class descriptor to
5649cff8e13d41825c4f3f0127af061e94b06114fc8Brian Carlstrom  // Class* instances. Results should be compared for a matching
5659cff8e13d41825c4f3f0127af061e94b06114fc8Brian Carlstrom  // Class::descriptor_ and Class::class_loader_.
566f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes  typedef std::multimap<size_t, Class*> Table;
567b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  Table image_classes_  GUARDED_BY(Locks::classlinker_classes_lock_);
568b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers  Table classes_ GUARDED_BY(Locks::classlinker_classes_lock_);
569f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes
570f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes  Class* LookupClassLocked(const char* descriptor, const ClassLoader* class_loader,
57100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                           size_t hash, const Table& classes)
572b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
573b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      EXCLUSIVE_LOCKS_REQUIRED(Locks::classlinker_classes_lock_);
5740e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
575a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  // indexes into class_roots_.
576a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  // needs to be kept in sync with class_roots_descriptors_.
57774eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom  enum ClassRoot {
57875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kJavaLangClass,
57975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kJavaLangObject,
580418d20fc407052d4152157f61e7453359f902383Elliott Hughes    kClassArrayClass,
58174eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    kObjectArrayClass,
58274eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    kJavaLangString,
58366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier    kJavaLangDexCache,
584bf61ba3dcd9d9895b86a05e88762ff034b09b263Elliott Hughes    kJavaLangRefReference,
5858060925c45cc2607ab92390d7366c6c0cfdfe4bbElliott Hughes    kJavaLangReflectConstructor,
58675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kJavaLangReflectField,
58766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier    kJavaLangReflectAbstractMethod,
58875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kJavaLangReflectMethod,
589466bb25416b88fabd5d4387b7c7e5cc1ece78b8cIan Rogers    kJavaLangReflectProxy,
59066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier    kJavaLangStringArrayClass,
59166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier    kJavaLangReflectAbstractMethodArrayClass,
5924445a7e3398a6143939168097a3aa275b734504dIan Rogers    kJavaLangReflectFieldArrayClass,
5934445a7e3398a6143939168097a3aa275b734504dIan Rogers    kJavaLangReflectMethodArrayClass,
59474eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    kJavaLangClassLoader,
5955167c97a4f672ba821453418e3943988fabbfc43Ian Rogers    kJavaLangThrowable,
5968cd6ddaeb78cc904e13bac88753654a04b2e15b8jeffhao    kJavaLangClassNotFoundException,
59755df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao    kJavaLangStackTraceElement,
59875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveBoolean,
599d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kPrimitiveByte,
60075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveChar,
60175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveDouble,
602d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kPrimitiveFloat,
60375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveInt,
60475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveLong,
605d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kPrimitiveShort,
60675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kPrimitiveVoid,
607d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kBooleanArrayClass,
608d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kByteArrayClass,
609d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kCharArrayClass,
610d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kDoubleArrayClass,
611d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kFloatArrayClass,
612d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kIntArrayClass,
613d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kLongArrayClass,
614d8ddfd5eadde1d5f53ef1419f529c799233eaa62Elliott Hughes    kShortArrayClass,
61555df06be4369f5d8ab5eb61a5d22809255171036Shih-wei Liao    kJavaLangStackTraceElementArrayClass,
61675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom    kClassRootsMax,
61775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  };
61875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  ObjectArray<Class>* class_roots_;
619913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom
62000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  Class* GetClassRoot(ClassRoot class_root)
621b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
622a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    DCHECK(class_roots_ != NULL);
62374eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    Class* klass = class_roots_->Get(class_root);
62474eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    DCHECK(klass != NULL);
62574eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    return klass;
62674eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom  }
62774eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom
62800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  void SetClassRoot(ClassRoot class_root, Class* klass)
629b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
630a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
63134f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom  ObjectArray<Class>* GetClassRoots() {
63234f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom    DCHECK(class_roots_ != NULL);
63334f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom    return class_roots_;
63434f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom  }
63534f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom
636418d20fc407052d4152157f61e7453359f902383Elliott Hughes  static const char* class_roots_descriptors_[];
637a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
638a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  const char* GetClassRootDescriptor(ClassRoot class_root) {
639a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    const char* descriptor = class_roots_descriptors_[class_root];
640a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    CHECK(descriptor != NULL);
641a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    return descriptor;
642a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  }
643a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
6449bc81918a2c663339f7739d9cf968f354506e3a7Ian Rogers  IfTable* array_iftable_;
645565f50731db360584d0080af7f14f0b7ca10371cCarl Shapiro
64675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  bool init_done_;
6479ebae1f30b84dfd8dab4144f80eebec4f8fc8851Mathieu Chartier  bool is_dirty_;
64875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom
649cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes  InternTable* intern_table_;
650cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
651f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom  friend class CommonTest;
652ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  friend class ImageWriter;  // for GetClassRoots
65375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  friend class ObjectTest;
6546d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers  FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors);
655ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  FRIEND_TEST(DexCacheTest, Open);
6561a18c8c1c0e4ea1ff06177e93c7ff703376dcee2Shih-wei Liao  FRIEND_TEST(ExceptionTest, FindExceptionHandler);
657ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom  FRIEND_TEST(ObjectTest, AllocObjectArray);
6580e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  DISALLOW_COPY_AND_ASSIGN(ClassLinker);
6590e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro};
6600e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
6610e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro}  // namespace art
6620e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
6630e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#endif  // ART_SRC_CLASS_LINKER_H_
664