]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: disable tail call for method wrappers when RegabiArgs is enabled
authorCherry Zhang <cherryyz@google.com>
Sun, 4 Apr 2021 16:20:35 +0000 (12:20 -0400)
committerCherry Zhang <cherryyz@google.com>
Mon, 5 Apr 2021 17:25:15 +0000 (17:25 +0000)
Currently, the IR of tailcall does not connect the arguments with
the OTAILCALL node, so the arguments are not marshaled correctly.
Disable tail call for now.

Updates #40724.

Change-Id: I39de3ea8e19a23eb63768ab7282d2f870e9c266e
Reviewed-on: https://go-review.googlesource.com/c/go/+/307234
Trust: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Austin Clements <austin@google.com>
src/cmd/compile/internal/reflectdata/reflect.go

index 3a31e3c951c3795e40f8fd84f64345047c42bdfa..379735e86bb0f6e45ae58ad2be78e02b3693d18f 100644 (file)
@@ -1770,7 +1770,11 @@ func methodWrapper(rcvr *types.Type, method *types.Field) *obj.LSym {
        // the TOC to the appropriate value for that module. But if it returns
        // directly to the wrapper's caller, nothing will reset it to the correct
        // value for that function.
-       if !base.Flag.Cfg.Instrumenting && rcvr.IsPtr() && methodrcvr.IsPtr() && method.Embedded != 0 && !types.IsInterfaceMethod(method.Type) && !(base.Ctxt.Arch.Name == "ppc64le" && base.Ctxt.Flag_dynlink) {
+       //
+       // Disable tailcall for RegabiArgs for now. The IR does not connect the
+       // arguments with the OTAILCALL node, and the arguments are not marshaled
+       // correctly.
+       if !base.Flag.Cfg.Instrumenting && rcvr.IsPtr() && methodrcvr.IsPtr() && method.Embedded != 0 && !types.IsInterfaceMethod(method.Type) && !(base.Ctxt.Arch.Name == "ppc64le" && base.Ctxt.Flag_dynlink) && !objabi.Experiment.RegabiArgs {
                // generate tail call: adjust pointer receiver and jump to embedded method.
                left := dot.X // skip final .M
                if !left.Type().IsPtr() {