mirror of
https://github.com/golang/go
synced 2024-11-02 11:50:30 +00:00
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
5 changed files with 38 additions and 2 deletions
20
misc/cgo/test/testdata/issue41761.go
vendored
Normal file
20
misc/cgo/test/testdata/issue41761.go
vendored
Normal 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
14
misc/cgo/test/testdata/issue41761a/a.go
vendored
Normal 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
|
||||
}
|
|
@ -1017,6 +1017,8 @@ 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())
|
||||
// For type T, export the index of type descriptor symbols of T and *T.
|
||||
if i, ok := typeSymIdx[t]; ok {
|
||||
w.int64(i[0])
|
||||
|
|
|
@ -596,7 +596,6 @@ func (r *importReader) typ1() *types.Type {
|
|||
|
||||
// Ensure we expand the interface in the frontend (#25055).
|
||||
checkwidth(t)
|
||||
|
||||
return t
|
||||
}
|
||||
}
|
||||
|
@ -711,6 +710,7 @@ func (r *importReader) symIdx(s *types.Sym) {
|
|||
}
|
||||
|
||||
func (r *importReader) typeExt(t *types.Type) {
|
||||
t.SetNotInHeap(r.bool())
|
||||
i, pi := r.int64(), r.int64()
|
||||
if i != -1 && pi != -1 {
|
||||
typeSymIdx[t] = [2]int64{i, pi}
|
||||
|
|
|
@ -48,7 +48,7 @@ const (
|
|||
Nowritebarrierrec // error on write barrier in this or recursive 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
|
||||
)
|
||||
|
||||
|
|
Loading…
Reference in a new issue