summarylogtreecommitdiffstats
path: root/v8-move-the-Stack-object-from-ThreadLocalTop.patch
diff options
context:
space:
mode:
authorPascal Ernster2023-05-31 22:03:41 +0200
committerCaleb Maclennan2023-06-01 01:36:47 +0300
commit9ca9405df7b87d664753f222f695f94e66e025ad (patch)
tree40600a154ff858219130c40a41c83ea386e9a4b3 /v8-move-the-Stack-object-from-ThreadLocalTop.patch
parent59ed1e400c44331a05e6686fe2d9a434f228f27e (diff)
downloadaur-9ca9405df7b87d664753f222f695f94e66e025ad.tar.gz
electron 23.3.0-1
Diffstat (limited to 'v8-move-the-Stack-object-from-ThreadLocalTop.patch')
-rw-r--r--v8-move-the-Stack-object-from-ThreadLocalTop.patch205
1 files changed, 205 insertions, 0 deletions
diff --git a/v8-move-the-Stack-object-from-ThreadLocalTop.patch b/v8-move-the-Stack-object-from-ThreadLocalTop.patch
new file mode 100644
index 000000000000..a06044834249
--- /dev/null
+++ b/v8-move-the-Stack-object-from-ThreadLocalTop.patch
@@ -0,0 +1,205 @@
+From 7b6fbcd0a6700db498ad55db046ecda92c8ee8c1 Mon Sep 17 00:00:00 2001
+From: Nikolaos Papaspyrou <nikolaos@chromium.org>
+Date: Sun, 29 Jan 2023 17:18:08 +0100
+Subject: [PATCH] Merge: [heap] Move the Stack object from ThreadLocalTop to
+ Isolate
+
+This is just for nodejs, do not backmerge to 11.0.
+(cherry picked from commit 1e4b71d99fea5ea6bb4bf6420585a7819872bb0f)
+
+> Change-Id: I026a35af3bc6999a09b21f277756d4454c086343
+> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4152476
+> Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
+> Reviewed-by: Omer Katz <omerkatz@chromium.org>
+> Commit-Queue: Nikolaos Papaspyrou <nikolaos@chromium.org>
+> Cr-Commit-Position: refs/heads/main@{#85445}
+
+Stack information is thread-specific and, until now, it was stored in a
+field in ThreadLocalTop. This CL moves stack information to the isolate
+and makes sure to update the stack start whenever a main thread enters
+the isolate. At the same time, the Stack object is refactored and
+simplified.
+
+As a side effect, after removing the Stack object, ThreadLocalTop
+satisfies the std::standard_layout trait; this fixes some issues
+observed with different C++ compilers.
+
+Bug: v8:13630
+Bug: v8:13257
+Change-Id: I4be1f04fe90699e1a6e456dad3e0dd623851acce
+---
+ src/execution/isolate.cc | 36 +++++++++++++++----------------
+ src/execution/isolate.h | 6 ++++++
+ src/execution/thread-local-top.cc | 2 --
+ src/execution/thread-local-top.h | 6 +-----
+ src/heap/heap.cc | 4 +---
+ 5 files changed, 25 insertions(+), 29 deletions(-)
+
+diff --git a/src/execution/isolate.cc b/src/execution/isolate.cc
+index 4edf364e0a..be4fd400d2 100644
+--- a/src/execution/isolate.cc
++++ b/src/execution/isolate.cc
+@@ -3074,22 +3074,23 @@ void Isolate::AddSharedWasmMemory(Handle<WasmMemoryObject> memory_object) {
+ void Isolate::RecordStackSwitchForScanning() {
+ Object current = root(RootIndex::kActiveContinuation);
+ DCHECK(!current.IsUndefined());
+- thread_local_top()->stack_.ClearStackSegments();
+- wasm::StackMemory* stack = Managed<wasm::StackMemory>::cast(
+- WasmContinuationObject::cast(current).stack())
+- .get()
+- .get();
++ stack().ClearStackSegments();
++ wasm::StackMemory* wasm_stack =
++ Managed<wasm::StackMemory>::cast(
++ WasmContinuationObject::cast(current).stack())
++ .get()
++ .get();
+ current = WasmContinuationObject::cast(current).parent();
+- thread_local_top()->stack_.SetStackStart(
+- reinterpret_cast<void*>(stack->base()));
++ heap()->SetStackStart(reinterpret_cast<void*>(wasm_stack->base()));
+ // We don't need to add all inactive stacks. Only the ones in the active chain
+ // may contain cpp heap pointers.
+ while (!current.IsUndefined()) {
+ auto cont = WasmContinuationObject::cast(current);
+- auto* stack = Managed<wasm::StackMemory>::cast(cont.stack()).get().get();
+- thread_local_top()->stack_.AddStackSegment(
+- reinterpret_cast<const void*>(stack->base()),
+- reinterpret_cast<const void*>(stack->jmpbuf()->sp));
++ auto* wasm_stack =
++ Managed<wasm::StackMemory>::cast(cont.stack()).get().get();
++ stack().AddStackSegment(
++ reinterpret_cast<const void*>(wasm_stack->base()),
++ reinterpret_cast<const void*>(wasm_stack->jmpbuf()->sp));
+ current = cont.parent();
+ }
+ }
+@@ -3377,20 +3378,13 @@ void Isolate::Delete(Isolate* isolate) {
+ Isolate* saved_isolate = isolate->TryGetCurrent();
+ SetIsolateThreadLocals(isolate, nullptr);
+ isolate->set_thread_id(ThreadId::Current());
+- isolate->thread_local_top()->stack_ =
+- saved_isolate ? std::move(saved_isolate->thread_local_top()->stack_)
+- : ::heap::base::Stack(base::Stack::GetStackStart());
++ isolate->heap()->SetStackStart(base::Stack::GetStackStart());
+
+ bool owns_shared_isolate = isolate->owns_shared_isolate_;
+ Isolate* maybe_shared_isolate = isolate->shared_isolate_;
+
+ isolate->Deinit();
+
+- // Restore the saved isolate's stack.
+- if (saved_isolate)
+- saved_isolate->thread_local_top()->stack_ =
+- std::move(isolate->thread_local_top()->stack_);
+-
+ #ifdef DEBUG
+ non_disposed_isolates_--;
+ #endif // DEBUG
+@@ -4647,6 +4641,10 @@ bool Isolate::Init(SnapshotData* startup_snapshot_data,
+ void Isolate::Enter() {
+ Isolate* current_isolate = nullptr;
+ PerIsolateThreadData* current_data = CurrentPerIsolateThreadData();
++
++ // Set the stack start for the main thread that enters the isolate.
++ heap()->SetStackStart(base::Stack::GetStackStart());
++
+ if (current_data != nullptr) {
+ current_isolate = current_data->isolate_;
+ DCHECK_NOT_NULL(current_isolate);
+diff --git a/src/execution/isolate.h b/src/execution/isolate.h
+index a32f999fe5..1cb6e10661 100644
+--- a/src/execution/isolate.h
++++ b/src/execution/isolate.h
+@@ -32,6 +32,7 @@
+ #include "src/execution/stack-guard.h"
+ #include "src/handles/handles.h"
+ #include "src/handles/traced-handles.h"
++#include "src/heap/base/stack.h"
+ #include "src/heap/factory.h"
+ #include "src/heap/heap.h"
+ #include "src/heap/read-only-heap.h"
+@@ -2022,6 +2023,8 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
+ SimulatorData* simulator_data() { return simulator_data_; }
+ #endif
+
++ ::heap::base::Stack& stack() { return stack_; }
++
+ #ifdef V8_ENABLE_WEBASSEMBLY
+ wasm::StackMemory*& wasm_stacks() { return wasm_stacks_; }
+ // Update the thread local's Stack object so that it is aware of the new stack
+@@ -2520,6 +2523,9 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
+ // The mutex only guards adding pages, the retrieval is signal safe.
+ base::Mutex code_pages_mutex_;
+
++ // Stack information for the main thread.
++ ::heap::base::Stack stack_;
++
+ #ifdef V8_ENABLE_WEBASSEMBLY
+ wasm::StackMemory* wasm_stacks_;
+ #endif
+diff --git a/src/execution/thread-local-top.cc b/src/execution/thread-local-top.cc
+index 0d7071ddda..05cc20b8e4 100644
+--- a/src/execution/thread-local-top.cc
++++ b/src/execution/thread-local-top.cc
+@@ -37,14 +37,12 @@ void ThreadLocalTop::Clear() {
+ current_embedder_state_ = nullptr;
+ failed_access_check_callback_ = nullptr;
+ thread_in_wasm_flag_address_ = kNullAddress;
+- stack_ = ::heap::base::Stack();
+ }
+
+ void ThreadLocalTop::Initialize(Isolate* isolate) {
+ Clear();
+ isolate_ = isolate;
+ thread_id_ = ThreadId::Current();
+- stack_.SetStackStart(base::Stack::GetStackStart());
+ #if V8_ENABLE_WEBASSEMBLY
+ thread_in_wasm_flag_address_ = reinterpret_cast<Address>(
+ trap_handler::GetThreadInWasmThreadLocalAddress());
+diff --git a/src/execution/thread-local-top.h b/src/execution/thread-local-top.h
+index 43fec0a7df..989c817f31 100644
+--- a/src/execution/thread-local-top.h
++++ b/src/execution/thread-local-top.h
+@@ -10,7 +10,6 @@
+ #include "include/v8-unwinder.h"
+ #include "src/common/globals.h"
+ #include "src/execution/thread-id.h"
+-#include "src/heap/base/stack.h"
+ #include "src/objects/contexts.h"
+ #include "src/utils/utils.h"
+
+@@ -30,7 +29,7 @@ class ThreadLocalTop {
+ // TODO(all): This is not particularly beautiful. We should probably
+ // refactor this to really consist of just Addresses and 32-bit
+ // integer fields.
+- static constexpr uint32_t kSizeInBytes = 30 * kSystemPointerSize;
++ static constexpr uint32_t kSizeInBytes = 25 * kSystemPointerSize;
+
+ // Does early low-level initialization that does not depend on the
+ // isolate being present.
+@@ -147,9 +146,6 @@ class ThreadLocalTop {
+
+ // Address of the thread-local "thread in wasm" flag.
+ Address thread_in_wasm_flag_address_;
+-
+- // Stack information.
+- ::heap::base::Stack stack_;
+ };
+
+ } // namespace internal
+diff --git a/src/heap/heap.cc b/src/heap/heap.cc
+index 51a90ddcab..b5722ab6ec 100644
+--- a/src/heap/heap.cc
++++ b/src/heap/heap.cc
+@@ -5851,9 +5851,7 @@ void Heap::SetStackStart(void* stack_start) {
+ stack().SetStackStart(stack_start);
+ }
+
+-::heap::base::Stack& Heap::stack() {
+- return isolate_->thread_local_top()->stack_;
+-}
++::heap::base::Stack& Heap::stack() { return isolate_->stack(); }
+
+ void Heap::RegisterExternallyReferencedObject(Address* location) {
+ Object object = TracedHandles::Mark(location, TracedHandles::MarkMode::kAll);