compiler: support //go:linknamestd pragma

Go 1.27 introduced the //go:linknamestd directive, a standard-library
variant of //go:linkname that does not require importing "unsafe". The
iter package switched to it for referencing runtime.newcoro and
runtime.coroswitch, which caused "linker could not find symbol
iter.newcoro / iter.coroswitch" errors when building with Go 1.27.

Handle //go:linknamestd the same as //go:linkname, bypassing the unsafe
import requirement, and add test coverage in the pragma compiler test.

Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
deadprogram
2026-06-30 20:39:18 +02:00
committed by Ron Evans
parent 35a61ac8c5
commit 6d49f0177b
3 changed files with 9 additions and 1 deletions
+1 -1
View File
@@ -515,7 +515,7 @@ func (c *compilerContext) parsePragmas(info *functionInfo, f *ssa.Function) {
info.inline = inlineHint
case "//go:noinline":
info.inline = inlineNone
case "//go:linkname":
case "//go:linkname", "//go:linknamestd":
if len(parts) != 3 || parts[1] != f.Name() {
continue
}
+6
View File
@@ -35,6 +35,12 @@ func withLinkageName1() {
//go:linkname withLinkageName2 somepkg.someFunction2
func withLinkageName2()
// Import a function from a different package using go:linknamestd (the standard
// library variant of go:linkname introduced in Go 1.27).
//
//go:linknamestd withLinkageNameStd somepkg.someFunctionStd
func withLinkageNameStd()
// Function has an 'inline hint', similar to the inline keyword in C.
//
//go:inline
+2
View File
@@ -33,6 +33,8 @@ entry:
declare void @somepkg.someFunction2(ptr) #0
declare void @somepkg.someFunctionStd(ptr) #0
; Function Attrs: inlinehint nounwind
define hidden void @main.inlineFunc(ptr %context) unnamed_addr #3 {
entry: