]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/gc: assert size of important types
authorDave Cheney <dave@cheney.net>
Sun, 6 Mar 2016 02:04:52 +0000 (13:04 +1100)
committerDave Cheney <dave@cheney.net>
Sun, 6 Mar 2016 04:09:07 +0000 (04:09 +0000)
Add tests to ensure that the size of important types don't change
unexpectedly.

Skip the test on nacl platforms because of their unusual padding
requirements.

Change-Id: Iddb127a99499e089a309b721f5073356c0da8b24
Reviewed-on: https://go-review.googlesource.com/20285
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Dave Cheney <dave@cheney.net>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/sizeof_test.go [new file with mode: 0644]
src/cmd/internal/obj/sizeof_test.go [new file with mode: 0644]

diff --git a/src/cmd/compile/internal/gc/sizeof_test.go b/src/cmd/compile/internal/gc/sizeof_test.go
new file mode 100644 (file)
index 0000000..a0ae7cc
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright 2016 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.
+
+// +build !nacl
+
+package gc
+
+import (
+       "reflect"
+       "testing"
+       "unsafe"
+)
+
+// Assert that the size of important structures do not change unexpectedly.
+
+func TestSizeof(t *testing.T) {
+       const _64bit = unsafe.Sizeof(uintptr(0)) == 8
+
+       var tests = []struct {
+               val    interface{} // type as a value
+               _32bit uintptr     // size on 32bit platforms
+               _64bit uintptr     // size on 64bit platforms
+       }{
+               {Flow{}, 52, 88},
+               {Func{}, 104, 184},
+               {Name{}, 52, 80},
+               {Node{}, 92, 144},
+               {Sym{}, 64, 112},
+               {Type{}, 144, 240},
+       }
+
+       for _, tt := range tests {
+               want := tt._32bit
+               if _64bit {
+                       want = tt._64bit
+               }
+               got := reflect.TypeOf(tt.val).Size()
+               if want != got {
+                       t.Errorf("unsafe.Sizeof(%T): want %d, got %d", tt.val, want, got)
+               }
+       }
+}
diff --git a/src/cmd/internal/obj/sizeof_test.go b/src/cmd/internal/obj/sizeof_test.go
new file mode 100644 (file)
index 0000000..70e62d0
--- /dev/null
@@ -0,0 +1,40 @@
+// Copyright 2016 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.
+
+// +build !nacl
+
+package obj
+
+import (
+       "reflect"
+       "testing"
+       "unsafe"
+)
+
+// Assert that the size of important structures do not change unexpectedly.
+
+func TestSizeof(t *testing.T) {
+       const _64bit = unsafe.Sizeof(uintptr(0)) == 8
+
+       var tests = []struct {
+               val    interface{} // type as a value
+               _32bit uintptr     // size on 32bit platforms
+               _64bit uintptr     // size on 64bit platforms
+       }{
+               {Addr{}, 52, 80},
+               {LSym{}, 92, 152},
+               {Prog{}, 196, 288},
+       }
+
+       for _, tt := range tests {
+               want := tt._32bit
+               if _64bit {
+                       want = tt._64bit
+               }
+               got := reflect.TypeOf(tt.val).Size()
+               if want != got {
+                       t.Errorf("unsafe.Sizeof(%T): want %d, got %d", tt.val, want, got)
+               }
+       }
+}