@@ -25,13 +25,15 @@ void JSDispatchEntry::MakeJSDispatchEntry(Address object, Address entrypoint,
2525 uint16_t parameter_count,
2626 bool mark_as_alive) {
2727 DCHECK_EQ(object & kHeapObjectTag, 0);
28+ #if !defined(__illumos__) || !defined(V8_TARGET_ARCH_64_BIT)
2829 DCHECK_EQ((((object - kObjectPointerOffset) << kObjectPointerShift) >>
2930 kObjectPointerShift) +
3031 kObjectPointerOffset,
3132 object);
3233 DCHECK_EQ((object - kObjectPointerOffset) + kObjectPointerOffset, object);
3334 DCHECK_LT((object - kObjectPointerOffset),
3435 1ULL << ((sizeof(encoded_word_) * 8) - kObjectPointerShift));
36+ #endif /* __illumos__ & 64-bit */
3537
3638 Address payload = ((object - kObjectPointerOffset) << kObjectPointerShift) |
3739 (parameter_count & kParameterCountMask);
@@ -57,8 +59,16 @@ Address JSDispatchEntry::GetCodePointer() const {
5759 // and so may be 0 or 1 here. As the return value is a tagged pointer, the
5860 // bit must be 1 when returned, so we need to set it here.
5961 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
6069 return ((payload >> kObjectPointerShift) + kObjectPointerOffset) |
6170 kHeapObjectTag;
71+ #endif /* __illumos__ & 64-bit */
6272}
6373
6474Tagged<Code> JSDispatchEntry::GetCode() const {
@@ -220,7 +230,12 @@ void JSDispatchEntry::MakeFreelistEntry(uint32_t next_entry_index) {
220230bool JSDispatchEntry::IsFreelistEntry() const {
221231#ifdef V8_TARGET_ARCH_64_BIT
222232 auto entrypoint = entrypoint_.load(std::memory_order_relaxed);
233+ #ifdef __illumos__
234+ // See the illumos definition of kFreeEntryTag for why we have to do this.
235+ return (entrypoint & 0xffff000000000000ull) == kFreeEntryTag;
236+ #else
223237 return (entrypoint & kFreeEntryTag) == kFreeEntryTag;
238+ #endif /* __illumos__ */
224239#else
225240 return next_free_entry_.load(std::memory_order_relaxed) != 0;
226241#endif
0 commit comments