From: Matthias Schiffer 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 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(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
(this); } ++ static bool IsValid(MemoryChunk* chunk) { return chunk != nullptr; } + +- bool is_valid() { return address() != NULL; } ++ Address address() { return reinterpret_cast
(this); } + + MemoryChunk* next_chunk() const { + return reinterpret_cast(base::Acquire_Load(&next_chunk_));