| // 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 main |
| |
| import ( |
| "testshared/globallib" |
| ) |
| |
| //go:noinline |
| func testLoop() { |
| for i, s := range globallib.Data { |
| if s != int64(i) { |
| panic("testLoop: mismatch") |
| } |
| } |
| } |
| |
| //go:noinline |
| func ptrData() *[1<<20 + 10]int64 { |
| return &globallib.Data |
| } |
| |
| //go:noinline |
| func testMediumOffset() { |
| for i, s := range globallib.Data[1<<16-2:] { |
| if s != int64(i)+1<<16-2 { |
| panic("testMediumOffset: index mismatch") |
| } |
| } |
| |
| x := globallib.Data[1<<16-1] |
| if x != 1<<16-1 { |
| panic("testMediumOffset: direct mismatch") |
| } |
| |
| y := &globallib.Data[1<<16-3] |
| if y != &ptrData()[1<<16-3] { |
| panic("testMediumOffset: address mismatch") |
| } |
| } |
| |
| //go:noinline |
| func testLargeOffset() { |
| for i, s := range globallib.Data[1<<20:] { |
| if s != int64(i)+1<<20 { |
| panic("testLargeOffset: index mismatch") |
| } |
| } |
| |
| x := globallib.Data[1<<20+1] |
| if x != 1<<20+1 { |
| panic("testLargeOffset: direct mismatch") |
| } |
| |
| y := &globallib.Data[1<<20+2] |
| if y != &ptrData()[1<<20+2] { |
| panic("testLargeOffset: address mismatch") |
| } |
| } |
| |
| func main() { |
| testLoop() |
| |
| // SSA rules commonly merge offsets into addresses. These |
| // tests access global data in different ways to try |
| // and exercise different SSA rules. |
| testMediumOffset() |
| testLargeOffset() |
| } |