@@ -25,13 +25,15 @@ void JSDispatchEntry::MakeJSDispatchEntry(Address object, Address entrypoint,
25
25
uint16_t parameter_count,
26
26
bool mark_as_alive) {
27
27
DCHECK_EQ (object & kHeapObjectTag , 0 );
28
+ #if !defined(__illumos__) || !defined(V8_TARGET_ARCH_64_BIT)
28
29
DCHECK_EQ ((((object - kObjectPointerOffset ) << kObjectPointerShift ) >>
29
30
kObjectPointerShift ) +
30
31
kObjectPointerOffset ,
31
32
object);
32
33
DCHECK_EQ ((object - kObjectPointerOffset ) + kObjectPointerOffset , object);
33
34
DCHECK_LT ((object - kObjectPointerOffset ),
34
35
1ULL << ((sizeof (encoded_word_) * 8 ) - kObjectPointerShift ));
36
+ #endif /* __illumos__ & 64-bit */
35
37
36
38
Address payload = ((object - kObjectPointerOffset ) << kObjectPointerShift ) |
37
39
(parameter_count & kParameterCountMask );
@@ -57,8 +59,16 @@ Address JSDispatchEntry::GetCodePointer() const {
57
59
// and so may be 0 or 1 here. As the return value is a tagged pointer, the
58
60
// bit must be 1 when returned, so we need to set it here.
59
61
Address payload = encoded_word_.load (std::memory_order_acquire);
62
+ #if defined(__illumos__) && defined(V8_TARGET_ARCH_64_BIT)
63
+ // Unsigned types won't sign-extend on shift-right, but we need to do
64
+ // this with illumos VA48 addressing.
65
+ DCHECK_EQ (kObjectPointerOffset , 0 );
66
+ return (Address)((intptr_t )payload >> (int )kObjectPointerShift ) |
67
+ kHeapObjectTag ;
68
+ #else
60
69
return ((payload >> kObjectPointerShift ) + kObjectPointerOffset ) |
61
70
kHeapObjectTag ;
71
+ #endif /* __illumos__ & 64-bit */
62
72
}
63
73
64
74
Tagged<Code> JSDispatchEntry::GetCode () const {
@@ -216,7 +226,12 @@ void JSDispatchEntry::MakeFreelistEntry(uint32_t next_entry_index) {
216
226
bool JSDispatchEntry::IsFreelistEntry () const {
217
227
#ifdef V8_TARGET_ARCH_64_BIT
218
228
auto entrypoint = entrypoint_.load (std::memory_order_relaxed);
229
+ #ifdef __illumos__
230
+ // See the illumos definition of kFreeEntryTag for why we have to do this.
231
+ return (entrypoint & 0xffff000000000000ull ) == kFreeEntryTag ;
232
+ #else
219
233
return (entrypoint & kFreeEntryTag ) == kFreeEntryTag ;
234
+ #endif /* __illumos__ */
220
235
#else
221
236
return next_free_entry_.load (std::memory_order_relaxed) != 0 ;
222
237
#endif
0 commit comments