diff options
author | David Chase <drchase@google.com> | 2021-02-26 14:27:59 -0500 |
---|---|---|
committer | David Chase <drchase@google.com> | 2021-03-04 23:09:24 +0000 |
commit | d891ebdce1ac2c72e1d923c24f5a65ec14ba7cf8 (patch) | |
tree | c865bc988e5c221293f7d67aee7c6737a651da75 /test/abi | |
parent | d6504b80973a22edbb5045e98c53901776101d18 (diff) | |
download | go-git-d891ebdce1ac2c72e1d923c24f5a65ec14ba7cf8.tar.gz |
cmd/compile: return (and receive) medium-large results
includes three tests
Change-Id: I33ac0cfe35085d4b6ad2775abcaa3d7d6527b49f
Reviewed-on: https://go-review.googlesource.com/c/go/+/297031
Trust: David Chase <drchase@google.com>
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'test/abi')
-rw-r--r-- | test/abi/double_nested_addressed_struct.go | 62 | ||||
-rw-r--r-- | test/abi/double_nested_struct.go | 55 | ||||
-rw-r--r-- | test/abi/too_big_to_ssa.go | 47 | ||||
-rw-r--r-- | test/abi/too_big_to_ssa.out | 2 |
4 files changed, 166 insertions, 0 deletions
diff --git a/test/abi/double_nested_addressed_struct.go b/test/abi/double_nested_addressed_struct.go new file mode 100644 index 0000000000..be7c88aaaf --- /dev/null +++ b/test/abi/double_nested_addressed_struct.go @@ -0,0 +1,62 @@ +// run + +//go:build !wasm +// +build !wasm + +// Copyright 2021 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. + +// wasm is excluded because the compiler chatter about register abi pragma ends up +// on stdout, and causes the expected output to not match. + +package main + +import ( + "fmt" +) + +var sink *string + +type stringPair struct { + a, b string +} + +type stringPairPair struct { + x, y stringPair +} + +// The goal of this test is to be sure that the call arg/result expander works correctly +// for a corner case of passing a 2-nested struct that fits in registers to/from calls. +// AND, the struct has its address taken. + +//go:registerparams +//go:noinline +func H(spp stringPairPair) string { + F(&spp) + return spp.x.a + " " + spp.x.b + " " + spp.y.a + " " + spp.y.b +} + +//go:registerparams +//go:noinline +func G(d, c, b, a string) stringPairPair { + return stringPairPair{stringPair{a, b}, stringPair{c, d}} +} + +//go:registerparams +//go:noinline +func F(spp *stringPairPair) { + spp.x.a, spp.x.b, spp.y.a, spp.y.b = spp.y.b, spp.y.a, spp.x.b, spp.x.a +} + +func main() { + spp := G("this", "is", "a", "test") + s := H(spp) + gotVsWant(s, "this is a test") +} + +func gotVsWant(got, want string) { + if got != want { + fmt.Printf("FAIL, got %s, wanted %s\n", got, want) + } +} diff --git a/test/abi/double_nested_struct.go b/test/abi/double_nested_struct.go new file mode 100644 index 0000000000..70d8ea4bce --- /dev/null +++ b/test/abi/double_nested_struct.go @@ -0,0 +1,55 @@ +// run + +//go:build !wasm +// +build !wasm + +// Copyright 2021 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. + +// wasm is excluded because the compiler chatter about register abi pragma ends up +// on stdout, and causes the expected output to not match. + +package main + +import ( + "fmt" +) + +var sink *string + +type stringPair struct { + a, b string +} + +type stringPairPair struct { + x, y stringPair +} + +// The goal of this test is to be sure that the call arg/result expander works correctly +// for a corner case of passing a 2-nested struct that fits in registers to/from calls. + +//go:registerparams +//go:noinline +func H(spp stringPairPair) string { + return spp.x.a + " " + spp.x.b + " " + spp.y.a + " " + spp.y.b +} + +//go:registerparams +//go:noinline +func G(a,b,c,d string) stringPairPair { + return stringPairPair{stringPair{a,b},stringPair{c,d}} +} + + +func main() { + spp := G("this","is","a","test") + s := H(spp) + gotVsWant(s, "this is a test") +} + +func gotVsWant(got, want string) { + if got != want { + fmt.Printf("FAIL, got %s, wanted %s\n", got, want) + } +} diff --git a/test/abi/too_big_to_ssa.go b/test/abi/too_big_to_ssa.go new file mode 100644 index 0000000000..a5c6abb0e4 --- /dev/null +++ b/test/abi/too_big_to_ssa.go @@ -0,0 +1,47 @@ +// run + +// +build !wasm + +// Copyright 2021 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 ( + "fmt" +) + +var sink *string + +type toobig struct { + // 6 words will not SSA but will fit in registers + a,b,c string +} + +//go:registerparams +//go:noinline +func H(x toobig) string { + return x.a + " " + x.b + " " + x.c +} + +//go:registerparams +//go:noinline +func I(a,b,c string) toobig { + return toobig{a,b,c} +} + +func main() { + s := H(toobig{"Hello", "there,", "World"}) + gotVsWant(s, "Hello there, World") + fmt.Println(s) + t := H(I("Ahoy", "there,", "Matey")) + gotVsWant(t, "Ahoy there, Matey") + fmt.Println(t) +} + +func gotVsWant(got, want string) { + if got != want { + fmt.Printf("FAIL, got %s, wanted %s\n", got, want) + } +} diff --git a/test/abi/too_big_to_ssa.out b/test/abi/too_big_to_ssa.out new file mode 100644 index 0000000000..eeece34d47 --- /dev/null +++ b/test/abi/too_big_to_ssa.out @@ -0,0 +1,2 @@ +Hello there, World +Ahoy there, Matey |