[release-branch.go1.15] cmd/compile: export notinheap annotation to object file

In the rare case when a cgo type makes it into an object file, we need
the go:notinheap annotation to go with it.

Fixes #41432.

Change-Id: Ie2ef241ee49661792e0d8c8c46c51b2fe5c6fa7c
Reviewed-on: https://go-review.googlesource.com/c/go/+/259300
Trust: Keith Randall <khr@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
Keith Randall 2020-10-02 16:04:12 -07:00 committed by Dmitri Shuralyov
parent cfeb16ddec
commit 76a2c87a2c
4 changed files with 45 additions and 0 deletions

20
misc/cgo/test/testdata/issue41761.go vendored Normal file
View File

@ -0,0 +1,20 @@
// 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.
package cgotest
/*
typedef struct S S;
*/
import "C"
import (
"cgotest/issue41761a"
"testing"
)
func test41761(t *testing.T) {
var x issue41761a.T
_ = (*C.struct_S)(x.X)
}

14
misc/cgo/test/testdata/issue41761a/a.go vendored Normal file
View File

@ -0,0 +1,14 @@
// 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.
package issue41761a
/*
typedef struct S S;
*/
import "C"
type T struct {
X *C.S
}

View File

@ -492,6 +492,7 @@ func (p *iexporter) doDecl(n *Node) {
w.signature(m.Type)
}
w.typeExt(t)
for _, m := range ms.Slice() {
w.methExt(m)
}
@ -1012,6 +1013,11 @@ func (w *exportWriter) symIdx(s *types.Sym) {
}
}
func (w *exportWriter) typeExt(t *types.Type) {
// Export whether this type is marked notinheap.
w.bool(t.NotInHeap())
}
// Inline bodies.
func (w *exportWriter) stmtList(list Nodes) {

View File

@ -346,6 +346,7 @@ func (r *importReader) doDecl(n *Node) {
}
t.Methods().Set(ms)
r.typeExt(t)
for _, m := range ms {
r.methExt(m)
}
@ -710,6 +711,10 @@ func (r *importReader) symIdx(s *types.Sym) {
}
}
func (r *importReader) typeExt(t *types.Type) {
t.SetNotInHeap(r.bool())
}
func (r *importReader) doInline(n *Node) {
if len(n.Func.Inl.Body) != 0 {
Fatalf("%v already has inline body", n)