mirror of https://github.com/golang/go.git
[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:
parent
cfeb16ddec
commit
76a2c87a2c
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue