Commit 842569eb authored by Peter Marshall's avatar Peter Marshall Committed by Commit Bot

[arrays] Increase max size of FixedDoubleArray by 2x on 64 bit

FixedArray max size is currently 1024 MB on 64 bit and 512 MB on 32 bit.
Update the max size of FixedDoubleArray to match. This doubles the max
size for arrays of doubles.

Bug: chromium:814599
Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng
Change-Id: I3ac1b4caaf5b6428fe8a8c848fffdf84af8a9ae9
Reviewed-on: https://chromium-review.googlesource.com/1160235Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Commit-Queue: Peter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#54892}
parent a5efd507
...@@ -203,7 +203,7 @@ struct SmiTagging<4> { ...@@ -203,7 +203,7 @@ struct SmiTagging<4> {
V8_INLINE static internal::Object* IntToSmi(int value) { V8_INLINE static internal::Object* IntToSmi(int value) {
return internal::IntToSmi<kSmiShiftSize>(value); return internal::IntToSmi<kSmiShiftSize>(value);
} }
V8_INLINE static bool IsValidSmi(intptr_t value) { V8_INLINE static constexpr bool IsValidSmi(intptr_t value) {
// To be representable as an tagged small integer, the two // To be representable as an tagged small integer, the two
// most-significant bits of 'value' must be either 00 or 11 due to // most-significant bits of 'value' must be either 00 or 11 due to
// sign-extension. To check this we add 01 to the two // sign-extension. To check this we add 01 to the two
...@@ -233,7 +233,7 @@ struct SmiTagging<8> { ...@@ -233,7 +233,7 @@ struct SmiTagging<8> {
V8_INLINE static internal::Object* IntToSmi(int value) { V8_INLINE static internal::Object* IntToSmi(int value) {
return internal::IntToSmi<kSmiShiftSize>(value); return internal::IntToSmi<kSmiShiftSize>(value);
} }
V8_INLINE static bool IsValidSmi(intptr_t value) { V8_INLINE static constexpr bool IsValidSmi(intptr_t value) {
// To be representable as a long smi, the value must be a 32-bit integer. // To be representable as a long smi, the value must be a 32-bit integer.
return (value == static_cast<int32_t>(value)); return (value == static_cast<int32_t>(value));
} }
...@@ -9528,7 +9528,7 @@ class Internals { ...@@ -9528,7 +9528,7 @@ class Internals {
return PlatformSmiTagging::IntToSmi(value); return PlatformSmiTagging::IntToSmi(value);
} }
V8_INLINE static bool IsValidSmi(intptr_t value) { V8_INLINE static constexpr bool IsValidSmi(intptr_t value) {
return PlatformSmiTagging::IsValidSmi(value); return PlatformSmiTagging::IsValidSmi(value);
} }
......
...@@ -85,6 +85,15 @@ class FixedArrayBase : public HeapObject { ...@@ -85,6 +85,15 @@ class FixedArrayBase : public HeapObject {
bool IsCowArray() const; bool IsCowArray() const;
// Maximal allowed size, in bytes, of a single FixedArrayBase.
// Prevents overflowing size computations, as well as extreme memory
// consumption.
#ifdef V8_HOST_ARCH_32_BIT
static const int kMaxSize = 512 * MB;
#else
static const int kMaxSize = 1024 * MB;
#endif // V8_HOST_ARCH_32_BIT
// Layout description. // Layout description.
// Length is smi tagged when it is stored. // Length is smi tagged when it is stored.
static const int kLengthOffset = HeapObject::kHeaderSize; static const int kLengthOffset = HeapObject::kHeaderSize;
...@@ -160,13 +169,11 @@ class FixedArray : public FixedArrayBase { ...@@ -160,13 +169,11 @@ class FixedArray : public FixedArrayBase {
inline Object** RawFieldOfElementAt(int index); inline Object** RawFieldOfElementAt(int index);
DECL_CAST(FixedArray) DECL_CAST(FixedArray)
// Maximal allowed size, in bytes, of a single FixedArray.
// Prevents overflowing size computations, as well as extreme memory
// consumption.
static const int kMaxSize = 128 * MB * kPointerSize;
// Maximally allowed length of a FixedArray. // Maximally allowed length of a FixedArray.
static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize; static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize;
static_assert(Internals::IsValidSmi(kMaxLength),
"FixedArray maxLength not a Smi");
// Maximally allowed length for regular (non large object space) object. // Maximally allowed length for regular (non large object space) object.
STATIC_ASSERT(kMaxRegularHeapObjectSize < kMaxSize); STATIC_ASSERT(kMaxRegularHeapObjectSize < kMaxSize);
static const int kMaxRegularLength = static const int kMaxRegularLength =
...@@ -239,12 +246,10 @@ class FixedDoubleArray : public FixedArrayBase { ...@@ -239,12 +246,10 @@ class FixedDoubleArray : public FixedArrayBase {
DECL_CAST(FixedDoubleArray) DECL_CAST(FixedDoubleArray)
// Maximal allowed size, in bytes, of a single FixedDoubleArray.
// Prevents overflowing size computations, as well as extreme memory
// consumption.
static const int kMaxSize = 512 * MB;
// Maximally allowed length of a FixedArray. // Maximally allowed length of a FixedArray.
static const int kMaxLength = (kMaxSize - kHeaderSize) / kDoubleSize; static const int kMaxLength = (kMaxSize - kHeaderSize) / kDoubleSize;
static_assert(Internals::IsValidSmi(kMaxLength),
"FixedDoubleArray maxLength not a Smi");
// Dispatched behavior. // Dispatched behavior.
DECL_PRINTER(FixedDoubleArray) DECL_PRINTER(FixedDoubleArray)
...@@ -300,6 +305,8 @@ class WeakFixedArray : public HeapObject { ...@@ -300,6 +305,8 @@ class WeakFixedArray : public HeapObject {
static const int kMaxLength = static const int kMaxLength =
(FixedArray::kMaxSize - kHeaderSize) / kPointerSize; (FixedArray::kMaxSize - kHeaderSize) / kPointerSize;
static_assert(Internals::IsValidSmi(kMaxLength),
"WeakFixedArray maxLength not a Smi");
protected: protected:
static int OffsetOfElementAt(int index) { static int OffsetOfElementAt(int index) {
...@@ -581,10 +588,10 @@ class ByteArray : public FixedArrayBase { ...@@ -581,10 +588,10 @@ class ByteArray : public FixedArrayBase {
// Layout description. // Layout description.
static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize);
// Maximal memory consumption for a single ByteArray.
static const int kMaxSize = 512 * MB;
// Maximal length of a single ByteArray. // Maximal length of a single ByteArray.
static const int kMaxLength = kMaxSize - kHeaderSize; static const int kMaxLength = kMaxSize - kHeaderSize;
static_assert(Internals::IsValidSmi(kMaxLength),
"ByteArray maxLength not a Smi");
class BodyDescriptor; class BodyDescriptor;
// No weak fields. // No weak fields.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment