mirror of
https://github.com/golang/go
synced 2024-11-14 09:10:27 -07:00
55ac5b50b0
When rewriting loads and stores accessing global variables to use the GOT we were making use of REGTMP (R10). Unfortunately loads and stores with large offsets (larger than 20-bits) were also using REGTMP, causing it to be clobbered and subsequently a segmentation fault. This can be fixed by using REGTMP2 (R11) for the rewrite. This is fine because REGTMP2 only has a couple of uses in the assembler (division, high multiplication and storage-to-storage instructions). We didn't use REGTMP2 originally because it used to be used more frequently, in particular for stores of constants to memory. However we have now eliminated those uses. This was found while writing a test case for CL 63030. That test case is included in this CL. Change-Id: I13956f1f3ca258a7c8a7ff0a7570d2848adf7f68 Reviewed-on: https://go-review.googlesource.com/65011 Reviewed-by: Cherry Zhang <cherryyz@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
18 lines
485 B
Go
18 lines
485 B
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package globallib
|
|
|
|
// Data is large enough to that offsets into it do not fit into
|
|
// 16-bit or 20-bit immediates. Ideally we'd also try and overrun
|
|
// 32-bit immediates, but that requires the test machine to have
|
|
// too much memory.
|
|
var Data [1<<20 + 10]int64
|
|
|
|
func init() {
|
|
for i := range Data {
|
|
Data[i] = int64(i)
|
|
}
|
|
}
|