Skip to content

Commit

Permalink
compiler: support pragmas on generic functions
Browse files Browse the repository at this point in the history
  • Loading branch information
aykevl committed Mar 23, 2023
1 parent 4b0e56c commit fa32371
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 2 deletions.
8 changes: 6 additions & 2 deletions compiler/symbol.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,10 +251,14 @@ func (c *compilerContext) getFunctionInfo(f *ssa.Function) functionInfo {
// parsePragmas is used by getFunctionInfo to parse function pragmas such as
// //export or //go:noinline.
func (info *functionInfo) parsePragmas(f *ssa.Function) {
if f.Syntax() == nil {
syntax := f.Syntax()
if f.Origin() != nil {
syntax = f.Origin().Syntax()
}
if syntax == nil {
return
}
if decl, ok := f.Syntax().(*ast.FuncDecl); ok && decl.Doc != nil {
if decl, ok := syntax.(*ast.FuncDecl); ok && decl.Doc != nil {

// Our importName for a wasm module (if we are compiling to wasm), or llvm link name
var importName string
Expand Down
16 changes: 16 additions & 0 deletions compiler/testdata/pragma.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,22 @@ func inlineFunc() {
func noinlineFunc() {
}

type Int interface {
int8 | int16
}

// Same for generic functions (but the compiler may miss the pragma due to it
// being generic).
//
//go:noinline
func noinlineGenericFunc[T Int]() {
}

func useGeneric() {
// Make sure the generic function above is instantiated.
noinlineGenericFunc[int8]()
}

// This function should have the specified section.
//
//go:section .special_function_section
Expand Down
13 changes: 13 additions & 0 deletions compiler/testdata/pragma.ll
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,19 @@ entry:
ret void
}

; Function Attrs: nounwind
define hidden void @main.useGeneric(ptr %context) unnamed_addr #2 {
entry:
call void @"main.noinlineGenericFunc[int8]"(ptr undef)
ret void
}

; Function Attrs: noinline nounwind
define linkonce_odr hidden void @"main.noinlineGenericFunc[int8]"(ptr %context) unnamed_addr #5 {
entry:
ret void
}

; Function Attrs: noinline nounwind
define hidden void @main.functionInSection(ptr %context) unnamed_addr #5 section ".special_function_section" {
entry:
Expand Down

0 comments on commit fa32371

Please sign in to comment.