From 17bc0d6663776259494ceb50e83ea9db84328053 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Mon, 27 Mar 2023 19:01:34 +0200 Subject: [PATCH] compiler: only support //go:wasmimport on declared functions Don't support this pragma on defined functions. It is only meant for importing, not for exporting. --- compiler/symbol.go | 2 +- compiler/testdata/pragma.go | 7 +++++++ compiler/testdata/pragma.ll | 9 +++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/compiler/symbol.go b/compiler/symbol.go index feff10ba..6e66c2bf 100644 --- a/compiler/symbol.go +++ b/compiler/symbol.go @@ -291,7 +291,7 @@ func (info *functionInfo) parsePragmas(f *ssa.Function) { case "//go:wasmimport": // Import a WebAssembly function, for example a WASI function. // For details, see: https://github.com/golang/go/issues/38248 - if len(parts) != 3 { + if len(parts) != 3 || len(f.Blocks) != 0 { continue } info.exported = true diff --git a/compiler/testdata/pragma.go b/compiler/testdata/pragma.go index 8ebb9ff1..0ff96887 100644 --- a/compiler/testdata/pragma.go +++ b/compiler/testdata/pragma.go @@ -59,6 +59,13 @@ func functionInSection() { func exportedFunctionInSection() { } +//go:wasmimport modulename import1 +func declaredImport() + +//go:wasmimport modulename import2 +func definedImport() { +} + // This function should not: it's only a declaration and not a definition. // //go:section .special_function_section diff --git a/compiler/testdata/pragma.ll b/compiler/testdata/pragma.ll index 4db6640a..f2a279a0 100644 --- a/compiler/testdata/pragma.ll +++ b/compiler/testdata/pragma.ll @@ -60,6 +60,14 @@ entry: ret void } +declare void @main.declaredImport() #7 + +; Function Attrs: nounwind +define hidden void @main.definedImport(ptr %context) unnamed_addr #2 { +entry: + ret void +} + declare void @main.undefinedFunctionNotInSection(ptr) #1 attributes #0 = { allockind("alloc,zeroed") allocsize(0) "alloc-family"="runtime.alloc" "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" } @@ -69,3 +77,4 @@ attributes #3 = { nounwind "target-features"="+bulk-memory,+nontrapping-fptoint, attributes #4 = { inlinehint nounwind "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" } attributes #5 = { noinline nounwind "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" } attributes #6 = { noinline nounwind "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" "wasm-export-name"="exportedFunctionInSection" "wasm-import-module"="env" "wasm-import-name"="exportedFunctionInSection" } +attributes #7 = { "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" "wasm-import-module"="modulename" "wasm-import-name"="import1" }