1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 * vim: set ts=8 sts=2 et sw=2 tw=80:
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef jit_Safepoints_h
8 #define jit_Safepoints_h
13 #include "jit/BitSet.h"
14 #include "jit/CompactBuffer.h"
15 #include "jit/RegisterSets.h"
20 class CodeLocationLabel
;
23 struct SafepointSlotEntry
;
29 static const uint32_t INVALID_SAFEPOINT_OFFSET
= uint32_t(-1);
31 class SafepointWriter
{
32 CompactBufferWriter stream_
;
34 BitSet argumentSlots_
;
37 explicit SafepointWriter(uint32_t localSlotsSize
, uint32_t argumentsSize
);
38 [[nodiscard
]] bool init(TempAllocator
& alloc
);
41 // A safepoint entry is written in the order these functions appear.
42 uint32_t startEntry();
44 void writeOsiCallPointOffset(uint32_t osiPointOffset
);
45 void writeGcRegs(LSafepoint
* safepoint
);
46 void writeGcSlots(LSafepoint
* safepoint
);
48 void writeSlotsOrElementsSlots(LSafepoint
* safepoint
);
49 void writeWasmAnyRefSlots(LSafepoint
* safepoint
);
52 void writeValueSlots(LSafepoint
* safepoint
);
54 void writeNunboxParts(LSafepoint
* safepoint
);
60 void encode(LSafepoint
* safepoint
);
62 size_t size() const { return stream_
.length(); }
63 const uint8_t* buffer() const { return stream_
.buffer(); }
64 bool oom() const { return stream_
.oom(); }
67 class SafepointReader
{
68 CompactBufferReader stream_
;
70 uint32_t argumentSlots_
;
71 uint32_t currentSlotChunk_
;
72 bool currentSlotsAreStack_
;
73 uint32_t nextSlotChunkNumber_
;
74 uint32_t osiCallPointOffset_
;
75 GeneralRegisterSet gcSpills_
;
76 GeneralRegisterSet valueSpills_
;
77 GeneralRegisterSet slotsOrElementsSpills_
;
78 GeneralRegisterSet allGprSpills_
;
79 GeneralRegisterSet wasmAnyRefSpills_
;
80 FloatRegisterSet allFloatSpills_
;
81 uint32_t nunboxSlotsRemaining_
;
82 uint32_t slotsOrElementsSlotsRemaining_
;
83 uint32_t wasmAnyRefSlotsRemaining_
;
86 void advanceFromGcRegs();
87 void advanceFromGcSlots();
88 void advanceFromNunboxOrValueSlots();
89 void advanceFromSlotsOrElementsSlots();
90 [[nodiscard
]] bool getSlotFromBitmap(SafepointSlotEntry
* entry
);
93 SafepointReader(IonScript
* script
, const SafepointIndex
* si
);
95 static CodeLocationLabel
InvalidationPatchPoint(IonScript
* script
,
96 const SafepointIndex
* si
);
98 uint32_t osiCallPointOffset() const { return osiCallPointOffset_
; }
99 LiveGeneralRegisterSet
gcSpills() const {
100 return LiveGeneralRegisterSet(gcSpills_
);
102 LiveGeneralRegisterSet
slotsOrElementsSpills() const {
103 return LiveGeneralRegisterSet(slotsOrElementsSpills_
);
105 LiveGeneralRegisterSet
wasmAnyRefSpills() const {
106 return LiveGeneralRegisterSet(wasmAnyRefSpills_
);
108 LiveGeneralRegisterSet
valueSpills() const {
109 return LiveGeneralRegisterSet(valueSpills_
);
111 LiveGeneralRegisterSet
allGprSpills() const {
112 return LiveGeneralRegisterSet(allGprSpills_
);
114 LiveFloatRegisterSet
allFloatSpills() const {
115 return LiveFloatRegisterSet(allFloatSpills_
);
117 uint32_t osiReturnPointOffset() const;
119 // Returns true if a slot was read, false if there are no more slots.
120 [[nodiscard
]] bool getGcSlot(SafepointSlotEntry
* entry
);
122 // Returns true if a slot was read, false if there are no more value slots.
123 [[nodiscard
]] bool getValueSlot(SafepointSlotEntry
* entry
);
125 // Returns true if a nunbox slot was read, false if there are no more
127 [[nodiscard
]] bool getNunboxSlot(LAllocation
* type
, LAllocation
* payload
);
129 // Returns true if a slot was read, false if there are no more slots.
130 [[nodiscard
]] bool getSlotsOrElementsSlot(SafepointSlotEntry
* entry
);
132 // Returns true if a slot was read, false if there are no more slots.
133 [[nodiscard
]] bool getWasmAnyRefSlot(SafepointSlotEntry
* entry
);
139 #endif /* jit_Safepoints_h */