aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2023-03-27 19:01:34 +0200
committerRon Evans <[email protected]>2023-03-28 09:31:09 +0200
commit17bc0d6663776259494ceb50e83ea9db84328053 (patch)
tree5cf3d8f5f9d3b4058793d36603d545b8c3b7940f
parent31043628d8349d52e81d3fc4deaf556c299299ae (diff)
downloadtinygo-17bc0d6663776259494ceb50e83ea9db84328053.tar.gz
tinygo-17bc0d6663776259494ceb50e83ea9db84328053.zip
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.
-rw-r--r--compiler/symbol.go2
-rw-r--r--compiler/testdata/pragma.go7
-rw-r--r--compiler/testdata/pragma.ll9
3 files changed, 17 insertions, 1 deletions
diff --git a/compiler/symbol.go b/compiler/symbol.go
index feff10ba0..6e66c2bfd 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 8ebb9ff12..0ff968878 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 4db6640a2..f2a279a0c 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" }