• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_COMPILER_REFS_MAP_H_
6 #define V8_COMPILER_REFS_MAP_H_
7 
8 #include "src/base/hashmap.h"
9 #include "src/common/globals.h"
10 #include "src/zone/zone.h"
11 
12 namespace v8 {
13 namespace internal {
14 namespace compiler {
15 
16 class ObjectData;
17 
18 class AddressMatcher : public base::KeyEqualityMatcher<Address> {
19  public:
operator()20   bool operator()(uint32_t hash1, uint32_t hash2, const Address& key1,
21                   const Address& key2) const {
22     return key1 == key2;
23   }
24 };
25 
26 // This class employs our own implementation of hash map for the purpose of
27 // storing the mapping between canonical Addresses and allocated ObjectData.
28 // It's used as the refs map in JSHeapBroker and as the snapshot in
29 // PerIsolateCompilerCache, as we need a cheap copy between the two and
30 // std::unordered_map doesn't satisfy this requirement, as it rehashes the
31 // whole map and copies all entries one by one.
32 class RefsMap
33     : public base::TemplateHashMapImpl<Address, ObjectData*, AddressMatcher,
34                                        ZoneAllocationPolicy>,
35       public ZoneObject {
36  public:
37   RefsMap(uint32_t capacity, AddressMatcher match, Zone* zone);
38   RefsMap(const RefsMap* other, Zone* zone);
39 
IsEmpty()40   bool IsEmpty() const { return occupancy() == 0; }
41 
42   // Wrappers around methods from UnderlyingMap
43   Entry* Lookup(const Address& key) const;
44   Entry* LookupOrInsert(const Address& key);
45   ObjectData* Remove(const Address& key);
46 
47  private:
48   static uint32_t Hash(Address addr);
49 };
50 
51 }  // namespace compiler
52 }  // namespace internal
53 }  // namespace v8
54 
55 #endif  // V8_COMPILER_REFS_MAP_H_
56