This libgo patch by James Clarke fixes 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. Bootstrapped and ran Go runtime tests on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 257049) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -016ea21c4cba324c6ea6424da7988c6f985e671b +553e04735d1be372c596c720bcaea27e050b13a6 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: libgo/go/runtime/lfstack_64bit.go =================================================================== --- libgo/go/runtime/lfstack_64bit.go (revision 256593) +++ libgo/go/runtime/lfstack_64bit.go (working copy) @@ -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 {