libgo patch committed: Update AIX memory allocation

Message ID CAOyqgcUtuFgsFBC6jmzuV1x7G-On9PMg6ioceYHQjm7ySg8nXw@mail.gmail.com
State New
Headers show
Series
  • libgo patch committed: Update AIX memory allocation
Related show

Commit Message

Ian Lance Taylor Feb. 28, 2018, 1:39 a.m.
This patch by Tony Reix updates the AIX memory allocation in libgo for
new versions of AIX.  Bootstrapped and ran Go testsuite on
x86_64-pc-linux-gnu.  Committed to mainline.

Ian

Patch

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 258051)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-bd7fc3c85d874344b18bbb0a738ec94dfb43794b
+821960465883fbdd96568f2325f55ee4b05de1cb
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: libgo/go/runtime/malloc.go
===================================================================
--- libgo/go/runtime/malloc.go	(revision 257914)
+++ libgo/go/runtime/malloc.go	(working copy)
@@ -296,8 +296,8 @@  func mallocinit() {
 		// allocation at 0x40 << 32 because when using 4k pages with 3-level
 		// translation buffers, the user address space is limited to 39 bits
 		// On darwin/arm64, the address space is even smaller.
-		// On AIX, mmap adresses range start at 0x07000000_00000000 for 64 bits
-		// processes.
+		// On AIX, mmap adresses range starts at 0x0700000000000000 for 64-bit
+		// processes. The new address space allocator starts at 0x0A00000000000000.
 		arenaSize := round(_MaxMem, _PageSize)
 		pSize = bitmapSize + spansSize + arenaSize + _PageSize
 		for i := 0; i <= 0x7f; i++ {
@@ -307,13 +307,16 @@  func mallocinit() {
 			case GOARCH == "arm64":
 				p = uintptr(i)<<40 | uintptrMask&(0x0040<<32)
 			case GOOS == "aix":
-				i = 1
-				p = uintptr(i)<<32 | uintptrMask&(0x70<<52)
+				if i == 0 {
+					p = uintptrMask&(1<<32) | uintptrMask&(0xa0<<52)
+				} else {
+					p = uintptr(i)<<32 | uintptrMask&(0x70<<52)
+				}
 			default:
 				p = uintptr(i)<<40 | uintptrMask&(0x00c0<<32)
 			}
 			p = uintptr(sysReserve(unsafe.Pointer(p), pSize, &reserved))
-			if p != 0 || GOOS == "aix" { // Useless to loop on AIX, as i is forced to 1
+			if p != 0 {
 				break
 			}
 		}