aboutsummaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2018-01-25 17:44:19 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2018-01-25 17:44:19 +0000
commita88d1f8bb2015c752fc783e168e25e5dab99a8b9 (patch)
treec538ad105bcf5484334faf79a5d0f5116ea5862c /libgo
parent19e502d4132a2b02e71f75e4a20e6396081cdbc5 (diff)
downloadgcc-a88d1f8bb2015c752fc783e168e25e5dab99a8b9.zip
gcc-a88d1f8bb2015c752fc783e168e25e5dab99a8b9.tar.gz
gcc-a88d1f8bb2015c752fc783e168e25e5dab99a8b9.tar.bz2
runtime: fix lfstackUnpack on ia64
The top three region number bits must be masked out before right-shifting the address bits into place, otherwise they will be copied down into the lower always-zero address bits. Reviewed-on: https://go-review.googlesource.com/84535 From-SVN: r257061
Diffstat (limited to 'libgo')
-rw-r--r--libgo/go/runtime/lfstack_64bit.go2
1 files changed, 1 insertions, 1 deletions
diff --git a/libgo/go/runtime/lfstack_64bit.go b/libgo/go/runtime/lfstack_64bit.go
index 44cbf74..95d0eba 100644
--- a/libgo/go/runtime/lfstack_64bit.go
+++ b/libgo/go/runtime/lfstack_64bit.go
@@ -78,7 +78,7 @@ func lfstackUnpack(val uint64) *lfnode {
return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> sparcLinuxCntBits << 3)))
}
if GOARCH == "ia64" {
- return (*lfnode)(unsafe.Pointer(uintptr((val>>ia64CntBits<<3)&(1<<(64-3)-1) | val&^(1<<(64-3)-1))))
+ return (*lfnode)(unsafe.Pointer(uintptr(((val & (1<<(64-3) - 1)) >> ia64CntBits << 3) | val&^(1<<(64-3)-1))))
}
if GOARCH == "ppc64" && GOOS == "aix" {
if val&(1<<63) != 0 {