Skip to content

Commit f1d3b41

Browse files
addaleaxryzokuken
authored andcommitted
deps: V8: cherry-pick 392316d
Original commit message: [ptr-compr][x64] Define kTaggedSize as kInt32Size ... when pointer compression is enabled and some number of cleanups. Bug: v8:7703 Change-Id: If7344abf68a1c4d54e4a79d066dc185f25055d7d Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1477737 Commit-Queue: Igor Sheludko <[email protected]> Auto-Submit: Igor Sheludko <[email protected]> Reviewed-by: Ulan Degenbaev <[email protected]> Reviewed-by: Toon Verwaest <[email protected]> Cr-Commit-Position: refs/heads/master@{#60056} Refs: v8/v8@392316d
1 parent de1924c commit f1d3b41

19 files changed

+255
-224
lines changed

common.gypi

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
# Reset this number to 0 on major V8 upgrades.
3939
# Increment by one for each non-official patch applied to deps/v8.
40-
'v8_embedder_string': '-node.1',
40+
'v8_embedder_string': '-node.2',
4141

4242
##### V8 defaults for Node.js #####
4343

deps/v8/include/v8-internal.h

+13-33
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ static const Address kNullAddress = 0;
2929
* Configuration of tagging scheme.
3030
*/
3131
const int kApiSystemPointerSize = sizeof(void*);
32-
const int kApiTaggedSize = kApiSystemPointerSize;
3332
const int kApiDoubleSize = sizeof(double);
3433
const int kApiInt32Size = sizeof(int32_t);
3534
const int kApiInt64Size = sizeof(int64_t);
@@ -92,6 +91,9 @@ struct SmiTagging<8> {
9291
static_assert(
9392
kApiSystemPointerSize == kApiInt64Size,
9493
"Pointer compression can be enabled only for 64-bit architectures");
94+
const int kApiTaggedSize = kApiInt32Size;
95+
#else
96+
const int kApiTaggedSize = kApiSystemPointerSize;
9597
#endif
9698

9799
#ifdef V8_31BIT_SMIS_ON_64BIT_ARCH
@@ -131,11 +133,7 @@ class Internals {
131133
static const int kJSObjectHeaderSize = 3 * kApiTaggedSize;
132134
static const int kFixedArrayHeaderSize = 2 * kApiTaggedSize;
133135
static const int kEmbedderDataArrayHeaderSize = 2 * kApiTaggedSize;
134-
static const int kEmbedderDataSlotSize =
135-
#ifdef V8_COMPRESS_POINTERS
136-
2 *
137-
#endif
138-
kApiSystemPointerSize;
136+
static const int kEmbedderDataSlotSize = kApiSystemPointerSize;
139137
static const int kNativeContextEmbedderDataOffset = 7 * kApiTaggedSize;
140138
static const int kFullStringRepresentationMask = 0x0f;
141139
static const int kStringEncodingMask = 0x8;
@@ -301,22 +299,8 @@ class Internals {
301299
#endif
302300
}
303301

304-
V8_INLINE static internal::Address ReadTaggedAnyField(
305-
internal::Address heap_object_ptr, int offset) {
306-
#ifdef V8_COMPRESS_POINTERS
307-
int32_t value = ReadRawField<int32_t>(heap_object_ptr, offset);
308-
internal::Address root_mask = static_cast<internal::Address>(
309-
-static_cast<intptr_t>(value & kSmiTagMask));
310-
internal::Address root_or_zero =
311-
root_mask & GetRootFromOnHeapAddress(heap_object_ptr);
312-
return root_or_zero +
313-
static_cast<internal::Address>(static_cast<intptr_t>(value));
314-
#else
315-
return ReadRawField<internal::Address>(heap_object_ptr, offset);
316-
#endif
317-
}
318-
319302
#ifdef V8_COMPRESS_POINTERS
303+
// See v8:7703 or src/ptr-compr.* for details about pointer compression.
320304
static constexpr size_t kPtrComprHeapReservationSize = size_t{1} << 32;
321305
static constexpr size_t kPtrComprIsolateRootBias =
322306
kPtrComprHeapReservationSize / 2;
@@ -328,18 +312,14 @@ class Internals {
328312
-static_cast<intptr_t>(kPtrComprIsolateRootAlignment);
329313
}
330314

331-
#else
332-
333-
template <typename T>
334-
V8_INLINE static T ReadEmbedderData(const v8::Context* context, int index) {
335-
typedef internal::Address A;
336-
typedef internal::Internals I;
337-
A ctx = *reinterpret_cast<const A*>(context);
338-
A embedder_data =
339-
I::ReadTaggedPointerField(ctx, I::kNativeContextEmbedderDataOffset);
340-
int value_offset =
341-
I::kEmbedderDataArrayHeaderSize + (I::kEmbedderDataSlotSize * index);
342-
return I::ReadRawField<T>(embedder_data, value_offset);
315+
V8_INLINE static internal::Address DecompressTaggedAnyField(
316+
internal::Address heap_object_ptr, int32_t value) {
317+
internal::Address root_mask = static_cast<internal::Address>(
318+
-static_cast<intptr_t>(value & kSmiTagMask));
319+
internal::Address root_or_zero =
320+
root_mask & GetRootFromOnHeapAddress(heap_object_ptr);
321+
return root_or_zero +
322+
static_cast<internal::Address>(static_cast<intptr_t>(value));
343323
}
344324
#endif // V8_COMPRESS_POINTERS
345325
};

deps/v8/include/v8.h

+30-8
Original file line numberDiff line numberDiff line change
@@ -10322,7 +10322,7 @@ AccessorSignature* AccessorSignature::Cast(Data* data) {
1032210322
}
1032310323

1032410324
Local<Value> Object::GetInternalField(int index) {
10325-
#if !defined(V8_ENABLE_CHECKS) && !defined(V8_COMPRESS_POINTERS)
10325+
#ifndef V8_ENABLE_CHECKS
1032610326
typedef internal::Address A;
1032710327
typedef internal::Internals I;
1032810328
A obj = *reinterpret_cast<A*>(this);
@@ -10333,7 +10333,12 @@ Local<Value> Object::GetInternalField(int index) {
1033310333
instance_type == I::kJSApiObjectType ||
1033410334
instance_type == I::kJSSpecialApiObjectType) {
1033510335
int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index);
10336-
A value = I::ReadTaggedAnyField(obj, offset);
10336+
A value = I::ReadRawField<A>(obj, offset);
10337+
#ifdef V8_COMPRESS_POINTERS
10338+
// We read the full pointer value and then decompress it in order to avoid
10339+
// dealing with potential endiannes issues.
10340+
value = I::DecompressTaggedAnyField(obj, static_cast<int32_t>(value));
10341+
#endif
1033710342
internal::Isolate* isolate =
1033810343
internal::IsolateFromNeverReadOnlySpaceObject(obj);
1033910344
A* result = HandleScope::CreateHandle(isolate, value);
@@ -10345,7 +10350,7 @@ Local<Value> Object::GetInternalField(int index) {
1034510350

1034610351

1034710352
void* Object::GetAlignedPointerFromInternalField(int index) {
10348-
#if !defined(V8_ENABLE_CHECKS) && !defined(V8_COMPRESS_POINTERS)
10353+
#ifndef V8_ENABLE_CHECKS
1034910354
typedef internal::Address A;
1035010355
typedef internal::Internals I;
1035110356
A obj = *reinterpret_cast<A*>(this);
@@ -10956,13 +10961,24 @@ int64_t Isolate::AdjustAmountOfExternalAllocatedMemory(
1095610961
}
1095710962

1095810963
Local<Value> Context::GetEmbedderData(int index) {
10959-
#if !defined(V8_ENABLE_CHECKS) && !defined(V8_COMPRESS_POINTERS)
10964+
#ifndef V8_ENABLE_CHECKS
1096010965
typedef internal::Address A;
1096110966
typedef internal::Internals I;
10967+
A ctx = *reinterpret_cast<const A*>(this);
10968+
A embedder_data =
10969+
I::ReadTaggedPointerField(ctx, I::kNativeContextEmbedderDataOffset);
10970+
int value_offset =
10971+
I::kEmbedderDataArrayHeaderSize + (I::kEmbedderDataSlotSize * index);
10972+
A value = I::ReadRawField<A>(embedder_data, value_offset);
10973+
#ifdef V8_COMPRESS_POINTERS
10974+
// We read the full pointer value and then decompress it in order to avoid
10975+
// dealing with potential endiannes issues.
10976+
value =
10977+
I::DecompressTaggedAnyField(embedder_data, static_cast<int32_t>(value));
10978+
#endif
1096210979
internal::Isolate* isolate = internal::IsolateFromNeverReadOnlySpaceObject(
1096310980
*reinterpret_cast<A*>(this));
10964-
A* result =
10965-
HandleScope::CreateHandle(isolate, I::ReadEmbedderData<A>(this, index));
10981+
A* result = HandleScope::CreateHandle(isolate, value);
1096610982
return Local<Value>(reinterpret_cast<Value*>(result));
1096710983
#else
1096810984
return SlowGetEmbedderData(index);
@@ -10971,9 +10987,15 @@ Local<Value> Context::GetEmbedderData(int index) {
1097110987

1097210988

1097310989
void* Context::GetAlignedPointerFromEmbedderData(int index) {
10974-
#if !defined(V8_ENABLE_CHECKS) && !defined(V8_COMPRESS_POINTERS)
10990+
#ifndef V8_ENABLE_CHECKS
10991+
typedef internal::Address A;
1097510992
typedef internal::Internals I;
10976-
return I::ReadEmbedderData<void*>(this, index);
10993+
A ctx = *reinterpret_cast<const A*>(this);
10994+
A embedder_data =
10995+
I::ReadTaggedPointerField(ctx, I::kNativeContextEmbedderDataOffset);
10996+
int value_offset =
10997+
I::kEmbedderDataArrayHeaderSize + (I::kEmbedderDataSlotSize * index);
10998+
return I::ReadRawField<void*>(embedder_data, value_offset);
1097710999
#else
1097811000
return SlowGetAlignedPointerFromEmbedderData(index);
1097911001
#endif

deps/v8/src/globals.h

+32-14
Original file line numberDiff line numberDiff line change
@@ -200,28 +200,47 @@ constexpr size_t kReservedCodeRangePages = 0;
200200

201201
STATIC_ASSERT(kSystemPointerSize == (1 << kSystemPointerSizeLog2));
202202

203+
#ifdef V8_COMPRESS_POINTERS
204+
static_assert(
205+
kSystemPointerSize == kInt64Size,
206+
"Pointer compression can be enabled only for 64-bit architectures");
207+
208+
constexpr int kTaggedSize = kInt32Size;
209+
constexpr int kTaggedSizeLog2 = 2;
210+
211+
// These types define raw and atomic storage types for tagged values stored
212+
// on V8 heap.
213+
using Tagged_t = int32_t;
214+
using AtomicTagged_t = base::Atomic32;
215+
216+
#else
217+
203218
constexpr int kTaggedSize = kSystemPointerSize;
204219
constexpr int kTaggedSizeLog2 = kSystemPointerSizeLog2;
205-
STATIC_ASSERT(kTaggedSize == (1 << kTaggedSizeLog2));
206220

207221
// These types define raw and atomic storage types for tagged values stored
208222
// on V8 heap.
209223
using Tagged_t = Address;
210224
using AtomicTagged_t = base::AtomicWord;
225+
226+
#endif // V8_COMPRESS_POINTERS
227+
228+
STATIC_ASSERT(kTaggedSize == (1 << kTaggedSizeLog2));
229+
211230
using AsAtomicTagged = base::AsAtomicPointerImpl<AtomicTagged_t>;
212231
STATIC_ASSERT(sizeof(Tagged_t) == kTaggedSize);
213232
STATIC_ASSERT(sizeof(AtomicTagged_t) == kTaggedSize);
214233

234+
STATIC_ASSERT(kTaggedSize == kApiTaggedSize);
235+
215236
// TODO(ishell): use kTaggedSize or kSystemPointerSize instead.
237+
#ifndef V8_COMPRESS_POINTERS
216238
constexpr int kPointerSize = kSystemPointerSize;
217239
constexpr int kPointerSizeLog2 = kSystemPointerSizeLog2;
218240
STATIC_ASSERT(kPointerSize == (1 << kPointerSizeLog2));
219-
220-
constexpr int kEmbedderDataSlotSize =
221-
#ifdef V8_COMPRESS_POINTERS
222-
kTaggedSize +
223241
#endif
224-
kTaggedSize;
242+
243+
constexpr int kEmbedderDataSlotSize = kSystemPointerSize;
225244

226245
constexpr int kEmbedderDataSlotSizeInTaggedSlots =
227246
kEmbedderDataSlotSize / kTaggedSize;
@@ -870,33 +889,32 @@ constexpr int kIeeeDoubleExponentWordOffset = 0;
870889
::i::kHeapObjectTag))
871890

872891
// OBJECT_POINTER_ALIGN returns the value aligned as a HeapObject pointer
873-
#define OBJECT_POINTER_ALIGN(value) \
874-
(((value) + kObjectAlignmentMask) & ~kObjectAlignmentMask)
892+
#define OBJECT_POINTER_ALIGN(value) \
893+
(((value) + ::i::kObjectAlignmentMask) & ~::i::kObjectAlignmentMask)
875894

876895
// OBJECT_POINTER_PADDING returns the padding size required to align value
877896
// as a HeapObject pointer
878897
#define OBJECT_POINTER_PADDING(value) (OBJECT_POINTER_ALIGN(value) - (value))
879898

880899
// POINTER_SIZE_ALIGN returns the value aligned as a system pointer.
881-
#define POINTER_SIZE_ALIGN(value) \
882-
(((value) + kPointerAlignmentMask) & ~kPointerAlignmentMask)
900+
#define POINTER_SIZE_ALIGN(value) \
901+
(((value) + ::i::kPointerAlignmentMask) & ~::i::kPointerAlignmentMask)
883902

884903
// POINTER_SIZE_PADDING returns the padding size required to align value
885904
// as a system pointer.
886905
#define POINTER_SIZE_PADDING(value) (POINTER_SIZE_ALIGN(value) - (value))
887906

888907
// CODE_POINTER_ALIGN returns the value aligned as a generated code segment.
889-
#define CODE_POINTER_ALIGN(value) \
890-
(((value) + kCodeAlignmentMask) & ~kCodeAlignmentMask)
908+
#define CODE_POINTER_ALIGN(value) \
909+
(((value) + ::i::kCodeAlignmentMask) & ~::i::kCodeAlignmentMask)
891910

892911
// CODE_POINTER_PADDING returns the padding size required to align value
893912
// as a generated code segment.
894913
#define CODE_POINTER_PADDING(value) (CODE_POINTER_ALIGN(value) - (value))
895914

896915
// DOUBLE_POINTER_ALIGN returns the value algined for double pointers.
897916
#define DOUBLE_POINTER_ALIGN(value) \
898-
(((value) + kDoubleAlignmentMask) & ~kDoubleAlignmentMask)
899-
917+
(((value) + ::i::kDoubleAlignmentMask) & ~::i::kDoubleAlignmentMask)
900918

901919
// Defines hints about receiver values based on structural knowledge.
902920
enum class ConvertReceiverMode : unsigned {

deps/v8/src/memcopy.h

+26
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,32 @@ inline void CopyBytes(T* dst, const T* src, size_t num_bytes) {
138138
CopyImpl<kMinComplexMemCopy>(dst, src, num_bytes);
139139
}
140140

141+
inline void MemsetInt32(int32_t* dest, int32_t value, size_t counter) {
142+
#if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64
143+
#define STOS "stosl"
144+
#endif
145+
146+
#if defined(MEMORY_SANITIZER)
147+
// MemorySanitizer does not understand inline assembly.
148+
#undef STOS
149+
#endif
150+
151+
#if defined(__GNUC__) && defined(STOS)
152+
asm volatile(
153+
"cld;"
154+
"rep ; " STOS
155+
: "+&c"(counter), "+&D"(dest)
156+
: "a"(value)
157+
: "memory", "cc");
158+
#else
159+
for (size_t i = 0; i < counter; i++) {
160+
dest[i] = value;
161+
}
162+
#endif
163+
164+
#undef STOS
165+
}
166+
141167
inline void MemsetPointer(Address* dest, Address value, size_t counter) {
142168
#if V8_HOST_ARCH_IA32
143169
#define STOS "stosl"

deps/v8/src/objects-inl.h

+3-18
Original file line numberDiff line numberDiff line change
@@ -614,33 +614,18 @@ HeapObject MapWord::ToForwardingAddress() {
614614
#ifdef VERIFY_HEAP
615615
void HeapObject::VerifyObjectField(Isolate* isolate, int offset) {
616616
VerifyPointer(isolate, READ_FIELD(*this, offset));
617-
#ifdef V8_COMPRESS_POINTERS
618-
STATIC_ASSERT(kTaggedSize == kSystemPointerSize);
619-
// Ensure upper 32-bits are zeros.
620-
Address value = *(FullObjectSlot(FIELD_ADDR(*this, offset)).location());
621-
CHECK_EQ(kNullAddress, RoundDown<kPtrComprIsolateRootAlignment>(value));
622-
#endif
617+
STATIC_ASSERT(!COMPRESS_POINTERS_BOOL || kTaggedSize == kInt32Size);
623618
}
624619

625620
void HeapObject::VerifyMaybeObjectField(Isolate* isolate, int offset) {
626621
MaybeObject::VerifyMaybeObjectPointer(isolate,
627622
READ_WEAK_FIELD(*this, offset));
628-
#ifdef V8_COMPRESS_POINTERS
629-
STATIC_ASSERT(kTaggedSize == kSystemPointerSize);
630-
// Ensure upper 32-bits are zeros.
631-
Address value = *(FullObjectSlot(FIELD_ADDR(*this, offset)).location());
632-
CHECK_EQ(kNullAddress, RoundDown<kPtrComprIsolateRootAlignment>(value));
633-
#endif
623+
STATIC_ASSERT(!COMPRESS_POINTERS_BOOL || kTaggedSize == kInt32Size);
634624
}
635625

636626
void HeapObject::VerifySmiField(int offset) {
637627
CHECK(READ_FIELD(*this, offset)->IsSmi());
638-
#ifdef V8_COMPRESS_POINTERS
639-
STATIC_ASSERT(kTaggedSize == kSystemPointerSize);
640-
// Ensure upper 32-bits are zeros.
641-
Address value = *(FullObjectSlot(FIELD_ADDR(*this, offset)).location());
642-
CHECK_EQ(kNullAddress, RoundDown<kPtrComprIsolateRootAlignment>(value));
643-
#endif
628+
STATIC_ASSERT(!COMPRESS_POINTERS_BOOL || kTaggedSize == kInt32Size);
644629
}
645630

646631
#endif

deps/v8/src/objects/code.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -402,11 +402,11 @@ class Code : public HeapObject {
402402
// This documents the amount of free space we have in each Code object header
403403
// due to padding for code alignment.
404404
#if V8_TARGET_ARCH_ARM64
405-
static constexpr int kHeaderPaddingSize = 0;
405+
static constexpr int kHeaderPaddingSize = COMPRESS_POINTERS_BOOL ? 20 : 0;
406406
#elif V8_TARGET_ARCH_MIPS64
407407
static constexpr int kHeaderPaddingSize = 0;
408408
#elif V8_TARGET_ARCH_X64
409-
static constexpr int kHeaderPaddingSize = 0;
409+
static constexpr int kHeaderPaddingSize = COMPRESS_POINTERS_BOOL ? 20 : 0;
410410
#elif V8_TARGET_ARCH_ARM
411411
static constexpr int kHeaderPaddingSize = 20;
412412
#elif V8_TARGET_ARCH_IA32

0 commit comments

Comments
 (0)