@@ -23,13 +23,15 @@ void JSDispatchEntry::MakeJSDispatchEntry(Address object, Address entrypoint,
2323 uint16_t parameter_count,
2424 bool mark_as_alive) {
2525 DCHECK_EQ (object & kHeapObjectTag , 0 );
26+ #if !defined(__illumos__) || !defined(V8_TARGET_ARCH_64_BIT)
2627 DCHECK_EQ ((((object - kObjectPointerOffset ) << kObjectPointerShift ) >>
2728 kObjectPointerShift ) +
2829 kObjectPointerOffset ,
2930 object);
3031 DCHECK_EQ ((object - kObjectPointerOffset ) + kObjectPointerOffset , object);
3132 DCHECK_LT ((object - kObjectPointerOffset ),
3233 1ULL << ((sizeof (encoded_word_) * 8 ) - kObjectPointerShift ));
34+ #endif /* __illumos__ & 64-bit */
3335
3436 Address payload = ((object - kObjectPointerOffset ) << kObjectPointerShift ) |
3537 (parameter_count & kParameterCountMask );
@@ -55,8 +57,16 @@ Address JSDispatchEntry::GetCodePointer() const {
5557 // and so may be 0 or 1 here. As the return value is a tagged pointer, the
5658 // bit must be 1 when returned, so we need to set it here.
5759 Address payload = encoded_word_.load (std::memory_order_relaxed);
60+ #if defined(__illumos__) && defined(V8_TARGET_ARCH_64_BIT)
61+ // Unsigned types won't sign-extend on shift-right, but we need to do
62+ // this with illumos VA48 addressing.
63+ DCHECK_EQ (kObjectPointerOffset , 0 );
64+ return (Address)((intptr_t )payload >> (int )kObjectPointerShift ) |
65+ kHeapObjectTag ;
66+ #else
5867 return ((payload >> kObjectPointerShift ) + kObjectPointerOffset ) |
5968 kHeapObjectTag ;
69+ #endif /* __illumos__ & 64-bit */
6070}
6171
6272Tagged<Code> JSDispatchEntry::GetCode () const {
@@ -214,7 +224,12 @@ void JSDispatchEntry::MakeFreelistEntry(uint32_t next_entry_index) {
214224bool JSDispatchEntry::IsFreelistEntry () const {
215225#ifdef V8_TARGET_ARCH_64_BIT
216226 auto entrypoint = entrypoint_.load (std::memory_order_relaxed);
227+ #ifdef __illumos__
228+ // See the illumos definition of kFreeEntryTag for why we have to do this.
229+ return (entrypoint & 0xffff000000000000ull ) == kFreeEntryTag ;
230+ #else
217231 return (entrypoint & kFreeEntryTag ) == kFreeEntryTag ;
232+ #endif /* __illumos__ */
218233#else
219234 return next_free_entry_.load (std::memory_order_relaxed) != 0 ;
220235#endif
0 commit comments