Part of this patch duplicates a patch that is already applied to the master Go library, so I explicitly backported that patch (https://codereview.appspot.com/111320044) instead.
Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline. Ian
diff -r 3b8f536b76d8 libgo/go/sync/atomic/atomic_test.go --- a/libgo/go/sync/atomic/atomic_test.go Tue Nov 04 14:36:54 2014 -0800 +++ b/libgo/go/sync/atomic/atomic_test.go Tue Nov 04 19:37:03 2014 -0800 @@ -858,7 +858,7 @@ addr := (*int32)(unsafe.Pointer(uaddr)) for i := 0; i < count; i++ { for { - v := *addr + v := LoadInt32(addr) if CompareAndSwapInt32(addr, v, v+1) { break } @@ -869,7 +869,7 @@ func hammerCompareAndSwapUint32(addr *uint32, count int) { for i := 0; i < count; i++ { for { - v := *addr + v := LoadUint32(addr) if CompareAndSwapUint32(addr, v, v+1) { break } @@ -883,7 +883,7 @@ addr := (*uintptr)(unsafe.Pointer(uaddr)) for i := 0; i < count; i++ { for { - v := *addr + v := LoadUintptr(addr) if CompareAndSwapUintptr(addr, v, v+1) { break } @@ -897,7 +897,7 @@ addr := (*unsafe.Pointer)(unsafe.Pointer(uaddr)) for i := 0; i < count; i++ { for { - v := *addr + v := LoadPointer(addr) if CompareAndSwapPointer(addr, v, unsafe.Pointer(uintptr(v)+1)) { break } @@ -1039,7 +1039,7 @@ addr := (*int64)(unsafe.Pointer(uaddr)) for i := 0; i < count; i++ { for { - v := *addr + v := LoadInt64(addr) if CompareAndSwapInt64(addr, v, v+1) { break } @@ -1050,7 +1050,7 @@ func hammerCompareAndSwapUint64(addr *uint64, count int) { for i := 0; i < count; i++ { for { - v := *addr + v := LoadUint64(addr) if CompareAndSwapUint64(addr, v, v+1) { break } @@ -1064,7 +1064,7 @@ addr := (*uintptr)(unsafe.Pointer(uaddr)) for i := 0; i < count; i++ { for { - v := *addr + v := LoadUintptr(addr) if CompareAndSwapUintptr(addr, v, v+1) { break } @@ -1078,7 +1078,7 @@ addr := (*unsafe.Pointer)(unsafe.Pointer(uaddr)) for i := 0; i < count; i++ { for { - v := *addr + v := LoadPointer(addr) if CompareAndSwapPointer(addr, v, unsafe.Pointer(uintptr(v)+1)) { break }