| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 1 | // Copyright 2011 the V8 project authors. All rights reserved. |
| Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 4 | |
| 5 | #ifndef V8_STORE_BUFFER_H_ |
| 6 | #define V8_STORE_BUFFER_H_ |
| 7 | |
| Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 8 | #include "src/allocation.h" |
| 9 | #include "src/base/logging.h" |
| 10 | #include "src/base/platform/platform.h" |
| 11 | #include "src/globals.h" |
| Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 12 | #include "src/heap/slot-set.h" |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 13 | |
| 14 | namespace v8 { |
| 15 | namespace internal { |
| 16 | |
| Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 17 | // Intermediate buffer that accumulates old-to-new stores from the generated |
| 18 | // code. On buffer overflow the slots are moved to the remembered set. |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 19 | class StoreBuffer { |
| 20 | public: |
| 21 | explicit StoreBuffer(Heap* heap); |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 22 | static void StoreBufferOverflow(Isolate* isolate); |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 23 | void SetUp(); |
| 24 | void TearDown(); |
| 25 | |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 26 | static const int kStoreBufferOverflowBit = 1 << (14 + kPointerSizeLog2); |
| 27 | static const int kStoreBufferSize = kStoreBufferOverflowBit; |
| 28 | static const int kStoreBufferLength = kStoreBufferSize / sizeof(Address); |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 29 | |
| Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 30 | void MoveEntriesToRememberedSet(); |
| Ben Murdoch | 014dc51 | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 31 | |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 32 | private: |
| 33 | Heap* heap_; |
| 34 | |
| Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 35 | // The start and the limit of the buffer that contains store slots |
| 36 | // added from the generated code. |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 37 | Address* start_; |
| 38 | Address* limit_; |
| 39 | |
| Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 40 | base::VirtualMemory* virtual_memory_; |
| Ben Murdoch | 014dc51 | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 41 | }; |
| 42 | |
| 43 | |
| Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 44 | class LocalStoreBuffer BASE_EMBEDDED { |
| Ben Murdoch | 014dc51 | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 45 | public: |
| Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 46 | explicit LocalStoreBuffer(Heap* heap) |
| 47 | : top_(new Node(nullptr)), heap_(heap) {} |
| Ben Murdoch | 014dc51 | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 48 | |
| Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 49 | ~LocalStoreBuffer() { |
| 50 | Node* current = top_; |
| 51 | while (current != nullptr) { |
| 52 | Node* tmp = current->next; |
| 53 | delete current; |
| 54 | current = tmp; |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | inline void Record(Address addr); |
| 59 | inline void Process(StoreBuffer* store_buffer); |
| Ben Murdoch | 014dc51 | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 60 | |
| 61 | private: |
| Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 62 | static const int kBufferSize = 16 * KB; |
| Ben Murdoch | 014dc51 | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 63 | |
| Ben Murdoch | 109988c | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 64 | struct Node : Malloced { |
| 65 | explicit Node(Node* next_node) : next(next_node), count(0) {} |
| 66 | |
| 67 | inline bool is_full() { return count == kBufferSize; } |
| 68 | |
| 69 | Node* next; |
| 70 | Address buffer[kBufferSize]; |
| 71 | int count; |
| 72 | }; |
| 73 | |
| 74 | Node* top_; |
| 75 | Heap* heap_; |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 76 | }; |
| 77 | |
| Ben Murdoch | 014dc51 | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 78 | } // namespace internal |
| 79 | } // namespace v8 |
| Ben Murdoch | 3ef787d | 2012-04-12 10:51:47 +0100 | [diff] [blame] | 80 | |
| 81 | #endif // V8_STORE_BUFFER_H_ |