1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- From: Matthias Schiffer <mschiffer@universe-factory.net>
- Date: Mon, 9 May 2016 16:21:57 +0200
- Subject: node: fix undefined behaviour leading to broken code with GCC 6
- Fixes segfaults occuring in the node host build when GCC 6 is used.
- Backport of upstream commit 96198d5bc710a4e3ca49eeeb3b3fa7b8cb61547d.
- Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
- diff --git a/lang/node/patches/004-gcc6-undefined-behaviour.patch b/lang/node/patches/004-gcc6-undefined-behaviour.patch
- new file mode 100644
- index 0000000..dbbbcf0
- --- /dev/null
- +++ b/lang/node/patches/004-gcc6-undefined-behaviour.patch
- @@ -0,0 +1,64 @@
- +diff --git a/deps/v8/src/heap/incremental-marking.cc b/deps/v8/src/heap/incremental-marking.cc
- +index c922e83..2ead8be 100644
- +--- a/deps/v8/src/heap/incremental-marking.cc
- ++++ b/deps/v8/src/heap/incremental-marking.cc
- +@@ -379,7 +379,7 @@ void IncrementalMarking::DeactivateIncrementalWriteBarrier() {
- + DeactivateIncrementalWriteBarrierForSpace(heap_->new_space());
- +
- + LargePage* lop = heap_->lo_space()->first_page();
- +- while (lop->is_valid()) {
- ++ while (LargePage::IsValid(lop)) {
- + SetOldSpacePageFlags(lop, false, false);
- + lop = lop->next_page();
- + }
- +@@ -414,7 +414,7 @@ void IncrementalMarking::ActivateIncrementalWriteBarrier() {
- + ActivateIncrementalWriteBarrier(heap_->new_space());
- +
- + LargePage* lop = heap_->lo_space()->first_page();
- +- while (lop->is_valid()) {
- ++ while (LargePage::IsValid(lop)) {
- + SetOldSpacePageFlags(lop, true, is_compacting_);
- + lop = lop->next_page();
- + }
- +diff --git a/deps/v8/src/heap/spaces-inl.h b/deps/v8/src/heap/spaces-inl.h
- +index 56c2bad..1a45096 100644
- +--- a/deps/v8/src/heap/spaces-inl.h
- ++++ b/deps/v8/src/heap/spaces-inl.h
- +@@ -148,7 +148,7 @@ Page* Page::Initialize(Heap* heap, MemoryChunk* chunk, Executability executable,
- +
- + bool PagedSpace::Contains(Address addr) {
- + Page* p = Page::FromAddress(addr);
- +- if (!p->is_valid()) return false;
- ++ if (!Page::IsValid(p)) return false;
- + return p->owner() == this;
- + }
- +
- +diff --git a/deps/v8/src/heap/spaces.cc b/deps/v8/src/heap/spaces.cc
- +index e197f5a..2fe10eb 100644
- +--- a/deps/v8/src/heap/spaces.cc
- ++++ b/deps/v8/src/heap/spaces.cc
- +@@ -2918,7 +2918,7 @@ LargePage* LargeObjectSpace::FindPage(Address a) {
- + if (e != NULL) {
- + DCHECK(e->value != NULL);
- + LargePage* page = reinterpret_cast<LargePage*>(e->value);
- +- DCHECK(page->is_valid());
- ++ DCHECK(LargePage::IsValid(page));
- + if (page->Contains(a)) {
- + return page;
- + }
- +diff --git a/deps/v8/src/heap/spaces.h b/deps/v8/src/heap/spaces.h
- +index 312d75f..1054672 100644
- +--- a/deps/v8/src/heap/spaces.h
- ++++ b/deps/v8/src/heap/spaces.h
- +@@ -283,9 +283,9 @@ class MemoryChunk {
- + // Only works for addresses in pointer spaces, not data or code spaces.
- + static inline MemoryChunk* FromAnyPointerAddress(Heap* heap, Address addr);
- +
- +- Address address() { return reinterpret_cast<Address>(this); }
- ++ static bool IsValid(MemoryChunk* chunk) { return chunk != nullptr; }
- +
- +- bool is_valid() { return address() != NULL; }
- ++ Address address() { return reinterpret_cast<Address>(this); }
- +
- + MemoryChunk* next_chunk() const {
- + return reinterpret_cast<MemoryChunk*>(base::Acquire_Load(&next_chunk_));
|