chore: cherry-pick 3 changes from 0-M133 (#45706)

* chore: [32-x-y] cherry-pick 3 changes from 0-M133

* 51cd241b7b13 from chromium
* 1c7ff4d5477f from v8
* 8834c16acfcc from v8

* fixup patch for 32-x-y

---------

Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
This commit is contained in:
Pedro Pontes
2025-03-01 08:57:00 +00:00
committed by GitHub
parent 9b291a897f
commit 1b72590643
6 changed files with 17677 additions and 1 deletions

1
.gitattributes vendored
View File

@@ -1,6 +1,5 @@
# `git apply` and friends don't understand CRLF, even on windows. Force those
# files to be checked out with LF endings even if core.autocrlf is true.
*.patch text eol=lf
DEPS text eol=lf
yarn.lock text eol=lf
script/zip_manifests/*.manifest text eol=lf

View File

@@ -147,3 +147,4 @@ cherry-pick-a51e7ebb7663.patch
cherry-pick-f3300abe2fcd.patch
remove_persistentmemoryallocator_getallocsize.patch
fix_osr_stutter_in_both_cpu_and_gpu_capture_when_page_has_animation.patch
reland_lzma_sdk_update_to_24_09.patch

File diff suppressed because it is too large Load Diff

View File

@@ -22,3 +22,5 @@ merged_maglev_fix_phi_untagging_bug_with_checknumber_holeyfloat64.patch
cherry-pick-9209292e7898.patch
cherry-pick-97e828af5cbc.patch
cherry-pick-ca504d096c39.patch
cherry-pick-1c7ff4d5477f.patch
cherry-pick-8834c16acfcc.patch

View File

@@ -0,0 +1,57 @@
From 1c7ff4d5477f0e2bc7e20ce3b0f4f8eef71e6d13 Mon Sep 17 00:00:00 2001
From: Olivier Flückiger <olivf@chromium.org>
Date: Mon, 27 Jan 2025 14:50:34 +0100
Subject: [PATCH] Merged: [turbofan] LoadField's type with recorded FieldType depends on stability
Bug: 390465670
(cherry picked from commit f920b6b2c2b1132cd1fbe1198500ceeaedcaa146)
Change-Id: I0b430909275e583e5c0ecf2840e143fef461cbad
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6218882
Reviewed-by: Darius Mercadier <dmercadier@chromium.org>
Commit-Queue: Darius Mercadier <dmercadier@chromium.org>
Auto-Submit: Olivier Flückiger <olivf@chromium.org>
Commit-Queue: Olivier Flückiger <olivf@chromium.org>
Cr-Commit-Position: refs/branch-heads/13.2@{#72}
Cr-Branched-From: 24068c59cedad9ee976ddc05431f5f497b1ebd71-refs/heads/13.2.152@{#1}
Cr-Branched-From: 6054ba94db0969220be4f94dc1677fc4696bdc4f-refs/heads/main@{#97085}
---
diff --git a/src/compiler/access-info.cc b/src/compiler/access-info.cc
index 7247c49..53e55a6 100644
--- a/src/compiler/access-info.cc
+++ b/src/compiler/access-info.cc
@@ -484,8 +484,9 @@
OptionalMapRef maybe_field_map =
TryMakeRef(broker(), FieldType::AsClass(*descriptors_field_type));
if (!maybe_field_map.has_value()) return Invalid();
- field_type = Type::For(maybe_field_map.value(), broker());
field_map = maybe_field_map;
+ // field_type can only be inferred from field_map if it is stable and we
+ // add a stability dependency. This happens on use in the access builder.
}
} else {
CHECK(details_representation.IsTagged());
@@ -1186,8 +1187,9 @@
OptionalMapRef maybe_field_map =
TryMakeRef(broker(), FieldType::AsClass(*descriptors_field_type));
if (!maybe_field_map.has_value()) return Invalid();
- field_type = Type::For(maybe_field_map.value(), broker());
field_map = maybe_field_map;
+ // field_type can only be inferred from field_map if it is stable and we
+ // add a stability dependency. This happens on use in the access builder.
}
}
diff --git a/src/compiler/property-access-builder.cc b/src/compiler/property-access-builder.cc
index 32c0ccf..bcaf221 100644
--- a/src/compiler/property-access-builder.cc
+++ b/src/compiler/property-access-builder.cc
@@ -337,6 +337,7 @@
if (field_map->is_stable()) {
dependencies()->DependOnStableMap(field_map.value());
field_access.map = field_map;
+ field_access.type = Type::For(*field_map, broker());
}
}
}

View File

@@ -0,0 +1,152 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Fl=C3=BCckiger?= <olivf@chromium.org>
Date: Mon, 3 Feb 2025 10:18:36 +0100
Subject: Merged: [runtime] Fix write barrier check in FastCloneJSObject
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Add missing check for page being marked.
Fixed: 392521083
(cherry picked from commit ce071a295e54b32bf7f03373da943678231cb1ee)
Change-Id: Iccfc1617862a6010ab34389aa4931f45e7389c05
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6221320
Auto-Submit: Olivier Flückiger <olivf@chromium.org>
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Commit-Queue: Olivier Flückiger <olivf@chromium.org>
Reviewed-by: Igor Sheludko <ishell@chromium.org>
Cr-Commit-Position: refs/branch-heads/13.2@{#74}
Cr-Branched-From: 24068c59cedad9ee976ddc05431f5f497b1ebd71-refs/heads/13.2.152@{#1}
Cr-Branched-From: 6054ba94db0969220be4f94dc1677fc4696bdc4f-refs/heads/main@{#97085}
diff --git a/src/codegen/code-stub-assembler-inl.h b/src/codegen/code-stub-assembler-inl.h
index 4a51a0d00f2798512ad6ef80a36b043626dac599..043375f4323afd353380dfd738aa8dcf5774ddbd 100644
--- a/src/codegen/code-stub-assembler-inl.h
+++ b/src/codegen/code-stub-assembler-inl.h
@@ -213,9 +213,8 @@ TNode<Object> CodeStubAssembler::FastCloneJSObject(
Label if_no_write_barrier(this),
if_needs_write_barrier(this, Label::kDeferred);
- TNode<BoolT> needs_write_barrier = IsPageFlagReset(
- BitcastTaggedToWord(target), MemoryChunk::kIsInYoungGenerationMask);
- Branch(needs_write_barrier, &if_needs_write_barrier, &if_no_write_barrier);
+ TrySkipWriteBarrier(target, &if_needs_write_barrier);
+ Goto(&if_no_write_barrier);
BIND(&if_needs_write_barrier);
EmitCopyLoop(true);
diff --git a/src/codegen/code-stub-assembler.cc b/src/codegen/code-stub-assembler.cc
index 3dba65a85e07b03268785876fc4ee5538dbc361a..1de4772a2cef0b22754f180a6ae19468d941ffa9 100644
--- a/src/codegen/code-stub-assembler.cc
+++ b/src/codegen/code-stub-assembler.cc
@@ -5505,21 +5505,18 @@ void CodeStubAssembler::FillFixedDoubleArrayWithZero(
std::make_pair(MachineType::UintPtr(), byte_length));
}
-void CodeStubAssembler::JumpIfPointersFromHereAreInteresting(
- TNode<Object> object, Label* interesting) {
- Label finished(this);
- TNode<IntPtrT> object_word = BitcastTaggedToWord(object);
- TNode<IntPtrT> object_page_header = MemoryChunkFromAddress(object_word);
- TNode<IntPtrT> page_flags = UncheckedCast<IntPtrT>(
- Load(MachineType::IntPtr(), object_page_header,
- IntPtrConstant(MemoryChunkLayout::kFlagsOffset)));
- Branch(
- WordEqual(WordAnd(page_flags,
- IntPtrConstant(
- MemoryChunk::kPointersFromHereAreInterestingMask)),
- IntPtrConstant(0)),
- &finished, interesting);
- BIND(&finished);
+void CodeStubAssembler::TrySkipWriteBarrier(TNode<Object> object,
+ Label* if_needs_write_barrier) {
+ TNode<BoolT> may_need_write_barrier =
+ IsPageFlagSet(BitcastTaggedToWord(object),
+ MemoryChunk::kPointersFromHereAreInterestingMask);
+ // TODO(olivf): Also skip the WB with V8_ENABLE_STICKY_MARK_BITS if the mark
+ // bit is set.
+ GotoIf(may_need_write_barrier, if_needs_write_barrier);
+
+ CSA_DCHECK(this, TaggedEqual(CallRuntime(Runtime::kIsNoWriteBarrierNeeded,
+ NoContextConstant(), object),
+ TrueConstant()));
}
void CodeStubAssembler::MoveElements(ElementsKind kind,
@@ -5547,7 +5544,7 @@ void CodeStubAssembler::MoveElements(ElementsKind kind,
// The write barrier can be ignored if {dst_elements} is in new space, or if
// the elements pointer is FixedDoubleArray.
if (needs_barrier_check) {
- JumpIfPointersFromHereAreInteresting(elements, &needs_barrier);
+ TrySkipWriteBarrier(elements, &needs_barrier);
}
const TNode<IntPtrT> source_byte_length =
@@ -5641,7 +5638,7 @@ void CodeStubAssembler::CopyElements(ElementsKind kind,
// The write barrier can be ignored if {dst_elements} is in new space, or if
// the elements pointer is FixedDoubleArray.
if (needs_barrier_check) {
- JumpIfPointersFromHereAreInteresting(dst_elements, &needs_barrier);
+ TrySkipWriteBarrier(dst_elements, &needs_barrier);
}
TNode<IntPtrT> source_byte_length =
diff --git a/src/codegen/code-stub-assembler.h b/src/codegen/code-stub-assembler.h
index cf7b52c8aed277219483b6a6f6a17cc9b28c9456..c03482cbfa0b1924be93c0a9076c338c066afde7 100644
--- a/src/codegen/code-stub-assembler.h
+++ b/src/codegen/code-stub-assembler.h
@@ -2365,8 +2365,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
HoleConversionMode convert_holes = HoleConversionMode::kDontConvert,
TVariable<BoolT>* var_holes_converted = nullptr);
- void JumpIfPointersFromHereAreInteresting(TNode<Object> object,
- Label* interesting);
+ void TrySkipWriteBarrier(TNode<Object> object, Label* if_needs_write_barrier);
// Efficiently copy elements within a single array. The regions
// [src_index, src_index + length) and [dst_index, dst_index + length)
diff --git a/src/runtime/runtime-test.cc b/src/runtime/runtime-test.cc
index c67550f82ef881cdabfc1837d4234a360fff929b..f0d1d6f5f0457da8b7e41b64b1e6bf6b04ba9061 100644
--- a/src/runtime/runtime-test.cc
+++ b/src/runtime/runtime-test.cc
@@ -2120,5 +2120,26 @@ RUNTIME_FUNCTION(Runtime_IsolateCountForTesting) {
return Smi::FromInt(g_num_isolates_for_testing);
}
+RUNTIME_FUNCTION(Runtime_IsNoWriteBarrierNeeded) {
+ HandleScope scope(isolate);
+ DisallowGarbageCollection no_gc;
+ if (args.length() != 1) {
+ return CrashUnlessFuzzing(isolate);
+ }
+ DirectHandle<Object> object = args.at(0);
+ if (!(*object).IsHeapObject()) {
+ return CrashUnlessFuzzing(isolate);
+ }
+ auto heap_object = Cast<HeapObject>(object);
+ if (InReadOnlySpace(*heap_object)) {
+ return ReadOnlyRoots(isolate).true_value();
+ }
+ if (GetWriteBarrierModeForObject(*heap_object, &no_gc) !=
+ WriteBarrierMode::SKIP_WRITE_BARRIER) {
+ return ReadOnlyRoots(isolate).false_value();
+ }
+ return ReadOnlyRoots(isolate).true_value();
+}
+
} // namespace internal
} // namespace v8
diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h
index 3fa07b54517f8097947ff3eead162b0f4c8031bd..6bd33f3ce945ee94745d11ccc3650c6cb996bc83 100644
--- a/src/runtime/runtime.h
+++ b/src/runtime/runtime.h
@@ -573,6 +573,7 @@ namespace internal {
F(IsEfficiencyModeEnabled, 0, 1) \
F(IsInPlaceInternalizableString, 1, 1) \
F(IsInternalizedString, 1, 1) \
+ F(IsNoWriteBarrierNeeded, 1, 1) \
F(IsMaglevEnabled, 0, 1) \
F(IsSameHeapObject, 2, 1) \
F(IsSharedString, 1, 1) \