if node.FrameOffset() < 0 {
lv.f.Fatalf("Node %v has frameoffset %d\n", node.Sym().Name, node.FrameOffset())
}
- typebits.Set(node.Type(), node.FrameOffset(), args)
+ typebits.SetNoCheck(node.Type(), node.FrameOffset(), args)
break
}
fallthrough // PPARAMOUT in registers acts memory-allocates like an AUTO
bv := bitvec.New(int32(nptr) * 2)
for _, p := range abiInfo.InParams() {
- typebits.Set(p.Type, p.FrameOffset(abiInfo), bv)
+ typebits.SetNoCheck(p.Type, p.FrameOffset(abiInfo), bv)
}
nbitmap := 1
if fn.Type().NumResults() > 0 {
for _, p := range abiInfo.OutParams() {
if len(p.Registers) == 0 {
- typebits.Set(p.Type, p.FrameOffset(abiInfo), bv)
+ typebits.SetNoCheck(p.Type, p.FrameOffset(abiInfo), bv)
}
}
off = objw.BitVec(lsym, off, bv)
// the first run and then simply copied into bv at the correct offset
// on future calls with the same type t.
func Set(t *types.Type, off int64, bv bitvec.BitVec) {
- if uint8(t.Alignment()) > 0 && off&int64(uint8(t.Alignment())-1) != 0 {
+ set(t, off, bv, false)
+}
+
+// SetNoCheck is like Set, but do not check for alignment.
+func SetNoCheck(t *types.Type, off int64, bv bitvec.BitVec) {
+ set(t, off, bv, true)
+}
+
+func set(t *types.Type, off int64, bv bitvec.BitVec, skip bool) {
+ if !skip && uint8(t.Alignment()) > 0 && off&int64(uint8(t.Alignment())-1) != 0 {
base.Fatalf("typebits.Set: invalid initial alignment: type %v has alignment %d, but offset is %v", t, uint8(t.Alignment()), off)
}
if !t.HasPointers() {
break
}
for i := int64(0); i < t.NumElem(); i++ {
- Set(elt, off, bv)
+ set(elt, off, bv, skip)
off += elt.Size()
}
case types.TSTRUCT:
for _, f := range t.Fields().Slice() {
- Set(f.Type, off+f.Offset, bv)
+ set(f.Type, off+f.Offset, bv, skip)
}
default:
--- /dev/null
+// compile
+
+// Copyright 2022 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 p
+
+import (
+ "sync/atomic"
+)
+
+type I interface {
+ M()
+}
+
+type S struct{}
+
+func (*S) M() {}
+
+type T struct {
+ I
+ x atomic.Int64
+}
+
+func F() {
+ t := &T{I: &S{}}
+ t.M()
+}