diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/gc/compile.go | 7 | ||||
| -rw-r--r-- | src/cmd/compile/internal/liveness/plive.go | 2 |
2 files changed, 7 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/gc/compile.go b/src/cmd/compile/internal/gc/compile.go index 159fd29c48..496daacb42 100644 --- a/src/cmd/compile/internal/gc/compile.go +++ b/src/cmd/compile/internal/gc/compile.go @@ -58,8 +58,13 @@ func enqueueFunc(fn *ir.Func) { types.CalcSize(fn.Type()) a := ssagen.AbiForBodylessFuncStackMap(fn) abiInfo := a.ABIAnalyzeFuncType(fn.Type()) // abiInfo has spill/home locations for wrapper - liveness.WriteFuncMap(fn, abiInfo) if fn.ABI == obj.ABI0 { + // The current args_stackmap generation assumes the function + // is ABI0, and only ABI0 assembly function can have a FUNCDATA + // reference to args_stackmap (see cmd/internal/obj/plist.go:Flushplist). + // So avoid introducing an args_stackmap if the func is not ABI0. + liveness.WriteFuncMap(fn, abiInfo) + x := ssagen.EmitArgInfo(fn, abiInfo) objw.Global(x, int32(len(x.P)), obj.RODATA|obj.LOCAL) } diff --git a/src/cmd/compile/internal/liveness/plive.go b/src/cmd/compile/internal/liveness/plive.go index 1a36035f46..708f0f2023 100644 --- a/src/cmd/compile/internal/liveness/plive.go +++ b/src/cmd/compile/internal/liveness/plive.go @@ -1536,7 +1536,7 @@ func isfat(t *types.Type) bool { // inputs and outputs as the value of symbol <fn>.args_stackmap. // If fn has outputs, two bitmaps are written, otherwise just one. func WriteFuncMap(fn *ir.Func, abiInfo *abi.ABIParamResultInfo) { - if ir.FuncName(fn) == "_" || fn.Sym().Linkname != "" { + if ir.FuncName(fn) == "_" { return } nptr := int(abiInfo.ArgWidth() / int64(types.PtrSize)) |
