| // Copyright 2019 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 test |
| |
| import "testing" |
| |
| var glob = 3 |
| var globp *int64 |
| |
| // Testing compilation of arch.ZeroRange of various sizes. |
| |
| // By storing a pointer to an int64 output param in a global, the compiler must |
| // ensure that output param is allocated on the heap. Also, since there is a |
| // defer, the pointer to each output param must be zeroed in the prologue (see |
| // plive.go:epilogue()). So, we will get a block of one or more stack slots that |
| // need to be zeroed. Hence, we are testing compilation completes successfully when |
| // zerorange calls of various sizes (8-136 bytes) are generated. We are not |
| // testing runtime correctness (which is hard to do for the current uses of |
| // ZeroRange). |
| |
| func TestZeroRange(t *testing.T) { |
| testZeroRange8(t) |
| testZeroRange16(t) |
| testZeroRange32(t) |
| testZeroRange64(t) |
| testZeroRange136(t) |
| } |
| |
| func testZeroRange8(t *testing.T) (r int64) { |
| defer func() { |
| glob = 4 |
| }() |
| globp = &r |
| return |
| } |
| |
| func testZeroRange16(t *testing.T) (r, s int64) { |
| defer func() { |
| glob = 4 |
| }() |
| globp = &r |
| globp = &s |
| return |
| } |
| |
| func testZeroRange32(t *testing.T) (r, s, t2, u int64) { |
| defer func() { |
| glob = 4 |
| }() |
| globp = &r |
| globp = &s |
| globp = &t2 |
| globp = &u |
| return |
| } |
| |
| func testZeroRange64(t *testing.T) (r, s, t2, u, v, w, x, y int64) { |
| defer func() { |
| glob = 4 |
| }() |
| globp = &r |
| globp = &s |
| globp = &t2 |
| globp = &u |
| globp = &v |
| globp = &w |
| globp = &x |
| globp = &y |
| return |
| } |
| |
| func testZeroRange136(t *testing.T) (r, s, t2, u, v, w, x, y, r1, s1, t1, u1, v1, w1, x1, y1, z1 int64) { |
| defer func() { |
| glob = 4 |
| }() |
| globp = &r |
| globp = &s |
| globp = &t2 |
| globp = &u |
| globp = &v |
| globp = &w |
| globp = &x |
| globp = &y |
| globp = &r1 |
| globp = &s1 |
| globp = &t1 |
| globp = &u1 |
| globp = &v1 |
| globp = &w1 |
| globp = &x1 |
| globp = &y1 |
| globp = &z1 |
| return |
| } |