// 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 gc 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 }