81 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			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..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_));
 |