go/test/typeparam
Keith Randall b730a26729 [dev.typeparams] cmd/compile: put shape types in their own package
Put shape types in the top level package called ".shape".
Name them using the serialization of the shape name, instead of
the .shapeN names.

This allows the linker to deduplicate instantiations across packages.

Not sure that this is entirely correct, as shapes in this package
may reference other packages (e.g. a field of a struct). But it seems
to work for now.

For the added test, when you look at the resulting binary (use the -k
option with run.go) it has only one instantiation of F, and 4 call sites:

$ objdump -d a.exe | grep _a\.F
 1053cb0:	e8 8b 00 00 00 	callq	139 <_a.F[.shape.*uint8]>
 1053ce9:	e8 52 00 00 00 	callq	82 <_a.F[.shape.*uint8]>
_a.F[.shape.*uint8]:
 1053d90:	e8 ab ff ff ff 	callq	-85 <_a.F[.shape.*uint8]>
 1053dc9:	e8 72 ff ff ff 	callq	-142 <_a.F[.shape.*uint8]>

Change-Id: I627f7e50210aabe4a10d0e2717d87b75ac82e99b
Reviewed-on: https://go-review.googlesource.com/c/go/+/339595
Trust: Keith Randall <khr@golang.org>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dan Scales <danscales@google.com>
2021-08-04 17:56:00 +00:00
..
absdiffimp.dir
aliasimp.dir
chansimp.dir
dedup.dir
factimp.dir
listimp.dir
listimp2.dir
mapimp.dir
mapsimp.dir
mdempsky
mincheck.dir
minimp.dir
mutualimp.dir
orderedmapsimp.dir
pairimp.dir
setsimp.dir
sliceimp.dir
stringerimp.dir
valimp.dir
absdiff.go
absdiffimp.go
adder.go
aliasimp.go
append.go
boundmethod.go
builtins.go
chans.go
chansimp.go
combine.go
cons.go
dedup.go
dedup.out
dictionaryCapture-noinline.go
dictionaryCapture.go
dottype.go
dottype.out
double.go
equal.go
fact.go
factimp.go
graph.go
ifaceconv.go
importtest.go
index.go
interfacearg.go
issue39755.go
issue44688.go
issue45547.go
issue45722.go
issue45738.go
issue45817.go
issue46472.go
issue47258.go
list.go
list2.go
listimp.go
listimp2.go
lockable.go
map.go
mapimp.go
maps.go
mapsimp.go
metrics.go
min.go
mincheck.go
minimp.go
mutualimp.go
nested.go
nested.out
ordered.go
orderedmap.go
orderedmapsimp.go
pair.go
pairimp.go
pragma.go
sets.go
setsimp.go
settable.go
shape1.go
shape1.out
sliceimp.go
slices.go
smallest.go
smoketest.go
stringable.go
stringer.go
stringerimp.go
struct.go
subdict.go
sum.go
tparam1.go
typelist.go
valimp.go
value.go