1776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers/* 2776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * Copyright (C) 2012 The Android Open Source Project 3776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * 4776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 5776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * you may not use this file except in compliance with the License. 6776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * You may obtain a copy of the License at 7776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * 8776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * http://www.apache.org/licenses/LICENSE-2.0 9776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * 10776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * Unless required by applicable law or agreed to in writing, software 11776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS, 12776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * See the License for the specific language governing permissions and 14776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers * limitations under the License. 15776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers */ 16776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_VERIFIER_REG_TYPE_CACHE_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_VERIFIER_REG_TYPE_CACHE_H_ 19776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers 2051a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal#include "base/casts.h" 21761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h" 22de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier#include "base/scoped_arena_containers.h" 2383c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier#include "object_callbacks.h" 24776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers#include "reg_type.h" 2551a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal#include "runtime.h" 26776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers 2751a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal#include <stdint.h> 282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include <vector> 292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 30776ac1fa61237db645adb4370a4aab888530caf4Ian Rogersnamespace art { 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 321ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers class Class; 331ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers class ClassLoader; 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 35de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartierclass ScopedArenaAllocator; 361ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogersclass StringPiece; 371ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers 38776ac1fa61237db645adb4370a4aab888530caf4Ian Rogersnamespace verifier { 39776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers 4051a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asalclass RegType; 4151a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal 42de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier// Use 8 bytes since that is the default arena allocator alignment. 43de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartierstatic constexpr size_t kDefaultArenaBitVectorBytes = 8; 44de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier 45776ac1fa61237db645adb4370a4aab888530caf4Ian Rogersclass RegTypeCache { 46776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers public: 47de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier explicit RegTypeCache(bool can_load_classes, ScopedArenaAllocator& arena); 4851a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal ~RegTypeCache(); 4990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier static void Init() SHARED_REQUIRES(Locks::mutator_lock_) { 50df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom if (!RegTypeCache::primitive_initialized_) { 5151a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal CHECK_EQ(RegTypeCache::primitive_count_, 0); 5241c65c19c15ffac41089fa9f37502f94c046960dIan Rogers CreatePrimitiveAndSmallConstantTypes(); 5341c65c19c15ffac41089fa9f37502f94c046960dIan Rogers CHECK_EQ(RegTypeCache::primitive_count_, kNumPrimitivesAndSmallConstants); 5451a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal RegTypeCache::primitive_initialized_ = true; 5551a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal } 5651a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal } 5751a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal static void ShutDown(); 58d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const art::verifier::RegType& GetFromId(uint16_t id) const; 59d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const RegType& From(mirror::ClassLoader* loader, const char* descriptor, bool precise) 6090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 61de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier // Find a RegType, returns null if not found. 62de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier const RegType* FindClass(mirror::Class* klass, bool precise) const 63de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 64de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier // Insert a new class with a specified descriptor, must not already be in the cache. 65de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier const RegType* InsertClass(const StringPiece& descriptor, mirror::Class* klass, bool precise) 66de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 67de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier // Get or insert a reg type for a description, klass, and precision. 68d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const RegType& FromClass(const char* descriptor, mirror::Class* klass, bool precise) 6990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 70d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const ConstantType& FromCat1Const(int32_t value, bool precise) 7190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 72d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const ConstantType& FromCat2ConstLo(int32_t value, bool precise) 7390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 74d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const ConstantType& FromCat2ConstHi(int32_t value, bool precise) 7590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 76d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const RegType& FromDescriptor(mirror::ClassLoader* loader, const char* descriptor, bool precise) 7790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 78d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const RegType& FromUnresolvedMerge(const RegType& left, const RegType& right) 7990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 80d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const RegType& FromUnresolvedSuperClass(const RegType& child) 8190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 8290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ConstantType& Zero() SHARED_REQUIRES(Locks::mutator_lock_) { 8351a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return FromCat1Const(0, true); 8400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 8590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ConstantType& One() SHARED_REQUIRES(Locks::mutator_lock_) { 86849600bb5cfc02bf5ab4aa9a810667ebd3b53328Sebastien Hertz return FromCat1Const(1, true); 87849600bb5cfc02bf5ab4aa9a810667ebd3b53328Sebastien Hertz } 8851a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal size_t GetCacheSize() { 8951a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return entries_.size(); 9000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 9190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const BooleanType& Boolean() SHARED_REQUIRES(Locks::mutator_lock_) { 9251a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *BooleanType::GetInstance(); 9300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 9490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ByteType& Byte() SHARED_REQUIRES(Locks::mutator_lock_) { 9551a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *ByteType::GetInstance(); 9600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 9790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const CharType& Char() SHARED_REQUIRES(Locks::mutator_lock_) { 9851a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *CharType::GetInstance(); 9900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 10090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ShortType& Short() SHARED_REQUIRES(Locks::mutator_lock_) { 10151a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *ShortType::GetInstance(); 1022bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers } 10390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const IntegerType& Integer() SHARED_REQUIRES(Locks::mutator_lock_) { 10451a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *IntegerType::GetInstance(); 10500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 10690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const FloatType& Float() SHARED_REQUIRES(Locks::mutator_lock_) { 10751a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *FloatType::GetInstance(); 1082bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers } 10990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const LongLoType& LongLo() SHARED_REQUIRES(Locks::mutator_lock_) { 11051a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *LongLoType::GetInstance(); 11100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 11290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const LongHiType& LongHi() SHARED_REQUIRES(Locks::mutator_lock_) { 11351a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *LongHiType::GetInstance(); 11400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 11590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const DoubleLoType& DoubleLo() SHARED_REQUIRES(Locks::mutator_lock_) { 11651a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *DoubleLoType::GetInstance(); 11700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 11890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const DoubleHiType& DoubleHi() SHARED_REQUIRES(Locks::mutator_lock_) { 11951a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *DoubleHiType::GetInstance(); 12000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 12190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const UndefinedType& Undefined() SHARED_REQUIRES(Locks::mutator_lock_) { 12251a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *UndefinedType::GetInstance(); 12300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 1247b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers const ConflictType& Conflict() { 12551a5fb78d1b03b5235c2ae45414235282182bb86Sameer Abu Asal return *ConflictType::GetInstance(); 12600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 1277b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers 12890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const PreciseReferenceType& JavaLangClass() SHARED_REQUIRES(Locks::mutator_lock_); 12990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const PreciseReferenceType& JavaLangString() SHARED_REQUIRES(Locks::mutator_lock_); 13090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const RegType& JavaLangThrowable(bool precise) SHARED_REQUIRES(Locks::mutator_lock_); 13190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const RegType& JavaLangObject(bool precise) SHARED_REQUIRES(Locks::mutator_lock_); 1327b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers 133d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const UninitializedType& Uninitialized(const RegType& type, uint32_t allocation_pc) 13490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 135ad0b3a35857d2cd2db720028ebc51176191e2219Ian Rogers // Create an uninitialized 'this' argument for the given type. 136d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const UninitializedType& UninitializedThisArgument(const RegType& type) 13790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 138d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const RegType& FromUninitialized(const RegType& uninit_type) 13990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 14090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ImpreciseConstType& ByteConstant() SHARED_REQUIRES(Locks::mutator_lock_); 14190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ImpreciseConstType& CharConstant() SHARED_REQUIRES(Locks::mutator_lock_); 14290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ImpreciseConstType& ShortConstant() SHARED_REQUIRES(Locks::mutator_lock_); 14390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ImpreciseConstType& IntConstant() SHARED_REQUIRES(Locks::mutator_lock_); 14490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ImpreciseConstType& PosByteConstant() SHARED_REQUIRES(Locks::mutator_lock_); 14590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const ImpreciseConstType& PosShortConstant() SHARED_REQUIRES(Locks::mutator_lock_); 146d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const RegType& GetComponentType(const RegType& array, mirror::ClassLoader* loader) 14790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 14890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void Dump(std::ostream& os) SHARED_REQUIRES(Locks::mutator_lock_); 149d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const RegType& RegTypeFromPrimitiveType(Primitive::Type) const; 150b49035706fceb2b13e8154668f175af624cf88f4Ian Rogers 151bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier void VisitRoots(RootVisitor* visitor, const RootInfo& root_info) 15290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 153bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier static void VisitStaticRoots(RootVisitor* visitor) 15490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 155c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier 156776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers private: 15790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void FillPrimitiveAndSmallConstantTypes() SHARED_REQUIRES(Locks::mutator_lock_); 1581bf8d4dbe5cb9891e8a1125ff1928b544efc243aIan Rogers mirror::Class* ResolveClass(const char* descriptor, mirror::ClassLoader* loader) 15990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 1601ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers bool MatchDescriptor(size_t idx, const StringPiece& descriptor, bool precise) 16190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 162d8f69b086baf6717ce949d1c4de90d73b91083b0Ian Rogers const ConstantType& FromCat1NonSmallConstant(int32_t value, bool precise) 16390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 16441c65c19c15ffac41089fa9f37502f94c046960dIan Rogers 165de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier // Returns the pass in RegType. 166de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier template <class RegTypeType> 167de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier RegTypeType& AddEntry(RegTypeType* new_entry) SHARED_REQUIRES(Locks::mutator_lock_); 168de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier 169de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier // Add a string piece to the arena allocator so that it stays live for the lifetime of the 170de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier // verifier. 171de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier StringPiece AddString(const StringPiece& string_piece); 172aa910d5ef43256102809e397de305c23f1c315e6Andreas Gampe 17341c65c19c15ffac41089fa9f37502f94c046960dIan Rogers template <class Type> 1747b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers static const Type* CreatePrimitiveTypeInstance(const std::string& descriptor) 17590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 17690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier static void CreatePrimitiveAndSmallConstantTypes() SHARED_REQUIRES(Locks::mutator_lock_); 17741c65c19c15ffac41089fa9f37502f94c046960dIan Rogers 17841c65c19c15ffac41089fa9f37502f94c046960dIan Rogers // A quick look up for popular small constants. 17941c65c19c15ffac41089fa9f37502f94c046960dIan Rogers static constexpr int32_t kMinSmallConstant = -1; 18041c65c19c15ffac41089fa9f37502f94c046960dIan Rogers static constexpr int32_t kMaxSmallConstant = 4; 181de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier static const PreciseConstType* small_precise_constants_[kMaxSmallConstant - 182de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier kMinSmallConstant + 1]; 18341c65c19c15ffac41089fa9f37502f94c046960dIan Rogers 18441c65c19c15ffac41089fa9f37502f94c046960dIan Rogers static constexpr size_t kNumPrimitivesAndSmallConstants = 18541c65c19c15ffac41089fa9f37502f94c046960dIan Rogers 12 + (kMaxSmallConstant - kMinSmallConstant + 1); 18641c65c19c15ffac41089fa9f37502f94c046960dIan Rogers 18741c65c19c15ffac41089fa9f37502f94c046960dIan Rogers // Have the well known global primitives been created? 18841c65c19c15ffac41089fa9f37502f94c046960dIan Rogers static bool primitive_initialized_; 18941c65c19c15ffac41089fa9f37502f94c046960dIan Rogers 19041c65c19c15ffac41089fa9f37502f94c046960dIan Rogers // Number of well known primitives that will be copied into a RegTypeCache upon construction. 19141c65c19c15ffac41089fa9f37502f94c046960dIan Rogers static uint16_t primitive_count_; 19241c65c19c15ffac41089fa9f37502f94c046960dIan Rogers 1937b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers // The actual storage for the RegTypes. 194de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier ScopedArenaVector<const RegType*> entries_; 195de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier 196de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier // Fast lookup for quickly finding entries that have a matching class. 197de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier ScopedArenaVector<std::pair<GcRoot<mirror::Class>, const RegType*>> klass_entries_; 1987b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers 19941c65c19c15ffac41089fa9f37502f94c046960dIan Rogers // Whether or not we're allowed to load classes. 20041c65c19c15ffac41089fa9f37502f94c046960dIan Rogers const bool can_load_classes_; 20141c65c19c15ffac41089fa9f37502f94c046960dIan Rogers 202de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier // Arena allocator. 203de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier ScopedArenaAllocator& arena_; 204de40d478930d0889a2aea5cbf58aa63da24e5dfaMathieu Chartier 2053e79aadc447dcdb9e52368baced9405667e68e6aBrian Carlstrom DISALLOW_COPY_AND_ASSIGN(RegTypeCache); 206776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers}; 207776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers 208776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers} // namespace verifier 209776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers} // namespace art 210776ac1fa61237db645adb4370a4aab888530caf4Ian Rogers 211fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_VERIFIER_REG_TYPE_CACHE_H_ 212