aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/testdata
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2020-07-20 18:07:00 -0400
committerCherry Zhang <cherryyz@google.com>2020-07-21 21:14:19 +0000
commit0e3114871e221485d89bf94dc019fcfa3df9c21a (patch)
treed45ef036d194686789b778cfa64ad961ffcded20 /src/cmd/link/testdata
parent526d99a49ae67bfde15134b96159680988615d2d (diff)
downloadgo-0e3114871e221485d89bf94dc019fcfa3df9c21a.tar.xz
[dev.link] cmd/link: fix hash collision check
For content-addressable symbols, we build its content hash based on the symbol data and relocations. When the compiler builds the symbol data, it may not always include the trailing zeros, e.g. the data of [10]int64{1,2,3} is only the first 24 bytes. Therefore, we may end up with symbols with the same contents (thus same hash) but different sizes. This is not actually a hash collision. In this case, we can deduplicate them and keep the one with the larger size. Change-Id: If6834542d7914cc00f917d7db151955e5aee6f30 Reviewed-on: https://go-review.googlesource.com/c/go/+/243718 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Jeremy Faller <jeremy@golang.org>
Diffstat (limited to 'src/cmd/link/testdata')
-rw-r--r--src/cmd/link/testdata/testHashedSyms/p.go33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/cmd/link/testdata/testHashedSyms/p.go b/src/cmd/link/testdata/testHashedSyms/p.go
new file mode 100644
index 0000000000..87dddcfcac
--- /dev/null
+++ b/src/cmd/link/testdata/testHashedSyms/p.go
@@ -0,0 +1,33 @@
+// Copyright 2020 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.
+
+// This test case contains two static temps (the array literals)
+// with same contents but different sizes. The linker should not
+// report a hash collision. The linker can (and actually does)
+// dedup the two symbols, by keeping the larger symbol. The dedup
+// is not a requirement for correctness and not checked in this test.
+// We do check the emitted symbol contents are correct, though.
+
+package main
+
+func main() {
+ F([10]int{1, 2, 3, 4, 5, 6}, [20]int{1, 2, 3, 4, 5, 6})
+}
+
+//go:noinline
+func F(x, y interface{}) {
+ x1 := x.([10]int)
+ y1 := y.([20]int)
+ for i := range y1 {
+ if i < 6 {
+ if x1[i] != i+1 || y1[i] != i+1 {
+ panic("FAIL")
+ }
+ } else {
+ if (i < len(x1) && x1[i] != 0) || y1[i] != 0 {
+ panic("FAIL")
+ }
+ }
+ }
+}