tinygo-org / tinygo

Go compiler for small places. Microcontrollers, WebAssembly (WASM/WASI), and command-line tools. Based on LLVM.
https://tinygo.org
Other
14.72k stars 858 forks source link

wasm-unknown target shouldn't set `--import-memory` by default #4319

Open jmillikin opened 2 days ago

jmillikin commented 2 days ago

The wasm-unknown target invokes wasm-ld with the --import-memory option, which causes the following import to be emitted in the output:

(import "env" "memory" (memory $mimport$0 2))

This is undesirable to have as default behavior for wasm-unknown, because it introduces a mandatory import into what is otherwise a freestanding module.

If the --import-memory were to be removed from targets/wasm-unknown.json ldflags, then wasm-ld would emit this instead:

;; Declare and export the Memory, which requires no special import binding in the host
(memory $0 2)
(export "memory" (memory $0))

This option appears to have been added as part of a larger change in https://github.com/tinygo-org/tinygo/pull/4125/commits/2cd966d6d577df17cfde3869ee7e0dbb4da9307f, but it's unclear from the commit message why --import-memory was added. Based on discussion in the PR, I think it was simply to reduce the number of bytes in an absolute bare-bones "hello world" module, which IMO is not a compelling reason to have it set by default.

aykevl commented 2 days ago

Because wasm-unknown by default doesn't target a particular platform, it's difficult to say whether memory should be imported or exported by default. @deadprogram what do environments like wazero expect? Memory, or no memory? Or do they support both?