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