]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: don't emit args_stackmap for ABIInternal asm funcs
authorThan McIntosh <thanm@google.com>
Tue, 13 Apr 2021 17:49:55 +0000 (13:49 -0400)
committerThan McIntosh <thanm@google.com>
Wed, 14 Apr 2021 16:59:24 +0000 (16:59 +0000)
The compiler currently emits an "*.args_stackmap" symbol for all
bodyless functions, so that asm functions will have the proper stack
map. At the moment the code in the compiler that emits args_stackmap
assumes ABI0; to avoid misleading stackmaps, turn off args_stackmap
generation for non-ABI0 asm functions.

Updates #40724.

Change-Id: Ia5e3528d56da5fb107e799bd658e52496ba4a331
Reviewed-on: https://go-review.googlesource.com/c/go/+/309790
Trust: Than McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/internal/obj/plist.go

index 9dbad20589cdb1ee46c2fe0497833abc791e407e..54b035bb96a94cd5de2cd16dad4c263d88d115d4 100644 (file)
@@ -85,6 +85,13 @@ func Flushplist(ctxt *Link, plist *Plist, newprog ProgAlloc, myimportpath string
                        // wrapper function
                        continue
                }
+               // The current args_stackmap generation in the compiler assumes
+               // that the function in question is ABI0, so avoid introducing
+               // an args_stackmap reference if the func is not ABI0 (better to
+               // have no stackmap than an incorrect/lying stackmap).
+               if s.ABI() != ABI0 {
+                       continue
+               }
                found := false
                for p := s.Func().Text; p != nil; p = p.Link {
                        if p.As == AFUNCDATA && p.From.Type == TYPE_CONST && p.From.Offset == objabi.FUNCDATA_ArgsPointerMaps {
@@ -92,7 +99,6 @@ func Flushplist(ctxt *Link, plist *Plist, newprog ProgAlloc, myimportpath string
                                break
                        }
                }
-
                if !found {
                        p := Appendp(s.Func().Text, newprog)
                        p.As = AFUNCDATA