mirror of https://github.com/golang/go.git
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 #41761 Change-Id: I541500cb1a03de954881aef659f96fc0b7738848 Reviewed-on: https://go-review.googlesource.com/c/go/+/259297 Trust: Keith Randall <khr@golang.org> Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
a65bc048bf
commit
a9c75ecd3d
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -1017,6 +1017,8 @@ func (w *exportWriter) symIdx(s *types.Sym) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *exportWriter) typeExt(t *types.Type) {
|
func (w *exportWriter) typeExt(t *types.Type) {
|
||||||
|
// Export whether this type is marked notinheap.
|
||||||
|
w.bool(t.NotInHeap())
|
||||||
// For type T, export the index of type descriptor symbols of T and *T.
|
// For type T, export the index of type descriptor symbols of T and *T.
|
||||||
if i, ok := typeSymIdx[t]; ok {
|
if i, ok := typeSymIdx[t]; ok {
|
||||||
w.int64(i[0])
|
w.int64(i[0])
|
||||||
|
|
|
||||||
|
|
@ -596,7 +596,6 @@ func (r *importReader) typ1() *types.Type {
|
||||||
|
|
||||||
// Ensure we expand the interface in the frontend (#25055).
|
// Ensure we expand the interface in the frontend (#25055).
|
||||||
checkwidth(t)
|
checkwidth(t)
|
||||||
|
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -711,6 +710,7 @@ func (r *importReader) symIdx(s *types.Sym) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *importReader) typeExt(t *types.Type) {
|
func (r *importReader) typeExt(t *types.Type) {
|
||||||
|
t.SetNotInHeap(r.bool())
|
||||||
i, pi := r.int64(), r.int64()
|
i, pi := r.int64(), r.int64()
|
||||||
if i != -1 && pi != -1 {
|
if i != -1 && pi != -1 {
|
||||||
typeSymIdx[t] = [2]int64{i, pi}
|
typeSymIdx[t] = [2]int64{i, pi}
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ const (
|
||||||
Nowritebarrierrec // error on write barrier in this or recursive callees
|
Nowritebarrierrec // error on write barrier in this or recursive callees
|
||||||
Yeswritebarrierrec // cancels Nowritebarrierrec in this function and callees
|
Yeswritebarrierrec // cancels Nowritebarrierrec in this function and callees
|
||||||
|
|
||||||
// Runtime-only type pragmas
|
// Runtime and cgo type pragmas
|
||||||
NotInHeap // values of this type must not be heap allocated
|
NotInHeap // values of this type must not be heap allocated
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue