gluon/patches/packages/openwrt/0006-node-fix-undefined-behaviour-leading-to-broken-code-with-GCC-6.patch
Matthias Schiffer 340df0dbee
Fix build with GCC 6
Make pkg-config, mkimage and gcc build with GCC 6 as host compiler. Fix
miscompilation of node.

Fixes #755
2016-05-09 17:09:00 +02:00

81 lines
3.2 KiB
Diff

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..11b0132
--- /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 58eb0aa..b2b796f 100644
+--- a/deps/v8/src/heap/incremental-marking.cc
++++ b/deps/v8/src/heap/incremental-marking.cc
+@@ -364,7 +364,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();
+ }
+@@ -396,7 +396,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 c2c4d12..d63ee63 100644
+--- a/deps/v8/src/heap/spaces-inl.h
++++ b/deps/v8/src/heap/spaces-inl.h
+@@ -155,7 +155,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 0806b25..c0e109b 100644
+--- a/deps/v8/src/heap/spaces.cc
++++ b/deps/v8/src/heap/spaces.cc
+@@ -2953,7 +2953,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 3461de3..e35c057 100644
+--- a/deps/v8/src/heap/spaces.h
++++ b/deps/v8/src/heap/spaces.h
+@@ -278,9 +278,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_));