public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* libgo patch committed: Don't assume that reads from address 0 crash
@ 2017-11-09 22:57 Ian Lance Taylor
  0 siblings, 0 replies; only message in thread
From: Ian Lance Taylor @ 2017-11-09 22:57 UTC (permalink / raw)
  To: gcc-patches, gofrontend-dev

[-- Attachment #1: Type: text/plain, Size: 310 bytes --]

This libgo patch from Tony Reix fixes libgo on AIX, where reads from
address 0 simply return 0 rather than crashing with a segmentation
violation.  The libgo code was expecting the latter, which caused some
tests to fail.  Bootstrapped and ran Go testsuite on
x86_64-pc-linux-gnu.  Committed to mainline.

Ian

[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 4534 bytes --]

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 254504)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@
-7fd845bd9414c348bfa30bd24aa0bb8e4eebf83a
+b03c5dc36d6d0c0d3bef434936e8b924d253595b
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: libgo/go/runtime/internal/atomic/atomic.c
===================================================================
--- libgo/go/runtime/internal/atomic/atomic.c	(revision 254090)
+++ libgo/go/runtime/internal/atomic/atomic.c	(working copy)
@@ -34,7 +34,7 @@ uint64_t
 Load64 (uint64_t *ptr)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    panicmem ();
   return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
 }
 
@@ -66,7 +66,7 @@ int64_t
 Loadint64 (int64_t *ptr)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    panicmem ();
   return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
 }
 
@@ -88,7 +88,7 @@ uint64_t
 Xadd64 (uint64_t *ptr, int64_t delta)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    panicmem ();
   return __atomic_add_fetch (ptr, (uint64_t) delta, __ATOMIC_SEQ_CST);
 }
 
@@ -110,7 +110,7 @@ int64_t
 Xaddint64 (int64_t *ptr, int64_t delta)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    panicmem ();
   return __atomic_add_fetch (ptr, delta, __ATOMIC_SEQ_CST);
 }
 
@@ -132,7 +132,7 @@ uint64_t
 Xchg64 (uint64_t *ptr, uint64_t new)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    panicmem ();
   return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST);
 }
 
@@ -184,7 +184,7 @@ _Bool
 Cas64 (uint64_t *ptr, uint64_t old, uint64_t new)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    panicmem ();
   return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);
 }
 
@@ -226,7 +226,7 @@ void
 Store64 (uint64_t *ptr, uint64_t val)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    panicmem ();
   __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST);
 }
 
Index: libgo/go/runtime/panic.go
===================================================================
--- libgo/go/runtime/panic.go	(revision 254090)
+++ libgo/go/runtime/panic.go	(working copy)
@@ -22,6 +22,7 @@ import (
 //go:linkname makefuncreturning runtime.makefuncreturning
 //go:linkname gorecover runtime.gorecover
 //go:linkname deferredrecover runtime.deferredrecover
+//go:linkname panicmem runtime.panicmem
 // Temporary for C code to call:
 //go:linkname throw runtime.throw
 
Index: libgo/go/sync/atomic/atomic.c
===================================================================
--- libgo/go/sync/atomic/atomic.c	(revision 254090)
+++ libgo/go/sync/atomic/atomic.c	(working copy)
@@ -26,7 +26,7 @@ int64_t
 SwapInt64 (int64_t *addr, int64_t new)
 {
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    panicmem ();
   return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
 }
 
@@ -48,7 +48,7 @@ uint64_t
 SwapUint64 (uint64_t *addr, uint64_t new)
 {
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    panicmem ();
   return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
 }
 
@@ -215,7 +215,7 @@ LoadInt64 (int64_t *addr)
   int64_t v;
 
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    panicmem ();
   v = *addr;
   while (! __sync_bool_compare_and_swap (addr, v, v))
     v = *addr;
@@ -247,7 +247,7 @@ LoadUint64 (uint64_t *addr)
   uint64_t v;
 
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    panicmem ();
   v = *addr;
   while (! __sync_bool_compare_and_swap (addr, v, v))
     v = *addr;
@@ -308,7 +308,7 @@ StoreInt64 (int64_t *addr, int64_t val)
   int64_t v;
 
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    panicmem ();
   v = *addr;
   while (! __sync_bool_compare_and_swap (addr, v, val))
     v = *addr;
@@ -338,7 +338,7 @@ StoreUint64 (uint64_t *addr, uint64_t va
   uint64_t v;
 
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    panicmem ();
   v = *addr;
   while (! __sync_bool_compare_and_swap (addr, v, val))
     v = *addr;
Index: libgo/runtime/runtime.h
===================================================================
--- libgo/runtime/runtime.h	(revision 254090)
+++ libgo/runtime/runtime.h	(working copy)
@@ -211,6 +211,8 @@ extern	uint32	runtime_panicking(void)
 extern	bool	runtime_isstarted;
 extern	bool	runtime_isarchive;
 
+extern	void	panicmem(void) __asm__ (GOSYM_PREFIX "runtime.panicmem");
+
 /*
  * common functions and data
  */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-11-09 21:57 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-09 22:57 libgo patch committed: Don't assume that reads from address 0 crash Ian Lance Taylor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).