Skip to content

Commit fa32371

Browse files
committed
compiler: support pragmas on generic functions
1 parent 4b0e56c commit fa32371

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

compiler/symbol.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,14 @@ func (c *compilerContext) getFunctionInfo(f *ssa.Function) functionInfo {
251251
// parsePragmas is used by getFunctionInfo to parse function pragmas such as
252252
// //export or //go:noinline.
253253
func (info *functionInfo) parsePragmas(f *ssa.Function) {
254-
if f.Syntax() == nil {
254+
syntax := f.Syntax()
255+
if f.Origin() != nil {
256+
syntax = f.Origin().Syntax()
257+
}
258+
if syntax == nil {
255259
return
256260
}
257-
if decl, ok := f.Syntax().(*ast.FuncDecl); ok && decl.Doc != nil {
261+
if decl, ok := syntax.(*ast.FuncDecl); ok && decl.Doc != nil {
258262

259263
// Our importName for a wasm module (if we are compiling to wasm), or llvm link name
260264
var importName string

compiler/testdata/pragma.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,22 @@ func inlineFunc() {
4848
func noinlineFunc() {
4949
}
5050

51+
type Int interface {
52+
int8 | int16
53+
}
54+
55+
// Same for generic functions (but the compiler may miss the pragma due to it
56+
// being generic).
57+
//
58+
//go:noinline
59+
func noinlineGenericFunc[T Int]() {
60+
}
61+
62+
func useGeneric() {
63+
// Make sure the generic function above is instantiated.
64+
noinlineGenericFunc[int8]()
65+
}
66+
5167
// This function should have the specified section.
5268
//
5369
//go:section .special_function_section

compiler/testdata/pragma.ll

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,19 @@ entry:
4848
ret void
4949
}
5050

51+
; Function Attrs: nounwind
52+
define hidden void @main.useGeneric(ptr %context) unnamed_addr #2 {
53+
entry:
54+
call void @"main.noinlineGenericFunc[int8]"(ptr undef)
55+
ret void
56+
}
57+
58+
; Function Attrs: noinline nounwind
59+
define linkonce_odr hidden void @"main.noinlineGenericFunc[int8]"(ptr %context) unnamed_addr #5 {
60+
entry:
61+
ret void
62+
}
63+
5164
; Function Attrs: noinline nounwind
5265
define hidden void @main.functionInSection(ptr %context) unnamed_addr #5 section ".special_function_section" {
5366
entry:

0 commit comments

Comments
 (0)